@circe/table
Version:
Circe Components for Angular :: Table Component
131 lines • 22.2 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewChildren } from '@angular/core';
import { BoxModelService, IconsOld, ToolService } from '@circe/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
export class TableActionsComponent {
constructor(el, tools, _cd, _renderer, _bm) {
this.el = el;
this.tools = tools;
this._cd = _cd;
this._renderer = _renderer;
this._bm = _bm;
this.manualHideDropdown = new Subject();
this.selectedOption = new EventEmitter();
this.defaultAction = new EventEmitter();
this.viewActions = [];
this.processedActions = [];
this.internalId = ToolService.generateUuid();
this.dropdownItems = [];
this.dropdownKeyboard$ = new Subject();
this._iconHandler = new IconsOld();
this._componentDestroyed$ = new Subject();
}
_processConfigurations() {
const actionsConfigurations = (typeof this.actions === 'function' ?
this.actions(this.rowData) : this.actions);
if (!!(actionsConfigurations === null || actionsConfigurations === void 0 ? void 0 : actionsConfigurations.length)) {
this.processedActions = actionsConfigurations.map(this._mapActionConfigToAction.bind(this));
const _defaultAction = actionsConfigurations.find((a) => a.value === this.defaultActionId);
if (_defaultAction) {
this.defaultAction.emit(_defaultAction);
}
}
this.dropdownItems = [...this.processedActions];
this.viewActions = [...this.processedActions];
}
_mapActionConfigToAction(actionConfiguration) {
const _iconHandler = this._iconHandler;
const _result = Object.assign({}, actionConfiguration);
if ('icon' in actionConfiguration) {
if ('iconLeft' in actionConfiguration.icon) {
_result.iconLeft = _iconHandler.getIcon(actionConfiguration.icon.iconLeft);
}
if ('iconRight' in actionConfiguration.icon) {
_result.iconRight = _iconHandler.getIcon(actionConfiguration.icon.iconRight);
}
}
_result.callback = () => { };
if ('callback' in actionConfiguration) {
_result.callback = actionConfiguration.callback;
}
return _result;
}
ngOnInit() {
this.processedDropdownConfig = {
elementReference: { type: 'id', name: 'npa-table-actions__dropdown-trigger-' + this.internalId },
elementRelative: 'cdk-virtual-scroll-content-wrapper',
elementBoundary: 'npa-table__body',
position: 'bottom right',
orientation: 'bottom left',
clickOutsideApply: true,
};
if (this.dropdownConfig) {
this.processedDropdownConfig = Object.assign(Object.assign(Object.assign({}, this.processedDropdownConfig), this.dropdownConfig), { elementReference: this.processedDropdownConfig.elementReference });
}
this._processConfigurations();
if (this.manualHideDropdown) {
this.manualHideDropdown
.pipe(takeUntil(this._componentDestroyed$))
.subscribe(() => {
this.showDropdown = false;
this._cd.markForCheck();
});
}
}
ngOnChanges(changes) {
var _a;
if (this.hotRender && ((_a = changes.actions) === null || _a === void 0 ? void 0 : _a.currentValue)) {
this._processConfigurations();
}
}
dropdownSelected(option) {
this.selectedOption.emit(this.processedActions.find((a) => a.value === option.value));
}
onDropdownShow() {
this.showDropdown = !this.showDropdown;
if (this.showDropdown && this.setDropdownParentTo) {
setTimeout(() => {
const _dropdownParent = this._bm.getElement(this.setDropdownParentTo);
const _dropdown = this.el.nativeElement.getElementsByTagName('npa-dropdown').item(0);
if (_dropdown && _dropdownParent) {
this._renderer.appendChild(_dropdownParent, _dropdown);
}
});
}
}
}
TableActionsComponent.decorators = [
{ type: Component, args: [{
selector: 'npa-table-actions',
template: "<div class=\"npa-table-actions\" #actionsContainer [class.hide]=\"group\">\n <ng-container *ngFor=\"let action of viewActions; trackBy: tools.identifier; \">\n <ng-container *ngIf=\"actionsType === 'button'\">\n <button\n class=\"npa-button npa-button--small\"\n [attr.data-action-id]=\"action.value\"\n #actionElement\n [ngClass]=\"{\n 'npa-button--icon-left': !!action.iconLeft,\n 'npa-button--icon-right': !!action.iconRight\n }\"\n (click)=\"selectedOption.emit(action)\">\n <i\n class=\"npa-icon npa-icon--left\"\n *ngIf=\"!!action.iconLeft\"\n [ngClass]=\"action.iconLeft\"></i>\n <ng-container *ngIf=\"!!action.label\">{{action.label}}</ng-container>\n <i\n class=\"npa-icon npa-icon--right\"\n *ngIf=\"!!action.iconRight\"\n [ngClass]=\"action.iconRight\"></i>\n </button>\n </ng-container>\n <ng-container *ngIf=\"actionsType === 'iconButton'\">\n <i\n class=\"npa-icon npa-icon--left\"\n #actionElement\n *ngIf=\"!!action.iconLeft\"\n [attr.data-action-id]=\"action.value\"\n [ngClass]=\"action.iconLeft\"\n (click)=\"selectedOption.emit(action)\"></i>\n </ng-container>\n <ng-container *ngIf=\"actionsType === 'link'\">\n <a\n class=\"npa-link npa-link-small npa-icon-text\"\n #actionElement\n [attr.data-action-id]=\"action.value\"\n [ngClass]=\"action.iconLeft\"\n (click)=\"selectedOption.emit(action)\">{{action.label}}</a>\n </ng-container>\n </ng-container>\n</div>\n<i\n class=\"npa-icon npa-icon--left icon-waiting npa-table-actions__dropdown-trigger\"\n #dropdownTrigger\n *ngIf=\"group\"\n [id]=\"'npa-table-actions__dropdown-trigger-' + internalId\"\n [ngClass]=\"{'hover': isHoveringRow}\"\n npaDropdownEvents [eventToTrigger]=\"'click'\" (event)=\"onDropdownShow()\"\n npaKeyboardEmitter (keyboardEmitter)=\"dropdownKeyboard$.next($event)\">\n</i>\n<npa-dropdown\n *ngIf=\"group && processedDropdownConfig\"\n [(showDropdown)]=\"showDropdown\"\n [options]=\"dropdownItems\"\n [config]=\"processedDropdownConfig\"\n [keyboardControl]=\"dropdownKeyboard$\"\n (optionSelected)=\"dropdownSelected($event)\">\n</npa-dropdown>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [":host{--npa-table-actions-default-align:center;--npa-table-actions-default-justify:normal;--npa-table-actions-default-spacing:12px;--npa-table-actions-trigger-dropdown-default-color:gray;--npa-table-actions-trigger-dropdown-default-hover-color:#000}:host .npa-table-actions{display:flex;align-items:var(--npa-table-actions-default-align);justify-content:var(--npa-table-actions-default-justify);flex-wrap:nowrap}:host .npa-table-actions.hide{opacity:0;pointer-events:none;position:absolute;z-index:-1}:host .npa-table-actions A,:host .npa-table-actions BUTTON,:host .npa-table-actions I{white-space:nowrap}:host .npa-table-actions A:not(:last-child),:host .npa-table-actions BUTTON:not(:last-child),:host .npa-table-actions I:not(:last-child){margin-right:var(--npa-table-actions-default-spacing)}:host .npa-table-actions .npa-table-actions__dropdown-trigger{color:var(--npa-table-actions-trigger-dropdown-default-color)}:host .npa-table-actions .npa-table-actions__dropdown-trigger.hover{color:var(--npa-table-actions-trigger-dropdown-default-hover-color)}:host I{cursor:pointer}"]
},] }
];
TableActionsComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: ToolService },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: BoxModelService }
];
TableActionsComponent.propDecorators = {
actionsContainer: [{ type: ViewChild, args: ['actionsContainer',] }],
dropdownTrigger: [{ type: ViewChild, args: ['dropdownTrigger',] }],
actionElements: [{ type: ViewChildren, args: ['actionElement',] }],
actions: [{ type: Input }],
actionsType: [{ type: Input }],
setDropdownParentTo: [{ type: Input }],
dropdownConfig: [{ type: Input }],
tableRow: [{ type: Input }],
rowData: [{ type: Input }],
isHoveringRow: [{ type: Input }],
hotRender: [{ type: Input }],
group: [{ type: Input }],
defaultActionId: [{ type: Input }],
actionsDropdownRelativeElement: [{ type: Input }],
manualHideDropdown: [{ type: Input }],
selectedOption: [{ type: Output }],
defaultAction: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YWJsZS9zcmMvbGliL3RhYmxlLWFjdGlvbnMvdGFibGUtYWN0aW9ucy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUNqSCxTQUFTLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQ2xELE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFnQyxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRM0MsTUFBTSxPQUFPLHFCQUFxQjtJQStCaEMsWUFDUyxFQUEyQixFQUMzQixLQUFrQixFQUNqQixHQUFzQixFQUN0QixTQUFvQixFQUNwQixHQUFvQjtRQUpyQixPQUFFLEdBQUYsRUFBRSxDQUF5QjtRQUMzQixVQUFLLEdBQUwsS0FBSyxDQUFhO1FBQ2pCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFyQnJCLHVCQUFrQixHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXZELG1CQUFjLEdBQStCLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQzlFLGtCQUFhLEdBQStCLElBQUksWUFBWSxFQUFnQixDQUFDO1FBRWhGLGdCQUFXLEdBQW1CLEVBQUUsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBbUIsRUFBRSxDQUFDO1FBQ3RDLGVBQVUsR0FBVyxXQUFXLENBQUMsWUFBWSxFQUFFLENB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QW9CLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLFNBQVMsSUFBSSxlQUFlLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDeEQ7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7O1lBbElGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3Qiwrd0VBQTJDO2dCQUUzQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQWZ3RCxVQUFVO1lBSUQsV0FBVztZQUpsRCxpQkFBaUI7WUFDMUMsU0FBUztZQUdGLGVBQWU7OzsrQkFhckIsU0FBUyxTQUFDLGtCQUFrQjs4QkFDNUIsU0FBUyxTQUFDLGlCQUFpQjs2QkFDM0IsWUFBWSxTQUFDLGVBQWU7c0JBQzVCLEtBQUs7MEJBQ0wsS0FBSztrQ0FDTCxLQUFLOzZCQUNMLEtBQUs7dUJBQ0wsS0FBSztzQkFDTCxLQUFLOzRCQUNMLEtBQUs7d0JBQ0wsS0FBSztvQkFDTCxLQUFLOzhCQUNMLEtBQUs7NkNBQ0wsS0FBSztpQ0FDTCxLQUFLOzZCQUVMLE1BQU07NEJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOcGFBY3Rpb24sIE5wYUFjdGlvbkNvbmZpZyB9IGZyb20gJy4vdGFibGUtYWN0aW9ucy50eXBlcyc7XG5pbXBvcnQgeyBCb3hNb2RlbFNlcnZpY2UsIEljb25zT2xkLCBOcGFFbGVtZW50LCBOcGFJZCwgTnBhT3B0aW9uLCBUb29sU2VydmljZSB9IGZyb20gJ0BjaXJjZS9jb3JlJztcbmltcG9ydCB7IE5wYUFjdGlvbkNvbmZpZ1NvdXJjZSwgTnBhVGFibGVBY3Rpb25UeXBlLCBOcGFUYWJsZUNvbHVtbiwgTnBhVGFibGVSb3dWYWx1ZSB9IGZyb20gJy4uL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5wYURyb3Bkb3duQ29uZmlnIH0gZnJvbSAnQGNpcmNlL2Ryb3Bkb3duJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnBhLXRhYmxlLWFjdGlvbnMnLFxuICB0ZW1wbGF0ZVVybDogJ3RhYmxlLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsndGFibGUtYWN0aW9ucy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUFjdGlvbnNDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBWaWV3Q2hpbGQoJ2FjdGlvbnNDb250YWluZXInKSBhY3Rpb25zQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93blRyaWdnZXInKSBkcm9wZG93blRyaWdnZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGRyZW4oJ2FjdGlvbkVsZW1lbnQnKSBhY3Rpb25FbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBASW5wdXQoKSBhY3Rpb25zOiBOcGFBY3Rpb25Db25maWc8VD5bXSB8IE5wYUFjdGlvbkNvbmZpZ1NvdXJjZTxUPjtcbiAgQElucHV0KCkgYWN0aW9uc1R5cGU6IE5wYVRhYmxlQWN0aW9uVHlwZTtcbiAgQElucHV0KCkgc2V0RHJvcGRvd25QYXJlbnRUbzogTnBhRWxlbWVudDtcbiAgQElucHV0KCkgZHJvcGRvd25Db25maWc6IE5wYURyb3Bkb3duQ29uZmlnO1xuICBASW5wdXQoKSB0YWJsZVJvdzogTnBhVGFibGVDb2x1bW48VD5bXTtcbiAgQElucHV0KCkgcm93RGF0YTogTnBhVGFibGVSb3dWYWx1ZTxUPjtcbiAgQElucHV0KCkgaXNIb3ZlcmluZ1JvdzogYm9vbGVhbjtcbiAgQElucHV0KCkgaG90UmVuZGVyOiBib29sZWFuO1xuICBASW5wdXQoKSBncm91cDogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVmYXVsdEFjdGlvbklkOiBOcGFJZDtcbiAgQElucHV0KCkgYWN0aW9uc0Ryb3Bkb3duUmVsYXRpdmVFbGVtZW50OiBOcGFFbGVtZW50O1xuICBASW5wdXQoKSBtYW51YWxIaWRlRHJvcGRvd246IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3RlZE9wdGlvbjogRXZlbnRFbWl0dGVyPE5wYUFjdGlvbjxUPj4gPSBuZXcgRXZlbnRFbWl0dGVyPE5wYUFjdGlvbjxUPj4oKTtcbiAgQE91dHB1dCgpIGRlZmF1bHRBY3Rpb246IEV2ZW50RW1pdHRlcjxOcGFBY3Rpb248VD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxOcGFBY3Rpb248VD4+KCk7XG5cbiAgcHVibGljIHZpZXdBY3Rpb25zOiBOcGFBY3Rpb248VD5bXSA9IFtdO1xuICBwdWJsaWMgcHJvY2Vzc2VkQWN0aW9uczogTnBhQWN0aW9uPFQ+W10gPSBbXTtcbiAgcHVibGljIGludGVybmFsSWQ6IHN0cmluZyA9IFRvb2xTZXJ2aWNlLmdlbmVyYXRlVXVpZCgpO1xuICBwdWJsaWMgc2hvd0Ryb3Bkb3duOiBib29sZWFuO1xuICBwdWJsaWMgZHJvcGRvd25JdGVtczogTnBhT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHByb2Nlc3NlZERyb3Bkb3duQ29uZmlnOiBOcGFEcm9wZG93bkNvbmZpZztcbiAgcHVibGljIGRyb3Bkb3duS2V5Ym9hcmQkOiBTdWJqZWN0PEtleWJvYXJkRXZlbnQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIF9pY29uSGFuZGxlcjogSWNvbnNPbGQgPSBuZXcgSWNvbnNPbGQoKTtcbiAgcHJpdmF0ZSBfY29tcG9uZW50RGVzdHJveWVkJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwdWJsaWMgdG9vbHM6IFRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2JtOiBCb3hNb2RlbFNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NDb25maWd1cmF0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBhY3Rpb25zQ29uZmlndXJhdGlvbnM6IE5wYUFjdGlvbkNvbmZpZzxUPltdID0gKHR5cGVvZiB0aGlzLmFjdGlvbnMgPT09ICdmdW5jdGlvbicgP1xuICAgICAgKHRoaXMuYWN0aW9ucyBhcyBOcGFBY3Rpb25Db25maWdTb3VyY2U8VD4pKHRoaXMucm93RGF0YSkgOiB0aGlzLmFjdGlvbnMpIGFzIE5wYUFjdGlvbkNvbmZpZzxUPltdO1xuICAgIGlmICghIWFjdGlvbnNDb25maWd1cmF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnByb2Nlc3NlZEFjdGlvbnMgPSBhY3Rpb25zQ29uZmlndXJhdGlvbnMubWFwKHRoaXMuX21hcEFjdGlvbkNvbmZpZ1RvQWN0aW9uLmJpbmQodGhpcykpO1xuXG4gICAgICBjb25zdCBfZGVmYXVsdEFjdGlvbjogTnBhQWN0aW9uQ29uZmlnPFQ+ID0gYWN0aW9uc0NvbmZpZ3VyYXRpb25zLmZpbmQoKGE6IE5wYUFjdGlvbkNvbmZpZzxUPikgPT4gYS52YWx1ZSA9PT0gdGhpcy5kZWZhdWx0QWN0aW9uSWQpO1xuICAgICAgaWYgKF9kZWZhdWx0QWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdEFjdGlvbi5lbWl0KF9kZWZhdWx0QWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gWy4uLnRoaXMucHJvY2Vzc2VkQWN0aW9uc107XG4gICAgdGhpcy52aWV3QWN0aW9ucyA9IFsuLi50aGlzLnByb2Nlc3NlZEFjdGlvbnNdO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFwQWN0aW9uQ29uZmlnVG9BY3Rpb24oYWN0aW9uQ29uZmlndXJhdGlvbjogTnBhQWN0aW9uQ29uZmlnPFQ+KTogTnBhQWN0aW9uPFQ+IHtcbiAgICBjb25zdCBfaWNvbkhhbmRsZXI6IEljb25zT2xkID0gdGhpcy5faWNvbkhhbmRsZXI7XG4gICAgY29uc3QgX3Jlc3VsdDogTnBhQWN0aW9uPFQ+ID0geyAuLi5hY3Rpb25Db25maWd1cmF0aW9uIH07XG5cbiAgICBpZiAoJ2ljb24nIGluIGFjdGlvbkNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGlmICgnaWNvbkxlZnQnIGluIGFjdGlvbkNvbmZpZ3VyYXRpb24uaWNvbikge1xuICAgICAgICBfcmVzdWx0Lmljb25MZWZ0ID0gX2ljb25IYW5kbGVyLmdldEljb24oYWN0aW9uQ29uZmlndXJhdGlvbi5pY29uLmljb25MZWZ0KTtcbiAgICAgIH1cbiAgICAgIGlmICgnaWNvblJpZ2h0JyBpbiBhY3Rpb25Db25maWd1cmF0aW9uLmljb24pIHtcbiAgICAgICAgX3Jlc3VsdC5pY29uUmlnaHQgPSBfaWNvbkhhbmRsZXIuZ2V0SWNvbihhY3Rpb25Db25maWd1cmF0aW9uLmljb24uaWNvblJpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVzdWx0LmNhbGxiYWNrID0gKCkgPT4ge307XG4gICAgaWYgKCdjYWxsYmFjaycgaW4gYWN0aW9uQ29uZmlndXJhdGlvbikge1xuICAgICAgX3Jlc3VsdC5jYWxsYmFjayA9IGFjdGlvbkNvbmZpZ3VyYXRpb24uY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzZWREcm9wZG93bkNvbmZpZyA9IHtcbiAgICAgIGVsZW1lbnRSZWZlcmVuY2U6IHsgdHlwZTogJ2lkJywgbmFtZTogJ25wYS10YWJsZS1hY3Rpb25zX19kcm9wZG93bi10cmlnZ2VyLScgKyB0aGlzLmludGVybmFsSWQgfSxcbiAgICAgIGVsZW1lbnRSZWxhdGl2ZTogJ2Nkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXInLFxuICAgICAgZWxlbWVudEJvdW5kYXJ5OiAnbnBhLXRhYmxlX19ib2R5JyxcbiAgICAgIHBvc2l0aW9uOiAnYm90dG9tIHJpZ2h0JyxcbiAgICAgIG9yaWVudGF0aW9uOiAnYm90dG9tIGxlZnQnLFxuICAgICAgY2xpY2tPdXRzaWRlQXBwbHk6IHRydWUsXG4gICAgfTtcbiAgICBpZiAodGhpcy5kcm9wZG93bkNvbmZpZykge1xuICAgICAgdGhpcy5wcm9jZXNzZWREcm9wZG93bkNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcm9jZXNzZWREcm9wZG93bkNvbmZpZyxcbiAgICAgICAgLi4udGhpcy5kcm9wZG93bkNvbmZpZyxcbiAgICAgICAgZWxlbWVudFJlZmVyZW5jZTogdGhpcy5wcm9jZXNzZWREcm9wZG93bkNvbmZpZy5lbGVtZW50UmVmZXJlbmNlXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLl9wcm9jZXNzQ29uZmlndXJhdGlvbnMoKTtcblxuICAgIGlmICh0aGlzLm1hbnVhbEhpZGVEcm9wZG93bikge1xuICAgICAgdGhpcy5tYW51YWxIaWRlRHJvcGRvd25cbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2NvbXBvbmVudERlc3Ryb3llZCQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvdFJlbmRlciAmJiBjaGFuZ2VzLmFjdGlvbnM/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5fcHJvY2Vzc0NvbmZpZ3VyYXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRyb3Bkb3duU2VsZWN0ZWQob3B0aW9uOiBOcGFPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9uLmVtaXQodGhpcy5wcm9jZXNzZWRBY3Rpb25zLmZpbmQoKGE6IE5wYUFjdGlvbjxUPikgPT4gYS52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgb25Ecm9wZG93blNob3coKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RHJvcGRvd24gPSAhdGhpcy5zaG93RHJvcGRvd247XG4gICAgaWYgKHRoaXMuc2hvd0Ryb3Bkb3duICYmIHRoaXMuc2V0RHJvcGRvd25QYXJlbnRUbykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IF9kcm9wZG93blBhcmVudDogRWxlbWVudCA9IHRoaXMuX2JtLmdldEVsZW1lbnQodGhpcy5zZXREcm9wZG93blBhcmVudFRvKTtcbiAgICAgICAgY29uc3QgX2Ryb3Bkb3duID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCducGEtZHJvcGRvd24nKS5pdGVtKDApO1xuICAgICAgICBpZiAoX2Ryb3Bkb3duICYmIF9kcm9wZG93blBhcmVudCkge1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKF9kcm9wZG93blBhcmVudCwgX2Ryb3Bkb3duKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=