UNPKG

@circe/table

Version:
177 lines 27.8 kB
import { PaginationComponent } from '@circe/pagination'; import { BehaviorSubject, combineLatest, isObservable, Subject } from 'rxjs'; import { ToolService } from '@circe/core'; import { map, takeUntil } from 'rxjs/operators'; export class TableSource { constructor(data, _filter, _paginator, _sorter) { this.totalItems$ = new BehaviorSubject(0); this._data$ = new BehaviorSubject([]); this._filter$ = new BehaviorSubject([]); this._sorter$ = new BehaviorSubject(null); this._paginator$ = new BehaviorSubject(null); this._renderChanges$ = new BehaviorSubject([]); this.cancelStream$ = new Subject(); if (data) { this.data = data; } if (_filter) { this.filter = _filter; } if (_sorter) { this.sorter = _sorter; } if (_paginator) { this.paginator = _paginator; } this._getDataObservable(); } get data() { return this._data$; } set data(data) { var _a; if (data) { if (isObservable(data)) { (_a = this._dataSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._dataSubscription = data.subscribe((data) => this._data$.next(data)); } else { this._data$.next(data); } } } get filter() { return this._filter$; } set filter(filter) { var _a; if (filter) { if (isObservable(filter)) { (_a = this._filterSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._filterSubscription = filter.subscribe((filter) => this._filter$.next(filter)); } else { this._filter$.next(filter); } } } get sorter() { return this._sorter$; } set sorter(sorter) { var _a; if (sorter) { if (isObservable(sorter)) { (_a = this._sortSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._sortSubscription = sorter.subscribe((sort) => this._sorter$.next(sort)); } else { this._sorter$.next(sorter); } } } get paginator() { return this._paginator$; } set paginator(paginator) { var _a; if (paginator) { if (isObservable(paginator)) { (_a = this._pageSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._pageSubscription = paginator.subscribe((page) => this._paginator$.next(page)); } else { this._paginator$.next(paginator); } } } static sortRows(rows, columnId, order = 'asc') { const _output = rows.map((e) => { return (e[columnId] === undefined) ? Object.assign(Object.assign({}, e), { [columnId]: '' }) : (e[columnId] === 0) ? Object.assign(Object.assign({}, e), { [columnId]: '0' }) : e; }).sort((a, b) => (order === 'asc') ? (a[columnId] > b[columnId] ? 1 : -1) : (a[columnId] < b[columnId] ? 1 : -1)); return _output; } static filterRows(rows, filters) { const _output = rows .filter((row) => { const _filterSuccess = filters.filter((f) => !!f.columns && !!f.value).every((f) => { return f.columns.some((columnId) => { const _value = ToolService.getValueFromMultiLevelObject(row, String(columnId)).toString().toLowerCase(); const _filterValue = f.value.toString().toLowerCase(); return f.searchExactly ? _value === _filterValue : _value.includes(_filterValue); }); }); return _filterSuccess; }); return _output; } _getDataObservable() { var _a; let _dataStream = isObservable(this._data$) ? this._data$ : new BehaviorSubject(this._data$); let _filterStream = isObservable(this._filter$) ? this._filter$ : new BehaviorSubject(this._filter$); let _sortStream = isObservable(this._sorter$) ? this._sorter$ : new BehaviorSubject(this._sorter$); let _pageStream = isObservable(this._paginator$) ? this._paginator$ : new BehaviorSubject(this._paginator$); this.cancelStream$.next(); _dataStream = _dataStream.pipe(takeUntil(this.cancelStream$)); _filterStream = _filterStream.pipe(takeUntil(this.cancelStream$)); _sortStream = _sortStream.pipe(takeUntil(this.cancelStream$)); _pageStream = _pageStream.pipe(takeUntil(this.cancelStream$)); const _filteredData = combineLatest([_dataStream, _filterStream]) .pipe(map(([data, filters]) => { return this._filterRows(data, filters); })); const _orderedData = combineLatest([_filteredData, _sortStream]) .pipe(map(([data, sort]) => { return this._orderRows(data, sort); })); const _paginatedData = combineLatest([_orderedData, _pageStream]) .pipe(map(([data, page]) => { return this._pageRows(data, page); })); (_a = this._renderChangesSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._renderChangesSubscription = _paginatedData.subscribe((d) => { this._renderChanges$.next(d); }); } _filterRows(data, filters) { if (!(filters === null || filters === void 0 ? void 0 : filters.length)) { this.totalItems$.next(data.length); return data; } const _filteredData = TableSource.filterRows(data, filters); const _actualPage = isObservable(this._paginator$) ? this._paginator$.value : this._paginator$; const _newPage = { pageFirstItem: 0, itemsPerPage: _actualPage === null || _actualPage === void 0 ? void 0 : _actualPage.itemsPerPage }; if (this._paginator$) { this._paginator$.next(_newPage); this.totalItems$.next(_filteredData.length); } return _filteredData; } _orderRows(data, sort) { if (!sort || !sort.columnId || !sort.sortType) { return data; } return [...TableSource.sortRows(data.slice(), sort.columnId, sort.sortType)]; } _pageRows(data, page) { if (!!page && !!page.itemsPerPage && page.pageFirstItem >= 0) { const startIndex = page.pageFirstItem; return data.slice(startIndex, startIndex + (page.itemsPerPage)); } return data; } _isPaginationComponent(obj) { return !!obj && (obj instanceof PaginationComponent || (typeof obj.ngOnInit === 'function' && typeof obj.ngOnChanges === 'function')); } connect() { return this._renderChanges$; } } export function _isTableSource(obj) { return !!obj && (obj instanceof TableSource || (typeof obj.connect === 'function')); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFibGUvc3JjL2xpYi90YWJsZS1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFrQixPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNHLE9BQU8sRUFBUyxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRCxNQUFNLE9BQU8sV0FBVztJQTRFdEIsWUFDRSxJQUFnQyxFQUNoQyxPQUE4RCxFQUM5RCxVQUFpRCxFQUNqRCxPQUFzRDtRQS9FakQsZ0JBQVcsR0FBNEIsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7UUErRHJFLFdBQU0sR0FBeUIsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsYUFBUSxHQUFzQyxJQUFJLGVBQWUsQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFDeEYsYUFBUSxHQUFrQyxJQUFJLGVBQWUsQ0FBZSxJQUFJLENBQUMsQ0FBQztRQUNsRixnQkFBVyxHQUE4QixJQUFJLGVBQWUsQ0FBVyxJQUFJLENBQUMsQ0FBQztRQUM3RSxvQkFBZSxHQUF5QixJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUNyRSxrQkFBYSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBYXpELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7U0FDbEI7UUFFRCxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztTQUN2QjtRQUVELElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBL0ZELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxJQUFJLENBQUMsSUFBZ0M7O1FBQzlDLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLE1BQUEsSUFBSSxDQUFDLGlCQUFpQiwwQ0FBRSxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDaEY7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLE1BQTREOztRQUM1RSxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN4QixNQUFBLElBQUksQ0FBQyxtQkFBbUIsMENBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBd0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN2RztpQkFBTTtnQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtTQUNGO0lBQ0gsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxNQUFNLENBQUMsTUFBb0Q7O1FBQ3BFLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hCLE1BQUEsSUFBSSxDQUFDLGlCQUFpQiwwQ0FBRSxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzdGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsU0FBK0M7O1FBQ2xFLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzNCLE1BQUEsSUFBSSxDQUFDLGlCQUFpQiwwQ0FBRSxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDL0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbEM7U0FDRjtJQUNILENBQUM7SUF1Q00sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFXLEVBQUUsUUFBZSxFQUFFLFFBQXdCLEtBQUs7UUFDaEYsTUFBTSxPQUFPLEdBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxpQ0FBTSxDQUFDLEtBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQU0sQ0FBQyxLQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEgsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVcsRUFBRSxPQUF5QjtRQUM3RCxNQUFNLE9BQU8sR0FBVSxJQUFJO2FBQ3hCLE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ25CLE1BQU0sY0FBYyxHQUFZLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWlCLEVBQUUsRUFBRTtnQkFDMUgsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWUsRUFBRSxFQUFFO29CQUN4QyxNQUFNLE1BQU0sR0FBVyxXQUFXLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNoSCxNQUFNLFlBQVksR0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUM5RCxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ25GLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxrQkFBa0I7O1FBQ3hCLElBQUksV0FBVyxHQUFvQixZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksYUFBYSxHQUFpQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQW1CLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RSxJQUFJLFdBQVcsR0FBNkIsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFlLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxJQUFJLFdBQVcsR0FBeUIsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM5RCxhQUFhLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzlELFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUU5RCxNQUFNLGFBQWEsR0FBb0IsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQy9FLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQTBCLEVBQUUsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTixNQUFNLFlBQVksR0FBb0IsYUFBYSxDQUFDLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQzlFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQXNCLEVBQUUsRUFBRTtZQUM5QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTixNQUFNLGNBQWMsR0FBb0IsYUFBYSxDQUFDLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQy9FLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQWtCLEVBQUUsRUFBRTtZQUMxQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTixNQUFBLElBQUksQ0FBQywwQkFBMEIsMENBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLDBCQUEwQixHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBUyxFQUFFLE9BQXlCO1FBQ3RELElBQUksQ0FBQyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLENBQUEsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sYUFBYSxHQUFRLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFhLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pHLE1BQU0sUUFBUSxHQUFhLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFlBQVksRUFBRSxDQUFDO1FBQ3pGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRU8sVUFBVSxDQUFDLElBQVMsRUFBRSxJQUFrQjtRQUM5QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFTLEVBQUUsSUFBYztRQUN6QyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUU7WUFDNUQsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsR0FBUTtRQUNyQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLFlBQVksbUJBQW1CLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssVUFBVSxJQUFJLE9BQU8sR0FBRyxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxjQUFjLENBQUksR0FBUTtJQUN4QyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLFlBQVksV0FBVyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDdEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2luYXRlLCBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQGNpcmNlL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5wYUlkLCBUb29sU2VydmljZSB9IGZyb20gJ0BjaXJjZS9jb3JlJztcbmltcG9ydCB7IG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTnBhVGFibGVGaWx0ZXIsIE5wYVRhYmxlU29ydCB9IGZyb20gJy4vdGFibGUudHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGFibGVTb3VyY2U8VD4ge1xuICBwdWJsaWMgdG90YWxJdGVtcyQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG5cbiAgcHVibGljIGdldCBkYXRhKCk6IFRbXSB8IEJlaGF2aW9yU3ViamVjdDxUW10+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YSQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogVFtdIHwgQmVoYXZpb3JTdWJqZWN0PFRbXT4pIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShkYXRhKSkge1xuICAgICAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uID0gZGF0YS5zdWJzY3JpYmUoKGRhdGE6IFRbXSkgPT4gdGhpcy5fZGF0YSQubmV4dChkYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhJC5uZXh0KGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyKCk6IE5wYVRhYmxlRmlsdGVyW10gfCBCZWhhdmlvclN1YmplY3Q8TnBhVGFibGVGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIkO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXIoZmlsdGVyOiBOcGFUYWJsZUZpbHRlcltdIHwgQmVoYXZpb3JTdWJqZWN0PE5wYVRhYmxlRmlsdGVyW10+KSB7XG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShmaWx0ZXIpKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZmlsdGVyU3Vic2NyaXB0aW9uID0gZmlsdGVyLnN1YnNjcmliZSgoZmlsdGVyOiBOcGFUYWJsZUZpbHRlcltdKSA9PiB0aGlzLl9maWx0ZXIkLm5leHQoZmlsdGVyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9maWx0ZXIkLm5leHQoZmlsdGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNvcnRlcigpOiBOcGFUYWJsZVNvcnQgfCBCZWhhdmlvclN1YmplY3Q8TnBhVGFibGVTb3J0PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRlciQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNvcnRlcihzb3J0ZXI6IE5wYVRhYmxlU29ydCB8IEJlaGF2aW9yU3ViamVjdDxOcGFUYWJsZVNvcnQ+KSB7XG4gICAgaWYgKHNvcnRlcikge1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShzb3J0ZXIpKSB7XG4gICAgICAgIHRoaXMuX3NvcnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3NvcnRTdWJzY3JpcHRpb24gPSBzb3J0ZXIuc3Vic2NyaWJlKChzb3J0OiBOcGFUYWJsZVNvcnQpID0+IHRoaXMuX3NvcnRlciQubmV4dChzb3J0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zb3J0ZXIkLm5leHQoc29ydGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2luYXRvcigpOiBQYWdpbmF0ZSB8IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0ZT4ge1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0b3IkO1xuICB9XG5cbiAgcHVibGljIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBQYWdpbmF0ZSB8IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0ZT4pIHtcbiAgICBpZiAocGFnaW5hdG9yKSB7XG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKHBhZ2luYXRvcikpIHtcbiAgICAgICAgdGhpcy5fcGFnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fcGFnZVN1YnNjcmlwdGlvbiA9IHBhZ2luYXRvci5zdWJzY3JpYmUoKHBhZ2U6IFBhZ2luYXRlKSA9PiB0aGlzLl9wYWdpbmF0b3IkLm5leHQocGFnZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdG9yJC5uZXh0KHBhZ2luYXRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDxUW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxOcGFUYWJsZUZpbHRlcltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TnBhVGFibGVGaWx0ZXJbXT4oW10pO1xuICBwcml2YXRlIF9zb3J0ZXIkOiBCZWhhdmlvclN1YmplY3Q8TnBhVGFibGVTb3J0PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TnBhVGFibGVTb3J0PihudWxsKTtcbiAgcHJpdmF0ZSBfcGFnaW5hdG9yJDogQmVoYXZpb3JTdWJqZWN0PFBhZ2luYXRlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFnaW5hdGU+KG51bGwpO1xuICBwcml2YXRlIF9yZW5kZXJDaGFuZ2VzJDogQmVoYXZpb3JTdWJqZWN0PFRbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4oW10pO1xuICBwcml2YXRlIGNhbmNlbFN0cmVhbSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX2RhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfZmlsdGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX3NvcnRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfcGFnZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6IFRbXSB8IEJlaGF2aW9yU3ViamVjdDxUW10+LFxuICAgIF9maWx0ZXI/OiBOcGFUYWJsZUZpbHRlcltdIHwgQmVoYXZpb3JTdWJqZWN0PE5wYVRhYmxlRmlsdGVyW10+LFxuICAgIF9wYWdpbmF0b3I/OiBQYWdpbmF0ZSB8IEJlaGF2aW9yU3ViamVjdDxQYWdpbmF0ZT4sXG4gICAgX3NvcnRlcj86IE5wYVRhYmxlU29ydCB8IEJlaGF2aW9yU3ViamVjdDxOcGFUYWJsZVNvcnQ+XG4gICkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGlmIChfZmlsdGVyKSB7XG4gICAgICB0aGlzLmZpbHRlciA9IF9maWx0ZXI7XG4gICAgfVxuXG4gICAgaWYgKF9zb3J0ZXIpIHtcbiAgICAgIHRoaXMuc29ydGVyID0gX3NvcnRlcjtcbiAgICB9XG5cbiAgICBpZiAoX3BhZ2luYXRvcikge1xuICAgICAgdGhpcy5wYWdpbmF0b3IgPSBfcGFnaW5hdG9yO1xuICAgIH1cblxuICAgIHRoaXMuX2dldERhdGFPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNvcnRSb3dzKHJvd3M6IGFueVtdLCBjb2x1bW5JZDogTnBhSWQsIG9yZGVyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnKTogYW55W10ge1xuICAgIGNvbnN0IF9vdXRwdXQ6IGFueVtdID0gcm93cy5tYXAoKGU6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChlW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSA/IHsgLi4uZSwgW2NvbHVtbklkXTogJycgfSA6IChlW2NvbHVtbklkXSA9PT0gMCkgPyB7IC4uLmUsIFtjb2x1bW5JZF06ICcwJyB9IDogZTtcbiAgICB9KS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gKG9yZGVyID09PSAnYXNjJykgPyAoYVtjb2x1bW5JZF0gPiBiW2NvbHVtbklkXSA/IDEgOiAtMSkgOiAoYVtjb2x1bW5JZF0gPCBiW2NvbHVtbklkXSA/IDEgOiAtMSkpO1xuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJSb3dzKHJvd3M6IGFueVtdLCBmaWx0ZXJzOiBOcGFUYWJsZUZpbHRlcltdKTogYW55W10ge1xuICAgIGNvbnN0IF9vdXRwdXQ6IGFueVtdID0gcm93c1xuICAgICAgLmZpbHRlcigocm93OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgX2ZpbHRlclN1Y2Nlc3M6IGJvb2xlYW4gPSBmaWx0ZXJzLmZpbHRlcigoZjogTnBhVGFibGVGaWx0ZXIpID0+ICEhZi5jb2x1bW5zICYmICEhZi52YWx1ZSkuZXZlcnkoKGY6IE5wYVRhYmxlRmlsdGVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGYuY29sdW1ucy5zb21lKChjb2x1bW5JZDogTnBhSWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF92YWx1ZTogc3RyaW5nID0gVG9vbFNlcnZpY2UuZ2V0VmFsdWVGcm9tTXVsdGlMZXZlbE9iamVjdChyb3csIFN0cmluZyhjb2x1bW5JZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IF9maWx0ZXJWYWx1ZTogc3RyaW5nID0gZi52YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gZi5zZWFyY2hFeGFjdGx5ID8gX3ZhbHVlID09PSBfZmlsdGVyVmFsdWUgOiBfdmFsdWUuaW5jbHVkZXMoX2ZpbHRlclZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBfZmlsdGVyU3VjY2VzcztcbiAgICAgIH0pO1xuICAgIHJldHVybiBfb3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGF0YU9ic2VydmFibGUoKTogdm9pZCB7XG4gICAgbGV0IF9kYXRhU3RyZWFtOiBPYnNlcnZhYmxlPFRbXT4gPSBpc09ic2VydmFibGUodGhpcy5fZGF0YSQpID9cbiAgICAgIHRoaXMuX2RhdGEkIDogbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KHRoaXMuX2RhdGEkKTtcbiAgICBsZXQgX2ZpbHRlclN0cmVhbTogT2JzZXJ2YWJsZTxOcGFUYWJsZUZpbHRlcltdPiA9IGlzT2JzZXJ2YWJsZSh0aGlzLl9maWx0ZXIkKSA/XG4gICAgICB0aGlzLl9maWx0ZXIkIDogbmV3IEJlaGF2aW9yU3ViamVjdDxOcGFUYWJsZUZpbHRlcltdPih0aGlzLl9maWx0ZXIkKTtcbiAgICBsZXQgX3NvcnRTdHJlYW06IE9ic2VydmFibGU8TnBhVGFibGVTb3J0PiA9IGlzT2JzZXJ2YWJsZSh0aGlzLl9zb3J0ZXIkKSA/XG4gICAgICB0aGlzLl9zb3J0ZXIkIDogbmV3IEJlaGF2aW9yU3ViamVjdDxOcGFUYWJsZVNvcnQ+KHRoaXMuX3NvcnRlciQpO1xuICAgIGxldCBfcGFnZVN0cmVhbTogT2JzZXJ2YWJsZTxQYWdpbmF0ZT4gPSBpc09ic2VydmFibGUodGhpcy5fcGFnaW5hdG9yJCkgP1xuICAgICAgdGhpcy5fcGFnaW5hdG9yJCA6IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFnaW5hdGU+KHRoaXMuX3BhZ2luYXRvciQpO1xuXG4gICAgdGhpcy5jYW5jZWxTdHJlYW0kLm5leHQoKTtcbiAgICBfZGF0YVN0cmVhbSA9IF9kYXRhU3RyZWFtLnBpcGUodGFrZVVudGlsKHRoaXMuY2FuY2VsU3RyZWFtJCkpO1xuICAgIF9maWx0ZXJTdHJlYW0gPSBfZmlsdGVyU3RyZWFtLnBpcGUodGFrZVVudGlsKHRoaXMuY2FuY2VsU3RyZWFtJCkpO1xuICAgIF9zb3J0U3RyZWFtID0gX3NvcnRTdHJlYW0ucGlwZSh0YWtlVW50aWwodGhpcy5jYW5jZWxTdHJlYW0kKSk7XG4gICAgX3BhZ2VTdHJlYW0gPSBfcGFnZVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLmNhbmNlbFN0cmVhbSQpKTtcblxuICAgIGNvbnN0IF9maWx0ZXJlZERhdGE6IE9ic2VydmFibGU8VFtdPiA9IGNvbWJpbmVMYXRlc3QoW19kYXRhU3RyZWFtLCBfZmlsdGVyU3RyZWFtXSlcbiAgICAgIC5waXBlKG1hcCgoW2RhdGEsIGZpbHRlcnNdOiBbVFtdLCBOcGFUYWJsZUZpbHRlcltdXSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyUm93cyhkYXRhLCBmaWx0ZXJzKTtcbiAgICAgIH0pKTtcbiAgICBjb25zdCBfb3JkZXJlZERhdGE6IE9ic2VydmFibGU8VFtdPiA9IGNvbWJpbmVMYXRlc3QoW19maWx0ZXJlZERhdGEsIF9zb3J0U3RyZWFtXSlcbiAgICAgIC5waXBlKG1hcCgoW2RhdGEsIHNvcnRdOiBbVFtdLCBOcGFUYWJsZVNvcnRdKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlclJvd3MoZGF0YSwgc29ydCk7XG4gICAgICB9KSk7XG5cbiAgICBjb25zdCBfcGFnaW5hdGVkRGF0YTogT2JzZXJ2YWJsZTxUW10+ID0gY29tYmluZUxhdGVzdChbX29yZGVyZWREYXRhLCBfcGFnZVN0cmVhbV0pXG4gICAgICAucGlwZShtYXAoKFtkYXRhLCBwYWdlXTogW1RbXSwgUGFnaW5hdGVdKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlUm93cyhkYXRhLCBwYWdlKTtcbiAgICAgIH0pKTtcblxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IF9wYWdpbmF0ZWREYXRhLnN1YnNjcmliZSgoZDogVFtdKSA9PiB7XG4gICAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzJC5uZXh0KGQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyUm93cyhkYXRhOiBUW10sIGZpbHRlcnM6IE5wYVRhYmxlRmlsdGVyW10pOiBUW10ge1xuICAgIGlmICghZmlsdGVycz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbXMkLm5leHQoZGF0YS5sZW5ndGgpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY29uc3QgX2ZpbHRlcmVkRGF0YTogVFtdID0gVGFibGVTb3VyY2UuZmlsdGVyUm93cyhkYXRhLCBmaWx0ZXJzKTtcbiAgICBjb25zdCBfYWN0dWFsUGFnZTogUGFnaW5hdGUgPSBpc09ic2VydmFibGUodGhpcy5fcGFnaW5hdG9yJCkgPyB0aGlzLl9wYWdpbmF0b3IkLnZhbHVlIDogdGhpcy5fcGFnaW5hdG9yJDtcbiAgICBjb25zdCBfbmV3UGFnZTogUGFnaW5hdGUgPSB7IHBhZ2VGaXJzdEl0ZW06IDAsIGl0ZW1zUGVyUGFnZTogX2FjdHVhbFBhZ2U/Lml0ZW1zUGVyUGFnZSB9O1xuICAgIGlmICh0aGlzLl9wYWdpbmF0b3IkKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0b3IkLm5leHQoX25ld1BhZ2UpO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zJC5uZXh0KF9maWx0ZXJlZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2ZpbHRlcmVkRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgX29yZGVyUm93cyhkYXRhOiBUW10sIHNvcnQ6IE5wYVRhYmxlU29ydCk6IFRbXSB7XG4gICAgaWYgKCFzb3J0IHx8ICFzb3J0LmNvbHVtbklkIHx8ICFzb3J0LnNvcnRUeXBlKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5UYWJsZVNvdXJjZS5zb3J0Um93cyhkYXRhLnNsaWNlKCksIHNvcnQuY29sdW1uSWQsIHNvcnQuc29ydFR5cGUpXTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhZ2VSb3dzKGRhdGE6IFRbXSwgcGFnZTogUGFnaW5hdGUpOiBUW10ge1xuICAgIGlmICghIXBhZ2UgJiYgISFwYWdlLml0ZW1zUGVyUGFnZSAmJiBwYWdlLnBhZ2VGaXJzdEl0ZW0gPj0gMCkge1xuICAgICAgY29uc3Qgc3RhcnRJbmRleDogbnVtYmVyID0gcGFnZS5wYWdlRmlyc3RJdGVtO1xuICAgICAgcmV0dXJuIGRhdGEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIChwYWdlLml0ZW1zUGVyUGFnZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNQYWdpbmF0aW9uQ29tcG9uZW50KG9iajogYW55KTogb2JqIGlzIFBhZ2luYXRpb25Db21wb25lbnQge1xuICAgIHJldHVybiAhIW9iaiAmJiAob2JqIGluc3RhbmNlb2YgUGFnaW5hdGlvbkNvbXBvbmVudCB8fCAodHlwZW9mIG9iai5uZ09uSW5pdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSk7XG4gIH1cblxuICBwdWJsaWMgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJDaGFuZ2VzJDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzVGFibGVTb3VyY2U8VD4ob2JqOiBhbnkpOiBvYmogaXMgVGFibGVTb3VyY2U8VD4ge1xuICByZXR1cm4gISFvYmogJiYgKG9iaiBpbnN0YW5jZW9mIFRhYmxlU291cmNlIHx8ICh0eXBlb2Ygb2JqLmNvbm5lY3QgPT09ICdmdW5jdGlvbicpKTtcbn1cbiJdfQ==