UNPKG

@taiga-ui/addon-table

Version:

A library to display tabled data with filters, search, group actions, etc.

120 lines 23.2 kB
import { AsyncPipe, NgForOf } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core'; import { TUI_TABLE_SHOW_HIDE_MESSAGE } from '@taiga-ui/addon-table/tokens'; import { TuiButton } from '@taiga-ui/core/components/button'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { TUI_TILES_REORDER, TuiTiles, tuiTilesShift } from '@taiga-ui/kit/components/tiles'; import { PolymorpheusOutlet, PolymorpheusTemplate } from '@taiga-ui/polymorpheus'; import { TUI_REORDER_OPTIONS } from './reorder.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/kit/components/tiles"; class TuiReorder { constructor() { this.dragging = false; this.order = new Map(); this.unsortedItems = []; this.options = inject(TUI_REORDER_OPTIONS); this.showHideText$ = inject(TUI_TABLE_SHOW_HIDE_MESSAGE); this.enabled = []; this.itemsChange = new EventEmitter(); this.enabledChange = new EventEmitter(); this.content = ({ $implicit, }) => String($implicit); } set items(items) { if (items.length !== this.unsortedItems.length || !items.every((item) => this.unsortedItems.includes(item))) { this.unsortedItems = items; } } onDrag() { this.dragging = true; } onDrop() { if (!this.dragging) { return; } this.dragging = false; this.updateItems(); } isEnabled(item) { return this.enabled.includes(item); } getIcon(item) { return this.isEnabled(item) ? this.options.icons.hide : this.options.icons.show; } toggle(toggled) { this.enabled = this.isEnabled(toggled) ? this.enabled.filter((item) => item !== toggled) : this.enabled.concat(toggled); this.updateEnabled(); } move(index, direction) { const oldIndex = this.order.get(index) ?? index; if ((!oldIndex && direction < 0) || (oldIndex === this.unsortedItems.length - 1 && direction > 0)) { return; } const newIndex = oldIndex + direction; const oldItem = Array.from(this.order.values()).findIndex((item) => item === newIndex); this.order.set(index, newIndex); this.order.set(oldItem, oldIndex); this.order = new Map(this.order); this.updateItems(); } getSortedItems() { const items = new Array(this.unsortedItems.length); this.unsortedItems.forEach((item, index) => { items[this.order.get(index) ?? index] = item; }); return items; } updateItems() { this.itemsChange.emit(this.getSortedItems()); this.updateEnabled(); } updateEnabled() { const enabled = this.getSortedItems().filter((item) => this.isEnabled(item)); this.enabled = enabled; this.enabledChange.emit(enabled); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiReorder, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiReorder, isStandalone: true, selector: "tui-reorder", inputs: { enabled: "enabled", items: "items", content: "content" }, outputs: { itemsChange: "itemsChange", enabledChange: "enabledChange" }, host: { listeners: { "focusout.stop": "(0)", "pointerdown.zoneless": "onDrag()", "document:pointerup.zoneless": "onDrop()" } }, providers: [ { provide: TUI_TILES_REORDER, useValue: tuiTilesShift, }, ], ngImport: i0, template: "<tui-tiles\n class=\"t-wrapper\"\n [(order)]=\"order\"\n>\n <tui-tile\n *ngFor=\"let item of unsortedItems; let index = index\"\n [style.order]=\"order.get(index)\"\n >\n <div\n class=\"t-item\"\n [class.t-item_disabled]=\"!isEnabled(item)\"\n >\n <div\n tuiTileHandle\n class=\"t-draggable\"\n >\n <tui-icon\n class=\"t-icon\"\n [icon]=\"options.icons.drag\"\n />\n <ng-container *polymorpheusOutlet=\"content as template; context: {$implicit: item, index: index}\">\n {{ template }}\n </ng-container>\n </div>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button\"\n [iconStart]=\"getIcon(item)\"\n (click)=\"toggle(item)\"\n (keydown.arrowDown.prevent)=\"move(index, 1)\"\n (keydown.arrowUp.prevent)=\"move(index, -1)\"\n >\n {{ showHideText$ | async }}\n </button>\n </div>\n </tui-tile>\n</tui-tiles>\n", styles: [":host{display:block;font:var(--tui-font-text-s);padding:.5rem 0;-webkit-user-select:none;user-select:none}.t-wrapper{grid-auto-rows:2rem}.t-draggable{cursor:ns-resize;flex:1 1 auto}.t-item{transition-property:background;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;display:flex;block-size:2rem;align-items:center;padding:0 .75rem;background:var(--tui-background-base)}.t-item_disabled{opacity:var(--tui-disabled-opacity)}.t-item_disabled .t-button{color:var(--tui-text-primary);opacity:1}.t-item:hover{background:var(--tui-background-base-alt)}.t-item:hover .t-button{opacity:1}.t-icon{margin-right:.5rem;color:var(--tui-text-tertiary);border-width:.25rem}.t-button{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;margin-left:auto;opacity:0}.t-button:focus{opacity:1}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "component", type: i1.TuiTilesComponent, selector: "tui-tiles", inputs: ["debounce", "order"], outputs: ["orderChange"] }, { kind: "component", type: i1.TuiTile, selector: "tui-tile", inputs: ["width", "height"] }, { kind: "directive", type: i1.TuiTileHandle, selector: "[tuiTileHandle]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiReorder }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiReorder, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-reorder', imports: [ AsyncPipe, NgForOf, PolymorpheusOutlet, PolymorpheusTemplate, TuiButton, TuiIcon, TuiTiles, ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_TILES_REORDER, useValue: tuiTilesShift, }, ], host: { '(focusout.stop)': '(0)', '(pointerdown.zoneless)': 'onDrag()', '(document:pointerup.zoneless)': 'onDrop()', }, template: "<tui-tiles\n class=\"t-wrapper\"\n [(order)]=\"order\"\n>\n <tui-tile\n *ngFor=\"let item of unsortedItems; let index = index\"\n [style.order]=\"order.get(index)\"\n >\n <div\n class=\"t-item\"\n [class.t-item_disabled]=\"!isEnabled(item)\"\n >\n <div\n tuiTileHandle\n class=\"t-draggable\"\n >\n <tui-icon\n class=\"t-icon\"\n [icon]=\"options.icons.drag\"\n />\n <ng-container *polymorpheusOutlet=\"content as template; context: {$implicit: item, index: index}\">\n {{ template }}\n </ng-container>\n </div>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button\"\n [iconStart]=\"getIcon(item)\"\n (click)=\"toggle(item)\"\n (keydown.arrowDown.prevent)=\"move(index, 1)\"\n (keydown.arrowUp.prevent)=\"move(index, -1)\"\n >\n {{ showHideText$ | async }}\n </button>\n </div>\n </tui-tile>\n</tui-tiles>\n", styles: [":host{display:block;font:var(--tui-font-text-s);padding:.5rem 0;-webkit-user-select:none;user-select:none}.t-wrapper{grid-auto-rows:2rem}.t-draggable{cursor:ns-resize;flex:1 1 auto}.t-item{transition-property:background;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;display:flex;block-size:2rem;align-items:center;padding:0 .75rem;background:var(--tui-background-base)}.t-item_disabled{opacity:var(--tui-disabled-opacity)}.t-item_disabled .t-button{color:var(--tui-text-primary);opacity:1}.t-item:hover{background:var(--tui-background-base-alt)}.t-item:hover .t-button{opacity:1}.t-icon{margin-right:.5rem;color:var(--tui-text-tertiary);border-width:.25rem}.t-button{transition-property:opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;margin-left:auto;opacity:0}.t-button:focus{opacity:1}\n"] }] }], propDecorators: { enabled: [{ type: Input }], itemsChange: [{ type: Output }], enabledChange: [{ type: Output }], items: [{ type: Input }], content: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVvcmRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3Jlb3JkZXIvcmVvcmRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3Jlb3JkZXIvcmVvcmRlci50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXpFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBRXRELE1BMkJhLFVBQVU7SUEzQnZCO1FBNEJZLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFZixVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDbEMsa0JBQWEsR0FBaUIsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN0QyxrQkFBYSxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FB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T0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFFBQVE7cUJBQ1gsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsUUFBUSxFQUFFLGFBQWE7eUJBQzFCO3FCQUNKLFFBQ0s7d0JBQ0YsaUJBQWlCLEVBQUUsS0FBSzt3QkFDeEIsd0JBQXdCLEVBQUUsVUFBVTt3QkFDcEMsK0JBQStCLEVBQUUsVUFBVTtxQkFDOUM7OEJBV00sT0FBTztzQkFEYixLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsYUFBYTtzQkFENUIsTUFBTTtnQkFJSSxLQUFLO3NCQURmLEtBQUs7Z0JBV0MsT0FBTztzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nRm9yT2Z9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RVSV9UQUJMRV9TSE9XX0hJREVfTUVTU0FHRX0gZnJvbSAnQHRhaWdhLXVpL2FkZG9uLXRhYmxlL3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7VHVpQ29udGV4dH0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge1R1aUJ1dHRvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHtUdWlJY29ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHtUVUlfVElMRVNfUkVPUkRFUiwgVHVpVGlsZXMsIHR1aVRpbGVzU2hpZnR9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy90aWxlcyc7XG5pbXBvcnQgdHlwZSB7UG9seW1vcnBoZXVzQ29udGVudH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5pbXBvcnQge1BvbHltb3JwaGV1c091dGxldCwgUG9seW1vcnBoZXVzVGVtcGxhdGV9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuXG5pbXBvcnQge1RVSV9SRU9SREVSX09QVElPTlN9IGZyb20gJy4vcmVvcmRlci5vcHRpb25zJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1yZW9yZGVyJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgTmdGb3JPZixcbiAgICAgICAgUG9seW1vcnBoZXVzT3V0bGV0LFxuICAgICAgICBQb2x5bW9ycGhldXNUZW1wbGF0ZSxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlJY29uLFxuICAgICAgICBUdWlUaWxlcyxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9yZW9yZGVyLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Jlb3JkZXIuc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUVUlfVElMRVNfUkVPUkRFUixcbiAgICAgICAgICAgIHVzZVZhbHVlOiB0dWlUaWxlc1NoaWZ0LFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnKGZvY3Vzb3V0LnN0b3ApJzogJygwKScsXG4gICAgICAgICcocG9pbnRlcmRvd24uem9uZWxlc3MpJzogJ29uRHJhZygpJyxcbiAgICAgICAgJyhkb2N1bWVudDpwb2ludGVydXAuem9uZWxlc3MpJzogJ29uRHJvcCgpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlSZW9yZGVyPFQ+IHtcbiAgICBwcml2YXRlIGRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgb3JkZXIgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIHByb3RlY3RlZCB1bnNvcnRlZEl0ZW1zOiByZWFkb25seSBUW10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfUkVPUkRFUl9PUFRJT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0hpZGVUZXh0JCA9IGluamVjdChUVUlfVEFCTEVfU0hPV19ISURFX01FU1NBR0UpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZW5hYmxlZDogcmVhZG9ubHkgVFtdID0gW107XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBlbmFibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXRlbXMoaXRlbXM6IHJlYWRvbmx5IFRbXSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBpdGVtcy5sZW5ndGggIT09IHRoaXMudW5zb3J0ZWRJdGVtcy5sZW5ndGggfHxcbiAgICAgICAgICAgICFpdGVtcy5ldmVyeSgoaXRlbSkgPT4gdGhpcy51bnNvcnRlZEl0ZW1zLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudW5zb3J0ZWRJdGVtcyA9IGl0ZW1zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29udGVudDogUG9seW1vcnBoZXVzQ29udGVudDxUdWlDb250ZXh0PFQ+ICYge2luZGV4OiBudW1iZXJ9PiA9ICh7XG4gICAgICAgICRpbXBsaWNpdCxcbiAgICB9KSA9PiBTdHJpbmcoJGltcGxpY2l0KTtcblxuICAgIHByb3RlY3RlZCBvbkRyYWcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRyb3AoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzRW5hYmxlZChpdGVtOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWQuaW5jbHVkZXMoaXRlbSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEljb24oaXRlbTogVCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRW5hYmxlZChpdGVtKSA/IHRoaXMub3B0aW9ucy5pY29ucy5oaWRlIDogdGhpcy5vcHRpb25zLmljb25zLnNob3c7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZSh0b2dnbGVkOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRoaXMuaXNFbmFibGVkKHRvZ2dsZWQpXG4gICAgICAgICAgICA/IHRoaXMuZW5hYmxlZC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHRvZ2dsZWQpXG4gICAgICAgICAgICA6IHRoaXMuZW5hYmxlZC5jb25jYXQodG9nZ2xlZCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG1vdmUoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSB0aGlzLm9yZGVyLmdldChpbmRleCkgPz8gaW5kZXg7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKCFvbGRJbmRleCAmJiBkaXJlY3Rpb24gPCAwKSB8fFxuICAgICAgICAgICAgKG9sZEluZGV4ID09PSB0aGlzLnVuc29ydGVkSXRlbXMubGVuZ3RoIC0gMSAmJiBkaXJlY3Rpb24gPiAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gb2xkSW5kZXggKyBkaXJlY3Rpb247XG4gICAgICAgIGNvbnN0IG9sZEl0ZW0gPSBBcnJheS5mcm9tKHRoaXMub3JkZXIudmFsdWVzKCkpLmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtID09PSBuZXdJbmRleCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9yZGVyLnNldChpbmRleCwgbmV3SW5kZXgpO1xuICAgICAgICB0aGlzLm9yZGVyLnNldChvbGRJdGVtLCBvbGRJbmRleCk7XG4gICAgICAgIHRoaXMub3JkZXIgPSBuZXcgTWFwKHRoaXMub3JkZXIpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlSXRlbXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNvcnRlZEl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gbmV3IEFycmF5KHRoaXMudW5zb3J0ZWRJdGVtcy5sZW5ndGgpO1xuXG4gICAgICAgIHRoaXMudW5zb3J0ZWRJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbXNbdGhpcy5vcmRlci5nZXQoaW5kZXgpID8/IGluZGV4XSA9IGl0ZW07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1zQ2hhbmdlLmVtaXQodGhpcy5nZXRTb3J0ZWRJdGVtcygpKTtcbiAgICAgICAgdGhpcy51cGRhdGVFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVFbmFibGVkKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5nZXRTb3J0ZWRJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gdGhpcy5pc0VuYWJsZWQoaXRlbSkpO1xuXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICAgIHRoaXMuZW5hYmxlZENoYW5nZS5lbWl0KGVuYWJsZWQpO1xuICAgIH1cbn1cbiIsIjx0dWktdGlsZXNcbiAgICBjbGFzcz1cInQtd3JhcHBlclwiXG4gICAgWyhvcmRlcildPVwib3JkZXJcIlxuPlxuICAgIDx0dWktdGlsZVxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB1bnNvcnRlZEl0ZW1zOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgICAgIFtzdHlsZS5vcmRlcl09XCJvcmRlci5nZXQoaW5kZXgpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwidC1pdGVtXCJcbiAgICAgICAgICAgIFtjbGFzcy50LWl0ZW1fZGlzYWJsZWRdPVwiIWlzRW5hYmxlZChpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB0dWlUaWxlSGFuZGxlXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWRyYWdnYWJsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9ucy5pY29ucy5kcmFnXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnBvbHltb3JwaGV1c091dGxldD1cImNvbnRlbnQgYXMgdGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpbmRleH1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdGVtcGxhdGUgfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbaWNvblN0YXJ0XT1cImdldEljb24oaXRlbSlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoaXRlbSlcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93RG93bi5wcmV2ZW50KT1cIm1vdmUoaW5kZXgsIDEpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5hcnJvd1VwLnByZXZlbnQpPVwibW92ZShpbmRleCwgLTEpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBzaG93SGlkZVRleHQkIHwgYXN5bmMgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3R1aS10aWxlPlxuPC90dWktdGlsZXM+XG4iXX0=