ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
226 lines • 36.8 kB
JavaScript
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 * 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'
];
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 sqlTypes = this.getSqlTypesForFilter(filter);
this.dataService[this.queryMethod](filter, this.colArray, this.entity, sqlTypes)
.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');
}
});
}
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() {
const configureServiceArgs = { injector: this.injector, baseService: OntimizeService, entity: this.entity, service: this.service, serviceType: this.serviceType };
this.dataService = Util.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();
}
this.dataService[this.queryMethod]({}, this.colArray, this.entity)
.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();
}, err => {
console.error(err);
observer.next();
});
});
}
}
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"] }, 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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QUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDMUM7Z0JBQ0QsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBbE5hLCtFQUE0QyxHQUFHLDRDQUE0QyxDQUFDO2dJQUYvRixrQ0FBa0M7b0hBQWxDLGtDQUFrQywyZUFMbEM7UUFFVCx1QkFBdUI7S0FDeEIsaUhBTWlDLFdBQVcsa0VDbkQvQyxpTUFHQTtBRDJERTtJQUFDLHFCQUFxQixFQUFFOztxRUFDYTs0RkFoQjFCLGtDQUFrQztrQkFYOUMsU0FBUzsrQkFDRSwrQkFBK0IsVUFFakMsNENBQTRDLFdBQzNDLDZDQUE2QyxtQkFDckMsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFFVCx1QkFBdUI7cUJBQ3hCOytGQU1xRSxXQUFXO3NCQUFoRixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFZbkQsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVHlwZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJVHJhbnNsYXRlUGlwZUFyZ3VtZW50LCBPVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3BpcGVzL28tdHJhbnNsYXRlLnBpcGUnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2VzL29udGltaXplL29udGltaXplLnNlcnZpY2UnO1xuaW1wb3J0IHsgT0NvbmZpZ3VyZVNlcnZpY2VBcmdzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdHlwZXMvY29uZmlndXJlLXNlcnZpY2UtYXJncy50eXBlJztcbmltcG9ydCB7IEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi90eXBlcy9leHByZXNzaW9uLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb25VdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWwvZmlsdGVyLWV4cHJlc3Npb24udXRpbHMnO1xuaW1wb3J0IHsgU2VydmljZVV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC9zZXJ2aWNlLnV0aWxzJztcbmltcG9ydCB7IFNRTFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC9zcWx0eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB0eXBlIHsgT0NvbHVtbiB9IGZyb20gJy4uLy4uL28tY29sdW1uLmNsYXNzJztcbmltcG9ydCB7IE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgfSBmcm9tICcuLi9vLWJhc2UtdGFibGUtY2VsbC1yZW5kZXJlci5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0NFTExfUkVOREVSRVJfU0VSVklDRSA9IFtcbiAgJ2VudGl0eScsXG4gICdzZXJ2aWNlJyxcbiAgJ2NvbHVtbnMnLFxuICAndHJhbnNsYXRlJyxcbiAgJ3ZhbHVlQ29sdW1uOiB2YWx1ZS1jb2x1bW4nLFxuICAndmFsdWVDb2x1bW5UeXBlOiB2YWx1ZS1jb2x1bW4tdHlwZScsXG4gICdwYXJlbnRLZXlzOiBwYXJlbnQta2V5cycsXG4gICdxdWVyeU1ldGhvZDogcXVlcnktbWV0aG9kJyxcbiAgJ3NlcnZpY2VUeXBlIDogc2VydmljZS10eXBlJyxcbiAgJ3RyYW5zbGF0ZUFyZ3NGbjogdHJhbnNsYXRlLXBhcmFtcydcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19UQUJMRV9DRUxMX1JFTkRFUkVSX1NFUlZJQ0UgPSBbXG4gICdvbkRhdGFMb2FkZWQnXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlLWNlbGwtcmVuZGVyZXItc2VydmljZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXRhYmxlLWNlbGwtcmVuZGVyZXItc2VydmljZS5jb21wb25lbnQuaHRtbCcsXG4gIGlucHV0czogREVGQVVMVF9JTlBVVFNfT19UQUJMRV9DRUxMX1JFTkRFUkVSX1NFUlZJQ0UsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RBQkxFX0NFTExfUkVOREVSRVJfU0VSVklDRSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIC8vIFNlcnZpY2UgcmVuZGVyZXIgbXVzdCBoYXZlIGl0cyBvd24gc2VydmljZSBpbnN0YW5jZSBpbiBvcmRlciB0byBhdm9pZCBvdmVycmlkaW5nIHRhYmxlIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgT1RhYmxlQ2VsbFJlbmRlcmVyU2VydmljZUNvbXBvbmVudCBleHRlbmRzIE9CYXNlVGFibGVDZWxsUmVuZGVyZXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0lOUFVUU19PX1RBQkxFX0NFTExfUkVOREVSRVJfU0VSVklDRSA9IERFRkFVTFRfSU5QVVRTX09fVEFCTEVfQ0VMTF9SRU5ERVJFUl9TRVJWSUNFO1xuXG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlcmVmJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0ZW1wbGF0ZXJlZjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwdWJsaWMgcm93RGF0YTogYW55O1xuICBwdWJsaWMgY2VsbFZhbHVlcyA9IFtdO1xuICBwdWJsaWMgcmVuZGVyVmFsdWU6IGFueTtcbiAgcHVibGljIHJlc3BvbnNlTWFwID0ge307XG5cbiAgLyogSW5wdXRzICovXG4gIHByb3RlY3RlZCBlbnRpdHk6IHN0cmluZztcbiAgcHJvdGVjdGVkIHNlcnZpY2U6IHN0cmluZztcbiAgcHJvdGVjdGVkIGNvbHVtbnM6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCB0cmFuc2xhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHZhbHVlQ29sdW1uOiBzdHJpbmc7XG4gIHB1YmxpYyB2YWx1ZUNvbHVtblR5cGU6IHN0cmluZyA9IENvZGVzLlRZUEVfSU5UO1xuICBwcm90ZWN0ZWQgcGFyZW50S2V5czogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcXVlcnlNZXRob2Q6IHN0cmluZyA9IENvZGVzLlFVRVJZX01FVEhPRDtcbiAgcHJvdGVjdGVkIHNlcnZpY2VUeXBlOiBzdHJpbmc7XG5cbiAgLyogT3V0cHV0cyAqL1xuICBwdWJsaWMgb25EYXRhTG9hZGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyogSW50ZXJuYWwgdmFyaWFibGVzICovXG4gIHByb3RlY3RlZCBjb2xBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIGRhdGFTZXJ2aWNlOiBhbnk7XG4gIHByb3RlY3RlZCBfcEtleXNFcXVpdiA9IHt9O1xuICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZTtcblxuICBwdWJsaWMgdHJhbnNsYXRlQXJnc0ZuOiAocm93RGF0YTogYW55KSA9PiBhbnlbXTtcbiAgcHJvdGVjdGVkIGNvbXBvbmVudFBpcGU6IE9UcmFuc2xhdGVQaXBlO1xuICBwcm90ZWN0ZWQgcGlwZUFyZ3VtZW50czogSVRyYW5zbGF0ZVBpcGVBcmd1bWVudCA9IHt9O1xuXG4gIHByb3RlY3RlZCBzdWJzY3JpdHBpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB0aGlzLnRhYmxlQ29sdW1uLnR5cGUgPSAnc2VydmljZSc7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0PERpYWxvZ1NlcnZpY2U+KERpYWxvZ1NlcnZpY2UgYXMgVHlwZTxEaWFsb2dTZXJ2aWNlPik7XG4gICAgdGhpcy5zZXRDb21wb25lbnRQaXBlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMudGFibGUpIHtcbiAgICAgIGNvbnN0IG9Db2w6IE9Db2x1bW4gPSB0aGlzLnRhYmxlLmdldE9Db2x1bW4odGhpcy5jb2x1bW4pO1xuICAgICAgb0NvbC5kZWZpbml0aW9uLmNvbnRlbnRBbGlnbiA9IG9Db2wuZGVmaW5pdGlvbi5jb250ZW50QWxpZ24gPyBvQ29sLmRlZmluaXRpb24uY29udGVudEFsaWduIDogJ3N0YXJ0JztcbiAgICB9XG5cbiAgICB0aGlzLmNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMuY29sdW1ucywgdHJ1ZSk7XG4gICAgY29uc3QgcGtBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnBhcmVudEtleXMpO1xuICAgIHRoaXMuX3BLZXlzRXF1aXYgPSBVdGlsLnBhcnNlUGFyZW50S2V5c0VxdWl2YWxlbmNlcyhwa0FycmF5KTtcbiAgICB0aGlzLmNvbmZpZ3VyZVNlcnZpY2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgb0NvbDogT0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9Db2wuZWRpdG9yKSkge1xuICAgICAgdGhpcy5zdWJzY3JpdHBpb25zLmFkZChvQ29sLmVkaXRvci5vblBvc3RVcGRhdGVSZWNvcmQuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyeURhdGEoZGF0YVt0aGlzLnRhYmxlQ29sdW1uLmF0dHJdLCBkYXRhKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXRwaW9ucykge1xuICAgICAgdGhpcy5zdWJzY3JpdHBpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldERlc2NyaXB0aW9uVmFsdWUoY2VsbHZhbHVlOiBhbnksIHJvd1ZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChjZWxsdmFsdWUpICYmIHRoaXMuY2VsbFZhbHVlcy5pbmRleE9mKGNlbGx2YWx1ZSkgPT09IC0xKSB7XG4gICAgICB0aGlzLnF1ZXJ5RGF0YShjZWxsdmFsdWUsIHJvd1ZhbHVlKTtcbiAgICAgIHRoaXMuY2VsbFZhbHVlcy5wdXNoKGNlbGx2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBxdWVyeURhdGEoY2VsbHZhbHVlLCBwYXJlbnRJdGVtPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTZXJ2aWNlIHx8ICEodGhpcy5xdWVyeU1ldGhvZCBpbiB0aGlzLmRhdGFTZXJ2aWNlKSB8fCAhdGhpcy5lbnRpdHkpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2VydmljZSBub3QgcHJvcGVybHkgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gU2VydmljZVV0aWxzLmdldEZpbHRlclVzaW5nUGFyZW50S2V5cyhwYXJlbnRJdGVtLCB0aGlzLl9wS2V5c0VxdWl2KTtcbiAgICBjb25zdCB0YWJsZUNvbEFsaWFzID0gT2JqZWN0LmtleXModGhpcy5fcEtleXNFcXVpdikuZmluZChrZXkgPT4gdGhpcy5fcEtleXNFcXVpdltrZXldID09PSB0aGlzLmNvbHVtbik7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRhYmxlQ29sQWxpYXMpKSB7XG4gICAgICBpZiAoIWZpbHRlclt0YWJsZUNvbEFsaWFzXSkge1xuICAgICAgICBmaWx0ZXJbdGFibGVDb2xBbGlhc10gPSBjZWxsdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbHRlclt0aGlzLmNvbHVtbl0gPSBjZWxsdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRTcWxUeXBlc0ZvckZpbHRlcihmaWx0ZXIpO1xuICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oZmlsdGVyLCB0aGlzLmNvbEFycmF5LCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpXG4gICAgICAuc3Vic2NyaWJlKChyZXNwOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICBsZXQgcmVzcERhdGE7XG4gICAgICAgICAgaWYgKFV0aWwuaXNBcnJheShyZXNwLmRhdGEpKSB7XG4gICAgICAgICAgICByZXNwRGF0YSA9IHJlc3AuZGF0YVswXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFV0aWwuaXNPYmplY3QocmVzcC5kYXRhKSAmJiBPYmplY3Qua2V5cyhyZXNwLmRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3BEYXRhID0gcmVzcC5kYXRhO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvbXBvbmVudCBoYXMgcmVjZWl2ZWQgbm90IHN1cHBvcnRlZCBzZXJ2aWNlIGRhdGEuIFN1cHBvcnRlZCBkYXRhIGFyZSBBcnJheSBvciBPYmplY3QnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQocmVzcERhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlTWFwW2NlbGx2YWx1ZV0gPSByZXNwRGF0YVt0aGlzLnZhbHVlQ29sdW1uXTtcbiAgICAgICAgICAgIHRoaXMub25EYXRhTG9hZGVkLmVtaXQodGhpcy5yZXNwb25zZU1hcFtjZWxsdmFsdWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgaWYgKGVyciAmJiB0eXBlb2YgZXJyICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCBlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCAnTUVTU0FHRVMuRVJST1JfUVVFUlknKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBnZXRTcWxUeXBlc0ZvckZpbHRlcihmaWx0ZXI6IE9iamVjdCkge1xuICAgIGNvbnN0IHNxbFR5cGUgPSB7fTtcbiAgICBjb25zdCB0YWJsZVNxbFR5cGVzID0gdGhpcy50YWJsZS5nZXRTcWxUeXBlcygpO1xuXG4gICAgT2JqZWN0LmtleXMoZmlsdGVyKS5mb3JFYWNoKGZpbHRlcktleSA9PiB7XG4gICAgICBjb25zdCBwS2V5RXF1aXYgPSBPYmplY3Qua2V5cyh0aGlzLl9wS2V5c0VxdWl2KS5maW5kKGtleUVxdWl2ID0+IGtleUVxdWl2ID09PSBmaWx0ZXJLZXkpO1xuICAgICAgY29uc3Qga2V5RXF1aXYgPSBVdGlsLmlzRGVmaW5lZChwS2V5RXF1aXYpID8gdGhpcy5fcEtleXNFcXVpdltwS2V5RXF1aXZdIDogZmlsdGVyS2V5O1xuICAgICAgc3FsVHlwZVtmaWx0ZXJLZXldID0gdGFibGVTcWxUeXBlc1trZXlFcXVpdl1cbiAgICB9KTtcblxuICAgIHJldHVybiBzcWxUeXBlO1xuICB9XG4gIHB1YmxpYyBjb25maWd1cmVTZXJ2aWNlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZ3VyZVNlcnZpY2VBcmdzOiBPQ29uZmlndXJlU2VydmljZUFyZ3MgPSB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yLCBiYXNlU2VydmljZTogT250aW1pemVTZXJ2aWNlLCBlbnRpdHk6IHRoaXMuZW50aXR5LCBzZXJ2aWNlOiB0aGlzLnNlcnZpY2UsIHNlcnZpY2VUeXBlOiB0aGlzLnNlcnZpY2VUeXBlIH1cbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gVXRpbC5jb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsRGF0YShjZWxsdmFsdWU6IGFueSwgcm93dmFsdWU/OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlTWFwW2NlbGx2YWx1ZV07XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyRXhwcmVzc2lvbihxdWlja0ZpbHRlcjogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3Qgb0NvbDogT0NvbHVtbiA9IHRoaXMudGFibGUuZ2V0T0NvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgbGV0IHJlc3VsdDogRXhwcmVzc2lvbjtcbiAgICBsZXQgY2FjaGVWYWx1ZSA9IE9iamVjdC5rZXlzKHRoaXMucmVzcG9uc2VNYXApLmZpbmQoa2V5ID0+IFV0aWwubm9ybWFsaXplU3RyaW5nKHRoaXMucmVzcG9uc2VNYXBba2V5XSkuaW5kZXhPZihVdGlsLm5vcm1hbGl6ZVN0cmluZyhxdWlja0ZpbHRlcikpICE9PSAtMSk7XG4gICAgaWYgKGNhY2hlVmFsdWUpIHtcbiAgICAgIGNhY2hlVmFsdWUgPSB0aGlzLnBhcnNlQnlWYWx1ZUNvbHVtblR5cGUoY2FjaGVWYWx1ZSk7XG4gICAgICByZXN1bHQgPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuYnVpbGRFeHByZXNzaW9uRXF1YWxzKHRoaXMuY29sdW1uLCBTUUxUeXBlcy5wYXJzZVVzaW5nU1FMVHlwZShjYWNoZVZhbHVlLCBTUUxUeXBlcy5nZXRTUUxUeXBlS2V5KG9Db2wuc3FsVHlwZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21wb25lbnRQaXBlKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50UGlwZSA9IG5ldyBPVHJhbnNsYXRlUGlwZSh0aGlzLmluamVjdG9yKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNwb25zZVZhbHVlKGNlbGx2YWx1ZTogYW55LCByb3d2YWx1ZT86IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlKSB7XG4gICAgICB0aGlzLnBpcGVBcmd1bWVudHMgPSB0aGlzLnRyYW5zbGF0ZUFyZ3NGbiA/IHsgdmFsdWVzOiB0aGlzLnRyYW5zbGF0ZUFyZ3NGbihyb3d2YWx1ZSkgfSA6IHt9O1xuICAgICAgcmV0dXJuIHN1cGVyLmdldENlbGxEYXRhKGNlbGx2YWx1ZSwgcm93dmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2VsbHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUJ5VmFsdWVDb2x1bW5UeXBlKHZhbDogYW55KSB7XG4gICAgbGV0IHZhbHVlID0gdmFsO1xuXG4gICAgaWYgKHRoaXMudmFsdWVDb2x1bW5UeXBlID09PSBDb2Rlcy5UWVBFX0lOVCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICB2YWx1ZSA9IHBhcnNlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFF1ZXJ5aW5nIGFsbCBlbnRpdHkgcmVjb3JkcyB0byBoYXZlIHRoZSByZXNwb25zZU1hcCBmdWxseSBmaWxsZWQgKi9cbiAgcXVlcnlBbGxEYXRhKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIGlmICghdGhpcy5kYXRhU2VydmljZSB8fCAhKHRoaXMucXVlcnlNZXRob2QgaW4gdGhpcy5kYXRhU2VydmljZSkgfHwgIXRoaXMuZW50aXR5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2VydmljZSBub3QgcHJvcGVybHkgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhU2VydmljZVt0aGlzLnF1ZXJ5TWV0aG9kXSh7fSwgdGhpcy5jb2xBcnJheSwgdGhpcy5lbnRpdHkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3A6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICBsZXQgcmVzcERhdGEgPSBbXTtcbiAgICAgICAgICAgIGlmIChVdGlsLmlzQXJyYXkocmVzcC5kYXRhKSkge1xuICAgICAgICAgICAgICByZXNwRGF0YSA9IHJlc3AuZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVXRpbC5pc09iamVjdChyZXNwLmRhdGEpICYmIE9iamVjdC5rZXlzKHJlc3AuZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXNwRGF0YSA9IFtyZXNwLmRhdGFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgaGFzIHJlY2VpdmVkIG5vdCBzdXBwb3J0ZWQgc2VydmljZSBkYXRhLiBTdXBwb3J0ZWQgZGF0YSBhcmUgQXJyYXkgb3IgT2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3BEYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChpdGVtW3RoaXMuY29sdW1uXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbGxWYWx1ZXMucHVzaChpdGVtW3RoaXMuY29sdW1uXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZU1hcFtpdGVtW3RoaXMuY29sdW1uXV0gPSBpdGVtW3RoaXMudmFsdWVDb2x1bW5dO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMub25EYXRhTG9hZGVkLmVtaXQodGhpcy5yZXNwb25zZU1hcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZXJlZiBsZXQtY2VsbHZhbHVlPVwiY2VsbHZhbHVlXCIgbGV0LXJvd3ZhbHVlPVwicm93dmFsdWVcIj5cbiAge3sgZ2V0RGVzY3JpcHRpb25WYWx1ZShjZWxsdmFsdWUsIHJvd3ZhbHVlKSB9fXt7IHJlc3BvbnNlVmFsdWUocmVzcG9uc2VNYXBbY2VsbHZhbHVlXSkgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=