ngx-filters
Version:
This library was generated for all type of frameworks such as Angular Material, Prime Ng, etc. Providing Filters such as Number Box, TextBox, Date, Single Select, Multi Select And True/False Filters for grids or list.
199 lines • 27.9 kB
JavaScript
import { NgxFiltersService } from "./ngx-filters.service";
import { Directive, EventEmitter, Injector } from "@angular/core";
import { FilterTypes } from "./ngx-types";
export class NgxFiltersParentBase {
constructor(injector) {
this.filters = [];
this.filterCount = 0;
this.innerFilters = [];
this.apply = new EventEmitter();
this.filterChange = new EventEmitter();
this._firstFilters = [];
this.filteredFilters = [];
this.filteredFiltersChange = new EventEmitter();
this.filtersService = injector.get(NgxFiltersService);
this.filtersService.conditionSource = this.filtersService.getConditionSource();
}
ngOnChanges(changes) {
if (changes && changes.filters && changes.filters.currentValue) {
this.populateInnerFilter();
}
}
getClone(outerFilters) {
const filters = [];
outerFilters.forEach(filter => {
filters.push({
options: filter.options,
hidden: filter.hidden,
field: filter.field,
conditionOperator: filter.conditionOperator,
logicalOperator: filter.logicalOperator,
label: filter.label,
value: filter.value !== null && filter.value !== undefined ? typeof (filter.value) === 'object' && filter.type !== FilterTypes.DateTime ? Object.assign({}, filter.value) : filter.value : null,
type: filter.type,
valueTo: filter.valueTo,
values: filter.values ? [...filter.values] : null,
valuesName: filter.valuesName,
valueName: filter.valueName,
valueToName: filter.valueToName,
conditionName: filter.conditionName,
hasFilter: filter.hasFilter,
hiddenCondition: filter.hiddenCondition,
disabledCondition: filter.disabledCondition,
conditionOperators: filter.conditionOperators,
hideRemove: filter.hideRemove,
displayLabel: filter.displayLabel
// creationTime: filter['created']
});
});
return filters;
}
get filterTypes() {
return FilterTypes;
}
applyFilter(filter) {
if (this.filtersService.checkHasFilter(filter)) {
filter['created'] = (new Date()).getTime();
filter.hasFilter = true;
this.filtersService.setValueForDateHasNoValue(filter);
}
else {
filter['created'] = 0;
}
if (this.afterFilterChange) {
filter.displayLabel = this.filtersService.getDisplayLabel(filter);
this.afterFilterChange(filter).then((result) => {
this.filterChange.emit(filter);
this.applyFilters();
filter.displayLabel = result;
});
}
else {
filter.displayLabel = this.filtersService.getDisplayLabel(filter);
this.filterChange.emit(filter);
this.applyFilters();
}
}
applyFilters() {
// this.filters = [];
setTimeout(() => {
this._setFilterCount();
this._getAndSetFilteredFilters();
this.innerFilters = this._sort(this.innerFilters);
this.filters = this.getClone(this.innerFilters);
this.apply.emit({
filters: this.filters,
filteredFilters: this.filteredFilters,
filtersQueryString: this.filtersService.getFiltersInQueryString(this.filteredFilters)
});
}, 10);
if (this.afterApply) {
this.afterApply();
}
}
mapFilters(filteredFilters) {
return filteredFilters.map(filter => {
var _a, _b, _c, _d;
if (filter.type == FilterTypes.TrueFalse &&
filter.value == false
&& ((_b = (_a = filter.options) === null || _a === void 0 ? void 0 : _a.trueFalseOptions) === null || _b === void 0 ? void 0 : _b.falseIsNull) == true) {
filter.value = null;
}
if (filter.type == FilterTypes.SingleSelect || filter.type == FilterTypes.MultiSelect) {
if (filter.type == FilterTypes.SingleSelect && filter.value) {
filter.value = filter.value[(_d = (_c = filter === null || filter === void 0 ? void 0 : filter.options) === null || _c === void 0 ? void 0 : _c.selectBoxOptions) === null || _d === void 0 ? void 0 : _d.valueMember];
}
else if (filter.values) {
filter.values = filter.values.map(va => {
var _a, _b;
return va[(_b = (_a = filter === null || filter === void 0 ? void 0 : filter.options) === null || _a === void 0 ? void 0 : _a.selectBoxOptions) === null || _b === void 0 ? void 0 : _b.valueMember];
});
}
}
if (filter.type === FilterTypes.DateTime) {
filter.value = this.filtersService.getTime(filter.value);
filter.valueTo = this.filtersService.getTime(filter.valueTo);
}
return filter;
});
}
mapFiltersForFilteredFilters(filteredFilters) {
const items = [];
filteredFilters.forEach(item => {
items.push({
value: item.value,
values: item.values,
type: item.type,
logicalOperator: item.logicalOperator,
conditionOperator: item.conditionOperator,
field: item.field,
valueTo: item.valueTo
});
});
return items;
}
_getAndSetFilteredFilters() {
this.filteredFilters = this.mapFilters(this.getClone(this.innerFilters).filter(z => z.hasFilter));
this.filteredFilters = this.mapFiltersForFilteredFilters(this.filteredFilters);
this.filteredFiltersChange.emit(this.filteredFilters);
}
populateInnerFilter() {
this.innerFilters = [];
this.filters.forEach(item => {
item.hasFilter = this.filtersService.checkHasFilter(item);
this.filtersService.setValueForDateHasNoValue((item));
});
this.filters = this._sort(this.filters);
this.innerFilters = this.getClone(this.filters);
this._getAndSetFilteredFilters();
this._firstFilters = this.getClone(this.filters);
this._firstFilters.forEach(w => {
w.values = null;
w.value = null;
w.valueToName = null;
w.valuesName = null;
w.hasFilter = false;
w.valueTo = null;
});
this._setFilterCount();
}
_setFilterCount() {
var _a;
this.filterCount = (_a = this.innerFilters.filter(z => z.hasFilter && !z.hidden)) === null || _a === void 0 ? void 0 : _a.length;
}
ngOnInit() {
// this.filtersService.useJalaliDate = this.useJalaliDate;
// if (!this.isMobile) {
// this.populateInnerFilter();
// }
}
_sort(filter) {
return filter.sort((a, b) => {
let aa = a.hasFilter ? 0 : 1;
if (a['created']) {
aa = aa - a['created'];
}
let bb = b.hasFilter ? 0 : 1;
if (b['created']) {
bb = bb - b['created'];
}
return aa - bb;
});
}
onClearAll() {
this.innerFilters = this.getClone(this._firstFilters);
this.filters = this.getClone(this._firstFilters);
this.apply.emit({
filters: this.filters,
filteredFilters: [],
filtersQueryString: null
});
}
}
NgxFiltersParentBase.decorators = [
{ type: Directive, args: [{},] }
];
NgxFiltersParentBase.ctorParameters = () => [
{ type: Injector }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpbHRlcnMtcGFyZW50LWJhc2UuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvYS5tb2hhbW1hZGkvc291cmNlL3JlcG9zL015bGlicmFyeS9Bbmd1bGFyLkxpYnJhcnkvbGlicy9wcm9qZWN0cy9uZ3gtZmlsdGVycy9zcmMvIiwic291cmNlcyI6WyJsaWIvbmd4LWZpbHRlcnMtcGFyZW50LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFrRCxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQVMsV0FBVyxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUl0RSxNQUFNLE9BQWdCLG9CQUFvQjtJQWF4QyxZQUFzQixRQUFrQjtRQVgvQixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBRWhDLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLGlCQUFZLEdBQWEsRUFBRSxDQUFDO1FBQ25CLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUNqRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFM0Msa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDNUIsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFDL0IsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUc1RCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lB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QUFhO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDaEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDeEI7WUFDRCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDaEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDeEI7WUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixlQUFlLEVBQUUsRUFBRTtZQUNuQixrQkFBa0IsRUFBRSxJQUFJO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7OztZQXRORixTQUFTLFNBQUMsRUFBRTs7O1lBSm9CLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05neEZpbHRlcnNTZXJ2aWNlfSBmcm9tIFwiLi9uZ3gtZmlsdGVycy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7RGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlc30gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtGaWx0ZXIsIEZpbHRlclR5cGVzLCBOZ3hBcHBseUZpbHRlclJlc3VsdH0gZnJvbSBcIi4vbmd4LXR5cGVzXCI7XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7fSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5neEZpbHRlcnNQYXJlbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIHB1YmxpYyBmaWx0ZXJzU2VydmljZTogTmd4RmlsdGVyc1NlcnZpY2VcclxuICBhYnN0cmFjdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gIGFic3RyYWN0IGFmdGVyQXBwbHk7XHJcbiAgZmlsdGVyQ291bnQgPSAwO1xyXG4gIGlubmVyRmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICBhYnN0cmFjdCBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd4QXBwbHlGaWx0ZXJSZXN1bHQ+KCk7XHJcbiAgYWJzdHJhY3QgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXI+KCk7XHJcbiAgYWJzdHJhY3QgYWZ0ZXJGaWx0ZXJDaGFuZ2U6IChmaWx0ZXI6IEZpbHRlcikgPT4gUHJvbWlzZTxhbnk+O1xyXG4gIHByaXZhdGUgX2ZpcnN0RmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICBhYnN0cmFjdCBmaWx0ZXJlZEZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcbiAgYWJzdHJhY3QgZmlsdGVyZWRGaWx0ZXJzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJbXT4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgdGhpcy5maWx0ZXJzU2VydmljZSA9IGluamVjdG9yLmdldChOZ3hGaWx0ZXJzU2VydmljZSk7XHJcbiAgICB0aGlzLmZpbHRlcnNTZXJ2aWNlLmNvbmRpdGlvblNvdXJjZSA9IHRoaXMuZmlsdGVyc1NlcnZpY2UuZ2V0Q29uZGl0aW9uU291cmNlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmZpbHRlcnMgJiYgY2hhbmdlcy5maWx0ZXJzLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnBvcHVsYXRlSW5uZXJGaWx0ZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENsb25lKG91dGVyRmlsdGVyczogRmlsdGVyW10pOiBGaWx0ZXJbXSB7XHJcbiAgICBjb25zdCBmaWx0ZXJzID0gW107XHJcbiAgICBvdXRlckZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICBmaWx0ZXJzLnB1c2goXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3B0aW9uczogZmlsdGVyLm9wdGlvbnMsXHJcbiAgICAgICAgICBoaWRkZW46IGZpbHRlci5oaWRkZW4sXHJcbiAgICAgICAgICBmaWVsZDogZmlsdGVyLmZpZWxkLFxyXG4gICAgICAgICAgY29uZGl0aW9uT3BlcmF0b3I6IGZpbHRlci5jb25kaXRpb25PcGVyYXRvcixcclxuICAgICAgICAgIGxvZ2ljYWxPcGVyYXRvcjogZmlsdGVyLmxvZ2ljYWxPcGVyYXRvcixcclxuICAgICAgICAgIGxhYmVsOiBmaWx0ZXIubGFiZWwsXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlICE9PSBudWxsICYmIGZpbHRlci52YWx1ZSAhPT0gdW5kZWZpbmVkID8gdHlwZW9mIChmaWx0ZXIudmFsdWUpID09PSAnb2JqZWN0JyAmJiBmaWx0ZXIudHlwZSAhPT0gRmlsdGVyVHlwZXMuRGF0ZVRpbWUgPyB7Li4uZmlsdGVyLnZhbHVlfSA6IGZpbHRlci52YWx1ZSA6IG51bGwsXHJcbiAgICAgICAgICB0eXBlOiBmaWx0ZXIudHlwZSxcclxuICAgICAgICAgIHZhbHVlVG86IGZpbHRlci52YWx1ZVRvLFxyXG4gICAgICAgICAgdmFsdWVzOiBmaWx0ZXIudmFsdWVzID8gWy4uLmZpbHRlci52YWx1ZXNdIDogbnVsbCxcclxuICAgICAgICAgIHZhbHVlc05hbWU6IGZpbHRlci52YWx1ZXNOYW1lLFxyXG4gICAgICAgICAgdmFsdWVOYW1lOiBmaWx0ZXIudmFsdWVOYW1lLFxyXG4gICAgICAgICAgdmFsdWVUb05hbWU6IGZpbHRlci52YWx1ZVRvTmFtZSxcclxuICAgICAgICAgIGNvbmRpdGlvbk5hbWU6IGZpbHRlci5jb25kaXRpb25OYW1lLFxyXG4gICAgICAgICAgaGFzRmlsdGVyOiBmaWx0ZXIuaGFzRmlsdGVyLFxyXG4gICAgICAgICAgaGlkZGVuQ29uZGl0aW9uOiBmaWx0ZXIuaGlkZGVuQ29uZGl0aW9uLFxyXG4gICAgICAgICAgZGlzYWJsZWRDb25kaXRpb246IGZpbHRlci5kaXNhYmxlZENvbmRpdGlvbixcclxuICAgICAgICAgIGNvbmRpdGlvbk9wZXJhdG9yczogZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9ycyxcclxuICAgICAgICAgIGhpZGVSZW1vdmU6IGZpbHRlci5oaWRlUmVtb3ZlLFxyXG4gICAgICAgICAgZGlzcGxheUxhYmVsOiBmaWx0ZXIuZGlzcGxheUxhYmVsXHJcbiAgICAgICAgICAvLyBjcmVhdGlvblRpbWU6IGZpbHRlclsnY3JlYXRlZCddXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyVHlwZXMoKSB7XHJcbiAgICByZXR1cm4gRmlsdGVyVHlwZXM7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcihmaWx0ZXI6IEZpbHRlcik6IHZvaWQge1xyXG5cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJzU2VydmljZS5jaGVja0hhc0ZpbHRlcihmaWx0ZXIpKSB7XHJcblxyXG4gICAgICBmaWx0ZXJbJ2NyZWF0ZWQnXSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XHJcbiAgICAgIGZpbHRlci5oYXNGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZpbHRlcnNTZXJ2aWNlLnNldFZhbHVlRm9yRGF0ZUhhc05vVmFsdWUoZmlsdGVyKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJbJ2NyZWF0ZWQnXSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hZnRlckZpbHRlckNoYW5nZSkge1xyXG4gICAgICBmaWx0ZXIuZGlzcGxheUxhYmVsID0gdGhpcy5maWx0ZXJzU2VydmljZS5nZXREaXNwbGF5TGFiZWwoZmlsdGVyKTtcclxuICAgICAgdGhpcy5hZnRlckZpbHRlckNoYW5nZShmaWx0ZXIpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQoZmlsdGVyKTtcclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xyXG4gICAgICAgIGZpbHRlci5kaXNwbGF5TGFiZWwgPSByZXN1bHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmlsdGVyLmRpc3BsYXlMYWJlbCA9IHRoaXMuZmlsdGVyc1NlcnZpY2UuZ2V0RGlzcGxheUxhYmVsKGZpbHRlcik7XHJcbiAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQoZmlsdGVyKTtcclxuICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuZmlsdGVycyA9IFtdO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3NldEZpbHRlckNvdW50KCk7XHJcbiAgICAgIHRoaXMuX2dldEFuZFNldEZpbHRlcmVkRmlsdGVycygpO1xyXG4gICAgICB0aGlzLmlubmVyRmlsdGVycyA9IHRoaXMuX3NvcnQodGhpcy5pbm5lckZpbHRlcnMpO1xyXG4gICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmdldENsb25lKHRoaXMuaW5uZXJGaWx0ZXJzKTtcclxuICAgICAgdGhpcy5hcHBseS5lbWl0KHtcclxuICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXHJcbiAgICAgICAgZmlsdGVyZWRGaWx0ZXJzOiB0aGlzLmZpbHRlcmVkRmlsdGVycyxcclxuICAgICAgICBmaWx0ZXJzUXVlcnlTdHJpbmc6IHRoaXMuZmlsdGVyc1NlcnZpY2UuZ2V0RmlsdGVyc0luUXVlcnlTdHJpbmcodGhpcy5maWx0ZXJlZEZpbHRlcnMpXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0sIDEwKTtcclxuICAgIGlmICh0aGlzLmFmdGVyQXBwbHkpIHtcclxuICAgICAgdGhpcy5hZnRlckFwcGx5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlcnMoZmlsdGVyZWRGaWx0ZXJzKTogRmlsdGVyW10ge1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZEZpbHRlcnMubWFwKGZpbHRlciA9PiB7XHJcbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5UcnVlRmFsc2UgJiZcclxuICAgICAgICBmaWx0ZXIudmFsdWUgPT0gZmFsc2VcclxuICAgICAgICAmJiBmaWx0ZXIub3B0aW9ucz8udHJ1ZUZhbHNlT3B0aW9ucz8uZmFsc2VJc051bGwgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGZpbHRlci52YWx1ZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpbHRlci50eXBlID09IEZpbHRlclR5cGVzLlNpbmdsZVNlbGVjdCB8fCBmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5TaW5nbGVTZWxlY3QgJiYgZmlsdGVyLnZhbHVlKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWVbZmlsdGVyPy5vcHRpb25zPy5zZWxlY3RCb3hPcHRpb25zPy52YWx1ZU1lbWJlcl07XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudmFsdWVzKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVzID0gZmlsdGVyLnZhbHVlcy5tYXAodmEgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFbZmlsdGVyPy5vcHRpb25zPy5zZWxlY3RCb3hPcHRpb25zPy52YWx1ZU1lbWJlcl07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlcy5EYXRlVGltZSkge1xyXG4gICAgICAgIGZpbHRlci52YWx1ZSA9IHRoaXMuZmlsdGVyc1NlcnZpY2UuZ2V0VGltZShmaWx0ZXIudmFsdWUpO1xyXG4gICAgICAgIGZpbHRlci52YWx1ZVRvID0gdGhpcy5maWx0ZXJzU2VydmljZS5nZXRUaW1lKGZpbHRlci52YWx1ZVRvKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlsdGVyO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEZpbHRlcnNGb3JGaWx0ZXJlZEZpbHRlcnMoZmlsdGVyZWRGaWx0ZXJzOiBGaWx0ZXJbXSk6IEZpbHRlcltdIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gW107XHJcbiAgICBmaWx0ZXJlZEZpbHRlcnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXHJcbiAgICAgICAgdmFsdWVzOiBpdGVtLnZhbHVlcyxcclxuICAgICAgICB0eXBlOiBpdGVtLnR5cGUsXHJcbiAgICAgICAgbG9naWNhbE9wZXJhdG9yOiBpdGVtLmxvZ2ljYWxPcGVyYXRvcixcclxuICAgICAgICBjb25kaXRpb25PcGVyYXRvcjogaXRlbS5jb25kaXRpb25PcGVyYXRvcixcclxuICAgICAgICBmaWVsZDogaXRlbS5maWVsZCxcclxuICAgICAgICB2YWx1ZVRvOiBpdGVtLnZhbHVlVG9cclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGl0ZW1zIGFzIGFueTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEFuZFNldEZpbHRlcmVkRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyZWRGaWx0ZXJzID0gdGhpcy5tYXBGaWx0ZXJzKHRoaXMuZ2V0Q2xvbmUodGhpcy5pbm5lckZpbHRlcnMpLmZpbHRlcih6ID0+IHouaGFzRmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlcmVkRmlsdGVycyA9IHRoaXMubWFwRmlsdGVyc0ZvckZpbHRlcmVkRmlsdGVycyh0aGlzLmZpbHRlcmVkRmlsdGVycyk7XHJcbiAgICB0aGlzLmZpbHRlcmVkRmlsdGVyc0NoYW5nZS5lbWl0KHRoaXMuZmlsdGVyZWRGaWx0ZXJzKTtcclxuXHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZUlubmVyRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbm5lckZpbHRlcnMgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpdGVtLmhhc0ZpbHRlciA9IHRoaXMuZmlsdGVyc1NlcnZpY2UuY2hlY2tIYXNGaWx0ZXIoaXRlbSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyc1NlcnZpY2Uuc2V0VmFsdWVGb3JEYXRlSGFzTm9WYWx1ZSgoaXRlbSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzID0gdGhpcy5fc29ydCh0aGlzLmZpbHRlcnMpO1xyXG5cclxuICAgIHRoaXMuaW5uZXJGaWx0ZXJzID0gdGhpcy5nZXRDbG9uZSh0aGlzLmZpbHRlcnMpO1xyXG5cclxuICAgIHRoaXMuX2dldEFuZFNldEZpbHRlcmVkRmlsdGVycygpO1xyXG5cclxuICAgIHRoaXMuX2ZpcnN0RmlsdGVycyA9IHRoaXMuZ2V0Q2xvbmUodGhpcy5maWx0ZXJzKTtcclxuICAgIHRoaXMuX2ZpcnN0RmlsdGVycy5mb3JFYWNoKHcgPT4ge1xyXG4gICAgICB3LnZhbHVlcyA9IG51bGw7XHJcbiAgICAgIHcudmFsdWUgPSBudWxsO1xyXG4gICAgICB3LnZhbHVlVG9OYW1lID0gbnVsbDtcclxuICAgICAgdy52YWx1ZXNOYW1lID0gbnVsbDtcclxuICAgICAgdy5oYXNGaWx0ZXIgPSBmYWxzZTtcclxuICAgICAgdy52YWx1ZVRvID0gbnVsbDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fc2V0RmlsdGVyQ291bnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEZpbHRlckNvdW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJDb3VudCA9IHRoaXMuaW5uZXJGaWx0ZXJzLmZpbHRlcih6ID0+IHouaGFzRmlsdGVyICYmICF6LmhpZGRlbik/Lmxlbmd0aDtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuZmlsdGVyc1NlcnZpY2UudXNlSmFsYWxpRGF0ZSA9IHRoaXMudXNlSmFsYWxpRGF0ZTtcclxuICAgIC8vIGlmICghdGhpcy5pc01vYmlsZSkge1xyXG4gICAgLy8gdGhpcy5wb3B1bGF0ZUlubmVyRmlsdGVyKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zb3J0KGZpbHRlcjogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gZmlsdGVyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgbGV0IGFhID0gYS5oYXNGaWx0ZXIgPyAwIDogMTtcclxuICAgICAgaWYgKGFbJ2NyZWF0ZWQnXSkge1xyXG4gICAgICAgIGFhID0gYWEgLSBhWydjcmVhdGVkJ107XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGJiID0gYi5oYXNGaWx0ZXIgPyAwIDogMTtcclxuICAgICAgaWYgKGJbJ2NyZWF0ZWQnXSkge1xyXG4gICAgICAgIGJiID0gYmIgLSBiWydjcmVhdGVkJ107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFhIC0gYmI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlubmVyRmlsdGVycyA9IHRoaXMuZ2V0Q2xvbmUodGhpcy5fZmlyc3RGaWx0ZXJzKTtcclxuICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZ2V0Q2xvbmUodGhpcy5fZmlyc3RGaWx0ZXJzKTtcclxuICAgIHRoaXMuYXBwbHkuZW1pdCh7XHJcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcclxuICAgICAgZmlsdGVyZWRGaWx0ZXJzOiBbXSxcclxuICAgICAgZmlsdGVyc1F1ZXJ5U3RyaW5nOiBudWxsXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19