UNPKG

@taiga-ui/addon-table

Version:

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

133 lines 18.9 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, EventEmitter, inject, Input, Output, signal, ViewEncapsulation, } from '@angular/core'; import { WA_INTERSECTION_ROOT_MARGIN } from '@ng-web-apis/intersection-observer'; import { tuiProvide, tuiWithStyles } from '@taiga-ui/cdk/utils/miscellaneous'; import { tuiButtonOptionsProvider } from '@taiga-ui/core/components/button'; import { TUI_TEXTFIELD_OPTIONS, } from '@taiga-ui/core/components/textfield'; import { tuiBadgeOptionsProvider } from '@taiga-ui/kit/components/badge'; import { tuiChipOptionsProvider } from '@taiga-ui/kit/components/chip'; import { tuiProgressOptionsProvider } from '@taiga-ui/kit/components/progress'; import { combineLatest, debounceTime, map, Subject } from 'rxjs'; import { TUI_TABLE_OPTIONS, TuiSortDirection, } from '../table.options'; import { TuiStuck } from './stuck.directive'; import * as i0 from "@angular/core"; import * as i1 from "./stuck.directive"; const EMPTY_COMPARATOR = () => 0; class TuiTableStyles { static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableStyles, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiTableStyles, isStandalone: true, selector: "ng-component", host: { classAttribute: "tui-table" }, ngImport: i0, template: '', isInline: true, styles: ["table[tuiTable]{border-collapse:separate;border-spacing:0}table[tuiTable] [tuiCell]{padding:0}table[tuiTable] [tuiTitle]{white-space:nowrap}table[tuiTable] [tuiTitle] tui-icon{font-size:1rem}table[tuiTable] [tuiSubtitle]{color:var(--tui-text-secondary)}table[tuiTable] [tuiTh] [tuiCell],table[tuiTable] [tuiTh] [tuiTitle]{font:inherit;color:inherit}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableStyles, decorators: [{ type: Component, args: [{ standalone: true, template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'tui-table', }, styles: ["table[tuiTable]{border-collapse:separate;border-spacing:0}table[tuiTable] [tuiCell]{padding:0}table[tuiTable] [tuiTitle]{white-space:nowrap}table[tuiTable] [tuiTitle] tui-icon{font-size:1rem}table[tuiTable] [tuiSubtitle]{color:var(--tui-text-secondary)}table[tuiTable] [tuiTh] [tuiCell],table[tuiTable] [tuiTh] [tuiTitle]{font:inherit;color:inherit}\n"] }] }] }); class TuiTableDirective { constructor() { this.options = inject(TUI_TABLE_OPTIONS); this.cdr = inject(ChangeDetectorRef); this.nothing = tuiWithStyles(TuiTableStyles); this.columns = []; this.direction = this.options.direction; this.sorter = EMPTY_COMPARATOR; /** * @deprecated: use sortChange */ this.directionChange = new EventEmitter(); /** * @deprecated: use sortChange */ this.sorterChange = new EventEmitter(); this.sortChange = combineLatest([ this.sorterChange, this.directionChange, ]).pipe(debounceTime(0), map(([sortComparator, sortDirection]) => ({ sortBy: sortComparator, orderBy: sortDirection, sortComparator, sortDirection, }))); this.appearance = signal('table'); this.size = signal(this.options.size); this.cleaner = signal(false); // TODO: refactor to signal inputs after Angular update this.change$ = new Subject(); } set sizeSetter(size) { this.size.set(size); } updateSorterAndDirection(sorter) { if (this.sorter === sorter) { this.updateSorter(this.sorter, this.direction === TuiSortDirection.Asc ? TuiSortDirection.Desc : TuiSortDirection.Asc); } else { this.updateSorter(sorter); } } ngOnChanges() { this.change$.next(); } ngAfterViewInit() { this.cdr.detectChanges(); } updateSorter(sorter, direction = TuiSortDirection.Asc) { this.sorter = sorter || EMPTY_COMPARATOR.bind({}); this.direction = direction; this.sorterChange.emit(sorter); this.directionChange.emit(this.direction); this.change$.next(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiTableDirective, isStandalone: true, selector: "table[tuiTable]", inputs: { columns: "columns", direction: "direction", sorter: "sorter", sizeSetter: ["size", "sizeSetter"] }, outputs: { directionChange: "directionChange", sorterChange: "sorterChange", sortChange: "sortChange" }, host: { properties: { "attr.data-size": "size()" } }, providers: [ { provide: WA_INTERSECTION_ROOT_MARGIN, useValue: '10000px 10000px 10000px 0px', }, tuiProvide(TUI_TEXTFIELD_OPTIONS, TuiTableDirective), tuiButtonOptionsProvider({ size: 's' }), tuiBadgeOptionsProvider({ size: 'm', appearance: 'neutral' }), tuiChipOptionsProvider({ size: 'xxs', appearance: 'neutral' }), tuiProgressOptionsProvider({ size: 's', color: 'var(--tui-text-action)' }), ], usesOnChanges: true, hostDirectives: [{ directive: i1.TuiStuck }], ngImport: i0 }); } } export { TuiTableDirective }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTableDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: 'table[tuiTable]', providers: [ { provide: WA_INTERSECTION_ROOT_MARGIN, useValue: '10000px 10000px 10000px 0px', }, tuiProvide(TUI_TEXTFIELD_OPTIONS, TuiTableDirective), tuiButtonOptionsProvider({ size: 's' }), tuiBadgeOptionsProvider({ size: 'm', appearance: 'neutral' }), tuiChipOptionsProvider({ size: 'xxs', appearance: 'neutral' }), tuiProgressOptionsProvider({ size: 's', color: 'var(--tui-text-action)' }), ], hostDirectives: [TuiStuck], host: { '[attr.data-size]': 'size()', }, }] }], propDecorators: { columns: [{ type: Input }], direction: [{ type: Input }], sorter: [{ type: Input }], directionChange: [{ type: Output }], sorterChange: [{ type: Output }], sortChange: [{ type: Output }], sizeSetter: [{ type: Input, args: ['size'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tdGFibGUvY29tcG9uZW50cy90YWJsZS9kaXJlY3RpdmVzL3RhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04saUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRS9FLE9BQU8sRUFBQyxVQUFVLEVBQUUsYUFBYSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDNUUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUUsT0FBTyxFQUNILHFCQUFxQixHQUV4QixNQUFNLHFDQUFxQyxDQUFDO0FBRTdDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3JFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBbUIsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhGLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBRW5CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1CQUFtQixDQUFDOzs7QUFFM0MsTUFBTSxnQkFBZ0IsR0FBMkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRXpELE1BVU0sY0FBYzsrR0FBZCxjQUFjO21HQUFk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a0JBQWtCLEVBQUUsUUFBUTtxQkFDL0I7aUJBQ0o7OEJBVVUsT0FBTztzQkFEYixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBT1UsZUFBZTtzQkFEOUIsTUFBTTtnQkFPUyxZQUFZO3NCQUQzQixNQUFNO2dCQUlTLFVBQVU7c0JBRHpCLE1BQU07Z0JBc0JJLFVBQVU7c0JBRHBCLEtBQUs7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgdHlwZSBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICB0eXBlIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V0FfSU5URVJTRUNUSU9OX1JPT1RfTUFSR0lOfSBmcm9tICdAbmctd2ViLWFwaXMvaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcbmltcG9ydCB7dHlwZSBUdWlDb21wYXJhdG9yfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUvdHlwZXMnO1xuaW1wb3J0IHt0dWlQcm92aWRlLCB0dWlXaXRoU3R5bGVzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHt0dWlCdXR0b25PcHRpb25zUHJvdmlkZXJ9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7XG4gICAgVFVJX1RFWFRGSUVMRF9PUFRJT05TLFxuICAgIHR5cGUgVHVpVGV4dGZpZWxkT3B0aW9ucyxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy90ZXh0ZmllbGQnO1xuaW1wb3J0IHt0eXBlIFR1aVNpemVMLCB0eXBlIFR1aVNpemVTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90eXBlcyc7XG5pbXBvcnQge3R1aUJhZGdlT3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvYmFkZ2UnO1xuaW1wb3J0IHt0dWlDaGlwT3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvY2hpcCc7XG5pbXBvcnQge3R1aVByb2dyZXNzT3B0aW9uc1Byb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvcHJvZ3Jlc3MnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIG1hcCwgdHlwZSBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgICBUVUlfVEFCTEVfT1BUSU9OUyxcbiAgICBUdWlTb3J0RGlyZWN0aW9uLFxuICAgIHR5cGUgVHVpVGFibGVTb3J0Q2hhbmdlLFxufSBmcm9tICcuLi90YWJsZS5vcHRpb25zJztcbmltcG9ydCB7VHVpU3R1Y2t9IGZyb20gJy4vc3R1Y2suZGlyZWN0aXZlJztcblxuY29uc3QgRU1QVFlfQ09NUEFSQVRPUjogVHVpQ29tcGFyYXRvcjx1bmtub3duPiA9ICgpID0+IDA7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYmxlLnN0eWxlLmxlc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICd0dWktdGFibGUnLFxuICAgIH0sXG59KVxuY2xhc3MgVHVpVGFibGVTdHlsZXMge31cblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3RhYmxlW3R1aVRhYmxlXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFdBX0lOVEVSU0VDVElPTl9ST09UX01BUkdJTixcbiAgICAgICAgICAgIHVzZVZhbHVlOiAnMTAwMDBweCAxMDAwMHB4IDEwMDAwcHggMHB4JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHVpUHJvdmlkZShUVUlfVEVYVEZJRUxEX09QVElPTlMsIFR1aVRhYmxlRGlyZWN0aXZlKSxcbiAgICAgICAgdHVpQnV0dG9uT3B0aW9uc1Byb3ZpZGVyKHtzaXplOiAncyd9KSxcbiAgICAgICAgdHVpQmFkZ2VPcHRpb25zUHJvdmlkZXIoe3NpemU6ICdtJywgYXBwZWFyYW5jZTogJ25ldXRyYWwnfSksXG4gICAgICAgIHR1aUNoaXBPcHRpb25zUHJvdmlkZXIoe3NpemU6ICd4eHMnLCBhcHBlYXJhbmNlOiAnbmV1dHJhbCd9KSxcbiAgICAgICAgdHVpUHJvZ3Jlc3NPcHRpb25zUHJvdmlkZXIoe3NpemU6ICdzJywgY29sb3I6ICd2YXIoLS10dWktdGV4dC1hY3Rpb24pJ30pLFxuICAgIF0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtUdWlTdHVja10sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuZGF0YS1zaXplXSc6ICdzaXplKCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aVRhYmxlRGlyZWN0aXZlPFQgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCB1bmtub3duPj4+XG4gICAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBUdWlUZXh0ZmllbGRPcHRpb25zLCBPbkNoYW5nZXNcbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoVFVJX1RBQkxFX09QVElPTlMpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBub3RoaW5nID0gdHVpV2l0aFN0eWxlcyhUdWlUYWJsZVN0eWxlcyk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5zOiBSZWFkb25seUFycmF5PHN0cmluZyB8IGtleW9mIFQ+ID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc29ydGVyOiBUdWlDb21wYXJhdG9yPFQ+ID0gRU1QVFlfQ09NUEFSQVRPUjtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkOiB1c2Ugc29ydENoYW5nZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBkaXJlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aVNvcnREaXJlY3Rpb24+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZDogdXNlIHNvcnRDaGFuZ2VcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgc29ydGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlDb21wYXJhdG9yPFQ+IHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBzb3J0Q2hhbmdlOiBPYnNlcnZhYmxlPFR1aVRhYmxlU29ydENoYW5nZTxUPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5zb3J0ZXJDaGFuZ2UsXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uQ2hhbmdlLFxuICAgIF0pLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgbWFwKChbc29ydENvbXBhcmF0b3IsIHNvcnREaXJlY3Rpb25dKSA9PiAoe1xuICAgICAgICAgICAgc29ydEJ5OiBzb3J0Q29tcGFyYXRvcixcbiAgICAgICAgICAgIG9yZGVyQnk6IHNvcnREaXJlY3Rpb24sXG4gICAgICAgICAgICBzb3J0Q29tcGFyYXRvcixcbiAgICAgICAgICAgIHNvcnREaXJlY3Rpb24sXG4gICAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcGVhcmFuY2UgPSBzaWduYWwoJ3RhYmxlJyk7XG4gICAgcHVibGljIHJlYWRvbmx5IHNpemUgPSBzaWduYWwodGhpcy5vcHRpb25zLnNpemUpO1xuICAgIHB1YmxpYyByZWFkb25seSBjbGVhbmVyID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIC8vIFRPRE86IHJlZmFjdG9yIHRvIHNpZ25hbCBpbnB1dHMgYWZ0ZXIgQW5ndWxhciB1cGRhdGVcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBASW5wdXQoJ3NpemUnKVxuICAgIHB1YmxpYyBzZXQgc2l6ZVNldHRlcihzaXplOiBUdWlTaXplTCB8IFR1aVNpemVTKSB7XG4gICAgICAgIHRoaXMuc2l6ZS5zZXQoc2l6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVNvcnRlckFuZERpcmVjdGlvbihzb3J0ZXI6IFR1aUNvbXBhcmF0b3I8VD4gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRlciA9PT0gc29ydGVyKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNvcnRlcihcbiAgICAgICAgICAgICAgICB0aGlzLnNvcnRlcixcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gVHVpU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgICAgICAgICAgPyBUdWlTb3J0RGlyZWN0aW9uLkRlc2NcbiAgICAgICAgICAgICAgICAgICAgOiBUdWlTb3J0RGlyZWN0aW9uLkFzYyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNvcnRlcihzb3J0ZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYW5nZSQubmV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlU29ydGVyKFxuICAgICAgICBzb3J0ZXI6IFR1aUNvbXBhcmF0b3I8VD4gfCBudWxsLFxuICAgICAgICBkaXJlY3Rpb246IFR1aVNvcnREaXJlY3Rpb24gPSBUdWlTb3J0RGlyZWN0aW9uLkFzYyxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zb3J0ZXIgPSBzb3J0ZXIgfHwgRU1QVFlfQ09NUEFSQVRPUi5iaW5kKHt9KTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgIHRoaXMuc29ydGVyQ2hhbmdlLmVtaXQoc29ydGVyKTtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuY2hhbmdlJC5uZXh0KCk7XG4gICAgfVxufVxuIl19