UNPKG

@firestitch/filter

Version:
508 lines 43.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { isEmpty, list as arrayList } from '@firestitch/common'; import { simpleFormat } from '@firestitch/date'; import { Alias, Model } from 'tsmodels'; import { Subject } from 'rxjs'; import { format, isDate, isValid } from 'date-fns'; import { clone, isObject } from 'lodash-es'; import { FsFilterConfigItem, ItemType } from './filter-item'; /** @type {?} */ export const SORT_BY_FIELD = 'system_sort_by'; /** @type {?} */ export const SORT_DIRECTION_FIELD = 'system_sort_direction'; export class FsFilterConfig extends Model { /** * @param {?=} data */ constructor(data = {}) { super(); this.load = true; this.persist = false; this.inline = false; this.autofocus = false; this.chips = false; this.sortValues = null; this.sort = null; this.sortDirection = null; this.queryParam = false; this.namespace = 'filter'; this.items = []; this.sortByItem = null; this.sortDirectionItem = null; this.keywordFilter = false; this.nonKeywordFilters = false; this._filtersNames = []; this._destroy$ = new Subject(); this._fromJSON(data); } /** * @return {?} */ get destroy$() { return this._destroy$.asObservable(); } /** * @param {?} items * @param {?} route * @param {?} persists * @return {?} */ initItems(items, route, persists) { if (items && Array.isArray(items)) { this.items = items.map((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => { if (index === 0 && item.type === ItemType.Text) { item.type = ItemType.Keyword; } if (item && item.name && this._filtersNames.indexOf(item.name) === -1) { this._filtersNames.push(item.name); return new FsFilterConfigItem(item, this, route, persists); } else { throw Error('Filter init error. Items name must be unique.'); } })); // After all the items have been created and added to this.items initalize the values // This is important if some item default values are dependent on others this.items.map((/** * @param {?} item * @return {?} */ (item) => { item.initValues(); return item; })); } this.initSorting(route, persists); this.keywordFilter = !!this.items.find((/** * @param {?} e * @return {?} */ e => ItemType.Keyword === e.type)); this.nonKeywordFilters = !!this.items.find((/** * @param {?} e * @return {?} */ e => ItemType.Keyword !== e.type)); } /** * @param {?} name * @return {?} */ getItem(name) { return this.items.find((/** * @param {?} item * @return {?} */ (item) => item.name === name)); } /** * @param {?} route * @param {?} persists * @return {?} */ initSorting(route, persists) { if (this.sortValues) { /** @type {?} */ const sortByItem = { name: SORT_BY_FIELD, type: ItemType.Select, label: 'Sort By', values: this.sortValues }; if (this.sort && this.sort.value) { sortByItem['default'] = this.sort.value; } this.sortByItem = new FsFilterConfigItem(sortByItem, this, route, persists); /** @type {?} */ const sortDirectionItem = { name: SORT_DIRECTION_FIELD, type: ItemType.Select, label: 'Sort Direction', values: [ { name: 'Ascending', value: 'asc' }, { name: 'Descending', value: 'desc' } ] }; if (this.sort && this.sort.direction) { sortDirectionItem['default'] = this.sort.direction; } this.sortDirectionItem = new FsFilterConfigItem(sortDirectionItem, this, route, persists); } } /** * @return {?} */ updateModelValues() { this.items.forEach((/** * @param {?} filter * @return {?} */ (filter) => { filter.model = clone(filter.model); })); if (this.sortByItem) { this.sortByItem.model = clone(this.sortByItem.model); } if (this.sortDirectionItem) { this.sortDirectionItem.model = clone(this.sortDirectionItem.model); } } /** * @param {?=} opts * @return {?} */ gets(opts = {}) { /** @type {?} */ const query = {}; for (const filter of this.items) { /** @type {?} */ let value = clone(filter.model); if (filter.type == ItemType.Select) { if (filter.multiple) { if (filter.isolate) { if (!Array.isArray(filter.model) || !filter.model.length) { value = arrayList(filter.values, 'value'); } } if (filter.model && filter.model.indexOf('__all') > -1) { value = null; } } else { if (filter.isolate) { if (filter.model == '__all') { value = arrayList(filter.values, 'value'); } } else { if (filter.model == '__all') { value = null; } } } } else if (filter.type == ItemType.AutoCompleteChips || filter.type === ItemType.Chips) { if (Array.isArray(filter.model) && filter.model.length && !opts.expand) { value = arrayList(filter.model, 'value'); } } else if (filter.type == ItemType.Checkbox) { value = filter.model ? filter.checked : filter.unchecked; } // @TODO if (isEmpty(value, { zero: true })) { continue; } if (filter.type == ItemType.Date || filter.type == ItemType.DateTime) { if (value && isValid(value) && isDate(value)) { value = simpleFormat(value); } } else if (filter.type == ItemType.DateRange || filter.type == ItemType.DateTimeRange) { /** @type {?} */ const from = value.from; /** @type {?} */ const to = value.to; value = {}; if (from) { value.from = format(from, 'yyyy-MM-dd\THH:mm:ssxxxxx'); } if (to) { value.to = format(to, 'yyyy-MM-dd\THH:mm:ssxxxxx'); } } else if (filter.type == ItemType.AutoComplete) { if (isEmpty(filter.model.value, { zero: true })) { continue; } value = opts.expand ? filter.model : filter.model.value; } if (isObject(filter.names) && opts.names !== false) { for (const key in filter.names) { if (value[filter.names[key]]) { query[key] = value[filter.names[key]]; } } } else { query[filter.name] = value; } } if (opts.flatten) { for (const name in query) { if (Array.isArray(query[name])) { query[name] = query[name].join(','); } } } return query; } /** * @return {?} */ getSort() { /** @type {?} */ let sortBy = this.getSortByValue(); sortBy = sortBy === '__all' ? null : sortBy; /** @type {?} */ let sortDirection = this.getSortDirectionValue(); sortDirection = sortDirection === '__all' ? null : sortDirection; return { value: sortBy, direction: sortDirection, }; } /** * @return {?} */ getSortByValue() { return this.sortByItem ? this.sortByItem.model : null; } /** * @return {?} */ getSortDirectionValue() { return this.sortDirectionItem ? this.sortDirectionItem.model : null; } /** * @param {?} sort * @return {?} */ updateSort(sort) { if (sort.sortBy) { this.sortByItem.model = sort.sortBy; } if (sort.sortDirection) { this.sortDirectionItem.model = sort.sortDirection; } } /** * @return {?} */ getFilledItems() { return this.items.reduce((/** * @param {?} acc * @param {?} filter * @return {?} */ (acc, filter) => { switch (filter.type) { case ItemType.Select: { /** @type {?} */ const multipleIsoldated = filter.multiple && filter.isolate && Array.isArray(filter.model) && filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ const multipleHasSelectedValues = filter.multiple && Array.isArray(filter.model) && filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ const selectedValues = !filter.multiple && filter.model && filter.model !== '__all'; if (multipleIsoldated || multipleHasSelectedValues || selectedValues) { acc.push(filter); } } break; case ItemType.AutoCompleteChips: { if (Array.isArray(filter.model) && filter.model.length) { acc.push(filter); } } break; case ItemType.Checkbox: { if (filter.model) { acc.push(filter); } } break; case ItemType.DateRange: case ItemType.DateTimeRange: { if (filter.model.from || filter.model.to) { acc.push(filter); } } break; case ItemType.Keyword: { } break; default: { if (filter.model && (!isEmpty(filter.model, { zero: true }) || !isEmpty(filter.model.value, { zero: true }))) { acc.push(filter); } } } return acc; }), []); } /** * @return {?} */ filtersClear() { for (const filter of this.items) { filter.clear(); } if (this.sortByItem) { if (this.sort) { this.sortByItem.model = this.sort.value; } else { this.sortByItem.clear(); } } if (this.sortDirectionItem) { if (this.sort) { this.sortDirectionItem.model = this.sort.direction; } else { this.sortDirectionItem.clear(); } } } /** * @return {?} */ loadValuesForPendingItems() { this.items .filter((/** * @param {?} item * @return {?} */ (item) => item.hasPendingValues)) .forEach((/** * @param {?} item * @return {?} */ (item) => item.loadValues(false))); } /** * @return {?} */ destroy() { this._destroy$.next(); this._destroy$.complete(); } } tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "load", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "persist", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "inline", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "autofocus", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "chips", void 0); tslib_1.__decorate([ Alias('sorts'), tslib_1.__metadata("design:type", Array) ], FsFilterConfig.prototype, "sortValues", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sort", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sortDirection", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "queryParam", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "namespace", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "init", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "change", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "reload", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "sortChange", void 0); if (false) { /** @type {?} */ FsFilterConfig.prototype.load; /** @type {?} */ FsFilterConfig.prototype.persist; /** @type {?} */ FsFilterConfig.prototype.inline; /** @type {?} */ FsFilterConfig.prototype.autofocus; /** @type {?} */ FsFilterConfig.prototype.chips; /** @type {?} */ FsFilterConfig.prototype.sortValues; /** @type {?} */ FsFilterConfig.prototype.sort; /** @type {?} */ FsFilterConfig.prototype.sortDirection; /** @type {?} */ FsFilterConfig.prototype.queryParam; /** @type {?} */ FsFilterConfig.prototype.namespace; /** @type {?} */ FsFilterConfig.prototype.init; /** @type {?} */ FsFilterConfig.prototype.change; /** @type {?} */ FsFilterConfig.prototype.reload; /** @type {?} */ FsFilterConfig.prototype.sortChange; /** @type {?} */ FsFilterConfig.prototype.items; /** @type {?} */ FsFilterConfig.prototype.sortByItem; /** @type {?} */ FsFilterConfig.prototype.sortDirectionItem; /** @type {?} */ FsFilterConfig.prototype.keywordFilter; /** @type {?} */ FsFilterConfig.prototype.nonKeywordFilters; /** * @type {?} * @private */ FsFilterConfig.prototype._filtersNames; /** * @type {?} * @private */ FsFilterConfig.prototype._destroy$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXJlc3RpdGNoL2ZpbHRlci8iLCJzb3VyY2VzIjpbImFwcC9tb2RlbHMvZmlsdGVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUc3RCxNQUFNLE9BQU8sYUFBYSxHQUFHLGdCQUFnQjs7QUFDN0MsTUFBTSxPQUFPLG9CQUFvQixHQUFHLHVCQUF1QjtBQUUzRCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7Ozs7SUEwQnZDLFlBQVksT0FBWSxFQUFFO1FBQ3hCLEtBQUssRUFBRSxDQUFDO1FBekJNLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixZQUFPLEdBQVEsS0FBSyxDQUFDO1FBQ3JCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDUCxlQUFVLEdBQVUsSUFBSSxDQUFDO1FBQ2hDLFNBQUksR0FBUyxJQUFJLENBQUM7UUFDbEIsa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixjQUFT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REFBMEI7QUFDekI7SUFBUixLQUFLLEVBQUU7OzZDQUFzQjtBQUNkO0lBQWYsS0FBSyxDQUFDLE9BQU8sQ0FBQzs7a0RBQWlDO0FBQ3ZDO0lBQVIsS0FBSyxFQUFFOzs0Q0FBMEI7QUFDekI7SUFBUixLQUFLLEVBQUU7O3FEQUE2QjtBQUM1QjtJQUFSLEtBQUssRUFBRTs7a0RBQTJCO0FBQzFCO0lBQVIsS0FBSyxFQUFFOztpREFBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7OzRDQUF1QjtBQUN0QjtJQUFSLEtBQUssRUFBRTs7OENBQXlCO0FBQ3hCO0lBQVIsS0FBSyxFQUFFOzs4Q0FBeUI7QUFDeEI7SUFBUixLQUFLLEVBQUU7O2tEQUE2Qjs7O0lBYnJDLDhCQUE0Qjs7SUFDNUIsaUNBQXFDOztJQUNyQyxnQ0FBK0I7O0lBQy9CLG1DQUFrQzs7SUFDbEMsK0JBQThCOztJQUM5QixvQ0FBZ0Q7O0lBQ2hELDhCQUFrQzs7SUFDbEMsdUNBQXFDOztJQUNyQyxvQ0FBbUM7O0lBQ25DLG1DQUFxQzs7SUFDckMsOEJBQStCOztJQUMvQixnQ0FBaUM7O0lBQ2pDLGdDQUFpQzs7SUFDakMsb0NBQXFDOztJQUVyQywrQkFBd0M7O0lBQ3hDLG9DQUE2Qzs7SUFDN0MsMkNBQW9EOztJQUNwRCx1Q0FBNkI7O0lBQzdCLDJDQUFpQzs7Ozs7SUFFakMsdUNBQTJCOzs7OztJQUMzQixtQ0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0VtcHR5LCBsaXN0IGFzIGFycmF5TGlzdCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBzaW1wbGVGb3JtYXQgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcbmltcG9ydCB7IEFsaWFzLCBNb2RlbCB9IGZyb20gJ3RzbW9kZWxzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBmb3JtYXQsIGlzRGF0ZSwgaXNWYWxpZCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGNsb25lLCBpc09iamVjdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnSXRlbSwgSXRlbVR5cGUgfSBmcm9tICcuL2ZpbHRlci1pdGVtJztcbmltcG9ydCB7IENoYW5nZUZuLCBGaWx0ZXJTb3J0LCBTb3J0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IFNPUlRfQllfRklFTEQgPSAnc3lzdGVtX3NvcnRfYnknO1xuZXhwb3J0IGNvbnN0IFNPUlRfRElSRUNUSU9OX0ZJRUxEID0gJ3N5c3RlbV9zb3J0X2RpcmVjdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGc0ZpbHRlckNvbmZpZyBleHRlbmRzIE1vZGVsIHtcblxuICBAQWxpYXMoKSBwdWJsaWMgbG9hZCA9IHRydWU7XG4gIEBBbGlhcygpIHB1YmxpYyBwZXJzaXN0OiBhbnkgPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIGlubGluZSA9IGZhbHNlO1xuICBAQWxpYXMoKSBwdWJsaWMgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGlwcyA9IGZhbHNlO1xuICBAQWxpYXMoJ3NvcnRzJykgcHVibGljIHNvcnRWYWx1ZXM6IGFueVtdID0gbnVsbDtcbiAgQEFsaWFzKCkgcHVibGljIHNvcnQ6IFNvcnQgPSBudWxsO1xuICBAQWxpYXMoKSBwdWJsaWMgc29ydERpcmVjdGlvbiA9IG51bGw7XG4gIEBBbGlhcygpIHB1YmxpYyBxdWVyeVBhcmFtID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBuYW1lc3BhY2UgPSAnZmlsdGVyJztcbiAgQEFsaWFzKCkgcHVibGljIGluaXQ6IENoYW5nZUZuO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hhbmdlOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIHJlbG9hZDogQ2hhbmdlRm47XG4gIEBBbGlhcygpIHB1YmxpYyBzb3J0Q2hhbmdlOiBDaGFuZ2VGbjtcblxuICBwdWJsaWMgaXRlbXM6IEZzRmlsdGVyQ29uZmlnSXRlbVtdID0gW107XG4gIHB1YmxpYyBzb3J0QnlJdGVtOiBGc0ZpbHRlckNvbmZpZ0l0ZW0gPSBudWxsO1xuICBwdWJsaWMgc29ydERpcmVjdGlvbkl0ZW06IEZzRmlsdGVyQ29uZmlnSXRlbSA9IG51bGw7XG4gIHB1YmxpYyBrZXl3b3JkRmlsdGVyID0gZmFsc2U7XG4gIHB1YmxpYyBub25LZXl3b3JkRmlsdGVycyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2ZpbHRlcnNOYW1lcyA9IFtdO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogYW55ID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZnJvbUpTT04oZGF0YSk7XG4gIH1cblxuICBnZXQgZGVzdHJveSQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3kkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXRJdGVtcyhpdGVtcywgcm91dGUsIHBlcnNpc3RzKSB7XG5cbiAgICBpZiAoaXRlbXMgJiYgQXJyYXkuaXNBcnJheShpdGVtcykpIHtcblxuICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcblxuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgaXRlbS50eXBlID09PSBJdGVtVHlwZS5UZXh0KSB7XG4gICAgICAgICAgaXRlbS50eXBlID0gSXRlbVR5cGUuS2V5d29yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0ubmFtZSAmJiB0aGlzLl9maWx0ZXJzTmFtZXMuaW5kZXhPZihpdGVtLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlcnNOYW1lcy5wdXNoKGl0ZW0ubmFtZSk7XG5cbiAgICAgICAgICByZXR1cm4gbmV3IEZzRmlsdGVyQ29uZmlnSXRlbShpdGVtLCB0aGlzLCByb3V0ZSwgcGVyc2lzdHMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ0ZpbHRlciBpbml0IGVycm9yLiBJdGVtcyBuYW1lIG11c3QgYmUgdW5pcXVlLicpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZnRlciBhbGwgdGhlIGl0ZW1zIGhhdmUgYmVlbiBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGlzLml0ZW1zIGluaXRhbGl6ZSB0aGUgdmFsdWVzXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBpZiBzb21lIGl0ZW0gZGVmYXVsdCB2YWx1ZXMgYXJlIGRlcGVuZGVudCBvbiBvdGhlcnNcbiAgICAgIHRoaXMuaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlcygpO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdFNvcnRpbmcocm91dGUsIHBlcnNpc3RzKTtcblxuICAgIHRoaXMua2V5d29yZEZpbHRlciA9ICEhdGhpcy5pdGVtcy5maW5kKGUgPT4gSXRlbVR5cGUuS2V5d29yZCA9PT0gZS50eXBlKTtcbiAgICB0aGlzLm5vbktleXdvcmRGaWx0ZXJzID0gISF0aGlzLml0ZW1zLmZpbmQoZSA9PiBJdGVtVHlwZS5LZXl3b3JkICE9PSBlLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW0obmFtZSkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdFNvcnRpbmcocm91dGUsIHBlcnNpc3RzKSB7XG4gICAgaWYgKHRoaXMuc29ydFZhbHVlcykge1xuICAgICAgY29uc3Qgc29ydEJ5SXRlbSA9IHtcbiAgICAgICAgbmFtZTogU09SVF9CWV9GSUVMRCxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgICAgICBsYWJlbDogJ1NvcnQgQnknLFxuICAgICAgICB2YWx1ZXM6IHRoaXMuc29ydFZhbHVlc1xuICAgICAgfTtcblxuXG4gICAgICBpZiAodGhpcy5zb3J0ICYmIHRoaXMuc29ydC52YWx1ZSkge1xuICAgICAgICBzb3J0QnlJdGVtWydkZWZhdWx0J10gPSB0aGlzLnNvcnQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ydEJ5SXRlbSA9IG5ldyBGc0ZpbHRlckNvbmZpZ0l0ZW0oc29ydEJ5SXRlbSwgdGhpcywgcm91dGUsIHBlcnNpc3RzKTtcblxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbkl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNPUlRfRElSRUNUSU9OX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBEaXJlY3Rpb24nLFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7IG5hbWU6ICdBc2NlbmRpbmcnLCB2YWx1ZTogJ2FzYycgfSxcbiAgICAgICAgICB7IG5hbWU6ICdEZXNjZW5kaW5nJywgdmFsdWU6ICdkZXNjJyB9XG4gICAgICAgIF1cbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LmRpcmVjdGlvbikge1xuICAgICAgICBzb3J0RGlyZWN0aW9uSXRlbVsnZGVmYXVsdCddID0gdGhpcy5zb3J0LmRpcmVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG5ldyBGc0ZpbHRlckNvbmZpZ0l0ZW0oc29ydERpcmVjdGlvbkl0ZW0sIHRoaXMsIHJvdXRlLCBwZXJzaXN0cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU1vZGVsVmFsdWVzKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICBmaWx0ZXIubW9kZWwgPSBjbG9uZShmaWx0ZXIubW9kZWwpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gY2xvbmUodGhpcy5zb3J0QnlJdGVtLm1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IGNsb25lKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRzKG9wdHM6IGFueSA9IHt9KSB7XG5cbiAgICBjb25zdCBxdWVyeSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgbGV0IHZhbHVlID0gY2xvbmUoZmlsdGVyLm1vZGVsKTtcblxuICAgICAgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLlNlbGVjdCkge1xuXG4gICAgICAgIGlmIChmaWx0ZXIubXVsdGlwbGUpIHtcblxuICAgICAgICAgIGlmIChmaWx0ZXIuaXNvbGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlci5tb2RlbCkgfHwgIWZpbHRlci5tb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheUxpc3QoZmlsdGVyLnZhbHVlcywgJ3ZhbHVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZpbHRlci5tb2RlbCAmJiBmaWx0ZXIubW9kZWwuaW5kZXhPZignX19hbGwnKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyLmlzb2xhdGUpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgPT0gJ19fYWxsJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGFycmF5TGlzdChmaWx0ZXIudmFsdWVzLCAndmFsdWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5tb2RlbCA9PSAnX19hbGwnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMgfHwgZmlsdGVyLnR5cGUgPT09IEl0ZW1UeXBlLkNoaXBzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlci5tb2RlbCkgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aCAmJiAhb3B0cy5leHBhbmQpIHtcbiAgICAgICAgICB2YWx1ZSA9IGFycmF5TGlzdChmaWx0ZXIubW9kZWwsICd2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkNoZWNrYm94KSB7XG4gICAgICAgIHZhbHVlID0gZmlsdGVyLm1vZGVsID8gZmlsdGVyLmNoZWNrZWQgOiBmaWx0ZXIudW5jaGVja2VkO1xuICAgICAgfVxuXG4gICAgICAvLyBAVE9ET1xuICAgICAgaWYgKGlzRW1wdHkodmFsdWUsIHsgemVybzogdHJ1ZSB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkRhdGUgfHwgZmlsdGVyLnR5cGUgPT0gSXRlbVR5cGUuRGF0ZVRpbWUpIHtcblxuICAgICAgICBpZiAodmFsdWUgJiYgaXNWYWxpZCh2YWx1ZSkgJiYgaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gc2ltcGxlRm9ybWF0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkRhdGVSYW5nZSB8fCBmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5EYXRlVGltZVJhbmdlKSB7XG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHZhbHVlLmZyb207XG4gICAgICAgIGNvbnN0IHRvID0gdmFsdWUudG87XG5cbiAgICAgICAgdmFsdWUgPSB7fTtcbiAgICAgICAgaWYgKGZyb20pIHtcbiAgICAgICAgICB2YWx1ZS5mcm9tID0gZm9ybWF0KGZyb20sICd5eXl5LU1NLWRkXFxUSEg6bW06c3N4eHh4eCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvKSB7XG4gICAgICAgICAgdmFsdWUudG8gPSBmb3JtYXQodG8sICd5eXl5LU1NLWRkXFxUSEg6bW06c3N4eHh4eCcpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlKSB7XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyLm1vZGVsLnZhbHVlLCB7emVybzogdHJ1ZX0pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IG9wdHMuZXhwYW5kID8gZmlsdGVyLm1vZGVsIDogZmlsdGVyLm1vZGVsLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3QoZmlsdGVyLm5hbWVzKSAmJiBvcHRzLm5hbWVzICE9PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWx0ZXIubmFtZXMpIHtcbiAgICAgICAgICBpZiAodmFsdWVbZmlsdGVyLm5hbWVzW2tleV1dKSB7XG4gICAgICAgICAgICBxdWVyeVtrZXldID0gdmFsdWVbZmlsdGVyLm5hbWVzW2tleV1dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlbZmlsdGVyLm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZmxhdHRlbikge1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIHF1ZXJ5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5W25hbWVdKSkge1xuICAgICAgICAgIHF1ZXJ5W25hbWVdID0gcXVlcnlbbmFtZV0uam9pbignLCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgcHVibGljIGdldFNvcnQoKTogRmlsdGVyU29ydCB8IG51bGwge1xuICAgIGxldCBzb3J0QnkgPSB0aGlzLmdldFNvcnRCeVZhbHVlKCk7XG4gICAgc29ydEJ5ID0gc29ydEJ5ID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnRCeTtcblxuICAgIGxldCBzb3J0RGlyZWN0aW9uID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uVmFsdWUoKTtcbiAgICBzb3J0RGlyZWN0aW9uID0gc29ydERpcmVjdGlvbiA9PT0gJ19fYWxsJyA/IG51bGwgOiBzb3J0RGlyZWN0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBzb3J0QnksXG4gICAgICBkaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnRCeVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnRCeUl0ZW0gPyB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb25WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA/IHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydCkge1xuICAgIGlmIChzb3J0LnNvcnRCeSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gc29ydC5zb3J0Qnk7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQuc29ydERpcmVjdGlvbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IHNvcnQuc29ydERpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsbGVkSXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMucmVkdWNlKChhY2MsIGZpbHRlcikgPT4ge1xuXG4gICAgICBzd2l0Y2ggKGZpbHRlci50eXBlKSB7XG4gICAgICAgIGNhc2UgSXRlbVR5cGUuU2VsZWN0OiB7XG4gICAgICAgICAgY29uc3QgbXVsdGlwbGVJc29sZGF0ZWQgPSBmaWx0ZXIubXVsdGlwbGVcbiAgICAgICAgICAgICYmIGZpbHRlci5pc29sYXRlXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGZpbHRlci5tb2RlbClcbiAgICAgICAgICAgICYmIGZpbHRlci5tb2RlbC5sZW5ndGhcbiAgICAgICAgICAgICYmIGZpbHRlci5tb2RlbC5pbmRleE9mKCdfX2FsbCcpID09PSAtMTtcblxuICAgICAgICAgIGNvbnN0IG11bHRpcGxlSGFzU2VsZWN0ZWRWYWx1ZXMgPSBmaWx0ZXIubXVsdGlwbGVcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKVxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aFxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPT09IC0xO1xuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSAhZmlsdGVyLm11bHRpcGxlICYmIGZpbHRlci5tb2RlbCAmJiBmaWx0ZXIubW9kZWwgIT09ICdfX2FsbCc7XG5cbiAgICAgICAgICBpZiAobXVsdGlwbGVJc29sZGF0ZWQgfHwgbXVsdGlwbGVIYXNTZWxlY3RlZFZhbHVlcyB8fCBzZWxlY3RlZFZhbHVlcykge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwczoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlci5tb2RlbCkgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aCkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5DaGVja2JveDoge1xuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgSXRlbVR5cGUuRGF0ZVJhbmdlOiBjYXNlIEl0ZW1UeXBlLkRhdGVUaW1lUmFuZ2U6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsLmZyb20gfHwgZmlsdGVyLm1vZGVsLnRvKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLktleXdvcmQ6IHt9IGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsICYmXG4gICAgICAgICAgICAoIWlzRW1wdHkoZmlsdGVyLm1vZGVsLCB7IHplcm86IHRydWUgfSkgfHwgIWlzRW1wdHkoZmlsdGVyLm1vZGVsLnZhbHVlLCB7emVybzogdHJ1ZX0pKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJzQ2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgZmlsdGVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSB0aGlzLnNvcnQudmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydEJ5SXRlbS5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSB0aGlzLnNvcnQuZGlyZWN0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRWYWx1ZXNGb3JQZW5kaW5nSXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZFZhbHVlcyhmYWxzZSkpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==