UNPKG

ontimize-web-ngx

Version:
243 lines 39.7 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, Component, EventEmitter, Injector, TemplateRef, ViewChild } from '@angular/core'; import { Observable, Subscription } from 'rxjs'; import { BooleanInputConverter } from '../../../../../decorators/input-converter'; import { OTranslatePipe } from '../../../../../pipes/o-translate.pipe'; import { DialogService } from '../../../../../services/dialog.service'; import { OntimizeServiceProvider } from '../../../../../services/factories'; import { OntimizeService } from '../../../../../services/ontimize/ontimize.service'; import { Codes } from '../../../../../util/codes'; import { FilterExpressionUtils } from '../../../../../util/filter-expression.utils'; import { ServiceUtils } from '../../../../../util/service.utils'; import { SQLTypes } from '../../../../../util/sqltypes'; import { Util } from '../../../../../util/util'; import { OBaseTableCellRenderer } from '../o-base-table-cell-renderer.class'; import { FactoryUtil } from '../../../../../util/factory.util'; import * as i0 from "@angular/core"; export const DEFAULT_INPUTS_O_TABLE_CELL_RENDERER_SERVICE = [ 'entity', 'service', 'columns', 'translate', 'valueColumn: value-column', 'valueColumnType: value-column-type', 'parentKeys: parent-keys', 'queryMethod: query-method', 'serviceType : service-type', 'translateArgsFn: translate-params', 'configureServiceArgs: configure-service-args' ]; export const DEFAULT_OUTPUTS_O_TABLE_CELL_RENDERER_SERVICE = [ 'onDataLoaded' ]; export class OTableCellRendererServiceComponent extends OBaseTableCellRenderer { constructor(injector) { super(injector); this.injector = injector; this.cellValues = []; this.responseMap = {}; this.translate = false; this.valueColumnType = Codes.TYPE_INT; this.queryMethod = Codes.QUERY_METHOD; this.onDataLoaded = new EventEmitter(); this.colArray = []; this._pKeysEquiv = {}; this.pipeArguments = {}; this.subscritpions = new Subscription(); this.tableColumn.type = 'service'; this.dialogService = injector.get(DialogService); this.setComponentPipe(); } initialize() { super.initialize(); if (this.table) { const oCol = this.table.getOColumn(this.column); oCol.definition.contentAlign = oCol.definition.contentAlign ? oCol.definition.contentAlign : 'start'; } this.colArray = Util.parseArray(this.columns, true); const pkArray = Util.parseArray(this.parentKeys); this._pKeysEquiv = Util.parseParentKeysEquivalences(pkArray); this.configureService(); } ngAfterViewInit() { const oCol = this.table.getOColumn(this.column); if (Util.isDefined(oCol.editor)) { this.subscritpions.add(oCol.editor.onPostUpdateRecord.subscribe((data) => { this.queryData(data[this.tableColumn.attr], data); })); } } ngOnDestroy() { if (this.subscritpions) { this.subscritpions.unsubscribe(); } } getDescriptionValue(cellvalue, rowValue) { if (Util.isDefined(cellvalue) && this.cellValues.indexOf(cellvalue) === -1) { this.queryData(cellvalue, rowValue); this.cellValues.push(cellvalue); } return ''; } queryData(cellvalue, parentItem) { if (!this.dataService || !(this.queryMethod in this.dataService) || !this.entity) { console.warn('Service not properly configured! aborting query'); return; } const filter = ServiceUtils.getFilterUsingParentKeys(parentItem, this._pKeysEquiv); const tableColAlias = Object.keys(this._pKeysEquiv).find(key => this._pKeysEquiv[key] === this.column); if (Util.isDefined(tableColAlias)) { if (!filter[tableColAlias]) { filter[tableColAlias] = cellvalue; } } else { filter[this.column] = cellvalue; } const queryArguments = this.getQueryArguments(filter); this.dataService[this.queryMethod](...this.dataService.requestArgumentAdapter.parseQueryParameters(queryArguments)) .subscribe((resp) => { if (resp.isSuccessful()) { let respData; if (Util.isArray(resp.data)) { respData = resp.data[0]; } else if (Util.isObject(resp.data) && Object.keys(resp.data).length > 0) { respData = resp.data; } else { console.warn('Component has received not supported service data. Supported data are Array or Object'); } if (Util.isDefined(respData)) { this.responseMap[cellvalue] = respData[this.valueColumn]; this.onDataLoaded.emit(this.responseMap[cellvalue]); } } }, err => { console.error(err); if (err && typeof err !== 'object') { this.dialogService.alert('ERROR', err); } else { this.dialogService.alert('ERROR', 'MESSAGES.ERROR_QUERY'); } }); } getQueryArguments(filter) { const sqlTypes = this.getSqlTypesForFilter(filter); return { filter: filter, columns: this.colArray, entity: this.entity, sqlTypes: sqlTypes }; } getSqlTypesForFilter(filter) { const sqlType = {}; const tableSqlTypes = this.table.getSqlTypes(); Object.keys(filter).forEach(filterKey => { const pKeyEquiv = Object.keys(this._pKeysEquiv).find(keyEquiv => keyEquiv === filterKey); const keyEquiv = Util.isDefined(pKeyEquiv) ? this._pKeysEquiv[pKeyEquiv] : filterKey; sqlType[filterKey] = tableSqlTypes[keyEquiv]; }); return sqlType; } configureService() { let configureServiceArgs = { injector: this.injector, baseService: OntimizeService, entity: this.entity, service: this.service, serviceType: this.serviceType }; if (Util.isDefined(this.configureServiceArgs)) { configureServiceArgs = { ...configureServiceArgs, ...this.configureServiceArgs }; } this.dataService = FactoryUtil.configureService(configureServiceArgs); } getCellData(cellvalue, rowvalue) { return this.responseMap[cellvalue]; } getFilterExpression(quickFilter) { const oCol = this.table.getOColumn(this.column); let result; let cacheValue = Object.keys(this.responseMap).find(key => Util.normalizeString(this.responseMap[key]).indexOf(Util.normalizeString(quickFilter)) !== -1); if (cacheValue) { cacheValue = this.parseByValueColumnType(cacheValue); result = FilterExpressionUtils.buildExpressionEquals(this.column, SQLTypes.parseUsingSQLType(cacheValue, SQLTypes.getSQLTypeKey(oCol.sqlType))); } return result; } setComponentPipe() { this.componentPipe = new OTranslatePipe(this.injector); } responseValue(cellvalue, rowvalue) { if (this.translate) { this.pipeArguments = this.translateArgsFn ? { values: this.translateArgsFn(rowvalue) } : {}; return super.getCellData(cellvalue, rowvalue); } else { return cellvalue; } } parseByValueColumnType(val) { let value = val; if (this.valueColumnType === Codes.TYPE_INT) { const parsed = parseInt(value, 10); if (!isNaN(parsed)) { value = parsed; } } return value; } queryAllData() { return new Observable(observer => { if (!this.dataService || !(this.queryMethod in this.dataService) || !this.entity) { console.warn('Service not properly configured! aborting query'); observer.next([]); } const queryArguments = this.getQueryArguments({}); this.dataService[this.queryMethod](...this.dataService.requestArgumentAdapter.parseQueryParameters(queryArguments)) .subscribe((resp) => { if (resp.isSuccessful()) { let respData = []; if (Util.isArray(resp.data)) { respData = resp.data; } else if (Util.isObject(resp.data) && Object.keys(resp.data).length > 0) { respData = [resp.data]; } else { console.warn('Component has received not supported service data. Supported data are Array or Object'); } respData.forEach(item => { if (Util.isDefined(item[this.column])) { this.cellValues.push(item[this.column]); this.responseMap[item[this.column]] = item[this.valueColumn]; } }); this.onDataLoaded.emit(this.responseMap); } observer.next(resp); observer.complete(); }, err => { console.error(err); observer.next([]); observer.error(err); }); }); } } OTableCellRendererServiceComponent.DEFAULT_INPUTS_O_TABLE_CELL_RENDERER_SERVICE = DEFAULT_INPUTS_O_TABLE_CELL_RENDERER_SERVICE; OTableCellRendererServiceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableCellRendererServiceComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); OTableCellRendererServiceComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableCellRendererServiceComponent, selector: "o-table-cell-renderer-service", inputs: { entity: "entity", service: "service", columns: "columns", translate: "translate", valueColumn: ["value-column", "valueColumn"], valueColumnType: ["value-column-type", "valueColumnType"], parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], serviceType: ["service-type", "serviceType"], translateArgsFn: ["translate-params", "translateArgsFn"], configureServiceArgs: ["configure-service-args", "configureServiceArgs"] }, outputs: { onDataLoaded: "onDataLoaded" }, providers: [ OntimizeServiceProvider ], viewQueries: [{ propertyName: "templateref", first: true, predicate: ["templateref"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #templateref let-cellvalue=\"cellvalue\" let-rowvalue=\"rowvalue\">\n {{ getDescriptionValue(cellvalue, rowvalue) }}{{ responseValue(responseMap[cellvalue]) }}\n</ng-template>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OTableCellRendererServiceComponent.prototype, "translate", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableCellRendererServiceComponent, decorators: [{ type: Component, args: [{ selector: 'o-table-cell-renderer-service', inputs: DEFAULT_INPUTS_O_TABLE_CELL_RENDERER_SERVICE, outputs: DEFAULT_OUTPUTS_O_TABLE_CELL_RENDERER_SERVICE, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ OntimizeServiceProvider ], template: "<ng-template #templateref let-cellvalue=\"cellvalue\" let-rowvalue=\"rowvalue\">\n {{ getDescriptionValue(cellvalue, rowvalue) }}{{ responseValue(responseMap[cellvalue]) }}\n</ng-template>\n" }] }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { templateref: [{ type: ViewChild, args: ['templateref', { read: TemplateRef, static: true }] }], translate: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1jZWxsLXJlbmRlcmVyLXNlcnZpY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvY29sdW1uL2NlbGwtcmVuZGVyZXIvc2VydmljZS9vLXRhYmxlLWNlbGwtcmVuZGVyZXItc2VydmljZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9jb2x1bW4vY2VsbC1yZW5kZXJlci9zZXJ2aWNlL28tdGFibGUtY2VsbC1yZW5kZXJlci1zZXJ2aWNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFxQixXQUFXLEVBQVEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRWxGLE9BQU8sRUFBMEIsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDL0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUdwRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFN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O0tBQ3hCLGlIQU1pQyxXQUFXLGtFQ3ZEL0MsaU1BR0E7QUQrREU7SUFBQyxxQkFBcUIsRUFBRTs7cUVBQ2E7NEZBaEIxQixrQ0FBa0M7a0JBWDlDLFNBQVM7K0JBQ0UsK0JBQStCLFVBRWpDLDRDQUE0QyxXQUMzQyw2Q0FBNkMsbUJBQ3JDLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBRVQsdUJBQXVCO3FCQUN4QjsrRkFNcUUsV0FBVztzQkFBaEYsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWW5ELFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVRyYW5zbGF0ZVBpcGVBcmd1bWVudCwgT1RyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9waXBlcy9vLXRyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2VzL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBPbnRpbWl6ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlcy9vbnRpbWl6ZS9vbnRpbWl6ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9Db25maWd1cmVTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdHlwZXMvZXhwcmVzc2lvbi50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uVXRpbHMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlsL2ZpbHRlci1leHByZXNzaW9uLnV0aWxzJztcbmltcG9ydCB7IFNlcnZpY2VVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvc2VydmljZS51dGlscyc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPQmFzZVRhYmxlQ2VsbFJlbmRlcmVyIH0gZnJvbSAnLi4vby1iYXNlLXRhYmxlLWNlbGwtcmVuZGVyZXIuY2xhc3MnO1xuXG5pbXBvcnQgdHlwZSB7IE9Db2x1bW4gfSBmcm9tICcuLi8uLi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2VzL2Jhc2Utc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBGYWN0b3J5VXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvZmFjdG9yeS51dGlsJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0NFTExfUkVOREVSRVJfU0VSVklDRSA9IFtcbiAgJ2VudGl0eScsXG4gICdzZXJ2aWNlJyxcbiAgJ2NvbHVtbnMnLFxuICAndHJhbnNsYXRlJyxcbiAgJ3ZhbHVlQ29sdW1uOiB2YWx1ZS1jb2x1bW4nLFxuICAndmFsdWVDb2x1bW5UeXBlOiB2YWx1ZS1jb2x1bW4tdHlwZScsXG4gICdwYXJlbnRLZXlzOiBwYXJlbnQta2V5cycsXG4gICdxdWVyeU1ldGhvZDogcXVlcnktbWV0aG9kJyxcbiAgJ3NlcnZpY2VUeXBlIDogc2VydmljZS10eXBlJyxcbiAgJ3RyYW5zbGF0ZUFyZ3NGbjogdHJhbnNsYXRlLXBhcmFtcycsXG4gIC8vICBjb25maWd1cmUtc2VydmljZS1hcmdzIFtPQ29uZmlndXJlU2VydmljZUFyZ3NdOiBBbGxvd3MgY29uZmlndXJlIHNlcnZpY2UgLlxuICAnY29uZmlndXJlU2VydmljZUFyZ3M6IGNvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MnXG5dO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PVVRQVVRTX09fVEFCTEVfQ0VMTF9SRU5ERVJFUl9TRVJWSUNFID0gW1xuICAnb25EYXRhTG9hZGVkJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby10YWJsZS1jZWxsLXJlbmRlcmVyLXNlcnZpY2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vby10YWJsZS1jZWxsLXJlbmRlcmVyLXNlcnZpY2UuY29tcG9uZW50Lmh0bWwnLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fVEFCTEVfQ0VMTF9SRU5ERVJFUl9TRVJWSUNFLFxuICBvdXRwdXRzOiBERUZBVUxUX09VVFBVVFNfT19UQUJMRV9DRUxMX1JFTkRFUkVSX1NFUlZJQ0UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICAvLyBTZXJ2aWNlIHJlbmRlcmVyIG11c3QgaGF2ZSBpdHMgb3duIHNlcnZpY2UgaW5zdGFuY2UgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcnJpZGluZyB0YWJsZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlclxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE9UYWJsZUNlbGxSZW5kZXJlclNlcnZpY2VDb21wb25lbnQgZXh0ZW5kcyBPQmFzZVRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9JTlBVVFNfT19UQUJMRV9DRUxMX1JFTkRFUkVSX1NFUlZJQ0UgPSBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0NFTExfUkVOREVSRVJfU0VSVklDRTtcblxuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZXJlZicsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgdGVtcGxhdGVyZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgcHVibGljIHJvd0RhdGE6IGFueTtcbiAgcHVibGljIGNlbGxWYWx1ZXMgPSBbXTtcbiAgcHVibGljIHJlbmRlclZhbHVlOiBhbnk7XG4gIHB1YmxpYyByZXNwb25zZU1hcCA9IHt9O1xuXG4gIC8qIElucHV0cyAqL1xuICBwcm90ZWN0ZWQgZW50aXR5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzZXJ2aWNlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBjb2x1bW5zOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCB2YWx1ZUNvbHVtbjogc3RyaW5nO1xuICBwdWJsaWMgdmFsdWVDb2x1bW5UeXBlOiBzdHJpbmcgPSBDb2Rlcy5UWVBFX0lOVDtcbiAgcHJvdGVjdGVkIHBhcmVudEtleXM6IHN0cmluZztcbiAgcHJvdGVjdGVkIHF1ZXJ5TWV0aG9kOiBzdHJpbmcgPSBDb2Rlcy5RVUVSWV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBzZXJ2aWNlVHlwZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVTZXJ2aWNlQXJncztcblxuICAvKiBPdXRwdXRzICovXG4gIHB1YmxpYyBvbkRhdGFMb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiBJbnRlcm5hbCB2YXJpYWJsZXMgKi9cbiAgcHJvdGVjdGVkIGNvbEFycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBwcm90ZWN0ZWQgZGF0YVNlcnZpY2U6IEJhc2VTZXJ2aWNlPFNlcnZpY2VSZXNwb25zZT47XG4gIHByb3RlY3RlZCBfcEtleXNFcXVpdiA9IHt9O1xuICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZTtcblxuICBwdWJsaWMgdHJhbnNsYXRlQXJnc0ZuOiAocm93RGF0YTogYW55KSA9PiBhbnlbXTtcbiAgcHJvdGVjdGVkIGNvbXBvbmVudFBpcGU6IE9UcmFuc2xhdGVQaXBlO1xuICBwcm90ZWN0ZWQgcGlwZUFyZ3VtZW50czogSVRyYW5zbGF0ZVBpcGVBcmd1bWVudCA9IHt9O1xuXG4gIHByb3RlY3RlZCBzdWJzY3JpdHBpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB0aGlzLnRhYmxlQ29sdW1uLnR5cGUgPSAnc2VydmljZSc7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0PERpYWxvZ1NlcnZpY2U+KERpYWxvZ1NlcnZpY2UgYXMgVHlwZTxEaWFsb2dTZXJ2aWNlPik7XG4gICAgdGhpcy5zZXRDb21wb25lbnRQaXBlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMudGFibGUpIHtcbiAgICAgIGNvbnN0IG9Db2w6IE9Db2x1bW4gPSB0aGlzLnRhYmxlLmdldE9Db2x1bW4odGhpcy5jb2x1bW4pO1xuICAgICAgb0NvbC5kZWZpbml0aW9uLmNvbnRlbnRBbGlnbiA9IG9Db2wuZGVmaW5pdGlvbi5jb250ZW50QWxpZ24gPyBvQ29sLmRlZmluaXRpb24uY29udGVudEFsaWduIDogJ3N0YXJ0JztcbiAgICB9XG5cbiAgICB0aGlzLmNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMuY29sdW1ucywgdHJ1ZSk7XG4gICAgY29uc3QgcGtBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnBhcmVudEtleXMpO1xuICAgIHRoaXMuX3BLZXlzRXF1aXYgPSBVdGlsLnBhcnNlUGFyZW50S2V5c0VxdWl2YWxlbmNlcyhwa0FycmF5KTtcbiAgICB0aGlzLmNvbmZpZ3VyZVNlcnZpY2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgb0NvbDogT0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9Db2wuZWRpdG9yKSkge1xuICAgICAgdGhpcy5zdWJzY3JpdHBpb25zLmFkZChvQ29sLmVkaXRvci5vblBvc3RVcGRhdGVSZWNvcmQuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyeURhdGEoZGF0YVt0aGlzLnRhYmxlQ29sdW1uLmF0dHJdLCBkYXRhKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXRwaW9ucykge1xuICAgICAgdGhpcy5zdWJzY3JpdHBpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldERlc2NyaXB0aW9uVmFsdWUoY2VsbHZhbHVlOiBhbnksIHJvd1ZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjZWxsdmFsdWUpICYmIHRoaXMuY2VsbFZhbHVlcy5pbmRleE9mKGNlbGx2YWx1ZSkgPT09IC0xKSB7XG4gICAgICB0aGlzLnF1ZXJ5RGF0YShjZWxsdmFsdWUsIHJvd1ZhbHVlKTtcbiAgICAgIHRoaXMuY2VsbFZhbHVlcy5wdXNoKGNlbGx2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBxdWVyeURhdGEoY2VsbHZhbHVlLCBwYXJlbnRJdGVtPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTZXJ2aWNlIHx8ICEodGhpcy5xdWVyeU1ldGhvZCBpbiB0aGlzLmRhdGFTZXJ2aWNlKSB8fCAhdGhpcy5lbnRpdHkpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2VydmljZSBub3QgcHJvcGVybHkgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gU2VydmljZVV0aWxzLmdldEZpbHRlclVzaW5nUGFyZW50S2V5cyhwYXJlbnRJdGVtLCB0aGlzLl9wS2V5c0VxdWl2KTtcbiAgICBjb25zdCB0YWJsZUNvbEFsaWFzID0gT2JqZWN0LmtleXModGhpcy5fcEtleXNFcXVpdikuZmluZChrZXkgPT4gdGhpcy5fcEtleXNFcXVpdltrZXldID09PSB0aGlzLmNvbHVtbik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRhYmxlQ29sQWxpYXMpKSB7XG4gICAgICBpZiAoIWZpbHRlclt0YWJsZUNvbEFsaWFzXSkge1xuICAgICAgICBmaWx0ZXJbdGFibGVDb2xBbGlhc10gPSBjZWxsdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbHRlclt0aGlzLmNvbHVtbl0gPSBjZWxsdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5QXJndW1lbnRzID0gdGhpcy5nZXRRdWVyeUFyZ3VtZW50cyhmaWx0ZXIpO1xuICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oLi4udGhpcy5kYXRhU2VydmljZS5yZXF1ZXN0QXJndW1lbnRBZGFwdGVyLnBhcnNlUXVlcnlQYXJhbWV0ZXJzKHF1ZXJ5QXJndW1lbnRzKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3A6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgIGxldCByZXNwRGF0YTtcbiAgICAgICAgICBpZiAoVXRpbC5pc0FycmF5KHJlc3AuZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3BEYXRhID0gcmVzcC5kYXRhWzBdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoVXRpbC5pc09iamVjdChyZXNwLmRhdGEpICYmIE9iamVjdC5rZXlzKHJlc3AuZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzcERhdGEgPSByZXNwLmRhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ29tcG9uZW50IGhhcyByZWNlaXZlZCBub3Qgc3VwcG9ydGVkIHNlcnZpY2UgZGF0YS4gU3VwcG9ydGVkIGRhdGEgYXJlIEFycmF5IG9yIE9iamVjdCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChyZXNwRGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VNYXBbY2VsbHZhbHVlXSA9IHJlc3BEYXRhW3RoaXMudmFsdWVDb2x1bW5dO1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQuZW1pdCh0aGlzLnJlc3BvbnNlTWFwW2NlbGx2YWx1ZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICBpZiAoZXJyICYmIHR5cGVvZiBlcnIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsIGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsICdNRVNTQUdFUy5FUlJPUl9RVUVSWScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFF1ZXJ5QXJndW1lbnRzKGZpbHRlcjoge30pOiBhbnkge1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlc0ZvckZpbHRlcihmaWx0ZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgY29sdW1uczogdGhpcy5jb2xBcnJheSxcbiAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXG4gICAgICBzcWxUeXBlczogc3FsVHlwZXNcbiAgICB9O1xuICB9XG5cbiAgZ2V0U3FsVHlwZXNGb3JGaWx0ZXIoZmlsdGVyOiBPYmplY3QpIHtcbiAgICBjb25zdCBzcWxUeXBlID0ge307XG4gICAgY29uc3QgdGFibGVTcWxUeXBlcyA9IHRoaXMudGFibGUuZ2V0U3FsVHlwZXMoKTtcblxuICAgIE9iamVjdC5rZXlzKGZpbHRlcikuZm9yRWFjaChmaWx0ZXJLZXkgPT4ge1xuICAgICAgY29uc3QgcEtleUVxdWl2ID0gT2JqZWN0LmtleXModGhpcy5fcEtleXNFcXVpdikuZmluZChrZXlFcXVpdiA9PiBrZXlFcXVpdiA9PT0gZmlsdGVyS2V5KTtcbiAgICAgIGNvbnN0IGtleUVxdWl2ID0gVXRpbC5pc0RlZmluZWQocEtleUVxdWl2KSA/IHRoaXMuX3BLZXlzRXF1aXZbcEtleUVxdWl2XSA6IGZpbHRlcktleTtcbiAgICAgIHNxbFR5cGVbZmlsdGVyS2V5XSA9IHRhYmxlU3FsVHlwZXNba2V5RXF1aXZdXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3FsVHlwZTtcbiAgfVxuICBwdWJsaWMgY29uZmlndXJlU2VydmljZSgpOiB2b2lkIHtcbiAgICBsZXQgY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVTZXJ2aWNlQXJncyA9IHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsIGJhc2VTZXJ2aWNlOiBPbnRpbWl6ZVNlcnZpY2UsIGVudGl0eTogdGhpcy5lbnRpdHksIHNlcnZpY2U6IHRoaXMuc2VydmljZSwgc2VydmljZVR5cGU6IHRoaXMuc2VydmljZVR5cGUgfVxuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLmNvbmZpZ3VyZVNlcnZpY2VBcmdzKSkge1xuICAgICAgY29uZmlndXJlU2VydmljZUFyZ3MgPSB7IC4uLmNvbmZpZ3VyZVNlcnZpY2VBcmdzLCAuLi50aGlzLmNvbmZpZ3VyZVNlcnZpY2VBcmdzIH07XG4gICAgfVxuICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBGYWN0b3J5VXRpbC5jb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsRGF0YShjZWxsdmFsdWU6IGFueSwgcm93dmFsdWU/OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlTWFwW2NlbGx2YWx1ZV07XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyRXhwcmVzc2lvbihxdWlja0ZpbHRlcjogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgb0NvbDogT0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgbGV0IHJlc3VsdDogRXhwcmVzc2lvbjtcbiAgICBsZXQgY2FjaGVWYWx1ZSA9IE9iamVjdC5rZXlzKHRoaXMucmVzcG9uc2VNYXApLmZpbmQoa2V5ID0+IFV0aWwubm9ybWFsaXplU3RyaW5nKHRoaXMucmVzcG9uc2VNYXBba2V5XSkuaW5kZXhPZihVdGlsLm5vcm1hbGl6ZVN0cmluZyhxdWlja0ZpbHRlcikpICE9PSAtMSk7XG4gICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgIGNhY2hlVmFsdWUgPSB0aGlzLnBhcnNlQnlWYWx1ZUNvbHVtblR5cGUoY2FjaGVWYWx1ZSk7XG4gICAgICByZXN1bHQgPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uRXF1YWxzKHRoaXMuY29sdW1uLCBTUUxUeXBlcy5wYXJzZVVzaW5nU1FMVHlwZShjYWNoZVZhbHVlLCBTUUxUeXBlcy5nZXRTUUxUeXBlS2V5KG9Db2wuc3FsVHlwZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21wb25lbnRQaXBlKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50UGlwZSA9IG5ldyBPVHJhbnNsYXRlUGlwZSh0aGlzLmluamVjdG9yKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNwb25zZVZhbHVlKGNlbGx2YWx1ZTogYW55LCByb3d2YWx1ZT86IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlKSB7XG4gICAgICB0aGlzLnBpcGVBcmd1bWVudHMgPSB0aGlzLnRyYW5zbGF0ZUFyZ3NGbiA/IHsgdmFsdWVzOiB0aGlzLnRyYW5zbGF0ZUFyZ3NGbihyb3d2YWx1ZSkgfSA6IHt9O1xuICAgICAgcmV0dXJuIHN1cGVyLmdldENlbGxEYXRhKGNlbGx2YWx1ZSwgcm93dmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2VsbHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUJ5VmFsdWVDb2x1bW5UeXBlKHZhbDogYW55KSB7XG4gICAgbGV0IHZhbHVlID0gdmFsO1xuXG4gICAgaWYgKHRoaXMudmFsdWVDb2x1bW5UeXBlID09PSBDb2Rlcy5UWVBFX0lOVCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICB2YWx1ZSA9IHBhcnNlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFF1ZXJ5aW5nIGFsbCBlbnRpdHkgcmVjb3JkcyB0byBoYXZlIHRoZSByZXNwb25zZU1hcCBmdWxseSBmaWxsZWQgKi9cbiAgcXVlcnlBbGxEYXRhKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIGlmICghdGhpcy5kYXRhU2VydmljZSB8fCAhKHRoaXMucXVlcnlNZXRob2QgaW4gdGhpcy5kYXRhU2VydmljZSkgfHwgIXRoaXMuZW50aXR5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2VydmljZSBub3QgcHJvcGVybHkgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChbXSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5QXJndW1lbnRzID0gdGhpcy5nZXRRdWVyeUFyZ3VtZW50cyh7fSk7XG5cbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oLi4udGhpcy5kYXRhU2VydmljZS5yZXF1ZXN0QXJndW1lbnRBZGFwdGVyLnBhcnNlUXVlcnlQYXJhbWV0ZXJzKHF1ZXJ5QXJndW1lbnRzKSlcbiAgICAgICAgLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIGxldCByZXNwRGF0YSA9IFtdO1xuICAgICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShyZXNwLmRhdGEpKSB7XG4gICAgICAgICAgICAgIHJlc3BEYXRhID0gcmVzcC5kYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChVdGlsLmlzT2JqZWN0KHJlc3AuZGF0YSkgJiYgT2JqZWN0LmtleXMocmVzcC5kYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJlc3BEYXRhID0gW3Jlc3AuZGF0YV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCBoYXMgcmVjZWl2ZWQgbm90IHN1cHBvcnRlZCBzZXJ2aWNlIGRhdGEuIFN1cHBvcnRlZCBkYXRhIGFyZSBBcnJheSBvciBPYmplY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzcERhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGl0ZW1bdGhpcy5jb2x1bW5dKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2VsbFZhbHVlcy5wdXNoKGl0ZW1bdGhpcy5jb2x1bW5dKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlTWFwW2l0ZW1bdGhpcy5jb2x1bW5dXSA9IGl0ZW1bdGhpcy52YWx1ZUNvbHVtbl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vbkRhdGFMb2FkZWQuZW1pdCh0aGlzLnJlc3BvbnNlTWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwKTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KFtdKTtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZXJlZiBsZXQtY2VsbHZhbHVlPVwiY2VsbHZhbHVlXCIgbGV0LXJvd3ZhbHVlPVwicm93dmFsdWVcIj5cbiAge3sgZ2V0RGVzY3JpcHRpb25WYWx1ZShjZWxsdmFsdWUsIHJvd3ZhbHVlKSB9fXt7IHJlc3BvbnNlVmFsdWUocmVzcG9uc2VNYXBbY2VsbHZhbHVlXSkgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=