@firestitch/filter 12.3.2 → 12.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/classes/actions-controller.d.ts +38 -38
- package/app/components/action-button/action-button.component.d.ts +7 -7
- package/app/components/action-kebab-actions/action-kebab-actions.component.d.ts +7 -7
- package/app/components/actions/actions.component.d.ts +8 -8
- package/app/components/filter/filter.component.d.ts +192 -192
- package/app/components/filter-chip/filter-chip.component.d.ts +26 -26
- package/app/components/filter-chip-content/filter-chip-content.component.d.ts +18 -18
- package/app/components/filter-chips/filter-chips.component.d.ts +8 -8
- package/app/components/filter-drawer/filter-drawer.component.d.ts +30 -30
- package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +15 -15
- package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +13 -13
- package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +20 -20
- package/app/components/filters-item/base-item/base-item.component.d.ts +23 -23
- package/app/components/filters-item/checkbox/checkbox.component.d.ts +11 -11
- package/app/components/filters-item/chips/chips.component.d.ts +13 -13
- package/app/components/filters-item/date/date.component.d.ts +19 -19
- package/app/components/filters-item/date-range/date-range.component.d.ts +14 -14
- package/app/components/filters-item/filter-item.component.d.ts +15 -15
- package/app/components/filters-item/range/range.component.d.ts +15 -15
- package/app/components/filters-item/select/backdrop/backdrop.component.d.ts +6 -6
- package/app/components/filters-item/select/groups/groups.component.d.ts +12 -12
- package/app/components/filters-item/select/multiple/multiple.component.d.ts +14 -14
- package/app/components/filters-item/select/select.component.d.ts +16 -16
- package/app/components/filters-item/select/simple/simple.component.d.ts +14 -14
- package/app/components/filters-item/text/text.component.d.ts +19 -19
- package/app/components/filters-item/week/week.component.d.ts +12 -12
- package/app/components/saved-filter-edit/saved-filter-edit.component.d.ts +18 -18
- package/app/components/saved-filters-menu/saved-filters-menu.component.d.ts +23 -23
- package/app/consts/query-param-delimiter.d.ts +1 -1
- package/app/directives/focus-to-item/focus-to-item.directive.d.ts +27 -27
- package/app/directives/status-bar/status-bar.directive.d.ts +5 -5
- package/app/enums/action-mode.enum.d.ts +5 -5
- package/app/enums/action-type.enum.d.ts +7 -7
- package/app/enums/item-date-mode.enum.d.ts +5 -5
- package/app/enums/item-type.enum.d.ts +15 -15
- package/app/fs-filter.module.d.ts +64 -65
- package/app/helpers/build-query-params.d.ts +3 -3
- package/app/helpers/compare.d.ts +2 -2
- package/app/helpers/create-filter-item.d.ts +13 -13
- package/app/helpers/find-value.d.ts +1 -1
- package/app/helpers/get-range-name.d.ts +1 -1
- package/app/helpers/parse-date.d.ts +1 -1
- package/app/helpers/parse-item-value-from-stored.d.ts +1 -1
- package/app/helpers/query-param-transformers.d.ts +2 -2
- package/app/helpers/restore-items.d.ts +12 -12
- package/app/helpers/try-convert-to-number.d.ts +1 -1
- package/app/injectors/filter-config.d.ts +2 -2
- package/app/injectors/filter-drawer-data.d.ts +2 -2
- package/app/injectors/filter-drawer-overlay.d.ts +2 -2
- package/app/interfaces/action.interface.d.ts +69 -69
- package/app/interfaces/config.interface.d.ts +61 -61
- package/app/interfaces/external-params.interface.d.ts +3 -3
- package/app/interfaces/filter.interface.d.ts +4 -4
- package/app/interfaces/items/autocomplete-chips.interface.d.ts +12 -12
- package/app/interfaces/items/autocomplete.interface.d.ts +6 -6
- package/app/interfaces/items/base.interface.d.ts +27 -27
- package/app/interfaces/items/checkbox.interface.d.ts +7 -7
- package/app/interfaces/items/chips.interface.d.ts +6 -6
- package/app/interfaces/items/date-range.interface.d.ts +8 -8
- package/app/interfaces/items/date.interface.d.ts +7 -7
- package/app/interfaces/items/range.interface.d.ts +13 -13
- package/app/interfaces/items/select.interface.d.ts +20 -20
- package/app/interfaces/items/text.interface.d.ts +9 -9
- package/app/interfaces/items/week.interface.d.ts +7 -7
- package/app/interfaces/saved-filters.interface.d.ts +18 -18
- package/app/interfaces/update-filter-item.interface.d.ts +4 -4
- package/app/models/action-menu-item.model.d.ts +23 -23
- package/app/models/action.model.d.ts +45 -45
- package/app/models/filter-config.d.ts +30 -30
- package/app/models/items/autocomplete/base-autocomplete-item.d.ts +12 -12
- package/app/models/items/autocomplete-chips-item.d.ts +19 -19
- package/app/models/items/autocomplete-item.d.ts +10 -10
- package/app/models/items/base-item.d.ts +75 -75
- package/app/models/items/checkbox-item.d.ts +16 -16
- package/app/models/items/chips-item.d.ts +17 -17
- package/app/models/items/date/base-date-item.d.ts +14 -14
- package/app/models/items/date-item.d.ts +7 -7
- package/app/models/items/date-range/base-date-range-item.d.ts +21 -21
- package/app/models/items/date-range-item.d.ts +5 -5
- package/app/models/items/date-time-item.d.ts +6 -6
- package/app/models/items/date-time-range-item.d.ts +5 -5
- package/app/models/items/range-item.d.ts +22 -22
- package/app/models/items/select/base-select-item.d.ts +13 -13
- package/app/models/items/select/multiple-select-item.d.ts +12 -12
- package/app/models/items/select/simple-select-item.d.ts +12 -12
- package/app/models/items/select-item.d.ts +7 -7
- package/app/models/items/text-item.d.ts +14 -14
- package/app/models/items/week-item.d.ts +17 -17
- package/app/pipes/remove-isolate-value.pipe.d.ts +8 -8
- package/app/providers/filter-meta.d.ts +5 -5
- package/app/services/external-params/persistance-params-controller.service.d.ts +22 -22
- package/app/services/external-params/query-params-controller.service.d.ts +22 -22
- package/app/services/external-params/saved-filters-controller.service.d.ts +40 -40
- package/app/services/external-params-controller.service.d.ts +44 -44
- package/app/services/filter-overlay.service.d.ts +34 -34
- package/app/services/focus-controller.service.d.ts +18 -18
- package/app/services/items-store.service.d.ts +65 -65
- package/bundles/firestitch-filter.umd.js +5343 -5346
- package/bundles/firestitch-filter.umd.js.map +1 -1
- package/esm2015/app/classes/actions-controller.js +122 -123
- package/esm2015/app/components/action-button/action-button.component.js +23 -25
- package/esm2015/app/components/action-kebab-actions/action-kebab-actions.component.js +22 -22
- package/esm2015/app/components/actions/actions.component.js +31 -31
- package/esm2015/app/components/filter/filter.component.js +617 -615
- package/esm2015/app/components/filter-chip/filter-chip.component.js +89 -91
- package/esm2015/app/components/filter-chip-content/filter-chip-content.component.js +83 -84
- package/esm2015/app/components/filter-chips/filter-chips.component.js +24 -24
- package/esm2015/app/components/filter-drawer/filter-drawer.component.js +73 -76
- package/esm2015/app/components/filter-drawer-actions/filter-drawer-actions.component.js +42 -43
- package/esm2015/app/components/filters-item/autocomplete/autocomplete.component.js +30 -30
- package/esm2015/app/components/filters-item/autocompletechips/autocompletechips.component.js +52 -52
- package/esm2015/app/components/filters-item/base-item/base-item.component.js +59 -59
- package/esm2015/app/components/filters-item/checkbox/checkbox.component.js +25 -25
- package/esm2015/app/components/filters-item/chips/chips.component.js +32 -32
- package/esm2015/app/components/filters-item/date/date.component.js +45 -45
- package/esm2015/app/components/filters-item/date-range/date-range.component.js +36 -36
- package/esm2015/app/components/filters-item/filter-item.component.js +47 -48
- package/esm2015/app/components/filters-item/range/range.component.js +49 -51
- package/esm2015/app/components/filters-item/select/backdrop/backdrop.component.js +16 -16
- package/esm2015/app/components/filters-item/select/groups/groups.component.js +32 -34
- package/esm2015/app/components/filters-item/select/multiple/multiple.component.js +59 -61
- package/esm2015/app/components/filters-item/select/select.component.js +44 -44
- package/esm2015/app/components/filters-item/select/simple/simple.component.js +45 -48
- package/esm2015/app/components/filters-item/text/text.component.js +54 -54
- package/esm2015/app/components/filters-item/week/week.component.js +28 -28
- package/esm2015/app/components/saved-filter-edit/saved-filter-edit.component.js +55 -55
- package/esm2015/app/components/saved-filters-menu/saved-filters-menu.component.js +55 -58
- package/esm2015/app/consts/query-param-delimiter.js +1 -1
- package/esm2015/app/directives/focus-to-item/focus-to-item.directive.js +125 -130
- package/esm2015/app/directives/status-bar/status-bar.directive.js +12 -12
- package/esm2015/app/enums/action-mode.enum.js +6 -6
- package/esm2015/app/enums/action-type.enum.js +8 -8
- package/esm2015/app/enums/item-date-mode.enum.js +6 -6
- package/esm2015/app/enums/item-type.enum.js +16 -16
- package/esm2015/app/fs-filter.module.js +235 -239
- package/esm2015/app/helpers/build-query-params.js +31 -31
- package/esm2015/app/helpers/compare.js +37 -37
- package/esm2015/app/helpers/create-filter-item.js +54 -54
- package/esm2015/app/helpers/find-value.js +12 -12
- package/esm2015/app/helpers/get-range-name.js +8 -8
- package/esm2015/app/helpers/parse-date.js +7 -7
- package/esm2015/app/helpers/parse-item-value-from-stored.js +81 -81
- package/esm2015/app/helpers/query-param-transformers.js +8 -8
- package/esm2015/app/helpers/restore-items.js +48 -48
- package/esm2015/app/helpers/try-convert-to-number.js +5 -5
- package/esm2015/app/injectors/filter-config.js +2 -2
- package/esm2015/app/injectors/filter-drawer-data.js +2 -2
- package/esm2015/app/injectors/filter-drawer-overlay.js +2 -2
- package/esm2015/app/interfaces/action.interface.js +1 -1
- package/esm2015/app/interfaces/config.interface.js +1 -1
- package/esm2015/app/interfaces/external-params.interface.js +1 -1
- package/esm2015/app/interfaces/filter.interface.js +1 -1
- package/esm2015/app/interfaces/items/autocomplete-chips.interface.js +1 -1
- package/esm2015/app/interfaces/items/autocomplete.interface.js +1 -1
- package/esm2015/app/interfaces/items/base.interface.js +1 -1
- package/esm2015/app/interfaces/items/checkbox.interface.js +1 -1
- package/esm2015/app/interfaces/items/chips.interface.js +1 -1
- package/esm2015/app/interfaces/items/date-range.interface.js +1 -1
- package/esm2015/app/interfaces/items/date.interface.js +1 -1
- package/esm2015/app/interfaces/items/range.interface.js +1 -1
- package/esm2015/app/interfaces/items/select.interface.js +1 -1
- package/esm2015/app/interfaces/items/text.interface.js +1 -1
- package/esm2015/app/interfaces/items/week.interface.js +1 -1
- package/esm2015/app/interfaces/saved-filters.interface.js +1 -1
- package/esm2015/app/interfaces/update-filter-item.interface.js +1 -1
- package/esm2015/app/models/action-menu-item.model.js +66 -66
- package/esm2015/app/models/action.model.js +102 -102
- package/esm2015/app/models/filter-config.js +65 -65
- package/esm2015/app/models/items/autocomplete/base-autocomplete-item.js +13 -13
- package/esm2015/app/models/items/autocomplete-chips-item.js +61 -61
- package/esm2015/app/models/items/autocomplete-item.js +31 -31
- package/esm2015/app/models/items/base-item.js +233 -233
- package/esm2015/app/models/items/checkbox-item.js +47 -47
- package/esm2015/app/models/items/chips-item.js +83 -83
- package/esm2015/app/models/items/date/base-date-item.js +47 -47
- package/esm2015/app/models/items/date-item.js +18 -18
- package/esm2015/app/models/items/date-range/base-date-range-item.js +136 -136
- package/esm2015/app/models/items/date-range-item.js +6 -6
- package/esm2015/app/models/items/date-time-item.js +9 -9
- package/esm2015/app/models/items/date-time-range-item.js +6 -6
- package/esm2015/app/models/items/range-item.js +88 -88
- package/esm2015/app/models/items/select/base-select-item.js +33 -33
- package/esm2015/app/models/items/select/multiple-select-item.js +68 -68
- package/esm2015/app/models/items/select/simple-select-item.js +62 -62
- package/esm2015/app/models/items/select-item.js +12 -12
- package/esm2015/app/models/items/text-item.js +29 -29
- package/esm2015/app/models/items/week-item.js +96 -96
- package/esm2015/app/pipes/remove-isolate-value.pipe.js +22 -22
- package/esm2015/app/providers/filter-meta.js +9 -9
- package/esm2015/app/services/external-params/persistance-params-controller.service.js +52 -58
- package/esm2015/app/services/external-params/query-params-controller.service.js +55 -57
- package/esm2015/app/services/external-params/saved-filters-controller.service.js +163 -165
- package/esm2015/app/services/external-params-controller.service.js +161 -166
- package/esm2015/app/services/filter-overlay.service.js +115 -116
- package/esm2015/app/services/focus-controller.service.js +29 -29
- package/esm2015/app/services/items-store.service.js +323 -323
- package/esm2015/firestitch-filter.js +4 -4
- package/esm2015/public_api.js +36 -36
- package/fesm2015/firestitch-filter.js +4268 -4272
- package/fesm2015/firestitch-filter.js.map +1 -1
- package/firestitch-filter.d.ts +5 -5
- package/package.json +3 -2
- package/public_api.d.ts +40 -40
|
@@ -1,324 +1,324 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
|
|
3
|
-
import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
|
|
4
|
-
import { pickBy } from 'lodash-es';
|
|
5
|
-
import { ItemType } from '../enums/item-type.enum';
|
|
6
|
-
import { SimpleSelectItem } from '../models/items/select/simple-select-item';
|
|
7
|
-
import { SORT_BY_FIELD, SORT_DIRECTION_FIELD } from '../models/filter-config';
|
|
8
|
-
import { createFilterItem } from '../helpers/create-filter-item';
|
|
9
|
-
import { RangeItem } from '../models/items/range-item';
|
|
10
|
-
import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
export class FsFilterItemsStore {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.sortByItem = null;
|
|
15
|
-
this.sortDirectionItem = null;
|
|
16
|
-
this.keywordItem = null;
|
|
17
|
-
this._ready$ = new BehaviorSubject(false);
|
|
18
|
-
this._items = [];
|
|
19
|
-
this._visibleItems$ = new BehaviorSubject([]);
|
|
20
|
-
this._itemsByName = new Map();
|
|
21
|
-
this._itemsValuesLoaded = false;
|
|
22
|
-
this._hasKeyword = false;
|
|
23
|
-
this._itemsChange$ = new Subject();
|
|
24
|
-
this._destroy$ = new Subject();
|
|
25
|
-
this._lazyInit();
|
|
26
|
-
}
|
|
27
|
-
get items() {
|
|
28
|
-
return this._items;
|
|
29
|
-
}
|
|
30
|
-
get visibleItems() {
|
|
31
|
-
return this._visibleItems$.getValue();
|
|
32
|
-
}
|
|
33
|
-
get visibleItems$() {
|
|
34
|
-
return this._visibleItems$.asObservable();
|
|
35
|
-
}
|
|
36
|
-
set visibleItems(items) {
|
|
37
|
-
this._visibleItems$.next(items);
|
|
38
|
-
}
|
|
39
|
-
get hasKeyword() {
|
|
40
|
-
return this._hasKeyword;
|
|
41
|
-
}
|
|
42
|
-
get itemsChange$() {
|
|
43
|
-
return this._itemsChange$.pipe(debounceTime(30));
|
|
44
|
-
}
|
|
45
|
-
get ready$() {
|
|
46
|
-
return this._ready$.asObservable();
|
|
47
|
-
}
|
|
48
|
-
ngOnDestroy() {
|
|
49
|
-
this.destroyItems();
|
|
50
|
-
this._destroy$.next();
|
|
51
|
-
this._destroy$.complete();
|
|
52
|
-
}
|
|
53
|
-
setConfig(config) {
|
|
54
|
-
this._itemsByName.clear();
|
|
55
|
-
this._config = config;
|
|
56
|
-
this.initItems(config.items);
|
|
57
|
-
}
|
|
58
|
-
getItemByName(name) {
|
|
59
|
-
return this._itemsByName.get(name);
|
|
60
|
-
}
|
|
61
|
-
initItems(items) {
|
|
62
|
-
this._itemsValuesLoaded = false;
|
|
63
|
-
if (Array.isArray(items)) {
|
|
64
|
-
this._createItems(items);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
filtersClear() {
|
|
68
|
-
var _a;
|
|
69
|
-
this.items.forEach((item) => {
|
|
70
|
-
if (item instanceof RangeItem) {
|
|
71
|
-
item.clearRange(null, item.defaultValue);
|
|
72
|
-
}
|
|
73
|
-
else if (item instanceof BaseDateRangeItem) {
|
|
74
|
-
item.clearDateRange(null, item.defaultValue);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
item.clear(item.defaultValue);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
if (this.sortByItem) {
|
|
81
|
-
if (this._config.sort) {
|
|
82
|
-
this.sortByItem.model = this._config.sort.value;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
this.sortByItem.clear(this.sortByItem.defaultValue);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (this.sortDirectionItem) {
|
|
89
|
-
if (this._config.sort) {
|
|
90
|
-
this.sortDirectionItem.model = this._config.sort.direction;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
(_a = this.keywordItem) === null || _a === void 0 ? void 0 : _a.clear();
|
|
97
|
-
}
|
|
98
|
-
loadAsyncValues() {
|
|
99
|
-
this.items
|
|
100
|
-
.filter((item) => item.hasPendingValues)
|
|
101
|
-
.forEach((item) => item.loadAsyncValues());
|
|
102
|
-
}
|
|
103
|
-
loadAsyncDefaults() {
|
|
104
|
-
const pendingItems = this.items
|
|
105
|
-
.filter((item) => {
|
|
106
|
-
return item.defaultValueFn
|
|
107
|
-
&& (item.persistedValue === null || item.persistedValue === undefined);
|
|
108
|
-
});
|
|
109
|
-
if (pendingItems.length > 0) {
|
|
110
|
-
forkJoin(pendingItems
|
|
111
|
-
.map((item) => item.loadDefaultValue()))
|
|
112
|
-
.pipe(finalize(() => {
|
|
113
|
-
this._ready$.next(true);
|
|
114
|
-
}), takeUntil(this._destroy$))
|
|
115
|
-
.subscribe();
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
this._ready$.next(true);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
getSort() {
|
|
122
|
-
let sortBy = this.getSortByValue();
|
|
123
|
-
sortBy = sortBy === '__all' ? null : sortBy;
|
|
124
|
-
let sortDirection = this.getSortDirectionValue();
|
|
125
|
-
sortDirection = sortDirection === '__all' ? null : sortDirection;
|
|
126
|
-
return {
|
|
127
|
-
value: sortBy,
|
|
128
|
-
direction: sortDirection,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
getSortByValue() {
|
|
132
|
-
return this.sortByItem ? this.sortByItem.model : null;
|
|
133
|
-
}
|
|
134
|
-
getSortDirectionValue() {
|
|
135
|
-
return this.sortDirectionItem ? this.sortDirectionItem.model : null;
|
|
136
|
-
}
|
|
137
|
-
updateSort(sort) {
|
|
138
|
-
if (sort.sortBy) {
|
|
139
|
-
this.sortByItem.model = sort.sortBy;
|
|
140
|
-
}
|
|
141
|
-
if (sort.sortDirection) {
|
|
142
|
-
this.sortDirectionItem.model = sort.sortDirection;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
values(onlyPresented = false) {
|
|
146
|
-
return this.items.reduce((acc, item) => {
|
|
147
|
-
const value = item.value;
|
|
148
|
-
if (!onlyPresented || value !== null) {
|
|
149
|
-
acc[item.name] = value;
|
|
150
|
-
}
|
|
151
|
-
return acc;
|
|
152
|
-
}, {});
|
|
153
|
-
}
|
|
154
|
-
valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
|
|
155
|
-
const params = {};
|
|
156
|
-
(items || this.items).forEach((filterItem) => {
|
|
157
|
-
const values = persisted
|
|
158
|
-
? filterItem.persistanceObject
|
|
159
|
-
: filterItem.queryObject;
|
|
160
|
-
Object.assign(params, values);
|
|
161
|
-
});
|
|
162
|
-
if (onlyPresented) {
|
|
163
|
-
return pickBy(params, (val) => {
|
|
164
|
-
return val !== null && val !== void 0;
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
return params;
|
|
168
|
-
}
|
|
169
|
-
initItemValues(p) {
|
|
170
|
-
this.items
|
|
171
|
-
.forEach((item) => {
|
|
172
|
-
item.initValues(p[item.name]);
|
|
173
|
-
});
|
|
174
|
-
this._initSortingItems(p);
|
|
175
|
-
this.loadAsyncDefaults();
|
|
176
|
-
this._subscribeToItemsChanges();
|
|
177
|
-
}
|
|
178
|
-
updateItemsWithValues(values) {
|
|
179
|
-
this.items
|
|
180
|
-
.forEach((item) => {
|
|
181
|
-
if (values[item.name]) {
|
|
182
|
-
item.model = values[item.name];
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
if (item instanceof RangeItem) {
|
|
186
|
-
item.clearRange(null, item.defaultValue);
|
|
187
|
-
}
|
|
188
|
-
else if (item instanceof BaseDateRangeItem) {
|
|
189
|
-
item.clearDateRange(null, item.defaultValue);
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
item.clear();
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
if (this.sortByItem) {
|
|
197
|
-
this.sortByItem.clear();
|
|
198
|
-
}
|
|
199
|
-
if (this.sortDirectionItem) {
|
|
200
|
-
this.sortDirectionItem.clear();
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
destroyItems() {
|
|
204
|
-
var _a, _b;
|
|
205
|
-
this.items
|
|
206
|
-
.forEach((item) => item.destroy());
|
|
207
|
-
(_a = this.sortByItem) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
208
|
-
(_b = this.sortDirectionItem) === null || _b === void 0 ? void 0 : _b.destroy();
|
|
209
|
-
this._items = [];
|
|
210
|
-
this.sortByItem = null;
|
|
211
|
-
this.sortDirectionItem = null;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Some items might need to load async values before they will be shown
|
|
215
|
-
*/
|
|
216
|
-
prepareItems() {
|
|
217
|
-
if (!this._itemsValuesLoaded) {
|
|
218
|
-
this._itemsValuesLoaded = true;
|
|
219
|
-
this.loadAsyncValues();
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
updateVisibleItems() {
|
|
223
|
-
this.visibleItems = this.items
|
|
224
|
-
.filter((item) => !item.isTypeKeyword && !item.hide);
|
|
225
|
-
}
|
|
226
|
-
_createItems(items) {
|
|
227
|
-
this._items = items
|
|
228
|
-
.filter((item) => !item.disable)
|
|
229
|
-
.filter((item) => {
|
|
230
|
-
if (this._itemsByName.has(item.name)) {
|
|
231
|
-
throw Error('Filter init error. Items name must be unique.');
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
this._itemsByName.set(item.name, null);
|
|
235
|
-
return true;
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
.map((item) => {
|
|
239
|
-
const filterItem = createFilterItem(item, { case: this._config.case });
|
|
240
|
-
if (filterItem.type === ItemType.Keyword) {
|
|
241
|
-
this._hasKeyword = true;
|
|
242
|
-
}
|
|
243
|
-
this._itemsByName.set(item.name, filterItem);
|
|
244
|
-
return filterItem;
|
|
245
|
-
});
|
|
246
|
-
this._createSortingItems();
|
|
247
|
-
}
|
|
248
|
-
_subscribeToItemsChanges() {
|
|
249
|
-
var _a;
|
|
250
|
-
this.items
|
|
251
|
-
.forEach((item) => {
|
|
252
|
-
item.valueChange$
|
|
253
|
-
.pipe(takeUntil(item.destroy$))
|
|
254
|
-
.subscribe(() => {
|
|
255
|
-
this._itemsChange$.next(item);
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
if ((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) {
|
|
259
|
-
this.sortByItem.valueChange$
|
|
260
|
-
.pipe(takeUntil(this.sortByItem.destroy$))
|
|
261
|
-
.subscribe(() => {
|
|
262
|
-
this._itemsChange$.next(this.sortByItem);
|
|
263
|
-
});
|
|
264
|
-
this.sortDirectionItem.valueChange$
|
|
265
|
-
.pipe(takeUntil(this.sortDirectionItem.destroy$))
|
|
266
|
-
.subscribe(() => {
|
|
267
|
-
this._itemsChange$.next(this.sortDirectionItem);
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
_lazyInit() {
|
|
272
|
-
this.ready$
|
|
273
|
-
.pipe(filter((state) => state), takeUntil(this._destroy$))
|
|
274
|
-
.subscribe(() => {
|
|
275
|
-
this.updateVisibleItems();
|
|
276
|
-
this._setKeywordItem();
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
_initSortingItems(p) {
|
|
280
|
-
if (this.sortByItem && this.sortDirectionItem) {
|
|
281
|
-
this.sortByItem.initValues(p[this.sortByItem.name]);
|
|
282
|
-
this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
_createSortingItems() {
|
|
286
|
-
var _a;
|
|
287
|
-
if (((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
288
|
-
const sortByItem = {
|
|
289
|
-
name: SORT_BY_FIELD,
|
|
290
|
-
type: ItemType.Select,
|
|
291
|
-
label: 'Sort By',
|
|
292
|
-
values: this._config.sortValues
|
|
293
|
-
};
|
|
294
|
-
if (this._config.sort && this._config.sort.value) {
|
|
295
|
-
sortByItem.default = this._config.sort.value;
|
|
296
|
-
}
|
|
297
|
-
this.sortByItem = new SimpleSelectItem(sortByItem, null);
|
|
298
|
-
const sortDirectionItem = {
|
|
299
|
-
name: SORT_DIRECTION_FIELD,
|
|
300
|
-
type: ItemType.Select,
|
|
301
|
-
label: 'Sort Direction',
|
|
302
|
-
values: [
|
|
303
|
-
{ name: 'Ascending', value: 'asc' },
|
|
304
|
-
{ name: 'Descending', value: 'desc' }
|
|
305
|
-
]
|
|
306
|
-
};
|
|
307
|
-
if (this._config.sort && this._config.sort.direction) {
|
|
308
|
-
sortDirectionItem.default = this._config.sort.direction;
|
|
309
|
-
}
|
|
310
|
-
this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
_setKeywordItem() {
|
|
314
|
-
this.keywordItem = this
|
|
315
|
-
.items
|
|
316
|
-
.find((item) => item.isTypeKeyword);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
FsFilterItemsStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
320
|
-
FsFilterItemsStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore });
|
|
321
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, decorators: [{
|
|
322
|
-
type: Injectable
|
|
323
|
-
}], ctorParameters: function () { return []; } });
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
|
|
3
|
+
import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
|
|
4
|
+
import { pickBy } from 'lodash-es';
|
|
5
|
+
import { ItemType } from '../enums/item-type.enum';
|
|
6
|
+
import { SimpleSelectItem } from '../models/items/select/simple-select-item';
|
|
7
|
+
import { SORT_BY_FIELD, SORT_DIRECTION_FIELD } from '../models/filter-config';
|
|
8
|
+
import { createFilterItem } from '../helpers/create-filter-item';
|
|
9
|
+
import { RangeItem } from '../models/items/range-item';
|
|
10
|
+
import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
export class FsFilterItemsStore {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.sortByItem = null;
|
|
15
|
+
this.sortDirectionItem = null;
|
|
16
|
+
this.keywordItem = null;
|
|
17
|
+
this._ready$ = new BehaviorSubject(false);
|
|
18
|
+
this._items = [];
|
|
19
|
+
this._visibleItems$ = new BehaviorSubject([]);
|
|
20
|
+
this._itemsByName = new Map();
|
|
21
|
+
this._itemsValuesLoaded = false;
|
|
22
|
+
this._hasKeyword = false;
|
|
23
|
+
this._itemsChange$ = new Subject();
|
|
24
|
+
this._destroy$ = new Subject();
|
|
25
|
+
this._lazyInit();
|
|
26
|
+
}
|
|
27
|
+
get items() {
|
|
28
|
+
return this._items;
|
|
29
|
+
}
|
|
30
|
+
get visibleItems() {
|
|
31
|
+
return this._visibleItems$.getValue();
|
|
32
|
+
}
|
|
33
|
+
get visibleItems$() {
|
|
34
|
+
return this._visibleItems$.asObservable();
|
|
35
|
+
}
|
|
36
|
+
set visibleItems(items) {
|
|
37
|
+
this._visibleItems$.next(items);
|
|
38
|
+
}
|
|
39
|
+
get hasKeyword() {
|
|
40
|
+
return this._hasKeyword;
|
|
41
|
+
}
|
|
42
|
+
get itemsChange$() {
|
|
43
|
+
return this._itemsChange$.pipe(debounceTime(30));
|
|
44
|
+
}
|
|
45
|
+
get ready$() {
|
|
46
|
+
return this._ready$.asObservable();
|
|
47
|
+
}
|
|
48
|
+
ngOnDestroy() {
|
|
49
|
+
this.destroyItems();
|
|
50
|
+
this._destroy$.next();
|
|
51
|
+
this._destroy$.complete();
|
|
52
|
+
}
|
|
53
|
+
setConfig(config) {
|
|
54
|
+
this._itemsByName.clear();
|
|
55
|
+
this._config = config;
|
|
56
|
+
this.initItems(config.items);
|
|
57
|
+
}
|
|
58
|
+
getItemByName(name) {
|
|
59
|
+
return this._itemsByName.get(name);
|
|
60
|
+
}
|
|
61
|
+
initItems(items) {
|
|
62
|
+
this._itemsValuesLoaded = false;
|
|
63
|
+
if (Array.isArray(items)) {
|
|
64
|
+
this._createItems(items);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
filtersClear() {
|
|
68
|
+
var _a;
|
|
69
|
+
this.items.forEach((item) => {
|
|
70
|
+
if (item instanceof RangeItem) {
|
|
71
|
+
item.clearRange(null, item.defaultValue);
|
|
72
|
+
}
|
|
73
|
+
else if (item instanceof BaseDateRangeItem) {
|
|
74
|
+
item.clearDateRange(null, item.defaultValue);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
item.clear(item.defaultValue);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
if (this.sortByItem) {
|
|
81
|
+
if (this._config.sort) {
|
|
82
|
+
this.sortByItem.model = this._config.sort.value;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.sortByItem.clear(this.sortByItem.defaultValue);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (this.sortDirectionItem) {
|
|
89
|
+
if (this._config.sort) {
|
|
90
|
+
this.sortDirectionItem.model = this._config.sort.direction;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
(_a = this.keywordItem) === null || _a === void 0 ? void 0 : _a.clear();
|
|
97
|
+
}
|
|
98
|
+
loadAsyncValues() {
|
|
99
|
+
this.items
|
|
100
|
+
.filter((item) => item.hasPendingValues)
|
|
101
|
+
.forEach((item) => item.loadAsyncValues());
|
|
102
|
+
}
|
|
103
|
+
loadAsyncDefaults() {
|
|
104
|
+
const pendingItems = this.items
|
|
105
|
+
.filter((item) => {
|
|
106
|
+
return item.defaultValueFn
|
|
107
|
+
&& (item.persistedValue === null || item.persistedValue === undefined);
|
|
108
|
+
});
|
|
109
|
+
if (pendingItems.length > 0) {
|
|
110
|
+
forkJoin(pendingItems
|
|
111
|
+
.map((item) => item.loadDefaultValue()))
|
|
112
|
+
.pipe(finalize(() => {
|
|
113
|
+
this._ready$.next(true);
|
|
114
|
+
}), takeUntil(this._destroy$))
|
|
115
|
+
.subscribe();
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this._ready$.next(true);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
getSort() {
|
|
122
|
+
let sortBy = this.getSortByValue();
|
|
123
|
+
sortBy = sortBy === '__all' ? null : sortBy;
|
|
124
|
+
let sortDirection = this.getSortDirectionValue();
|
|
125
|
+
sortDirection = sortDirection === '__all' ? null : sortDirection;
|
|
126
|
+
return {
|
|
127
|
+
value: sortBy,
|
|
128
|
+
direction: sortDirection,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
getSortByValue() {
|
|
132
|
+
return this.sortByItem ? this.sortByItem.model : null;
|
|
133
|
+
}
|
|
134
|
+
getSortDirectionValue() {
|
|
135
|
+
return this.sortDirectionItem ? this.sortDirectionItem.model : null;
|
|
136
|
+
}
|
|
137
|
+
updateSort(sort) {
|
|
138
|
+
if (sort.sortBy) {
|
|
139
|
+
this.sortByItem.model = sort.sortBy;
|
|
140
|
+
}
|
|
141
|
+
if (sort.sortDirection) {
|
|
142
|
+
this.sortDirectionItem.model = sort.sortDirection;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
values(onlyPresented = false) {
|
|
146
|
+
return this.items.reduce((acc, item) => {
|
|
147
|
+
const value = item.value;
|
|
148
|
+
if (!onlyPresented || value !== null) {
|
|
149
|
+
acc[item.name] = value;
|
|
150
|
+
}
|
|
151
|
+
return acc;
|
|
152
|
+
}, {});
|
|
153
|
+
}
|
|
154
|
+
valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
|
|
155
|
+
const params = {};
|
|
156
|
+
(items || this.items).forEach((filterItem) => {
|
|
157
|
+
const values = persisted
|
|
158
|
+
? filterItem.persistanceObject
|
|
159
|
+
: filterItem.queryObject;
|
|
160
|
+
Object.assign(params, values);
|
|
161
|
+
});
|
|
162
|
+
if (onlyPresented) {
|
|
163
|
+
return pickBy(params, (val) => {
|
|
164
|
+
return val !== null && val !== void 0;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return params;
|
|
168
|
+
}
|
|
169
|
+
initItemValues(p) {
|
|
170
|
+
this.items
|
|
171
|
+
.forEach((item) => {
|
|
172
|
+
item.initValues(p[item.name]);
|
|
173
|
+
});
|
|
174
|
+
this._initSortingItems(p);
|
|
175
|
+
this.loadAsyncDefaults();
|
|
176
|
+
this._subscribeToItemsChanges();
|
|
177
|
+
}
|
|
178
|
+
updateItemsWithValues(values) {
|
|
179
|
+
this.items
|
|
180
|
+
.forEach((item) => {
|
|
181
|
+
if (values[item.name]) {
|
|
182
|
+
item.model = values[item.name];
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
if (item instanceof RangeItem) {
|
|
186
|
+
item.clearRange(null, item.defaultValue);
|
|
187
|
+
}
|
|
188
|
+
else if (item instanceof BaseDateRangeItem) {
|
|
189
|
+
item.clearDateRange(null, item.defaultValue);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
item.clear();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
if (this.sortByItem) {
|
|
197
|
+
this.sortByItem.clear();
|
|
198
|
+
}
|
|
199
|
+
if (this.sortDirectionItem) {
|
|
200
|
+
this.sortDirectionItem.clear();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
destroyItems() {
|
|
204
|
+
var _a, _b;
|
|
205
|
+
this.items
|
|
206
|
+
.forEach((item) => item.destroy());
|
|
207
|
+
(_a = this.sortByItem) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
208
|
+
(_b = this.sortDirectionItem) === null || _b === void 0 ? void 0 : _b.destroy();
|
|
209
|
+
this._items = [];
|
|
210
|
+
this.sortByItem = null;
|
|
211
|
+
this.sortDirectionItem = null;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Some items might need to load async values before they will be shown
|
|
215
|
+
*/
|
|
216
|
+
prepareItems() {
|
|
217
|
+
if (!this._itemsValuesLoaded) {
|
|
218
|
+
this._itemsValuesLoaded = true;
|
|
219
|
+
this.loadAsyncValues();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
updateVisibleItems() {
|
|
223
|
+
this.visibleItems = this.items
|
|
224
|
+
.filter((item) => !item.isTypeKeyword && !item.hide);
|
|
225
|
+
}
|
|
226
|
+
_createItems(items) {
|
|
227
|
+
this._items = items
|
|
228
|
+
.filter((item) => !item.disable)
|
|
229
|
+
.filter((item) => {
|
|
230
|
+
if (this._itemsByName.has(item.name)) {
|
|
231
|
+
throw Error('Filter init error. Items name must be unique.');
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
this._itemsByName.set(item.name, null);
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
.map((item) => {
|
|
239
|
+
const filterItem = createFilterItem(item, { case: this._config.case });
|
|
240
|
+
if (filterItem.type === ItemType.Keyword) {
|
|
241
|
+
this._hasKeyword = true;
|
|
242
|
+
}
|
|
243
|
+
this._itemsByName.set(item.name, filterItem);
|
|
244
|
+
return filterItem;
|
|
245
|
+
});
|
|
246
|
+
this._createSortingItems();
|
|
247
|
+
}
|
|
248
|
+
_subscribeToItemsChanges() {
|
|
249
|
+
var _a;
|
|
250
|
+
this.items
|
|
251
|
+
.forEach((item) => {
|
|
252
|
+
item.valueChange$
|
|
253
|
+
.pipe(takeUntil(item.destroy$))
|
|
254
|
+
.subscribe(() => {
|
|
255
|
+
this._itemsChange$.next(item);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
if ((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) {
|
|
259
|
+
this.sortByItem.valueChange$
|
|
260
|
+
.pipe(takeUntil(this.sortByItem.destroy$))
|
|
261
|
+
.subscribe(() => {
|
|
262
|
+
this._itemsChange$.next(this.sortByItem);
|
|
263
|
+
});
|
|
264
|
+
this.sortDirectionItem.valueChange$
|
|
265
|
+
.pipe(takeUntil(this.sortDirectionItem.destroy$))
|
|
266
|
+
.subscribe(() => {
|
|
267
|
+
this._itemsChange$.next(this.sortDirectionItem);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
_lazyInit() {
|
|
272
|
+
this.ready$
|
|
273
|
+
.pipe(filter((state) => state), takeUntil(this._destroy$))
|
|
274
|
+
.subscribe(() => {
|
|
275
|
+
this.updateVisibleItems();
|
|
276
|
+
this._setKeywordItem();
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
_initSortingItems(p) {
|
|
280
|
+
if (this.sortByItem && this.sortDirectionItem) {
|
|
281
|
+
this.sortByItem.initValues(p[this.sortByItem.name]);
|
|
282
|
+
this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
_createSortingItems() {
|
|
286
|
+
var _a;
|
|
287
|
+
if (((_a = this._config.sortValues) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
288
|
+
const sortByItem = {
|
|
289
|
+
name: SORT_BY_FIELD,
|
|
290
|
+
type: ItemType.Select,
|
|
291
|
+
label: 'Sort By',
|
|
292
|
+
values: this._config.sortValues
|
|
293
|
+
};
|
|
294
|
+
if (this._config.sort && this._config.sort.value) {
|
|
295
|
+
sortByItem.default = this._config.sort.value;
|
|
296
|
+
}
|
|
297
|
+
this.sortByItem = new SimpleSelectItem(sortByItem, null);
|
|
298
|
+
const sortDirectionItem = {
|
|
299
|
+
name: SORT_DIRECTION_FIELD,
|
|
300
|
+
type: ItemType.Select,
|
|
301
|
+
label: 'Sort Direction',
|
|
302
|
+
values: [
|
|
303
|
+
{ name: 'Ascending', value: 'asc' },
|
|
304
|
+
{ name: 'Descending', value: 'desc' }
|
|
305
|
+
]
|
|
306
|
+
};
|
|
307
|
+
if (this._config.sort && this._config.sort.direction) {
|
|
308
|
+
sortDirectionItem.default = this._config.sort.direction;
|
|
309
|
+
}
|
|
310
|
+
this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
_setKeywordItem() {
|
|
314
|
+
this.keywordItem = this
|
|
315
|
+
.items
|
|
316
|
+
.find((item) => item.isTypeKeyword);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
FsFilterItemsStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
320
|
+
FsFilterItemsStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore });
|
|
321
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFilterItemsStore, decorators: [{
|
|
322
|
+
type: Injectable
|
|
323
|
+
}], ctorParameters: function () { return []; } });
|
|
324
324
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU1uQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFN0UsT0FBTyxFQUFrQixhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saURBQWlELENBQUM7O0FBYXBGLE1BQU0sT0FBTyxrQkFBa0I7SUFrQjdCO1FBaEJPLGVBQVUsR0FBZ0MsSUFBSSxDQUFDO1FBQy9DLHNCQUFpQixHQUFnQyxJQUFJLENBQUM7UUFDdEQsZ0JBQVcsR0FBYSxJQUFJLENBQUM7UUFFNUIsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLFdBQU0sR0FBa0MsRUFBRSxDQUFDO1FBQzNDLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQWdDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLGlCQUFZLEdBQUcsSUFBSSxH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LElBQUksQ0FDTCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUk7YUFDcEIsS0FBSzthQUNMLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBYSxDQUFDO0lBQ3BELENBQUM7O2dIQTVYVSxrQkFBa0I7b0hBQWxCLGtCQUFrQjs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBmaW5hbGl6ZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBwaWNrQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQge1xuICBGaWx0ZXJTb3J0LFxuICBJRmlsdGVyQ29uZmlnSXRlbSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vZW51bXMvaXRlbS10eXBlLmVudW0nO1xuaW1wb3J0IHsgQmFzZUl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvYmFzZS1pdGVtJztcbmltcG9ydCB7IFNpbXBsZVNlbGVjdEl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvc2VsZWN0L3NpbXBsZS1zZWxlY3QtaXRlbSc7XG5pbXBvcnQgeyBJRmlsdGVyQ29uZmlnU2VsZWN0SXRlbSB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXRlbXMvc2VsZWN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZywgU09SVF9CWV9GSUVMRCwgU09SVF9ESVJFQ1RJT05fRklFTEQgfSBmcm9tICcuLi9tb2RlbHMvZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBjcmVhdGVGaWx0ZXJJdGVtIH0gZnJvbSAnLi4vaGVscGVycy9jcmVhdGUtZmlsdGVyLWl0ZW0nO1xuaW1wb3J0IHsgUmFuZ2VJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL3JhbmdlLWl0ZW0nO1xuaW1wb3J0IHsgQmFzZURhdGVSYW5nZUl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvZGF0ZS1yYW5nZS9iYXNlLWRhdGUtcmFuZ2UtaXRlbSc7XG5pbXBvcnQgeyBJU29ydGluZ0NoYW5nZUV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRleHRJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL3RleHQtaXRlbSc7XG5pbXBvcnQgeyBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dGVybmFsLXBhcmFtcy5pbnRlcmZhY2UnO1xuXG5cbmludGVyZmFjZSBJVmFsdWVBc1F1ZXJ5IHtcbiAgb25seVByZXNlbnRlZD86IGJvb2xlYW47XG4gIGl0ZW1zPzogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W107XG4gIHBlcnNpc3RlZD86IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGc0ZpbHRlckl0ZW1zU3RvcmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBzb3J0QnlJdGVtOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4gPSBudWxsO1xuICBwdWJsaWMgc29ydERpcmVjdGlvbkl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiA9IG51bGw7XG4gIHB1YmxpYyBrZXl3b3JkSXRlbTogVGV4dEl0ZW0gPSBudWxsO1xuXG4gIHByaXZhdGUgX3JlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIF9pdGVtczogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10gPSBbXTtcbiAgcHJpdmF0ZSBfdmlzaWJsZUl0ZW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10+KFtdKTtcbiAgcHJpdmF0ZSBfaXRlbXNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+PigpO1xuXG4gIHByaXZhdGUgX2l0ZW1zVmFsdWVzTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2hhc0tleXdvcmQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBGc0ZpbHRlckNvbmZpZztcblxuICBwcml2YXRlIF9pdGVtc0NoYW5nZSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbGF6eUluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXRlbXMoKTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUl0ZW1zJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXNpYmxlSXRlbXMkKCk6IE9ic2VydmFibGU8QmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUl0ZW1zJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmlzaWJsZUl0ZW1zKGl0ZW1zOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSkge1xuICAgIHRoaXMuX3Zpc2libGVJdGVtcyQubmV4dChpdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0tleXdvcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0tleXdvcmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zQ2hhbmdlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXNDaGFuZ2UkLnBpcGUoZGVib3VuY2VUaW1lKDMwKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlYWR5JCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHkkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUl0ZW1zKCk7XG5cbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgdGhpcy5faXRlbXNCeU5hbWUuY2xlYXIoKTtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0SXRlbXMoY29uZmlnLml0ZW1zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zQnlOYW1lLmdldChuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0SXRlbXMoaXRlbXM6IElGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgdGhpcy5fY3JlYXRlSXRlbXMoaXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJzQ2xlYXIoKSB7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFJhbmdlSXRlbSkge1xuICAgICAgICBpdGVtLmNsZWFyUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQmFzZURhdGVSYW5nZUl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGVhckRhdGVSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtLmNsZWFyKGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSB0aGlzLl9jb25maWcuc29ydC52YWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLmNsZWFyKHRoaXMuc29ydEJ5SXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IHRoaXMuX2NvbmZpZy5zb3J0LmRpcmVjdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcih0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkSXRlbT8uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkQXN5bmNWYWx1ZXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZEFzeW5jVmFsdWVzKCkpO1xuICB9XG5cbiAgcHVibGljIGxvYWRBc3luY0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHBlbmRpbmdJdGVtcyA9IHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uZGVmYXVsdFZhbHVlRm5cbiAgICAgICAgICAmJiAoaXRlbS5wZXJzaXN0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBpdGVtLnBlcnNpc3RlZFZhbHVlID09PSB1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICBpZiAocGVuZGluZ0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvcmtKb2luKFxuICAgICAgICBwZW5kaW5nSXRlbXNcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmxvYWREZWZhdWx0VmFsdWUoKSlcbiAgICAgIClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZHkkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlYWR5JC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0KCk6IEZpbHRlclNvcnQge1xuICAgIGxldCBzb3J0QnkgPSB0aGlzLmdldFNvcnRCeVZhbHVlKCk7XG4gICAgc29ydEJ5ID0gc29ydEJ5ID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnRCeTtcblxuICAgIGxldCBzb3J0RGlyZWN0aW9uID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uVmFsdWUoKTtcbiAgICBzb3J0RGlyZWN0aW9uID0gc29ydERpcmVjdGlvbiA9PT0gJ19fYWxsJyA/IG51bGwgOiBzb3J0RGlyZWN0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBzb3J0QnksXG4gICAgICBkaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnRCeVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnRCeUl0ZW0gPyB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb25WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA/IHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogSVNvcnRpbmdDaGFuZ2VFdmVudCkge1xuICAgIGlmIChzb3J0LnNvcnRCeSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gc29ydC5zb3J0Qnk7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQuc29ydERpcmVjdGlvbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IHNvcnQuc29ydERpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzKG9ubHlQcmVzZW50ZWQgPSBmYWxzZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpdGVtLnZhbHVlO1xuXG4gICAgICBpZiAoIW9ubHlQcmVzZW50ZWQgfHwgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgYWNjW2l0ZW0ubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzQXNRdWVyeSh7XG4gICAgb25seVByZXNlbnRlZCA9IHRydWUsXG4gICAgaXRlbXMgPSBudWxsLFxuICAgIHBlcnNpc3RlZCA9IGZhbHNlLFxuICB9OiBJVmFsdWVBc1F1ZXJ5ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAoaXRlbXMgfHwgdGhpcy5pdGVtcykuZm9yRWFjaCgoZmlsdGVySXRlbTogQmFzZUl0ZW08YW55PikgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gcGVyc2lzdGVkXG4gICAgICAgID8gZmlsdGVySXRlbS5wZXJzaXN0YW5jZU9iamVjdFxuICAgICAgICA6IGZpbHRlckl0ZW0ucXVlcnlPYmplY3Q7XG5cbiAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB2YWx1ZXMpO1xuICAgIH0pO1xuXG4gICAgaWYgKG9ubHlQcmVzZW50ZWQpIHtcbiAgICAgIHJldHVybiBwaWNrQnkocGFyYW1zLCAodmFsKSA9PiB7XG4gICAgICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDA7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHVibGljIGluaXRJdGVtVmFsdWVzKHA6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlcyhwW2l0ZW0ubmFtZV0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9pbml0U29ydGluZ0l0ZW1zKHApO1xuICAgIHRoaXMubG9hZEFzeW5jRGVmYXVsdHMoKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVUb0l0ZW1zQ2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1zV2l0aFZhbHVlcyh2YWx1ZXM6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZXNbaXRlbS5uYW1lXSkge1xuICAgICAgICAgIGl0ZW0ubW9kZWwgPSB2YWx1ZXNbaXRlbS5uYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFJhbmdlSXRlbSkge1xuICAgICAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBCYXNlRGF0ZVJhbmdlSXRlbSkge1xuICAgICAgICAgICAgaXRlbS5jbGVhckRhdGVSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkgeyB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIoKTsgfVxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7IHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uY2xlYXIoKTsgfVxuICB9XG5cbiAgcHVibGljIGRlc3Ryb3lJdGVtcygpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5kZXN0cm95KCkpO1xuICAgIHRoaXMuc29ydEJ5SXRlbT8uZGVzdHJveSgpO1xuICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0/LmRlc3Ryb3koKTtcblxuICAgIHRoaXMuX2l0ZW1zID0gW107XG4gICAgdGhpcy5zb3J0QnlJdGVtID0gbnVsbDtcbiAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGl0ZW1zIG1pZ2h0IG5lZWQgdG8gbG9hZCBhc3luYyB2YWx1ZXMgYmVmb3JlIHRoZXkgd2lsbCBiZSBzaG93blxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJdGVtcygpIHtcbiAgICBpZiAoIXRoaXMuX2l0ZW1zVmFsdWVzTG9hZGVkKSB7XG4gICAgICB0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCA9IHRydWU7XG5cbiAgICAgIHRoaXMubG9hZEFzeW5jVmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpc2libGVJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzVHlwZUtleXdvcmQgJiYgIWl0ZW0uaGlkZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVJdGVtcyhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmRpc2FibGUpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtc0J5TmFtZS5oYXMoaXRlbS5uYW1lKSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdGaWx0ZXIgaW5pdCBlcnJvci4gSXRlbXMgbmFtZSBtdXN0IGJlIHVuaXF1ZS4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9pdGVtc0J5TmFtZS5zZXQoaXRlbS5uYW1lLCBudWxsKTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJJdGVtID0gY3JlYXRlRmlsdGVySXRlbShpdGVtLCB7IGNhc2U6IHRoaXMuX2NvbmZpZy5jYXNlIH0pO1xuXG4gICAgICAgIGlmIChmaWx0ZXJJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLktleXdvcmQpIHtcbiAgICAgICAgICB0aGlzLl9oYXNLZXl3b3JkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2l0ZW1zQnlOYW1lLnNldChpdGVtLm5hbWUsIGZpbHRlckl0ZW0pO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJJdGVtO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9jcmVhdGVTb3J0aW5nSXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvSXRlbXNDaGFuZ2VzKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwoaXRlbS5kZXN0cm95JCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQoaXRlbSk7XG4gICAgICAgICAgfSlcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0VmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS52YWx1ZUNoYW5nZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuc29ydEJ5SXRlbS5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQodGhpcy5zb3J0QnlJdGVtKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmRlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pdGVtc0NoYW5nZSQubmV4dCh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGF6eUluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkeSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSXRlbXMoKTtcbiAgICAgICAgdGhpcy5fc2V0S2V5d29yZEl0ZW0oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFNvcnRpbmdJdGVtcyhwOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtICYmIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5pbml0VmFsdWVzKHBbdGhpcy5zb3J0QnlJdGVtLm5hbWVdKTtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uaW5pdFZhbHVlcyhwW3RoaXMuc29ydERpcmVjdGlvbkl0ZW0ubmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVNvcnRpbmdJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLnNvcnRWYWx1ZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRCeUl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNPUlRfQllfRklFTEQsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgbGFiZWw6ICdTb3J0IEJ5JyxcbiAgICAgICAgdmFsdWVzOiB0aGlzLl9jb25maWcuc29ydFZhbHVlc1xuICAgICAgfSBhcyBJRmlsdGVyQ29uZmlnU2VsZWN0SXRlbTtcblxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQgJiYgdGhpcy5fY29uZmlnLnNvcnQudmFsdWUpIHtcbiAgICAgICAgc29ydEJ5SXRlbS5kZWZhdWx0ID0gdGhpcy5fY29uZmlnLnNvcnQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ydEJ5SXRlbSA9IG5ldyBTaW1wbGVTZWxlY3RJdGVtKFxuICAgICAgICBzb3J0QnlJdGVtLFxuICAgICAgICBudWxsLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbkl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNPUlRfRElSRUNUSU9OX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBEaXJlY3Rpb24nLFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7IG5hbWU6ICdBc2NlbmRpbmcnLCB2YWx1ZTogJ2FzYycgfSxcbiAgICAgICAgICB7IG5hbWU6ICdEZXNjZW5kaW5nJywgdmFsdWU6ICdkZXNjJyB9XG4gICAgICAgIF1cbiAgICAgIH0gYXMgSUZpbHRlckNvbmZpZ1NlbGVjdEl0ZW07XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCAmJiB0aGlzLl9jb25maWcuc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgc29ydERpcmVjdGlvbkl0ZW0uZGVmYXVsdCA9IHRoaXMuX2NvbmZpZy5zb3J0LmRpcmVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG5ldyBTaW1wbGVTZWxlY3RJdGVtKFxuICAgICAgICBzb3J0RGlyZWN0aW9uSXRlbSxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRLZXl3b3JkSXRlbSgpIHtcbiAgICB0aGlzLmtleXdvcmRJdGVtID0gdGhpc1xuICAgICAgLml0ZW1zXG4gICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5pc1R5cGVLZXl3b3JkKSBhcyBUZXh0SXRlbTtcbiAgfVxufVxuIl19
|