UNPKG

ddata-ui-input

Version:

DData UI Input module, components, models & services

154 lines 26.4 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { DdataCoreModule } from 'ddata-core'; import { InputHelperService } from '../../../services/input/helper/input-helper.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "ddata-ui-common"; import * as i3 from "./dialog/multiple-select-dialog.component"; export class DdataMultipleSelectComponent { constructor(changeDetector) { this.changeDetector = changeDetector; this.helperService = DdataCoreModule.InjectorInstance.get(InputHelperService); this.random = this.helperService.randChars(); // look & feel this.wrapperClass = 'd-flex flex-wrap'; this.inputBlockClass = 'col-12 d-flex px-0'; this.inputBlockExtraClass = 'col-md-9'; this.unselectedText = 'Válassz'; // behavior this.mode = 'multiple'; this.isRequire = false; this.disabledAppearance = false; this.disabled = false; this.addEmptyOption = true; // label this.labelClass = 'col-12 col-md-3 px-0 col-form-label'; this.showLabel = true; this.labelText = ''; // additional texts this.prepend = ''; this.append = ''; this.field = 'id'; this.items = []; this.text = 'name'; this.valueField = 'id'; // selected items this.disableShowSelectedItems = false; this.showIcon = false; this.selectedElementsBlockClass = 'col-12 d-flex flex-wrap px-0'; this.selectedElementsBlockExtraClass = 'col-md-9 d-flex flex-wrap'; this.selected = new EventEmitter(); this.selectModel = new EventEmitter(); this.isModalVisible = false; } // dialog set dialogSettings(value) { if (!value) { console.error(`You try to use dd-select as multiple select, but not defined dialogSettings. Please define it.`); return; } this._dialogSettings = value; } get id() { return `${this.field}_${this.random}`; } get selectedModelName() { return this.model[this.getObjectFieldName()][this.text]; } ngOnInit() { } showModal(method) { this.isModalVisible = true; this.changeDetector.detectChanges(); } hideModal() { this.isModalVisible = false; } selectedEmit(event) { this.selected.emit(event); } selectModelEmit(event) { event.is_selected = true; if (this.mode === 'single') { this.model[this.getObjectFieldName()] = event; this.model[this.field] = event.id; } if (this.mode === 'multiple') { // TODO avoid duplicate add this.model[this.getObjectFieldName()].push(event); } this.selectModel.emit(event); } deleteFromMultipleSelectedList(item) { const index = this.model[this.field].indexOf(item); if (index !== -1) { this.model[this.field].splice(index, 1); } const dialogIndex = this._dialogSettings.listOptions.selectedElements.indexOf(item); if (dialogIndex !== -1) { this._dialogSettings.listOptions.selectedElements.splice(dialogIndex, 1); } } getObjectFieldName() { return this.field.split('_id')[0]; } } DdataMultipleSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataMultipleSelectComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); DdataMultipleSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataMultipleSelectComponent, selector: "multiple-select", inputs: { wrapperClass: "wrapperClass", inputBlockClass: "inputBlockClass", inputBlockExtraClass: "inputBlockExtraClass", unselectedText: "unselectedText", mode: "mode", isRequire: "isRequire", disabledAppearance: "disabledAppearance", disabled: "disabled", addEmptyOption: "addEmptyOption", labelClass: "labelClass", showLabel: "showLabel", labelText: "labelText", prepend: "prepend", append: "append", model: "model", field: "field", items: "items", text: "text", valueField: "valueField", disableShowSelectedItems: "disableShowSelectedItems", showIcon: "showIcon", selectedElementsBlockClass: "selectedElementsBlockClass", selectedElementsBlockExtraClass: "selectedElementsBlockExtraClass", dialogSettings: "dialogSettings" }, outputs: { selected: "selected", selectModel: "selectModel" }, ngImport: i0, template: "<div [class]=\"wrapperClass\">\n <!-- label -->\n <label\n [class]=\"labelClass\"\n [for]=\"id\"\n *ngIf=\"showLabel\"\n >\n {{ labelText }}:\n\n <span *ngIf=\"isRequired\"> *</span>\n </label>\n\n <div\n [class]=\"inputBlockClass\"\n [ngClass]=\"showLabel ? inputBlockExtraClass : ''\"\n >\n <!-- prepend -->\n <div class=\"input-group-prepend\" *ngIf=\"!!prepend\">\n <div class=\"input-group-text\">{{ prepend }}</div>\n </div>\n\n <!-- select -->\n <div\n class=\"form-control multiple-select text-muted\"\n [ngClass]=\"{'disabled': disabled}\"\n (click)=\"showModal('list')\"\n >\n <!-- if there isn't any selected items -->\n <ng-container *ngIf=\"!model[field] || model[field].length === 0; else hasSelectedItems\">\n {{ '-- ' + unselectedText + ' --' }}\n </ng-container>\n\n <ng-template #hasSelectedItems>\n <!-- multiple select mode -->\n <ng-container *ngIf=\"mode === 'multiple'\">\n {{ model[field].length + ' elem kiv\u00E1lasztva' }}\n </ng-container>\n\n <!-- single select mode -->\n <ng-container *ngIf=\"mode === 'single'\">\n {{ selectedModelName }}\n </ng-container>\n </ng-template>\n </div>\n\n <!-- append -->\n <div class=\"input-group-append\" *ngIf=\"!!append\">\n <div class=\"input-group-text\">{{ append }}</div>\n </div>\n </div>\n\n</div>\n<!-- multiple select - selected items -->\n<ng-container *ngIf=\"mode === 'multiple' && !disableShowSelectedItems\">\n <div *ngIf=\"model[field].length > 0\" class=\"d-flex justify-content-end\">\n <div [class]=\"selectedElementsBlockClass\" [ngClass]=\"showLabel ? selectedElementsBlockExtraClass : ''\">\n <ng-container *ngFor=\"let element of model[field]\">\n <dd-tag\n [tag]=\"element\"\n [class]=\"'d-inline-block pl-2 mb-1 bg-light me-2'\"\n [showIcon]=\"showIcon\"\n (delete)=\"deleteFromMultipleSelectedList(element)\"\n ></dd-tag>\n </ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"isModalVisible\">\n <multiple-select-dialog\n [settings]=\"_dialogSettings\"\n [method]=\"'list'\"\n [mode]=\"mode\"\n [model]=\"model\"\n [field]=\"field\"\n [items]=\"items\"\n [text]=\"text\"\n [valueField]=\"valueField\"\n\n (selectionFinished)=\"hideModal()\"\n (selected)=\"selectedEmit($event)\"\n (selectModel)=\"selectModelEmit($event)\"\n ></multiple-select-dialog>\n</ng-container>\n", styles: [".multiple-select{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.DdataUiTagComponent, selector: "dd-tag", inputs: ["tag", "class", "showIcon"], outputs: ["delete"] }, { kind: "component", type: i3.DdataMultipleSelectDialogComponent, selector: "multiple-select-dialog", inputs: ["settings", "method", "mode", "model", "field", "text", "valueField", "items", "modalTitle"], outputs: ["selectionFinished", "selected", "selectModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataMultipleSelectComponent, decorators: [{ type: Component, args: [{ selector: 'multiple-select', template: "<div [class]=\"wrapperClass\">\n <!-- label -->\n <label\n [class]=\"labelClass\"\n [for]=\"id\"\n *ngIf=\"showLabel\"\n >\n {{ labelText }}:\n\n <span *ngIf=\"isRequired\"> *</span>\n </label>\n\n <div\n [class]=\"inputBlockClass\"\n [ngClass]=\"showLabel ? inputBlockExtraClass : ''\"\n >\n <!-- prepend -->\n <div class=\"input-group-prepend\" *ngIf=\"!!prepend\">\n <div class=\"input-group-text\">{{ prepend }}</div>\n </div>\n\n <!-- select -->\n <div\n class=\"form-control multiple-select text-muted\"\n [ngClass]=\"{'disabled': disabled}\"\n (click)=\"showModal('list')\"\n >\n <!-- if there isn't any selected items -->\n <ng-container *ngIf=\"!model[field] || model[field].length === 0; else hasSelectedItems\">\n {{ '-- ' + unselectedText + ' --' }}\n </ng-container>\n\n <ng-template #hasSelectedItems>\n <!-- multiple select mode -->\n <ng-container *ngIf=\"mode === 'multiple'\">\n {{ model[field].length + ' elem kiv\u00E1lasztva' }}\n </ng-container>\n\n <!-- single select mode -->\n <ng-container *ngIf=\"mode === 'single'\">\n {{ selectedModelName }}\n </ng-container>\n </ng-template>\n </div>\n\n <!-- append -->\n <div class=\"input-group-append\" *ngIf=\"!!append\">\n <div class=\"input-group-text\">{{ append }}</div>\n </div>\n </div>\n\n</div>\n<!-- multiple select - selected items -->\n<ng-container *ngIf=\"mode === 'multiple' && !disableShowSelectedItems\">\n <div *ngIf=\"model[field].length > 0\" class=\"d-flex justify-content-end\">\n <div [class]=\"selectedElementsBlockClass\" [ngClass]=\"showLabel ? selectedElementsBlockExtraClass : ''\">\n <ng-container *ngFor=\"let element of model[field]\">\n <dd-tag\n [tag]=\"element\"\n [class]=\"'d-inline-block pl-2 mb-1 bg-light me-2'\"\n [showIcon]=\"showIcon\"\n (delete)=\"deleteFromMultipleSelectedList(element)\"\n ></dd-tag>\n </ng-container>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"isModalVisible\">\n <multiple-select-dialog\n [settings]=\"_dialogSettings\"\n [method]=\"'list'\"\n [mode]=\"mode\"\n [model]=\"model\"\n [field]=\"field\"\n [items]=\"items\"\n [text]=\"text\"\n [valueField]=\"valueField\"\n\n (selectionFinished)=\"hideModal()\"\n (selected)=\"selectedEmit($event)\"\n (selectModel)=\"selectModelEmit($event)\"\n ></multiple-select-dialog>\n</ng-container>\n", styles: [".multiple-select{cursor:pointer}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { wrapperClass: [{ type: Input }], inputBlockClass: [{ type: Input }], inputBlockExtraClass: [{ type: Input }], unselectedText: [{ type: Input }], mode: [{ type: Input }], isRequire: [{ type: Input }], disabledAppearance: [{ type: Input }], disabled: [{ type: Input }], addEmptyOption: [{ type: Input }], labelClass: [{ type: Input }], showLabel: [{ type: Input }], labelText: [{ type: Input }], prepend: [{ type: Input }], append: [{ type: Input }], model: [{ type: Input }], field: [{ type: Input }], items: [{ type: Input }], text: [{ type: Input }], valueField: [{ type: Input }], disableShowSelectedItems: [{ type: Input }], showIcon: [{ type: Input }], selectedElementsBlockClass: [{ type: Input }], selectedElementsBlockExtraClass: [{ type: Input }], dialogSettings: [{ type: Input }], selected: [{ type: Output }], selectModel: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RkYXRhLXVpLWlucHV0L3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3QvbXVsdGlwbGUtc2VsZWN0L211bHRpcGxlLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC9tdWx0aXBsZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFzQixlQUFlLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBR2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDOzs7OztBQVF6RixNQUFNLE9BQU8sNEJBQTRCO0lBZ0V2QyxZQUE2QixjQUFpQztRQUFqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUEvRHRELGtCQUFhLEdBQ25CLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQThCLGtCQUFrQixDQUFDLENBQUM7UUFDaEYsV0FBTSxHQUFXLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFeEQsY0FBYztRQUNMLGlCQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDbEMsb0JBQWUsR0FBRyxvQkFBb0IsQ0FBQztRQUN2Qyx5QkFBb0IsR0FBRyxVQUFVLENBQUM7UUFDbEMsbUJBQWMsR0FBRyxTQUFTLENBQUM7UUFFcEMsV0FBVztRQUNGLFNBQUksR0FBZSxVQUFVLENBQUM7UUFDOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQix1QkFBa0IsR0FBRyxLQUFL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QWxCLEtBQUs7Z0JBR0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUNHLCtCQUErQjtzQkFBdkMsS0FBSztnQkFFTyxjQUFjO3NCQUExQixLQUFLO2dCQVVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlTW9kZWxJbnRlcmZhY2UsIERkYXRhQ29yZU1vZHVsZSwgRmllbGRzSW50ZXJmYWNlIH0gZnJvbSAnZGRhdGEtY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dDb250ZW50V2l0aE9wdGlvbnNJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGlhbG9nL2NvbnRlbnQvZGlhbG9nLWNvbnRlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElucHV0SGVscGVyU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2lucHV0L2hlbHBlci9pbnB1dC1oZWxwZXItc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW5wdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaW5wdXQvaGVscGVyL2lucHV0LWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdFR5cGUgfSBmcm9tICcuLi9zZWxlY3QudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ211bHRpcGxlLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aXBsZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aXBsZS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZGF0YU11bHRpcGxlU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSBoZWxwZXJTZXJ2aWNlOiBJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2UgPVxuICAgIERkYXRhQ29yZU1vZHVsZS5JbmplY3Rvckluc3RhbmNlLmdldDxJbnB1dEhlbHBlclNlcnZpY2VJbnRlcmZhY2U+KElucHV0SGVscGVyU2VydmljZSk7XG4gIHByaXZhdGUgcmFuZG9tOiBzdHJpbmcgPSB0aGlzLmhlbHBlclNlcnZpY2UucmFuZENoYXJzKCk7XG5cbiAgLy8gbG9vayAmIGZlZWxcbiAgQElucHV0KCkgd3JhcHBlckNsYXNzID0gJ2QtZmxleCBmbGV4LXdyYXAnO1xuICBASW5wdXQoKSBpbnB1dEJsb2NrQ2xhc3MgPSAnY29sLTEyIGQtZmxleCBweC0wJztcbiAgQElucHV0KCkgaW5wdXRCbG9ja0V4dHJhQ2xhc3MgPSAnY29sLW1kLTknO1xuICBASW5wdXQoKSB1bnNlbGVjdGVkVGV4dCA9ICdWw6FsYXNzeic7XG5cbiAgLy8gYmVoYXZpb3JcbiAgQElucHV0KCkgbW9kZTogU2VsZWN0VHlwZSA9ICdtdWx0aXBsZSc7XG4gIEBJbnB1dCgpIGlzUmVxdWlyZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZEFwcGVhcmFuY2UgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgYWRkRW1wdHlPcHRpb24gPSB0cnVlO1xuXG4gIC8vIGxhYmVsXG4gIEBJbnB1dCgpIGxhYmVsQ2xhc3MgPSAnY29sLTEyIGNvbC1tZC0zIHB4LTAgY29sLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBzaG93TGFiZWwgPSB0cnVlO1xuICBASW5wdXQoKSBsYWJlbFRleHQgPSAnJztcblxuICAvLyBhZGRpdGlvbmFsIHRleHRzXG4gIEBJbnB1dCgpIHByZXBlbmQgPSAnJztcbiAgQElucHV0KCkgYXBwZW5kID0gJyc7XG5cbiAgLy8gZGF0YVxuICBASW5wdXQoKSBtb2RlbDogQmFzZU1vZGVsSW50ZXJmYWNlPGFueT4gJiBGaWVsZHNJbnRlcmZhY2U8YW55PjtcbiAgQElucHV0KCkgZmllbGQgPSAnaWQnO1xuICBASW5wdXQoKSBpdGVtczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgdGV4dCA9ICduYW1lJztcbiAgQElucHV0KCkgdmFsdWVGaWVsZCA9ICdpZCc7XG5cbiAgLy8gc2VsZWN0ZWQgaXRlbXNcbiAgQElucHV0KCkgZGlzYWJsZVNob3dTZWxlY3RlZEl0ZW1zID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dJY29uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRWxlbWVudHNCbG9ja0NsYXNzID0gJ2NvbC0xMiBkLWZsZXggZmxleC13cmFwIHB4LTAnO1xuICBASW5wdXQoKSBzZWxlY3RlZEVsZW1lbnRzQmxvY2tFeHRyYUNsYXNzID0gJ2NvbC1tZC05IGQtZmxleCBmbGV4LXdyYXAnO1xuICAvLyBkaWFsb2dcbiAgQElucHV0KCkgc2V0IGRpYWxvZ1NldHRpbmdzKHZhbHVlOiBEaWFsb2dDb250ZW50V2l0aE9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBZb3UgdHJ5IHRvIHVzZSBkZC1zZWxlY3QgYXMgbXVsdGlwbGUgc2VsZWN0LCBidXQgbm90IGRlZmluZWQgZGlhbG9nU2V0dGluZ3MuIFBsZWFzZSBkZWZpbmUgaXQuYCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWFsb2dTZXR0aW5ncyA9IHZhbHVlO1xuICB9XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TW9kZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZmllbGR9XyR7dGhpcy5yYW5kb219YDtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZE1vZGVsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGVsW3RoaXMuZ2V0T2JqZWN0RmllbGROYW1lKCldW3RoaXMudGV4dF07XG4gIH1cblxuICBpc01vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBfZGlhbG9nU2V0dGluZ3M6IERpYWxvZ0NvbnRlbnRXaXRoT3B0aW9uc0ludGVyZmFjZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIHNob3dNb2RhbChtZXRob2Q6ICdjcmVhdGUtZWRpdCcgfCAnbGlzdCcpOiB2b2lkIHtcbiAgICB0aGlzLmlzTW9kYWxWaXNpYmxlID0gdHJ1ZTtcblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaGlkZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIHNlbGVjdGVkRW1pdChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHNlbGVjdE1vZGVsRW1pdChldmVudDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQuaXNfc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMubW9kZWxbdGhpcy5nZXRPYmplY3RGaWVsZE5hbWUoKV0gPSBldmVudDtcbiAgICAgIHRoaXMubW9kZWxbdGhpcy5maWVsZF0gPSBldmVudC5pZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAvLyBUT0RPIGF2b2lkIGR1cGxpY2F0ZSBhZGRcbiAgICAgIHRoaXMubW9kZWxbdGhpcy5nZXRPYmplY3RGaWVsZE5hbWUoKV0ucHVzaChldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RNb2RlbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGRlbGV0ZUZyb21NdWx0aXBsZVNlbGVjdGVkTGlzdChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWxbdGhpcy5maWVsZF0uaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kZWxbdGhpcy5maWVsZF0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dJbmRleCA9IHRoaXMuX2RpYWxvZ1NldHRpbmdzLmxpc3RPcHRpb25zLnNlbGVjdGVkRWxlbWVudHMuaW5kZXhPZihpdGVtKTtcblxuICAgIGlmIChkaWFsb2dJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nU2V0dGluZ3MubGlzdE9wdGlvbnMuc2VsZWN0ZWRFbGVtZW50cy5zcGxpY2UoZGlhbG9nSW5kZXgsIDEpO1xuICAgIH1cbn1cblxuICBnZXRPYmplY3RGaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5zcGxpdCgnX2lkJylbMF07XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIndyYXBwZXJDbGFzc1wiPlxuICA8IS0tIGxhYmVsIC0tPlxuICA8bGFiZWxcbiAgICBbY2xhc3NdPVwibGFiZWxDbGFzc1wiXG4gICAgW2Zvcl09XCJpZFwiXG4gICAgKm5nSWY9XCJzaG93TGFiZWxcIlxuICA+XG4gICAge3sgbGFiZWxUZXh0IH19OlxuXG4gICAgPHNwYW4gKm5nSWY9XCJpc1JlcXVpcmVkXCI+ICo8L3NwYW4+XG4gIDwvbGFiZWw+XG5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJpbnB1dEJsb2NrQ2xhc3NcIlxuICAgIFtuZ0NsYXNzXT1cInNob3dMYWJlbCA/IGlucHV0QmxvY2tFeHRyYUNsYXNzIDogJydcIlxuICA+XG4gICAgPCEtLSBwcmVwZW5kIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCIgKm5nSWY9XCIhIXByZXBlbmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+e3sgcHJlcGVuZCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBzZWxlY3QgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXVsdGlwbGUtc2VsZWN0IHRleHQtbXV0ZWRcIlxuICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IGRpc2FibGVkfVwiXG4gICAgICAoY2xpY2spPVwic2hvd01vZGFsKCdsaXN0JylcIlxuICAgID5cbiAgICAgIDwhLS0gaWYgdGhlcmUgaXNuJ3QgYW55IHNlbGVjdGVkIGl0ZW1zIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2RlbFtmaWVsZF0gfHwgbW9kZWxbZmllbGRdLmxlbmd0aCA9PT0gMDsgZWxzZSBoYXNTZWxlY3RlZEl0ZW1zXCI+XG4gICAgICAgIHt7ICctLSAnICsgdW5zZWxlY3RlZFRleHQgKyAnIC0tJyB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaGFzU2VsZWN0ZWRJdGVtcz5cbiAgICAgICAgPCEtLSBtdWx0aXBsZSBzZWxlY3QgbW9kZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGUgPT09ICdtdWx0aXBsZSdcIj5cbiAgICAgICAgICB7eyBtb2RlbFtmaWVsZF0ubGVuZ3RoICsgJyBlbGVtIGtpdsOhbGFzenR2YScgfX1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBzaW5nbGUgc2VsZWN0IG1vZGUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAnc2luZ2xlJ1wiPlxuICAgICAgICAgIHt7IHNlbGVjdGVkTW9kZWxOYW1lIH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gYXBwZW5kIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIiAqbmdJZj1cIiEhYXBwZW5kXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiPnt7IGFwcGVuZCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuPC9kaXY+XG48IS0tIG11bHRpcGxlIHNlbGVjdCAtIHNlbGVjdGVkIGl0ZW1zIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGUgPT09ICdtdWx0aXBsZScgJiYgIWRpc2FibGVTaG93U2VsZWN0ZWRJdGVtc1wiPlxuICA8ZGl2ICpuZ0lmPVwibW9kZWxbZmllbGRdLmxlbmd0aCA+IDBcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgPGRpdiBbY2xhc3NdPVwic2VsZWN0ZWRFbGVtZW50c0Jsb2NrQ2xhc3NcIiBbbmdDbGFzc109XCJzaG93TGFiZWwgPyBzZWxlY3RlZEVsZW1lbnRzQmxvY2tFeHRyYUNsYXNzIDogJydcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgbW9kZWxbZmllbGRdXCI+XG4gICAgICAgIDxkZC10YWdcbiAgICAgICAgICBbdGFnXT1cImVsZW1lbnRcIlxuICAgICAgICAgIFtjbGFzc109XCInZC1pbmxpbmUtYmxvY2sgcGwtMiBtYi0xIGJnLWxpZ2h0IG1lLTInXCJcbiAgICAgICAgICBbc2hvd0ljb25dPVwic2hvd0ljb25cIlxuICAgICAgICAgIChkZWxldGUpPVwiZGVsZXRlRnJvbU11bHRpcGxlU2VsZWN0ZWRMaXN0KGVsZW1lbnQpXCJcbiAgICAgICAgPjwvZGQtdGFnPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc01vZGFsVmlzaWJsZVwiPlxuICA8bXVsdGlwbGUtc2VsZWN0LWRpYWxvZ1xuICAgIFtzZXR0aW5nc109XCJfZGlhbG9nU2V0dGluZ3NcIlxuICAgIFttZXRob2RdPVwiJ2xpc3QnXCJcbiAgICBbbW9kZV09XCJtb2RlXCJcbiAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgW2l0ZW1zXT1cIml0ZW1zXCJcbiAgICBbdGV4dF09XCJ0ZXh0XCJcbiAgICBbdmFsdWVGaWVsZF09XCJ2YWx1ZUZpZWxkXCJcblxuICAgIChzZWxlY3Rpb25GaW5pc2hlZCk9XCJoaWRlTW9kYWwoKVwiXG4gICAgKHNlbGVjdGVkKT1cInNlbGVjdGVkRW1pdCgkZXZlbnQpXCJcbiAgICAoc2VsZWN0TW9kZWwpPVwic2VsZWN0TW9kZWxFbWl0KCRldmVudClcIlxuICAgID48L211bHRpcGxlLXNlbGVjdC1kaWFsb2c+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==