UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

422 lines 45.4 kB
/** * @fileoverview added by tsickle * Generated from: data-table-cell.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, Input, NgZone, ViewChild } from '@angular/core'; import { InputNumberComponent } from '@duoduo-oba/ng-devui/input-number'; import { SelectComponent } from '@duoduo-oba/ng-devui/select'; import { TreeSelectComponent } from '@duoduo-oba/ng-devui/tree-select'; import { stopPropagationIfExist } from '@duoduo-oba/ng-devui/utils'; import { DataTableRowComponent } from './data-table-row.component'; import { DataTableComponent } from './data-table.component'; import { EditorDirective } from './editor-host.directive'; import { DataTableColumnTmplComponent } from './tmpl/data-table-column-tmpl.component'; export class DataTableCellComponent { // 动态生成的编辑控件激活 /** * @param {?} dt * @param {?} changeDetectorRef * @param {?} componentFactoryResolver * @param {?} rowComponent * @param {?} cellRef * @param {?} ngZone */ constructor(dt, changeDetectorRef, componentFactoryResolver, rowComponent, cellRef, ngZone) { this.dt = dt; this.changeDetectorRef = changeDetectorRef; this.componentFactoryResolver = componentFactoryResolver; this.rowComponent = rowComponent; this.cellRef = cellRef; this.ngZone = ngZone; this.clickCount = 0; // 记录点击次数 } /** * @return {?} */ ngOnInit() { this.forceUpdateSubscription = this.rowComponent.forceUpdateEvent.subscribe((/** * @param {?} _ * @return {?} */ _ => this.forceUpdate())); this.ngZone.runOutsideAngular((/** * @return {?} */ () => { this.cellRef.nativeElement.addEventListener('click', this.onCellClick.bind(this)); this.cellRef.nativeElement.addEventListener('dblclick', this.onCellDBClick.bind(this)); })); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { /** @type {?} */ const rowItem = changes['rowItem']; if (rowItem) { this.updateEditable(rowItem); } } /** * @param {?} rowItem * @return {?} */ updateEditable(rowItem) { /** @type {?} */ const currentConfig = rowItem.currentValue['$editDeniedConfig']; if (!currentConfig) { if (this.fieldEditDenied) { this.fieldEditDenied = false; } } else { /** @type {?} */ const index = currentConfig.findIndex((/** * @param {?} config * @return {?} */ (config) => { return config === this.column.field; })); if (index === -1) { if (this.fieldEditDenied) { this.fieldEditDenied = false; } } else { if (!this.fieldEditDenied) { this.fieldEditDenied = true; } } } } /** * @param {?} $event * @return {?} */ onCellClick($event) { /** @type {?} */ const cellSelectedEventArg = { rowIndex: this.rowIndex, colIndex: this.colIndex, column: this.column, rowItem: this.rowItem, cellComponent: this, rowComponent: this.rowComponent }; this.clickCount++; if (this.clickCount === 1) { this.timeoutId = setTimeout((/** * @return {?} */ () => { if (this.clickCount === 1) { this.dt.onCellClick(cellSelectedEventArg); } this.clickCount = 0; clearTimeout(this.timeoutId); }), this.timeout); } } /** * @param {?} $event * @return {?} */ onCellDBClick($event) { /** @type {?} */ const cellSelectedEventArg = { rowIndex: this.rowIndex, colIndex: this.colIndex, column: this.column, rowItem: this.rowItem, cellComponent: this, rowComponent: this.rowComponent }; this.dt.onCellDBClick(cellSelectedEventArg); } /** * @return {?} */ forceUpdate() { this.changeDetectorRef.markForCheck(); } /** * @param {?=} $event * @return {?} */ finishCellEdit($event) { if (this.editModel !== 'cell') { return; } this.isCellEdit = false; this.editorHost.viewContainerRef.clear(); this.dynamicEditorActive = false; this.templateEditorActive = false; // tslint:disable-next-line:no-unused-expression this.documentClickSubscription && this.unSubscription(this.documentClickSubscription); // tslint:disable-next-line:no-unused-expression this.cellEditorClickSubscription && this.unSubscription(this.cellEditorClickSubscription); stopPropagationIfExist($event); this.dt.onCellEditEnd({ rowIndex: this.rowIndex, colIndex: this.colIndex, column: this.column, rowItem: this.rowItem, cellComponent: this, rowComponent: this.rowComponent }); } /** * @param {?} column * @param {?} rowItem * @return {?} */ isCellEditEnable(column, rowItem) { if (this.editModel === 'cell') { return this.isCellEdit; } return this.isEditRow; } /** * @return {?} */ ngOnDestroy() { // tslint:disable-next-line:no-unused-expression this.forceUpdateSubscription && this.unSubscription(this.forceUpdateSubscription); // tslint:disable-next-line:no-unused-expression this.documentClickSubscription && this.unSubscription(this.documentClickSubscription); // tslint:disable-next-line:no-unused-expression this.cellEditorClickSubscription && this.unSubscription(this.cellEditorClickSubscription); // tslint:disable-next-line:no-unused-expression this.cellActionSubscription && this.unSubscription(this.cellActionSubscription); } /** * @private * @param {?} sbscription * @return {?} */ unSubscription(sbscription) { if (sbscription) { sbscription.unsubscribe(); sbscription = null; } } /** * @return {?} */ creatCellEditor() { /** @type {?} */ let componentFactory; /** @type {?} */ let editorComponent; switch (this.column.fieldType) { case 'number': editorComponent = InputNumberComponent; break; case 'select': editorComponent = SelectComponent; break; case 'treeSelect': editorComponent = TreeSelectComponent; break; default: this.templateEditorActive = true; break; } if (editorComponent) { componentFactory = this.componentFactoryResolver.resolveComponentFactory(editorComponent); /** @type {?} */ const viewContainerRef = this.editorHost.viewContainerRef; viewContainerRef.clear(); /** @type {?} */ const componentRef = viewContainerRef.createComponent(componentFactory); /** @type {?} */ const componentInstance = componentRef.instance; if (this.column.extraOptions) { componentFactory.inputs.forEach((/** * @param {?} input * @return {?} */ (input) => { if (this.column.extraOptions[input.templateName]) { componentInstance[input.propName] = this.column.extraOptions[input.templateName]; } })); } componentInstance.writeValue(this.rowItem[this.column.field]); componentInstance.registerOnChange((/** * @param {?} value * @return {?} */ (value) => { this.rowItem[this.column.field] = value; if (this.column.extraOptions && this.column.extraOptions.finishEditingAfterValueChange) { this.finishCellEdit(); } })); this.dynamicEditorActive = true; } } /** * @param {?} $event * @return {?} */ cellEditing($event) { $event.stopPropagation(); $event.preventDefault(); /** @type {?} */ let beforeEdit = Promise.resolve(); if (this.dt.beforeCellEdit) { beforeEdit = this.dt.beforeCellEdit(this.rowItem, this.column); } beforeEdit.then((/** * @param {?=} extraOptions * @return {?} */ (extraOptions) => { if (extraOptions) { this.column.extraOptions = extraOptions; } this.dt.cellEditorClickEvent.emit($event); /** @type {?} */ const cellSelectedEventArg = { rowIndex: this.rowIndex, colIndex: this.colIndex, column: this.column, rowItem: this.rowItem, cellComponent: this, rowComponent: this.rowComponent }; if (this.column.editable && this.editModel === 'cell') { this.isCellEdit = true; this.creatCellEditor(); this.documentClickSubscription = this.dt.documentClickEvent.subscribe((/** * @param {?} event * @return {?} */ event => { if (event === 'cancel' || !this.cellRef.nativeElement.contains(event.target)) { this.ngZone.run((/** * @return {?} */ () => { this.finishCellEdit(); })); } })); this.cellEditorClickSubscription = this.dt.cellEditorClickEvent.subscribe((/** * @param {?} event * @return {?} */ event => { if (!this.cellRef.nativeElement.contains(event.target)) { this.finishCellEdit(); } })); this.dt.onCellEditStart(cellSelectedEventArg); } })); } /** * @param {?} rowItem * @return {?} */ toggleChildTable(rowItem) { rowItem.$isChildTableOpen = !rowItem.$isChildTableOpen; this.dt.onToggleChildrenTable(rowItem, rowItem.$isChildTableOpen); } } DataTableCellComponent.decorators = [ { type: Component, args: [{ selector: 'd-data-table-cell,[dDataTableCell]', template: "<ng-template *ngIf=\"!column.editable || fieldEditDenied\" [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n\r\n<ng-container *ngIf=\"column.editable && !fieldEditDenied\">\r\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip === 'btn'\" class=\"cell-container\">\r\n <div class=\"cell-container-inner not-break modify-holder\">\r\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n <span class=\"cell-modify\" (click)=\"cellEditing($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\r\n <g id=\"cell-modify\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <path\r\n id=\"cell-modify-copy\"\r\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\r\n />\r\n </g>\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip !== 'btn'\" class=\"cell-editable\" (click)=\"cellEditing($event)\">\r\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n </div>\r\n <div [ngClass]=\"{ 'edit-padding-fix': dynamicEditorActive }\">\r\n <ng-template dEditorHost></ng-template>\r\n </div>\r\n <ng-template\r\n *ngIf=\"templateEditorActive\"\r\n [ngTemplateOutlet]=\"column.cellEditCmp ? column.cellEditCmp.template : column.fieldType === 'date' ? dateEditTempate : textEditTempate\"\r\n [ngTemplateOutletContext]=\"{\r\n rowIndex:rowIndex,\r\n colIndex:colIndex,\r\n column: column,\r\n rowItem:rowItem,\r\n $implicit: this,\r\n row: rowComponent\r\n }\"\r\n >\r\n </ng-template>\r\n</ng-container>\r\n\r\n<ng-template #cellViewTemp>\r\n <ng-container *ngIf=\"column.nestedColumn\">\r\n <span *ngIf=\"tableLevel > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: tableLevel * 16 + 'px' }\"></span>\r\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\r\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\r\n <svg\r\n *ngIf=\"!column.extraOptions?.iconFoldTable\"\r\n class=\"svg-icon-close-folder\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 16 16\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n >\r\n <g id=\"b-closeFolder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <path\r\n d=\"M3,2 L13,2 C13.5522847,2 14,2.44771525 14,3 L14,13 C14,13.5522847 13.5522847,14 13,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L2,3 C2,2.44771525 2.44771525,2 3,2 Z M12,7 L4,7 L4,9 L12,9 L12,7 Z\"\r\n fill-rule=\"nonzero\"\r\n ></path>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"column.extraOptions?.iconFoldTable\" [innerHTML]=\"column.extraOptions?.iconFoldTable | safe: 'html'\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\r\n <svg\r\n *ngIf=\"!column.extraOptions?.iconUnFoldTable\"\r\n class=\"svg-icon-open-folder\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 16 16\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n >\r\n <g id=\"b-openFolder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <path\r\n d=\"M3,2 L13,2 C13.5522847,2 14,2.44771525 14,3 L14,13 C14,13.5522847 13.5522847,14 13,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L2,3 C2,2.44771525 2.44771525,2 3,2 Z M7,7 L4,7 L4,9 L7,9 L7,12 L9,12 L9,9 L12,9 L12,7 L9,7 L9,4 L7,4 L7,7 Z\"\r\n fill-rule=\"nonzero\"\r\n ></path>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"column.extraOptions?.iconUnFoldTable\" [innerHTML]=\"column.extraOptions?.iconUnFoldTable | safe: 'html'\"></span>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.cellCmp ? column.cellCmp.template : textViewTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n rowIndex:rowIndex,\r\n colIndex:colIndex,\r\n column: column,\r\n rowItem: rowItem,\r\n cellItem: rowItem[column.field],\r\n cellValue: rowItem | disPlayCellValuePipe:rowIndex:column,\r\n $implicit: this,\r\n row: rowComponent,\r\n tableLevel: tableLevel\r\n }\"\r\n >\r\n </ng-template>\r\n</ng-template>\r\n\r\n<ng-template let-cellValue=\"cellValue\" #textViewTemplate>\r\n <span [attr.title]=\"cellValue\">{{ cellValue }}</span>\r\n</ng-template>\r\n\r\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #textEditTempate>\r\n <form class=\"form-inline edit-padding-fix\">\r\n <div class=\"form-group full-width\">\r\n <div class=\"input-group full-width\">\r\n <input\r\n [dAutoFocus]=\"cell && cell.isCellEdit\"\r\n [type]=\"column.fieldType\"\r\n class=\"devui-form-control\"\r\n [name]=\"column.field\"\r\n [(ngModel)]=\"rowItem[column.field]\"\r\n [attr.maxlength]=\"column.extraOptions?.maxlength\"\r\n [attr.minlength]=\"column.extraOptions?.minlength\"\r\n [attr.pattern]=\"column.extraOptions?.pattern\"\r\n (keydown.enter)=\"cell && cell.finishCellEdit($event)\"\r\n [placeholder]=\"column.placeholder || ''\"\r\n />\r\n </div>\r\n </div>\r\n </form>\r\n</ng-template>\r\n\r\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #dateEditTempate>\r\n <form class=\"form-inline edit-padding-fix\">\r\n <div class=\"devui-form-group\">\r\n <div class=\"devui-input-group\">\r\n <input\r\n class=\"devui-form-control search\"\r\n [name]=\"column.field\"\r\n [(ngModel)]=\"rowItem[column.field]\"\r\n dDatepicker\r\n appendToBody\r\n [dateFormat]=\"column.extraOptions?.dateFormat\"\r\n #datePicker=\"datepicker\"\r\n (ngModelChange)=\"!column.extraOptions?.showTime && cell && cell.finishCellEdit()\"\r\n [maxDate]=\"column.extraOptions?.maxDate\"\r\n [minDate]=\"column.extraOptions?.minDate\"\r\n [cssClass]=\"column.extraOptions?.cssClass\"\r\n [dateConfig]=\"column.extraOptions?.dateConfig\"\r\n [locale]=\"column.extraOptions?.locale\"\r\n [customViewTemplate]=\"column.extraOptions?.customViewTemplate\"\r\n [disabled]=\"column.extraOptions?.disabled\"\r\n [yearNumber]=\"column.extraOptions?.yearNumber || 12\"\r\n [placeholder]=\"column.placeholder || ''\"\r\n [autoOpen]=\"true\"\r\n [showTime]=\"column.extraOptions?.showTime\"\r\n />\r\n <div class=\"devui-input-group-addon\" (click)=\"datePicker.toggle($event, true)\">\r\n <i class=\"icon icon-calendar\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</ng-template>\r\n", styles: [""] }] } ]; /** @nocollapse */ DataTableCellComponent.ctorParameters = () => [ { type: DataTableComponent }, { type: ChangeDetectorRef }, { type: ComponentFactoryResolver }, { type: DataTableRowComponent }, { type: ElementRef }, { type: NgZone } ]; DataTableCellComponent.propDecorators = { editorHost: [{ type: ViewChild, args: [EditorDirective, { static: false },] }], rowIndex: [{ type: Input }], colIndex: [{ type: Input }], column: [{ type: Input }], rowItem: [{ type: Input }], editModel: [{ type: Input }], isEditRow: [{ type: Input }], timeout: [{ type: Input }], tableLevel: [{ type: Input }] }; if (false) { /** @type {?} */ DataTableCellComponent.prototype.editorHost; /** @type {?} */ DataTableCellComponent.prototype.rowIndex; /** @type {?} */ DataTableCellComponent.prototype.colIndex; /** @type {?} */ DataTableCellComponent.prototype.column; /** @type {?} */ DataTableCellComponent.prototype.rowItem; /** @type {?} */ DataTableCellComponent.prototype.editModel; /** @type {?} */ DataTableCellComponent.prototype.isEditRow; /** @type {?} */ DataTableCellComponent.prototype.timeout; /** @type {?} */ DataTableCellComponent.prototype.tableLevel; /** @type {?} */ DataTableCellComponent.prototype.isCellEdit; /** @type {?} */ DataTableCellComponent.prototype.forceUpdateSubscription; /** @type {?} */ DataTableCellComponent.prototype.documentClickSubscription; /** @type {?} */ DataTableCellComponent.prototype.cellEditorClickSubscription; /** @type {?} */ DataTableCellComponent.prototype.cellActionSubscription; /** @type {?} */ DataTableCellComponent.prototype.clickCount; /** @type {?} */ DataTableCellComponent.prototype.timeoutId; /** @type {?} */ DataTableCellComponent.prototype.fieldEditDenied; /** @type {?} */ DataTableCellComponent.prototype.templateEditorActive; /** @type {?} */ DataTableCellComponent.prototype.dynamicEditorActive; /** @type {?} */ DataTableCellComponent.prototype.dt; /** * @type {?} * @private */ DataTableCellComponent.prototype.changeDetectorRef; /** * @type {?} * @private */ DataTableCellComponent.prototype.componentFactoryResolver; /** @type {?} */ DataTableCellComponent.prototype.rowComponent; /** * @type {?} * @private */ DataTableCellComponent.prototype.cellRef; /** * @type {?} * @private */ DataTableCellComponent.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RhdGEtdGFibGUvIiwic291cmNlcyI6WyJkYXRhLXRhYmxlLWNlbGwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFDdkQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFPdkYsTUFBTSxPQUFPLHNCQUFzQjs7Ozs7Ozs7OztJQXFCakMsWUFBbUIsRUFBc0IsRUFBVSxpQkFBb0MsRUFDN0Usd0JBQWtELEVBQ25ELFlBQW1DLEVBQVUsT0FBbUIsRUFBVSxNQUFjO1FBRjlFLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUM3RSw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ25ELGlCQUFZLEdBQVosWUFBWSxDQUF1QjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFR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Ozs7WUEvUEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQ0FBb0M7Z0JBQzlDLHM0T0FBK0M7O2FBRWhEOzs7O1lBUlEsa0JBQWtCO1lBUmxCLGlCQUFpQjtZQUFhLHdCQUF3QjtZQU90RCxxQkFBcUI7WUFQbUMsVUFBVTtZQUFTLE1BQU07Ozt5QkFrQnZGLFNBQVMsU0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3VCQUM1QyxLQUFLO3VCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSztzQkFDTCxLQUFLO3lCQUNMLEtBQUs7Ozs7SUFSTiw0Q0FBMkU7O0lBQzNFLDBDQUEwQjs7SUFDMUIsMENBQTBCOztJQUMxQix3Q0FBOEM7O0lBQzlDLHlDQUFzQjs7SUFDdEIsMkNBQTJCOztJQUMzQiwyQ0FBNEI7O0lBQzVCLHlDQUF5Qjs7SUFDekIsNENBQTRCOztJQUM1Qiw0Q0FBb0I7O0lBQ3BCLHlEQUFzQzs7SUFDdEMsMkRBQXdDOztJQUN4Qyw2REFBMEM7O0lBQzFDLHdEQUFxQzs7SUFDckMsNENBQWU7O0lBQ2YsMkNBQVU7O0lBQ1YsaURBQXlCOztJQUN6QixzREFBOEI7O0lBQzlCLHFEQUE2Qjs7SUFFakIsb0NBQTZCOzs7OztJQUFFLG1EQUE0Qzs7Ozs7SUFDckYsMERBQTBEOztJQUMxRCw4Q0FBMEM7Ozs7O0lBQUUseUNBQTJCOzs7OztJQUFFLHdDQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2UsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSW5wdXROdW1iZXJDb21wb25lbnQgfSBmcm9tICduZy1kZXZ1aS9pbnB1dC1udW1iZXInO1xyXG5pbXBvcnQgeyBTZWxlY3RDb21wb25lbnQgfSBmcm9tICduZy1kZXZ1aS9zZWxlY3QnO1xyXG5pbXBvcnQgeyBUcmVlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnbmctZGV2dWkvdHJlZS1zZWxlY3QnO1xyXG5pbXBvcnQgeyBzdG9wUHJvcGFnYXRpb25JZkV4aXN0IH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuL2RhdGEtdGFibGUtcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2VkaXRvci1ob3N0LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtblRtcGxDb21wb25lbnQgfSBmcm9tICcuL3RtcGwvZGF0YS10YWJsZS1jb2x1bW4tdG1wbC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWRhdGEtdGFibGUtY2VsbCxbZERhdGFUYWJsZUNlbGxdJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLWNlbGwuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ2VsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoRWRpdG9yRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UgfSkgZWRpdG9ySG9zdDogRWRpdG9yRGlyZWN0aXZlO1xyXG4gIEBJbnB1dCgpIHJvd0luZGV4OiBudW1iZXI7XHJcbiAgQElucHV0KCkgY29sSW5kZXg6IG51bWJlcjtcclxuICBASW5wdXQoKSBjb2x1bW46IERhdGFUYWJsZUNvbHVtblRtcGxDb21wb25lbnQ7XHJcbiAgQElucHV0KCkgcm93SXRlbTogYW55O1xyXG4gIEBJbnB1dCgpIGVkaXRNb2RlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzRWRpdFJvdzogYm9vbGVhbjtcclxuICBASW5wdXQoKSB0aW1lb3V0OiBudW1iZXI7XHJcbiAgQElucHV0KCkgdGFibGVMZXZlbDogbnVtYmVyO1xyXG4gIGlzQ2VsbEVkaXQ6IGJvb2xlYW47XHJcbiAgZm9yY2VVcGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBkb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY2VsbEFjdGlvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNsaWNrQ291bnQgPSAwOyAvLyDorrDlvZXngrnlh7vmrKHmlbBcclxuICB0aW1lb3V0SWQ7IC8vIOW7tuaXtmlkXHJcbiAgZmllbGRFZGl0RGVuaWVkOiBib29sZWFuO1xyXG4gIHRlbXBsYXRlRWRpdG9yQWN0aXZlOiBib29sZWFuOyAvLyDpgJrov4fmqKHmnb/nlJ/miJDnmoTnvJbovpHmjqfku7bmv4DmtLtcclxuICBkeW5hbWljRWRpdG9yQWN0aXZlOiBib29sZWFuOyAvLyDliqjmgIHnlJ/miJDnmoTnvJbovpHmjqfku7bmv4DmtLtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGR0OiBEYXRhVGFibGVDb21wb25lbnQsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHB1YmxpYyByb3dDb21wb25lbnQ6IERhdGFUYWJsZVJvd0NvbXBvbmVudCwgcHJpdmF0ZSBjZWxsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcmNlVXBkYXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3dDb21wb25lbnQuZm9yY2VVcGRhdGVFdmVudC5zdWJzY3JpYmUoXyA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpO1xyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNlbGxSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICdjbGljaycsXHJcbiAgICAgICAgdGhpcy5vbkNlbGxDbGljay5iaW5kKHRoaXMpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuY2VsbFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2RibGNsaWNrJyxcclxuICAgICAgICB0aGlzLm9uQ2VsbERCQ2xpY2suYmluZCh0aGlzKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtwcm9wS2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSkge1xyXG4gICAgY29uc3Qgcm93SXRlbSA9IGNoYW5nZXNbJ3Jvd0l0ZW0nXTtcclxuICAgIGlmIChyb3dJdGVtKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRWRpdGFibGUocm93SXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFZGl0YWJsZShyb3dJdGVtKSB7XHJcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gcm93SXRlbS5jdXJyZW50VmFsdWVbJyRlZGl0RGVuaWVkQ29uZmlnJ107XHJcbiAgICBpZiAoIWN1cnJlbnRDb25maWcpIHtcclxuICAgICAgaWYgKHRoaXMuZmllbGRFZGl0RGVuaWVkKSB7XHJcbiAgICAgICAgdGhpcy5maWVsZEVkaXREZW5pZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29uZmlnLmZpbmRJbmRleCgoY29uZmlnOiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gY29uZmlnID09PSB0aGlzLmNvbHVtbi5maWVsZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZEVkaXREZW5pZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5maWVsZEVkaXREZW5pZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2VsbENsaWNrKCRldmVudCkge1xyXG4gICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgIHJvd0luZGV4OiB0aGlzLnJvd0luZGV4LFxyXG4gICAgICBjb2xJbmRleDogdGhpcy5jb2xJbmRleCxcclxuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgcm93SXRlbTogdGhpcy5yb3dJdGVtLFxyXG4gICAgICBjZWxsQ29tcG9uZW50OiB0aGlzLFxyXG4gICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY2xpY2tDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuY2xpY2tDb3VudCA9PT0gMSkge1xyXG4gICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNsaWNrQ291bnQgPT09IDEpIHtcclxuICAgICAgICAgIHRoaXMuZHQub25DZWxsQ2xpY2soY2VsbFNlbGVjdGVkRXZlbnRBcmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNsaWNrQ291bnQgPSAwO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XHJcbiAgICAgIH0sIHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNlbGxEQkNsaWNrKCRldmVudCkge1xyXG4gICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgIHJvd0luZGV4OiB0aGlzLnJvd0luZGV4LFxyXG4gICAgICBjb2xJbmRleDogdGhpcy5jb2xJbmRleCxcclxuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgcm93SXRlbTogdGhpcy5yb3dJdGVtLFxyXG4gICAgICBjZWxsQ29tcG9uZW50OiB0aGlzLFxyXG4gICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50XHJcbiAgICB9O1xyXG4gICAgdGhpcy5kdC5vbkNlbGxEQkNsaWNrKGNlbGxTZWxlY3RlZEV2ZW50QXJnKTtcclxuICB9XHJcblxyXG4gIGZvcmNlVXBkYXRlKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGZpbmlzaENlbGxFZGl0KCRldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lZGl0TW9kZWwgIT09ICdjZWxsJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0NlbGxFZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmVkaXRvckhvc3Qudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG4gICAgdGhpcy5keW5hbWljRWRpdG9yQWN0aXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRlbXBsYXRlRWRpdG9yQWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24pO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uKTtcclxuICAgIHN0b3BQcm9wYWdhdGlvbklmRXhpc3QoJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmR0Lm9uQ2VsbEVkaXRFbmQoe1xyXG4gICAgICByb3dJbmRleDogdGhpcy5yb3dJbmRleCxcclxuICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgIHJvd0l0ZW06IHRoaXMucm93SXRlbSxcclxuICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgcm93Q29tcG9uZW50OiB0aGlzLnJvd0NvbXBvbmVudFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0NlbGxFZGl0RW5hYmxlKGNvbHVtbiwgcm93SXRlbSkge1xyXG4gICAgaWYgKHRoaXMuZWRpdE1vZGVsID09PSAnY2VsbCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNDZWxsRWRpdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRSb3c7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5mb3JjZVVwZGF0ZVN1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuZm9yY2VVcGRhdGVTdWJzY3JpcHRpb24pO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24pO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uKTtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5jZWxsQWN0aW9uU3Vic2NyaXB0aW9uICYmIHRoaXMudW5TdWJzY3JpcHRpb24odGhpcy5jZWxsQWN0aW9uU3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5TdWJzY3JpcHRpb24oc2JzY3JpcHRpb246IFN1YnNjcmlwdGlvbikge1xyXG4gICAgaWYgKHNic2NyaXB0aW9uKSB7XHJcbiAgICAgIHNic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHNic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjcmVhdENlbGxFZGl0b3IoKSB7XHJcbiAgICBsZXQgY29tcG9uZW50RmFjdG9yeTtcclxuICAgIGxldCBlZGl0b3JDb21wb25lbnQ7XHJcbiAgICBzd2l0Y2ggKHRoaXMuY29sdW1uLmZpZWxkVHlwZSkge1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIGVkaXRvckNvbXBvbmVudCA9IElucHV0TnVtYmVyQ29tcG9uZW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgIGVkaXRvckNvbXBvbmVudCA9IFNlbGVjdENvbXBvbmVudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAndHJlZVNlbGVjdCc6XHJcbiAgICAgICAgZWRpdG9yQ29tcG9uZW50ID0gVHJlZVNlbGVjdENvbXBvbmVudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWRpdG9yQ29tcG9uZW50KSB7XHJcbiAgICAgIGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShlZGl0b3JDb21wb25lbnQpO1xyXG4gICAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gdGhpcy5lZGl0b3JIb3N0LnZpZXdDb250YWluZXJSZWY7XHJcbiAgICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQ8eyB3cml0ZVZhbHVlOiBGdW5jdGlvbiwgcmVnaXN0ZXJPbkNoYW5nZTogRnVuY3Rpb24gfT4oY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlO1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zKSB7XHJcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbi5leHRyYU9wdGlvbnNbaW5wdXQudGVtcGxhdGVOYW1lXSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZVtpbnB1dC5wcm9wTmFtZV0gPSB0aGlzLmNvbHVtbi5leHRyYU9wdGlvbnNbaW5wdXQudGVtcGxhdGVOYW1lXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBjb21wb25lbnRJbnN0YW5jZS53cml0ZVZhbHVlKHRoaXMucm93SXRlbVt0aGlzLmNvbHVtbi5maWVsZF0pO1xyXG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5yZWdpc3Rlck9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucm93SXRlbVt0aGlzLmNvbHVtbi5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zICYmIHRoaXMuY29sdW1uLmV4dHJhT3B0aW9ucy5maW5pc2hFZGl0aW5nQWZ0ZXJWYWx1ZUNoYW5nZSkge1xyXG4gICAgICAgICAgdGhpcy5maW5pc2hDZWxsRWRpdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZHluYW1pY0VkaXRvckFjdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjZWxsRWRpdGluZygkZXZlbnQpIHtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgbGV0IGJlZm9yZUVkaXQgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIGlmICh0aGlzLmR0LmJlZm9yZUNlbGxFZGl0KSB7XHJcbiAgICAgIGJlZm9yZUVkaXQgPSB0aGlzLmR0LmJlZm9yZUNlbGxFZGl0KHRoaXMucm93SXRlbSwgdGhpcy5jb2x1bW4pO1xyXG4gICAgfVxyXG4gICAgYmVmb3JlRWRpdC50aGVuKChleHRyYU9wdGlvbnM/OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGV4dHJhT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uLmV4dHJhT3B0aW9ucyA9IGV4dHJhT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmR0LmNlbGxFZGl0b3JDbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcclxuICAgICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgICAgcm93SW5kZXg6IHRoaXMucm93SW5kZXgsXHJcbiAgICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgICByb3dJdGVtOiB0aGlzLnJvd0l0ZW0sXHJcbiAgICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50XHJcbiAgICAgIH07XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbi5lZGl0YWJsZSAmJiB0aGlzLmVkaXRNb2RlbCA9PT0gJ2NlbGwnKSB7XHJcbiAgICAgICAgdGhpcy5pc0NlbGxFZGl0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNyZWF0Q2VsbEVkaXRvcigpO1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMuZHQuZG9jdW1lbnRDbGlja0V2ZW50LnN1YnNjcmliZShcclxuICAgICAgICAgIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50ID09PSAnY2FuY2VsJyB8fCAhdGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaENlbGxFZGl0KCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uID0gdGhpcy5kdC5jZWxsRWRpdG9yQ2xpY2tFdmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoQ2VsbEVkaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5kdC5vbkNlbGxFZGl0U3RhcnQoY2VsbFNlbGVjdGVkRXZlbnRBcmcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNoaWxkVGFibGUocm93SXRlbSkge1xyXG4gICAgcm93SXRlbS4kaXNDaGlsZFRhYmxlT3BlbiA9ICFyb3dJdGVtLiRpc0NoaWxkVGFibGVPcGVuO1xyXG4gICAgdGhpcy5kdC5vblRvZ2dsZUNoaWxkcmVuVGFibGUocm93SXRlbSwgcm93SXRlbS4kaXNDaGlsZFRhYmxlT3Blbik7XHJcbiAgfVxyXG59XHJcbiJdfQ==