UNPKG

ngx-mat-multi-sort-fork

Version:

An extension for the angular material table to support multi-sorting.

208 lines 30.5 kB
import { Subject, BehaviorSubject, delay, filter, tap } from 'rxjs'; import { Settings } from './utils'; export class TableData { // TODO refactor constructor(columns, options) { this._nextObservable = new Subject(); this._previousObservable = new Subject(); this._sizeObservable = new Subject(); this._sortObservable = new Subject(); this._sortHeadersObservable = new Subject(); this._columns = new BehaviorSubject(columns.map(c => { if (c.isActive === undefined) { c.isActive = true; } return c; })); this._displayedColumns = this._columns.value.filter(c => c.isActive).map(c => c.id); if (options) { if (options.pageSizeOptions && options.pageSizeOptions.length < 1) { throw Error('Array of pageSizeOptions must contain at least one entry'); } if (options.defaultSortParams) { options.defaultSortParams.map(s => { if (!this._displayedColumns.includes(s)) { throw Error(`Provided sort parameter "${s}" is not a column.`); } }); } this._sortParams = options.defaultSortParams || []; this._sortDirs = options.defaultSortDirs || []; if (this._sortParams.length !== this._sortDirs.length) { this._sortDirs = this._sortParams.map(() => 'asc'); } this._totalElements = options.totalElements || 0; this._pageSizeOptions = options.pageSizeOptions || [10, 20, 50, 100]; this._key = options.localStorageKey; } else { this._pageSizeOptions = [10, 20, 50, 100]; this._sortParams = []; this._sortDirs = []; } this.init(); } onSortEvent() { this._sortParams = this._dataSource.sort['actives']; this._sortDirs = this._dataSource.sort['directions']; this._clientSideSort(); this._sortObservable.next(); this.storeTableSettings(); } onPaginationEvent($event) { const tmpPageSize = this.pageSize; this.pageSize = $event.pageSize; this.pageIndex = $event.pageIndex; if (tmpPageSize !== this.pageSize) { this._sizeObservable.next(); } else if ($event.previousPageIndex && $event.previousPageIndex < $event.pageIndex) { this._nextObservable.next(); } else if ($event.previousPageIndex && $event.previousPageIndex > $event.pageIndex) { this._previousObservable.next(); } } updateSortHeaders() { // Dirty hack to display default sort column(s) const temp = Object.assign([], this._displayedColumns); this._sortHeadersObservable.next([]); this._sortHeadersObservable.next(temp); this._clientSideSort(); this._sortObservable.next(); this.storeTableSettings(); 1; } // this fixes an infine loop of rerendering subscribeSortHeaders() { this._sortHeadersObservable.pipe(delay(0), // ignore when there is no update in the sort (params or dirs) filter(() => this._displayedSortDirs !== this.sortDirs && this._displayedSortParams !== this.sortParams), tap((column) => { // update the displayed sort when it is not the empty array if (column.length > 0) { this._displayedSortDirs = this.sortDirs; this._displayedSortParams = this.sortParams; } })).subscribe(columns => this._displayedColumns = columns); } init() { this.subscribeSortHeaders(); if (this._key) { const settings = new Settings(this._key); settings.load(); if (this._isLocalStorageSettingsValid(settings)) { this.columns = settings.columns; this._sortDirs = settings.sortDirs; this._sortParams = settings.sortParams; } else { console.warn("Stored tableSettings are invalid. Using default"); } } } _clientSideSort() { this._dataSource.orderData(); } _isLocalStorageSettingsValid(settings) { // check if number of columns matching if (settings.columns.length !== this._columns.value.length) { return false; } // check if columns are the same for (var column of settings.columns) { var match = this._columns.value.filter(c => c.id == column.id && c.name == column.name); if (match === undefined) { return false; } } return true; } storeTableSettings() { console.log("Store"); if (this._key) { const settings = new Settings(this._key); settings.columns = this._columns.value; settings.sortParams = this._sortParams; settings.sortDirs = this._sortDirs; settings.save(); } } set totalElements(totalElements) { this._totalElements = totalElements; } get totalElements() { return this._totalElements; } set displayedColumns(displayedColumns) { this._displayedColumns = displayedColumns; this._columns.next(this._columns.value.map(c => { if (this._displayedColumns.includes(c.id)) { c.isActive = true; } else c.isActive = false; return c; })); } get displayedColumns() { return this._displayedColumns; } set dataSource(dataSource) { this._dataSource = dataSource; if (this._sortParams.length > 0) { this._dataSource.sort.actives = this._sortParams; this._dataSource.sort.directions = this._sortDirs.map(v => v); this.updateSortHeaders(); } } get dataSource() { return this._dataSource; } set data(data) { this._dataSource.data = data; this._clientSideSort(); } set columns(v) { this._columns.next(v.map(c => { if (c.isActive === undefined) { c.isActive = true; } return c; })); } onColumnsChange() { return this._columns; } updateColumnNames(v) { const dict = {}; v.forEach(c => dict[c.id] = c.name); this._columns.next(this._columns.value.map(c => { c.name = dict[c.id] || c.name; return c; })); } get nextObservable() { return this._nextObservable; } get previousObservable() { return this._previousObservable; } get sizeObservable() { return this._sizeObservable; } get sortObservable() { return this._sortObservable; } get sortParams() { return this._sortParams; } get sortDirs() { return this._sortDirs; } get columns() { return this._columns.value; } get pageSizeOptions() { return this._pageSizeOptions; } set sortParams(v) { this._sortParams = v; this._dataSource.sort.actives = this._sortParams; } set sortDirs(v) { this._sortDirs = v; this._dataSource.sort.directions = this._sortDirs.map(elem => elem); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC1tdWx0aS1zb3J0L3NyYy9saWIvdGFibGUtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR25DLE1BQU0sT0FBTyxTQUFTO0lBcUJsQixnQkFBZ0I7SUFDaEIsWUFBWSxPQUEyRCxFQUNuRSxPQU1DO1FBakJHLG9CQUFlLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFDckQsd0JBQW1CLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFDekQsb0JBQWUsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNyRCxvQkFBZSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBSXJELDJCQUFzQixHQUFzQixJQUFJLE9BQU8sRUFBWSxDQUFDO1FBV3hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXBGLElB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RCxJQUFXLFFBQVEsQ0FBQyxDQUFXO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQXFCLENBQUMsQ0FBQztJQUN6RixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIGRlbGF5LCBmaWx0ZXIsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXRNdWx0aVNvcnRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuL21hdC1tdWx0aS1zb3J0LWRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlRGF0YTxUPiB7XHJcbiAgICBwcml2YXRlIF9kYXRhU291cmNlITogTWF0TXVsdGlTb3J0VGFibGVEYXRhU291cmNlPFQ+O1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29sdW1uczogQmVoYXZpb3JTdWJqZWN0PHsgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBpc0FjdGl2ZT86IGJvb2xlYW4gfVtdPjtcclxuICAgIHByaXZhdGUgX2Rpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdO1xyXG4gICAgcGFnZVNpemUhOiBudW1iZXI7XHJcbiAgICBwYWdlSW5kZXghOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9wYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdO1xyXG4gICAgcHJpdmF0ZSBfdG90YWxFbGVtZW50cyE6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3NvcnRQYXJhbXM6IHN0cmluZ1tdO1xyXG4gICAgcHJpdmF0ZSBfc29ydERpcnM6IHN0cmluZ1tdO1xyXG4gICAgcHJpdmF0ZSBfa2V5ITogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgX25leHRPYnNlcnZhYmxlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3ByZXZpb3VzT2JzZXJ2YWJsZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zaXplT2JzZXJ2YWJsZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zb3J0T2JzZXJ2YWJsZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9kaXNwbGF5ZWRTb3J0RGlycz86IHN0cmluZ1tdXHJcbiAgICBwcml2YXRlIF9kaXNwbGF5ZWRTb3J0UGFyYW1zPzogc3RyaW5nW11cclxuXHJcbiAgICBwcml2YXRlIF9zb3J0SGVhZGVyc09ic2VydmFibGU6IFN1YmplY3Q8c3RyaW5nW10+ID0gbmV3IFN1YmplY3Q8c3RyaW5nW10+KCk7XHJcblxyXG4gICAgLy8gVE9ETyByZWZhY3RvclxyXG4gICAgY29uc3RydWN0b3IoY29sdW1uczogeyBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGlzQWN0aXZlPzogYm9vbGVhbiB9W10sXHJcbiAgICAgICAgb3B0aW9ucz86IHtcclxuICAgICAgICAgICAgZGVmYXVsdFNvcnRQYXJhbXM/OiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgZGVmYXVsdFNvcnREaXJzPzogc3RyaW5nW10sXHJcbiAgICAgICAgICAgIHBhZ2VTaXplT3B0aW9ucz86IG51bWJlcltdLFxyXG4gICAgICAgICAgICB0b3RhbEVsZW1lbnRzPzogbnVtYmVyLFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2VLZXk/OiBzdHJpbmdcclxuICAgICAgICB9KSB7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IG5ldyBCZWhhdmlvclN1YmplY3QoY29sdW1ucy5tYXAoYyA9PiB7IGlmIChjLmlzQWN0aXZlID09PSB1bmRlZmluZWQpIHsgYy5pc0FjdGl2ZSA9IHRydWU7IH0gcmV0dXJuIGM7IH0pKTtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5fY29sdW1ucy52YWx1ZS5maWx0ZXIoYyA9PiBjLmlzQWN0aXZlKS5tYXAoYyA9PiBjLmlkKTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFnZVNpemVPcHRpb25zICYmIG9wdGlvbnMucGFnZVNpemVPcHRpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdBcnJheSBvZiBwYWdlU2l6ZU9wdGlvbnMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbnRyeScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kZWZhdWx0U29ydFBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0U29ydFBhcmFtcy5tYXAocyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXNwbGF5ZWRDb2x1bW5zLmluY2x1ZGVzKHMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBQcm92aWRlZCBzb3J0IHBhcmFtZXRlciBcIiR7c31cIiBpcyBub3QgYSBjb2x1bW4uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NvcnRQYXJhbXMgPSBvcHRpb25zLmRlZmF1bHRTb3J0UGFyYW1zIHx8IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3J0RGlycyA9IG9wdGlvbnMuZGVmYXVsdFNvcnREaXJzIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvcnRQYXJhbXMubGVuZ3RoICE9PSB0aGlzLl9zb3J0RGlycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnREaXJzID0gdGhpcy5fc29ydFBhcmFtcy5tYXAoKCkgPT4gJ2FzYycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl90b3RhbEVsZW1lbnRzID0gb3B0aW9ucy50b3RhbEVsZW1lbnRzIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VTaXplT3B0aW9ucyA9IG9wdGlvbnMucGFnZVNpemVPcHRpb25zIHx8IFsxMCwgMjAsIDUwLCAxMDBdO1xyXG4gICAgICAgICAgICB0aGlzLl9rZXkgPSBvcHRpb25zLmxvY2FsU3RvcmFnZUtleSE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFnZVNpemVPcHRpb25zID0gWzEwLCAyMCwgNTAsIDEwMF07XHJcbiAgICAgICAgICAgIHRoaXMuX3NvcnRQYXJhbXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5fc29ydERpcnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU29ydEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMuX3NvcnRQYXJhbXMgPSB0aGlzLl9kYXRhU291cmNlLnNvcnRbJ2FjdGl2ZXMnXTtcclxuICAgICAgICB0aGlzLl9zb3J0RGlycyA9IHRoaXMuX2RhdGFTb3VyY2Uuc29ydFsnZGlyZWN0aW9ucyddO1xyXG4gICAgICAgIHRoaXMuX2NsaWVudFNpZGVTb3J0KCk7XHJcbiAgICAgICAgdGhpcy5fc29ydE9ic2VydmFibGUubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVUYWJsZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uUGFnaW5hdGlvbkV2ZW50KCRldmVudDogUGFnZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdG1wUGFnZVNpemU6IG51bWJlciA9IHRoaXMucGFnZVNpemU7XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9ICRldmVudC5wYWdlU2l6ZTtcclxuICAgICAgICB0aGlzLnBhZ2VJbmRleCA9ICRldmVudC5wYWdlSW5kZXg7XHJcblxyXG4gICAgICAgIGlmICh0bXBQYWdlU2l6ZSAhPT0gdGhpcy5wYWdlU2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zaXplT2JzZXJ2YWJsZS5uZXh0KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICgkZXZlbnQucHJldmlvdXNQYWdlSW5kZXggJiYgJGV2ZW50LnByZXZpb3VzUGFnZUluZGV4IDwgJGV2ZW50LnBhZ2VJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLl9uZXh0T2JzZXJ2YWJsZS5uZXh0KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICgkZXZlbnQucHJldmlvdXNQYWdlSW5kZXggJiYgJGV2ZW50LnByZXZpb3VzUGFnZUluZGV4ID4gJGV2ZW50LnBhZ2VJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c09ic2VydmFibGUubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU29ydEhlYWRlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRGlydHkgaGFjayB0byBkaXNwbGF5IGRlZmF1bHQgc29ydCBjb2x1bW4ocylcclxuICAgICAgICBjb25zdCB0ZW1wID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5fZGlzcGxheWVkQ29sdW1ucyk7XHJcbiAgICAgICAgdGhpcy5fc29ydEhlYWRlcnNPYnNlcnZhYmxlLm5leHQoW10pO1xyXG4gICAgICAgIHRoaXMuX3NvcnRIZWFkZXJzT2JzZXJ2YWJsZS5uZXh0KHRlbXApO1xyXG4gICAgICAgIHRoaXMuX2NsaWVudFNpZGVTb3J0KCk7XHJcbiAgICAgICAgdGhpcy5fc29ydE9ic2VydmFibGUubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVUYWJsZVNldHRpbmdzKCk7MVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMgZml4ZXMgYW4gaW5maW5lIGxvb3Agb2YgcmVyZW5kZXJpbmdcclxuICAgIHByaXZhdGUgc3Vic2NyaWJlU29ydEhlYWRlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc29ydEhlYWRlcnNPYnNlcnZhYmxlLnBpcGUoXHJcbiAgICAgICAgICAgIGRlbGF5KDApLFxyXG4gICAgICAgICAgICAvLyBpZ25vcmUgd2hlbiB0aGVyZSBpcyBubyB1cGRhdGUgaW4gdGhlIHNvcnQgKHBhcmFtcyBvciBkaXJzKVxyXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5fZGlzcGxheWVkU29ydERpcnMgIT09IHRoaXMuc29ydERpcnMgJiYgdGhpcy5fZGlzcGxheWVkU29ydFBhcmFtcyAhPT0gdGhpcy5zb3J0UGFyYW1zKSxcclxuICAgICAgICAgICAgdGFwKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGlzcGxheWVkIHNvcnQgd2hlbiBpdCBpcyBub3QgdGhlIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgICAgICBpZihjb2x1bW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXllZFNvcnREaXJzID0gdGhpcy5zb3J0RGlycztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5ZWRTb3J0UGFyYW1zID0gdGhpcy5zb3J0UGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICkuc3Vic2NyaWJlKGNvbHVtbnMgPT4gdGhpcy5fZGlzcGxheWVkQ29sdW1ucyA9IGNvbHVtbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlU29ydEhlYWRlcnMoKTtcclxuICAgICAgICBpZiAodGhpcy5fa2V5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IFNldHRpbmdzKHRoaXMuX2tleSk7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLmxvYWQoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzTG9jYWxTdG9yYWdlU2V0dGluZ3NWYWxpZChzZXR0aW5ncykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHNldHRpbmdzLmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlycyA9IHNldHRpbmdzLnNvcnREaXJzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydFBhcmFtcyA9IHNldHRpbmdzLnNvcnRQYXJhbXM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJTdG9yZWQgdGFibGVTZXR0aW5ncyBhcmUgaW52YWxpZC4gVXNpbmcgZGVmYXVsdFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jbGllbnRTaWRlU29ydCgpIHtcclxuICAgICAgICB0aGlzLl9kYXRhU291cmNlLm9yZGVyRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzTG9jYWxTdG9yYWdlU2V0dGluZ3NWYWxpZChzZXR0aW5nczogU2V0dGluZ3MpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBjaGVjayBpZiBudW1iZXIgb2YgY29sdW1ucyBtYXRjaGluZ1xyXG4gICAgICAgIGlmIChzZXR0aW5ncy5jb2x1bW5zLmxlbmd0aCAhPT0gdGhpcy5fY29sdW1ucy52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgY29sdW1ucyBhcmUgdGhlIHNhbWVcclxuICAgICAgICBmb3IgKHZhciBjb2x1bW4gb2Ygc2V0dGluZ3MuY29sdW1ucykge1xyXG4gICAgICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLl9jb2x1bW5zLnZhbHVlLmZpbHRlcihjID0+IGMuaWQgPT0gY29sdW1uLmlkICYmIGMubmFtZSA9PSBjb2x1bW4ubmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChtYXRjaCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0b3JlVGFibGVTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlN0b3JlXCIpXHJcbiAgICAgICAgaWYgKHRoaXMuX2tleSkge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nczogU2V0dGluZ3MgPSBuZXcgU2V0dGluZ3ModGhpcy5fa2V5KTtcclxuICAgICAgICAgICAgc2V0dGluZ3MuY29sdW1ucyA9IHRoaXMuX2NvbHVtbnMudmFsdWU7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLnNvcnRQYXJhbXMgPSB0aGlzLl9zb3J0UGFyYW1zO1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5zb3J0RGlycyA9IHRoaXMuX3NvcnREaXJzO1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5zYXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdG90YWxFbGVtZW50cyh0b3RhbEVsZW1lbnRzOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl90b3RhbEVsZW1lbnRzID0gdG90YWxFbGVtZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRvdGFsRWxlbWVudHMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxFbGVtZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGRpc3BsYXllZENvbHVtbnMoZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5ZWRDb2x1bW5zID0gZGlzcGxheWVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLl9jb2x1bW5zLm5leHQodGhpcy5fY29sdW1ucy52YWx1ZS5tYXAoYyA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5ZWRDb2x1bW5zLmluY2x1ZGVzKGMuaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjLmlzQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGMuaXNBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGM7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGlzcGxheWVkQ29sdW1ucygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXllZENvbHVtbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkYXRhU291cmNlKGRhdGFTb3VyY2U6IE1hdE11bHRpU29ydFRhYmxlRGF0YVNvdXJjZTxUPikge1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgICAgIGlmICh0aGlzLl9zb3J0UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZGF0YVNvdXJjZS5zb3J0LmFjdGl2ZXMgPSB0aGlzLl9zb3J0UGFyYW1zO1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlLnNvcnQuZGlyZWN0aW9ucyA9IHRoaXMuX3NvcnREaXJzLm1hcCh2ID0+IHYgYXMgU29ydERpcmVjdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU29ydEhlYWRlcnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IE1hdE11bHRpU29ydFRhYmxlRGF0YVNvdXJjZTxUPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkYXRhKGRhdGE6IFRbXSkge1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5fY2xpZW50U2lkZVNvcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGNvbHVtbnModjogeyBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGlzQWN0aXZlPzogYm9vbGVhbiB9W10pIHtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zLm5leHQodi5tYXAoYyA9PiB7IGlmIChjLmlzQWN0aXZlID09PSB1bmRlZmluZWQpIHsgYy5pc0FjdGl2ZSA9IHRydWU7IH0gcmV0dXJuIGM7IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db2x1bW5zQ2hhbmdlKCk6IEJlaGF2aW9yU3ViamVjdDx7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgaXNBY3RpdmU/OiBib29sZWFuIH1bXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVDb2x1bW5OYW1lcyh2OiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9W10pIHtcclxuICAgICAgICBjb25zdCBkaWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICAgICAgdi5mb3JFYWNoKGMgPT4gZGljdFtjLmlkXSA9IGMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5fY29sdW1ucy5uZXh0KHRoaXMuX2NvbHVtbnMudmFsdWUubWFwKGMgPT4geyBjLm5hbWUgPSBkaWN0W2MuaWRdIHx8IGMubmFtZTsgcmV0dXJuIGM7IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5leHRPYnNlcnZhYmxlKCk6IFN1YmplY3Q8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25leHRPYnNlcnZhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcHJldmlvdXNPYnNlcnZhYmxlKCk6IFN1YmplY3Q8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzT2JzZXJ2YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNpemVPYnNlcnZhYmxlKCk6IFN1YmplY3Q8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemVPYnNlcnZhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc29ydE9ic2VydmFibGUoKTogU3ViamVjdDxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc29ydE9ic2VydmFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzb3J0UGFyYW1zKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc29ydFBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNvcnREaXJzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc29ydERpcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCk6IHsgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBpc0FjdGl2ZT86IGJvb2xlYW4gfVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHBhZ2VTaXplT3B0aW9ucygpOiBudW1iZXJbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNvcnRQYXJhbXModjogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLl9zb3J0UGFyYW1zID0gdjtcclxuICAgICAgICB0aGlzLl9kYXRhU291cmNlLnNvcnQuYWN0aXZlcyA9IHRoaXMuX3NvcnRQYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzb3J0RGlycyh2OiBzdHJpbmdbXSkge1xyXG4gICAgICAgIHRoaXMuX3NvcnREaXJzID0gdjtcclxuICAgICAgICB0aGlzLl9kYXRhU291cmNlLnNvcnQuZGlyZWN0aW9ucyA9IHRoaXMuX3NvcnREaXJzLm1hcChlbGVtID0+IGVsZW0gYXMgU29ydERpcmVjdGlvbik7XHJcbiAgICB9XHJcbn1cclxuIl19