@firestitch/filter 18.1.0 → 18.2.1
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/components/filter/filter.component.d.ts +9 -13
- package/app/components/filter-chip/filter-chip.component.d.ts +7 -7
- package/app/components/filter-drawer/filter-drawer.component.d.ts +7 -7
- package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +2 -2
- package/app/components/saved-filter/index.d.ts +0 -1
- package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +6 -5
- package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.d.ts +1 -0
- package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.d.ts +13 -0
- package/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +6 -2
- package/app/fs-filter.module.d.ts +7 -8
- package/app/helpers/build-query-params.d.ts +2 -2
- package/app/helpers/create-filter-item.d.ts +1 -1
- package/app/interfaces/external-params.interface.d.ts +1 -1
- package/app/interfaces/saved-filters.interface.d.ts +2 -2
- package/app/models/items/autocomplete-chips-item.d.ts +1 -1
- package/app/models/items/base-item.d.ts +1 -1
- package/app/models/items/chips-item.d.ts +1 -1
- package/app/models/items/date/base-date-item.d.ts +1 -1
- package/app/models/items/date-range/base-date-range-item.d.ts +1 -1
- package/app/models/items/select/multiple-select-item.d.ts +3 -3
- package/app/models/items/select/simple-select-item.d.ts +2 -2
- package/app/models/items/week-item.d.ts +1 -1
- package/app/services/index.d.ts +5 -5
- package/app/services/{items-store.service.d.ts → item-store.service.d.ts} +9 -9
- package/app/services/{external-params-controller.service.d.ts → param-controller.service.d.ts} +9 -10
- package/app/services/{query-persistance-controller.service.d.ts → persistance-controller.service.d.ts} +3 -3
- package/app/services/query-param-controller.service.d.ts +21 -0
- package/app/services/{saved-filters-controller.service.d.ts → saved-filter-controller.service.d.ts} +6 -10
- package/esm2022/app/components/filter/filter.component.mjs +68 -77
- package/esm2022/app/components/filter-chip/filter-chip.component.mjs +22 -16
- package/esm2022/app/components/filter-chips/filter-chips.component.mjs +3 -3
- package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +18 -18
- package/esm2022/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +1 -1
- package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +5 -5
- package/esm2022/app/components/saved-filter/index.mjs +1 -2
- package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +17 -16
- package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.mjs +2 -0
- package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.mjs +28 -0
- package/esm2022/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +24 -17
- package/esm2022/app/fs-filter.module.mjs +1 -5
- package/esm2022/app/helpers/build-query-params.mjs +1 -1
- package/esm2022/app/interfaces/external-params.interface.mjs +1 -1
- package/esm2022/app/interfaces/saved-filters.interface.mjs +1 -1
- package/esm2022/app/models/items/autocomplete-chips-item.mjs +4 -4
- package/esm2022/app/models/items/base-item.mjs +4 -4
- package/esm2022/app/models/items/chips-item.mjs +5 -5
- package/esm2022/app/models/items/date/base-date-item.mjs +9 -9
- package/esm2022/app/models/items/date-range/base-date-range-item.mjs +12 -12
- package/esm2022/app/models/items/select/multiple-select-item.mjs +17 -17
- package/esm2022/app/models/items/select/simple-select-item.mjs +10 -10
- package/esm2022/app/models/items/week-item.mjs +11 -9
- package/esm2022/app/services/index.mjs +6 -6
- package/esm2022/app/services/item-store.service.mjs +356 -0
- package/esm2022/app/services/param-controller.service.mjs +149 -0
- package/esm2022/app/services/persistance-controller.service.mjs +65 -0
- package/esm2022/app/services/query-param-controller.service.mjs +65 -0
- package/esm2022/app/services/saved-filter-controller.service.mjs +169 -0
- package/esm2022/public_api.mjs +2 -3
- package/fesm2022/firestitch-filter.mjs +1714 -1787
- package/fesm2022/firestitch-filter.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -2
- package/app/components/saved-filter/saved-filter-edit/index.d.ts +0 -1
- package/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.d.ts +0 -18
- package/app/services/query-params-controller.service.d.ts +0 -21
- package/esm2022/app/components/saved-filter/saved-filter-edit/index.mjs +0 -2
- package/esm2022/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.mjs +0 -72
- package/esm2022/app/services/external-params-controller.service.mjs +0 -154
- package/esm2022/app/services/items-store.service.mjs +0 -356
- package/esm2022/app/services/query-params-controller.service.mjs +0 -65
- package/esm2022/app/services/query-persistance-controller.service.mjs +0 -65
- package/esm2022/app/services/saved-filters-controller.service.mjs +0 -210
|
@@ -1,356 +0,0 @@
|
|
|
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 { buildQueryParams } from '../helpers/build-query-params';
|
|
7
|
-
import { createFilterItem } from '../helpers/create-filter-item';
|
|
8
|
-
import { SortByField, SortDirectionField } from '../models/filter-config';
|
|
9
|
-
import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
|
|
10
|
-
import { RangeItem } from '../models/items/range-item';
|
|
11
|
-
import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
|
|
12
|
-
import { SimpleSelectItem } from '../models/items/select/simple-select-item';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
export class FsFilterItemsStore {
|
|
15
|
-
sortByItem = null;
|
|
16
|
-
sortDirectionItem = null;
|
|
17
|
-
keywordItem = null;
|
|
18
|
-
filter;
|
|
19
|
-
_ready$ = new BehaviorSubject(false);
|
|
20
|
-
_visibleItems$ = new BehaviorSubject([]);
|
|
21
|
-
_items = new Map();
|
|
22
|
-
_itemsValuesLoaded = false;
|
|
23
|
-
_hasKeyword = false;
|
|
24
|
-
_config;
|
|
25
|
-
_itemsChange$ = new Subject();
|
|
26
|
-
_destroy$ = new Subject();
|
|
27
|
-
constructor() {
|
|
28
|
-
this._lazyInit();
|
|
29
|
-
}
|
|
30
|
-
get items() {
|
|
31
|
-
return Array.from(this._items.values());
|
|
32
|
-
}
|
|
33
|
-
get itemNames() {
|
|
34
|
-
return this.items.map((item) => item.name);
|
|
35
|
-
}
|
|
36
|
-
get visibleItems() {
|
|
37
|
-
return this._visibleItems$.getValue();
|
|
38
|
-
}
|
|
39
|
-
set visibleItems(items) {
|
|
40
|
-
this._visibleItems$.next(items);
|
|
41
|
-
}
|
|
42
|
-
get visibleItems$() {
|
|
43
|
-
return this._visibleItems$.asObservable();
|
|
44
|
-
}
|
|
45
|
-
get hasKeyword() {
|
|
46
|
-
return this._hasKeyword;
|
|
47
|
-
}
|
|
48
|
-
get itemsChange$() {
|
|
49
|
-
return this._itemsChange$.pipe(debounceTime(30));
|
|
50
|
-
}
|
|
51
|
-
get ready$() {
|
|
52
|
-
return this._ready$.asObservable();
|
|
53
|
-
}
|
|
54
|
-
ngOnDestroy() {
|
|
55
|
-
this.destroyItems();
|
|
56
|
-
this._destroy$.next(null);
|
|
57
|
-
this._destroy$.complete();
|
|
58
|
-
}
|
|
59
|
-
setConfig(config) {
|
|
60
|
-
this._config = config;
|
|
61
|
-
this.initItems(config.items);
|
|
62
|
-
}
|
|
63
|
-
getItemByName(name) {
|
|
64
|
-
return this._items.get(name);
|
|
65
|
-
}
|
|
66
|
-
initItems(items) {
|
|
67
|
-
this._itemsValuesLoaded = false;
|
|
68
|
-
if (Array.isArray(items)) {
|
|
69
|
-
this._createItems(items);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
queryParams() {
|
|
73
|
-
return buildQueryParams(this.valuesAsQuery(), this.items);
|
|
74
|
-
}
|
|
75
|
-
filtersClear() {
|
|
76
|
-
this.items.forEach((item) => {
|
|
77
|
-
if (item instanceof RangeItem) {
|
|
78
|
-
item.clearRange(null, item.defaultValue);
|
|
79
|
-
}
|
|
80
|
-
else if (item instanceof BaseDateRangeItem) {
|
|
81
|
-
item.clearDateRange(null, item.defaultValue);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
item.clear(item.defaultValue);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
if (this.sortByItem) {
|
|
88
|
-
if (this._config.sort) {
|
|
89
|
-
this.sortByItem.model = this._config.sort.value;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
this.sortByItem.clear(this.sortByItem.defaultValue);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (this.sortDirectionItem) {
|
|
96
|
-
if (this._config.sort) {
|
|
97
|
-
this.sortDirectionItem.model = this._config.sort.direction;
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
this.keywordItem?.clear();
|
|
104
|
-
}
|
|
105
|
-
loadAsyncValues() {
|
|
106
|
-
this.items
|
|
107
|
-
.filter((item) => item.hasPendingValues)
|
|
108
|
-
.forEach((item) => item.loadAsyncValues());
|
|
109
|
-
}
|
|
110
|
-
loadAsyncDefaults() {
|
|
111
|
-
// default values can be asynchronous, and we must load them if there is no persisted value instead
|
|
112
|
-
const defaultValuesToBeLoaded = this.items
|
|
113
|
-
.filter((item) => {
|
|
114
|
-
return item.defaultValueFn
|
|
115
|
-
&& (item.persistedValue === null || item.persistedValue === undefined);
|
|
116
|
-
});
|
|
117
|
-
// special hack for isolate multiple select
|
|
118
|
-
// values for this type of select must be preloaded
|
|
119
|
-
// Read more in class MultipleSelectItem._init()
|
|
120
|
-
const valuesToBeLoaded = this.items
|
|
121
|
-
.filter((item) => {
|
|
122
|
-
return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
|
|
123
|
-
});
|
|
124
|
-
if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
|
|
125
|
-
forkJoin([
|
|
126
|
-
...defaultValuesToBeLoaded
|
|
127
|
-
.map((item) => item.loadDefaultValue()),
|
|
128
|
-
...valuesToBeLoaded
|
|
129
|
-
.map((item) => {
|
|
130
|
-
item.loadAsyncValues();
|
|
131
|
-
return item.loading$
|
|
132
|
-
.pipe();
|
|
133
|
-
}),
|
|
134
|
-
])
|
|
135
|
-
.pipe(finalize(() => {
|
|
136
|
-
this._ready$.next(true);
|
|
137
|
-
}), takeUntil(this._destroy$))
|
|
138
|
-
.subscribe();
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
this._ready$.next(true);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
getSort() {
|
|
145
|
-
let sortBy = this.getSortByValue();
|
|
146
|
-
sortBy = sortBy === '__all' ? null : sortBy;
|
|
147
|
-
let sortDirection = this.getSortDirectionValue();
|
|
148
|
-
sortDirection = sortDirection === '__all' ? null : sortDirection;
|
|
149
|
-
return {
|
|
150
|
-
value: sortBy,
|
|
151
|
-
direction: sortDirection,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
getSortByValue() {
|
|
155
|
-
return this.sortByItem ? this.sortByItem.model : null;
|
|
156
|
-
}
|
|
157
|
-
getSortDirectionValue() {
|
|
158
|
-
return this.sortDirectionItem ? this.sortDirectionItem.model : null;
|
|
159
|
-
}
|
|
160
|
-
updateSort(sort) {
|
|
161
|
-
if (sort.sortBy) {
|
|
162
|
-
this.sortByItem.model = sort.sortBy;
|
|
163
|
-
}
|
|
164
|
-
if (sort.sortDirection) {
|
|
165
|
-
this.sortDirectionItem.model = sort.sortDirection;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
values(onlyPresented = false) {
|
|
169
|
-
return this.items
|
|
170
|
-
.reduce((acc, item) => {
|
|
171
|
-
const value = item.value;
|
|
172
|
-
if (!onlyPresented || value !== null) {
|
|
173
|
-
acc[item.name] = value;
|
|
174
|
-
}
|
|
175
|
-
return acc;
|
|
176
|
-
}, {});
|
|
177
|
-
}
|
|
178
|
-
models() {
|
|
179
|
-
return this.items
|
|
180
|
-
.reduce((acc, item) => {
|
|
181
|
-
acc[item.name] = item.model;
|
|
182
|
-
return acc;
|
|
183
|
-
}, {});
|
|
184
|
-
}
|
|
185
|
-
valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
|
|
186
|
-
const params = {};
|
|
187
|
-
(items || this.items)
|
|
188
|
-
.forEach((filterItem) => {
|
|
189
|
-
const values = persisted
|
|
190
|
-
? filterItem.persistanceObject
|
|
191
|
-
: filterItem.queryObject;
|
|
192
|
-
Object.assign(params, values);
|
|
193
|
-
});
|
|
194
|
-
if (onlyPresented) {
|
|
195
|
-
return pickBy(params, (val) => {
|
|
196
|
-
return val !== undefined;
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
return params;
|
|
200
|
-
}
|
|
201
|
-
init(p) {
|
|
202
|
-
this.items
|
|
203
|
-
.forEach((item) => {
|
|
204
|
-
item.initValues(p[item.name]);
|
|
205
|
-
});
|
|
206
|
-
this._initSortingItems(p);
|
|
207
|
-
this.loadAsyncDefaults();
|
|
208
|
-
this._subscribeToItemsChanges();
|
|
209
|
-
}
|
|
210
|
-
updateItemsWithValues(values) {
|
|
211
|
-
this.items
|
|
212
|
-
.forEach((item) => {
|
|
213
|
-
if (values[item.name]) {
|
|
214
|
-
item.model = values[item.name];
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
if (item instanceof RangeItem) {
|
|
218
|
-
item.clearRange(null, item.defaultValue);
|
|
219
|
-
}
|
|
220
|
-
else if (item instanceof BaseDateRangeItem) {
|
|
221
|
-
item.clearDateRange(null, item.defaultValue);
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
item.clear();
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
if (this.sortByItem) {
|
|
229
|
-
this.sortByItem.clear();
|
|
230
|
-
}
|
|
231
|
-
if (this.sortDirectionItem) {
|
|
232
|
-
this.sortDirectionItem.clear();
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
updateSortingItemsValues(items) {
|
|
236
|
-
if (!this.sortByItem) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
this.sortByItem.values = items;
|
|
240
|
-
}
|
|
241
|
-
destroyItems() {
|
|
242
|
-
this.items
|
|
243
|
-
.forEach((item) => item.destroy());
|
|
244
|
-
this.sortByItem?.destroy();
|
|
245
|
-
this.sortDirectionItem?.destroy();
|
|
246
|
-
this._items.clear();
|
|
247
|
-
this.sortByItem = null;
|
|
248
|
-
this.sortDirectionItem = null;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Some items might need to load async values before they will be shown
|
|
252
|
-
*/
|
|
253
|
-
prepareItems() {
|
|
254
|
-
if (!this._itemsValuesLoaded) {
|
|
255
|
-
this._itemsValuesLoaded = true;
|
|
256
|
-
this.loadAsyncValues();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
updateItemsVisiblity() {
|
|
260
|
-
this.visibleItems = this.items
|
|
261
|
-
.filter((item) => !item.isTypeKeyword && !item.hide);
|
|
262
|
-
}
|
|
263
|
-
_createItems(items) {
|
|
264
|
-
this._items = new Map(items
|
|
265
|
-
.filter((item) => !item.disable)
|
|
266
|
-
.filter((item) => {
|
|
267
|
-
if (this._items.has(item.name)) {
|
|
268
|
-
throw Error('Filter init error. Items name must be unique.');
|
|
269
|
-
}
|
|
270
|
-
return true;
|
|
271
|
-
})
|
|
272
|
-
.map((item) => {
|
|
273
|
-
const filterItem = createFilterItem(item, {}, this.filter);
|
|
274
|
-
if (filterItem.type === ItemType.Keyword) {
|
|
275
|
-
this._hasKeyword = true;
|
|
276
|
-
}
|
|
277
|
-
this._items.set(item.name, filterItem);
|
|
278
|
-
return [item.name, filterItem];
|
|
279
|
-
}));
|
|
280
|
-
this._createSortingItems();
|
|
281
|
-
}
|
|
282
|
-
_subscribeToItemsChanges() {
|
|
283
|
-
this.items
|
|
284
|
-
.forEach((item) => {
|
|
285
|
-
item.valueChange$
|
|
286
|
-
.pipe(takeUntil(item.destroy$))
|
|
287
|
-
.subscribe(() => {
|
|
288
|
-
this._itemsChange$.next(item);
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
if (this._config.sortValues?.length) {
|
|
292
|
-
this.sortByItem.valueChange$
|
|
293
|
-
.pipe(takeUntil(this.sortByItem.destroy$))
|
|
294
|
-
.subscribe(() => {
|
|
295
|
-
this._itemsChange$.next(this.sortByItem);
|
|
296
|
-
});
|
|
297
|
-
this.sortDirectionItem.valueChange$
|
|
298
|
-
.pipe(takeUntil(this.sortDirectionItem.destroy$))
|
|
299
|
-
.subscribe(() => {
|
|
300
|
-
this._itemsChange$.next(this.sortDirectionItem);
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
_lazyInit() {
|
|
305
|
-
this.ready$
|
|
306
|
-
.pipe(filter((state) => state), takeUntil(this._destroy$))
|
|
307
|
-
.subscribe(() => {
|
|
308
|
-
this.updateItemsVisiblity();
|
|
309
|
-
this._setKeywordItem();
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
_initSortingItems(p) {
|
|
313
|
-
if (this.sortByItem && this.sortDirectionItem) {
|
|
314
|
-
this.sortByItem.initValues(p[this.sortByItem.name]);
|
|
315
|
-
this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
_createSortingItems() {
|
|
319
|
-
if (this._config.sortValues?.length > 0) {
|
|
320
|
-
const sortByItem = {
|
|
321
|
-
name: SortByField,
|
|
322
|
-
type: ItemType.Select,
|
|
323
|
-
label: 'Sort by',
|
|
324
|
-
values: this._config.sortValues,
|
|
325
|
-
};
|
|
326
|
-
if (this._config.sort && this._config.sort.value) {
|
|
327
|
-
sortByItem.default = this._config.sort.value;
|
|
328
|
-
}
|
|
329
|
-
this.sortByItem = new SimpleSelectItem(sortByItem, null, this.filter);
|
|
330
|
-
const sortDirectionItem = {
|
|
331
|
-
name: SortDirectionField,
|
|
332
|
-
type: ItemType.Select,
|
|
333
|
-
label: 'Sort direction',
|
|
334
|
-
values: [
|
|
335
|
-
{ name: 'Ascending', value: 'asc' },
|
|
336
|
-
{ name: 'Descending', value: 'desc' },
|
|
337
|
-
],
|
|
338
|
-
};
|
|
339
|
-
if (this._config.sort && this._config.sort.direction) {
|
|
340
|
-
sortDirectionItem.default = this._config.sort.direction;
|
|
341
|
-
}
|
|
342
|
-
this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null, this.filter);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
_setKeywordItem() {
|
|
346
|
-
this.keywordItem = this
|
|
347
|
-
.items
|
|
348
|
-
.find((item) => item.isTypeKeyword);
|
|
349
|
-
}
|
|
350
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
351
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterItemsStore });
|
|
352
|
-
}
|
|
353
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterItemsStore, decorators: [{
|
|
354
|
-
type: Injectable
|
|
355
|
-
}], ctorParameters: () => [] });
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUduQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFTakUsT0FBTyxFQUFrQixXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7O0FBVzdFLE1BQU0sT0FBTyxrQkFBa0I7SUFFdEIsVUFBVSxHQUFnQyxJQUFJLENBQUM7SUFDL0MsaUJBQWlCLEdBQWdDLElBQUksQ0FBQztJQUN0RCxXQUFXLEdBQWEsSUFBSSxDQUFDO0lBQzdCLE1BQU0sQ0FBa0I7SUFFdkIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFD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RUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDckIsS0FBSyxFQUFFLGdCQUFnQjtnQkFDdkIsTUFBTSxFQUFFO29CQUNOLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO29CQUNuQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtpQkFDdEM7YUFDeUIsQ0FBQztZQUU3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzFELENBQUM7WUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDM0MsaUJBQWlCLEVBQ2pCLElBQUksRUFDSixJQUFJLENBQUMsTUFBTSxDQUNaLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJO2FBQ3BCLEtBQUs7YUFDTCxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQWEsQ0FBQztJQUNwRCxDQUFDO3dHQTlhVSxrQkFBa0I7NEdBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZmluYWxpemUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgcGlja0J5IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHR5cGUgeyBGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vZW51bXMvaXRlbS10eXBlLmVudW0nO1xuaW1wb3J0IHsgYnVpbGRRdWVyeVBhcmFtcyB9IGZyb20gJy4uL2hlbHBlcnMvYnVpbGQtcXVlcnktcGFyYW1zJztcbmltcG9ydCB7IGNyZWF0ZUZpbHRlckl0ZW0gfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZS1maWx0ZXItaXRlbSc7XG5pbXBvcnQge1xuICBGaWx0ZXJTb3J0LFxuICBJRmlsdGVyQ29uZmlnSXRlbSxcbiAgU29ydEl0ZW0sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dGVybmFsLXBhcmFtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdDaGFuZ2VFdmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRmlsdGVyQ29uZmlnU2VsZWN0SXRlbSB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXRlbXMvc2VsZWN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZywgU29ydEJ5RmllbGQsIFNvcnREaXJlY3Rpb25GaWVsZCB9IGZyb20gJy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IEJhc2VJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL2Jhc2UtaXRlbSc7XG5pbXBvcnQgeyBCYXNlRGF0ZVJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9kYXRlLXJhbmdlL2Jhc2UtZGF0ZS1yYW5nZS1pdGVtJztcbmltcG9ydCB7IFJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9yYW5nZS1pdGVtJztcbmltcG9ydCB7IE11bHRpcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3QvbXVsdGlwbGUtc2VsZWN0LWl0ZW0nO1xuaW1wb3J0IHsgU2ltcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3Qvc2ltcGxlLXNlbGVjdC1pdGVtJztcbmltcG9ydCB7IFRleHRJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL3RleHQtaXRlbSc7XG5cblxuaW50ZXJmYWNlIElWYWx1ZUFzUXVlcnkge1xuICBvbmx5UHJlc2VudGVkPzogYm9vbGVhbjtcbiAgaXRlbXM/OiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXTtcbiAgcGVyc2lzdGVkPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZzRmlsdGVySXRlbXNTdG9yZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIHNvcnRCeUl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiA9IG51bGw7XG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uSXRlbTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+ID0gbnVsbDtcbiAgcHVibGljIGtleXdvcmRJdGVtOiBUZXh0SXRlbSA9IG51bGw7XG4gIHB1YmxpYyBmaWx0ZXI6IEZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIF9yZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfdmlzaWJsZUl0ZW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10+KFtdKTtcbiAgcHJpdmF0ZSBfaXRlbXMgPSBuZXcgTWFwPHN0cmluZywgQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+PigpO1xuICBwcml2YXRlIF9pdGVtc1ZhbHVlc0xvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9oYXNLZXl3b3JkID0gZmFsc2U7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2l0ZW1zQ2hhbmdlJCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgKSB7XG4gICAgdGhpcy5fbGF6eUluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXRlbXMoKTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2l0ZW1zLnZhbHVlcygpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXRlbU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ubmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcygpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVJdGVtcyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmlzaWJsZUl0ZW1zKGl0ZW1zOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSkge1xuICAgIHRoaXMuX3Zpc2libGVJdGVtcyQubmV4dChpdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcyQoKTogT2JzZXJ2YWJsZTxCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXT4ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlSXRlbXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNLZXl3b3JkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNLZXl3b3JkO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtc0NoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zQ2hhbmdlJC5waXBlKGRlYm91bmNlVGltZSgzMCkpO1xuICB9XG5cbiAgcHVibGljIGdldCByZWFkeSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lJdGVtcygpO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldENvbmZpZyhjb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0SXRlbXMoY29uZmlnLml0ZW1zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmdldChuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0SXRlbXMoaXRlbXM6IElGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgdGhpcy5fY3JlYXRlSXRlbXMoaXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBxdWVyeVBhcmFtcygpOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMge1xuICAgIHJldHVybiBidWlsZFF1ZXJ5UGFyYW1zKHRoaXMudmFsdWVzQXNRdWVyeSgpLCB0aGlzLml0ZW1zKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJzQ2xlYXIoKSB7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFJhbmdlSXRlbSkge1xuICAgICAgICBpdGVtLmNsZWFyUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQmFzZURhdGVSYW5nZUl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGVhckRhdGVSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtLmNsZWFyKGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSB0aGlzLl9jb25maWcuc29ydC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydEJ5SXRlbS5jbGVhcih0aGlzLnNvcnRCeUl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0KSB7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSB0aGlzLl9jb25maWcuc29ydC5kaXJlY3Rpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtleXdvcmRJdGVtPy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGxvYWRBc3luY1ZhbHVlcygpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmhhc1BlbmRpbmdWYWx1ZXMpXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5sb2FkQXN5bmNWYWx1ZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZEFzeW5jRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgLy8gZGVmYXVsdCB2YWx1ZXMgY2FuIGJlIGFzeW5jaHJvbm91cywgYW5kIHdlIG11c3QgbG9hZCB0aGVtIGlmIHRoZXJlIGlzIG5vIHBlcnNpc3RlZCB2YWx1ZSBpbnN0ZWFkXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlc1RvQmVMb2FkZWQgPSB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLmRlZmF1bHRWYWx1ZUZuXG4gICAgICAgICAgJiYgKGl0ZW0ucGVyc2lzdGVkVmFsdWUgPT09IG51bGwgfHwgaXRlbS5wZXJzaXN0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gc3BlY2lhbCBoYWNrIGZvciBpc29sYXRlIG11bHRpcGxlIHNlbGVjdFxuICAgIC8vIHZhbHVlcyBmb3IgdGhpcyB0eXBlIG9mIHNlbGVjdCBtdXN0IGJlIHByZWxvYWRlZFxuICAgIC8vIFJlYWQgbW9yZSBpbiBjbGFzcyBNdWx0aXBsZVNlbGVjdEl0ZW0uX2luaXQoKVxuICAgIGNvbnN0IHZhbHVlc1RvQmVMb2FkZWQgPSB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiAoaXRlbSBpbnN0YW5jZW9mIE11bHRpcGxlU2VsZWN0SXRlbSkgJiYgaXRlbS5oYXNQZW5kaW5nVmFsdWVzICYmIGl0ZW0uaXNvbGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZXNUb0JlTG9hZGVkLmxlbmd0aCA+IDAgfHwgdmFsdWVzVG9CZUxvYWRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBmb3JrSm9pbihcbiAgICAgICAgW1xuICAgICAgICAgIC4uLmRlZmF1bHRWYWx1ZXNUb0JlTG9hZGVkXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmxvYWREZWZhdWx0VmFsdWUoKSksXG5cbiAgICAgICAgICAuLi52YWx1ZXNUb0JlTG9hZGVkXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIGl0ZW0ubG9hZEFzeW5jVmFsdWVzKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubG9hZGluZyRcbiAgICAgICAgICAgICAgICAucGlwZSgpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWR5JC5uZXh0KHRydWUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWFkeSQubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydCgpOiBGaWx0ZXJTb3J0IHtcbiAgICBsZXQgc29ydEJ5ID0gdGhpcy5nZXRTb3J0QnlWYWx1ZSgpO1xuICAgIHNvcnRCeSA9IHNvcnRCeSA9PT0gJ19fYWxsJyA/IG51bGwgOiBzb3J0Qnk7XG5cbiAgICBsZXQgc29ydERpcmVjdGlvbiA9IHRoaXMuZ2V0U29ydERpcmVjdGlvblZhbHVlKCk7XG4gICAgc29ydERpcmVjdGlvbiA9IHNvcnREaXJlY3Rpb24gPT09ICdfX2FsbCcgPyBudWxsIDogc29ydERpcmVjdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogc29ydEJ5LFxuICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydEJ5VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydEJ5SXRlbSA/IHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydERpcmVjdGlvblZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID8gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0OiBJU29ydGluZ0NoYW5nZUV2ZW50KSB7XG4gICAgaWYgKHNvcnQuc29ydEJ5KSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSBzb3J0LnNvcnRCeTtcbiAgICB9XG5cbiAgICBpZiAoc29ydC5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gc29ydC5zb3J0RGlyZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXMob25seVByZXNlbnRlZCA9IGZhbHNlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtLnZhbHVlO1xuXG4gICAgICAgIGlmICghb25seVByZXNlbnRlZCB8fCB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjY1tpdGVtLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICB9XG5cbiAgcHVibGljIG1vZGVscygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgICAgICBhY2NbaXRlbS5uYW1lXSA9IGl0ZW0ubW9kZWw7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXNBc1F1ZXJ5KHtcbiAgICBvbmx5UHJlc2VudGVkID0gdHJ1ZSxcbiAgICBpdGVtcyA9IG51bGwsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gIH06IElWYWx1ZUFzUXVlcnkgPSB7fSk6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAoaXRlbXMgfHwgdGhpcy5pdGVtcylcbiAgICAgIC5mb3JFYWNoKChmaWx0ZXJJdGVtOiBCYXNlSXRlbTxhbnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHBlcnNpc3RlZFxuICAgICAgICAgID8gZmlsdGVySXRlbS5wZXJzaXN0YW5jZU9iamVjdFxuICAgICAgICAgIDogZmlsdGVySXRlbS5xdWVyeU9iamVjdDtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywgdmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKG9ubHlQcmVzZW50ZWQpIHtcbiAgICAgIHJldHVybiBwaWNrQnkocGFyYW1zLCAodmFsKSA9PiB7XG4gICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwdWJsaWMgaW5pdChwOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLmluaXRWYWx1ZXMocFtpdGVtLm5hbWVdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faW5pdFNvcnRpbmdJdGVtcyhwKTtcbiAgICB0aGlzLmxvYWRBc3luY0RlZmF1bHRzKCk7XG4gICAgdGhpcy5fc3Vic2NyaWJlVG9JdGVtc0NoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtc1dpdGhWYWx1ZXModmFsdWVzOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodmFsdWVzW2l0ZW0ubmFtZV0pIHtcbiAgICAgICAgICBpdGVtLm1vZGVsID0gdmFsdWVzW2l0ZW0ubmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXJSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQmFzZURhdGVSYW5nZUl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXJEYXRlUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtLmNsZWFyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTb3J0aW5nSXRlbXNWYWx1ZXMoaXRlbXM6IFNvcnRJdGVtW10pIHtcbiAgICBpZiAoIXRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc29ydEJ5SXRlbS52YWx1ZXMgPSBpdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95SXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0uZGVzdHJveSgpKTtcbiAgICB0aGlzLnNvcnRCeUl0ZW0/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtPy5kZXN0cm95KCk7XG5cbiAgICB0aGlzLl9pdGVtcy5jbGVhcigpO1xuICAgIHRoaXMuc29ydEJ5SXRlbSA9IG51bGw7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU29tZSBpdGVtcyBtaWdodCBuZWVkIHRvIGxvYWQgYXN5bmMgdmFsdWVzIGJlZm9yZSB0aGV5IHdpbGwgYmUgc2hvd25cbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSXRlbXMoKSB7XG4gICAgaWYgKCF0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCkge1xuICAgICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLmxvYWRBc3luY1ZhbHVlcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtc1Zpc2libGl0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVJdGVtcyA9IHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzVHlwZUtleXdvcmQgJiYgIWl0ZW0uaGlkZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVJdGVtcyhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gbmV3IE1hcChcbiAgICAgIGl0ZW1zXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmRpc2FibGUpXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5faXRlbXMuaGFzKGl0ZW0ubmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdGaWx0ZXIgaW5pdCBlcnJvci4gSXRlbXMgbmFtZSBtdXN0IGJlIHVuaXF1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckl0ZW0gPSBjcmVhdGVGaWx0ZXJJdGVtKGl0ZW0sIHsgfSwgdGhpcy5maWx0ZXIpO1xuXG4gICAgICAgICAgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuS2V5d29yZCkge1xuICAgICAgICAgICAgdGhpcy5faGFzS2V5d29yZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5faXRlbXMuc2V0KGl0ZW0ubmFtZSwgZmlsdGVySXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gW2l0ZW0ubmFtZSwgZmlsdGVySXRlbV07XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLl9jcmVhdGVTb3J0aW5nSXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvSXRlbXNDaGFuZ2VzKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwoaXRlbS5kZXN0cm95JCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQoaXRlbSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9jb25maWcuc29ydFZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnNvcnRCeUl0ZW0uZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2l0ZW1zQ2hhbmdlJC5uZXh0KHRoaXMuc29ydEJ5SXRlbSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLnZhbHVlQ2hhbmdlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xhenlJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVhZHkkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlSXRlbXNWaXNpYmxpdHkoKTtcbiAgICAgICAgdGhpcy5fc2V0S2V5d29yZEl0ZW0oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFNvcnRpbmdJdGVtcyhwOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtICYmIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5pbml0VmFsdWVzKHBbdGhpcy5zb3J0QnlJdGVtLm5hbWVdKTtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uaW5pdFZhbHVlcyhwW3RoaXMuc29ydERpcmVjdGlvbkl0ZW0ubmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVNvcnRpbmdJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLnNvcnRWYWx1ZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRCeUl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNvcnRCeUZpZWxkLFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBieScsXG4gICAgICAgIHZhbHVlczogdGhpcy5fY29uZmlnLnNvcnRWYWx1ZXMsXG4gICAgICB9IGFzIElGaWx0ZXJDb25maWdTZWxlY3RJdGVtO1xuXG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCAmJiB0aGlzLl9jb25maWcuc29ydC52YWx1ZSkge1xuICAgICAgICBzb3J0QnlJdGVtLmRlZmF1bHQgPSB0aGlzLl9jb25maWcuc29ydC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0QnlJdGVtID0gbmV3IFNpbXBsZVNlbGVjdEl0ZW0oXG4gICAgICAgIHNvcnRCeUl0ZW0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuZmlsdGVyLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbkl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNvcnREaXJlY3Rpb25GaWVsZCxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgICAgICBsYWJlbDogJ1NvcnQgZGlyZWN0aW9uJyxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQXNjZW5kaW5nJywgdmFsdWU6ICdhc2MnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRGVzY2VuZGluZycsIHZhbHVlOiAnZGVzYycgfSxcbiAgICAgICAgXSxcbiAgICAgIH0gYXMgSUZpbHRlckNvbmZpZ1NlbGVjdEl0ZW07XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCAmJiB0aGlzLl9jb25maWcuc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgc29ydERpcmVjdGlvbkl0ZW0uZGVmYXVsdCA9IHRoaXMuX2NvbmZpZy5zb3J0LmRpcmVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG5ldyBTaW1wbGVTZWxlY3RJdGVtKFxuICAgICAgICBzb3J0RGlyZWN0aW9uSXRlbSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5maWx0ZXIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldEtleXdvcmRJdGVtKCkge1xuICAgIHRoaXMua2V5d29yZEl0ZW0gPSB0aGlzXG4gICAgICAuaXRlbXNcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLmlzVHlwZUtleXdvcmQpIGFzIFRleHRJdGVtO1xuICB9XG59XG4iXX0=
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { ActivatedRoute } from '@angular/router';
|
|
3
|
-
import { restoreItems } from '../helpers/restore-items';
|
|
4
|
-
import { FsFilterItemsStore } from './items-store.service';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/router";
|
|
7
|
-
import * as i2 from "./items-store.service";
|
|
8
|
-
export class QueryParamsController {
|
|
9
|
-
_route;
|
|
10
|
-
_itemsStore;
|
|
11
|
-
_enabled = false;
|
|
12
|
-
_fetchedParams;
|
|
13
|
-
constructor(_route, _itemsStore) {
|
|
14
|
-
this._route = _route;
|
|
15
|
-
this._itemsStore = _itemsStore;
|
|
16
|
-
}
|
|
17
|
-
get enabled() {
|
|
18
|
-
return this._enabled;
|
|
19
|
-
}
|
|
20
|
-
get fetchedParams() {
|
|
21
|
-
return this._fetchedParams;
|
|
22
|
-
}
|
|
23
|
-
init(enabled) {
|
|
24
|
-
this._enabled = enabled;
|
|
25
|
-
if (this.enabled) {
|
|
26
|
-
this.fetchFromQueryParams();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
writeStateToQueryParams(params) {
|
|
30
|
-
if (this._enabled) {
|
|
31
|
-
this._replaceState(params);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Parse query and update filter values
|
|
36
|
-
*/
|
|
37
|
-
fetchFromQueryParams() {
|
|
38
|
-
const items = [
|
|
39
|
-
...this._itemsStore.items,
|
|
40
|
-
this._itemsStore.sortByItem,
|
|
41
|
-
this._itemsStore.sortDirectionItem,
|
|
42
|
-
]
|
|
43
|
-
.filter((item) => !!item);
|
|
44
|
-
this._fetchedParams = restoreItems(this._route.snapshot.queryParams, items);
|
|
45
|
-
}
|
|
46
|
-
_replaceState(data) {
|
|
47
|
-
const url = new URL(window.location.href);
|
|
48
|
-
Object.keys(data)
|
|
49
|
-
.forEach((name) => {
|
|
50
|
-
if (data[name] === undefined || data[name] === null) {
|
|
51
|
-
url.searchParams.delete(name);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
url.searchParams.set(name, data[name]);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
history.replaceState({}, null, url.pathname + url.search);
|
|
58
|
-
}
|
|
59
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QueryParamsController, deps: [{ token: i1.ActivatedRoute }, { token: i2.FsFilterItemsStore }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
60
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QueryParamsController });
|
|
61
|
-
}
|
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QueryParamsController, decorators: [{
|
|
63
|
-
type: Injectable
|
|
64
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.FsFilterItemsStore }] });
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvcXVlcnktcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFJM0QsTUFBTSxPQUFPLHFCQUFxQjtJQU10QjtJQUNBO0lBTEYsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixjQUFjLENBQXNCO0lBRTVDLFlBQ1UsTUFBc0IsRUFDdEIsV0FBK0I7UUFEL0IsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO0lBQ3RDLENBQUM7SUFFSixJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTSxJQUFJLENBQUMsT0FBZ0I7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxNQUFNO1FBQ25DLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLG9CQUFvQjtRQUN6QixNQUFNLEtBQUssR0FBRztZQUNaLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQjtTQUNuQzthQUNFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQ2hDLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFJO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDZCxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQixJQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuRCxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RCxDQUFDO3dHQTlEVSxxQkFBcUI7NEdBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgcmVzdG9yZUl0ZW1zIH0gZnJvbSAnLi4vaGVscGVycy9yZXN0b3JlLWl0ZW1zJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJJdGVtc1N0b3JlIH0gZnJvbSAnLi9pdGVtcy1zdG9yZS5zZXJ2aWNlJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJhbXNDb250cm9sbGVyIHtcblxuICBwcml2YXRlIF9lbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2ZldGNoZWRQYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgX2l0ZW1zU3RvcmU6IEZzRmlsdGVySXRlbXNTdG9yZSxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmV0Y2hlZFBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hlZFBhcmFtcztcbiAgfVxuXG4gIHB1YmxpYyBpbml0KGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlZDtcblxuICAgIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuZmV0Y2hGcm9tUXVlcnlQYXJhbXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVTdGF0ZVRvUXVlcnlQYXJhbXMocGFyYW1zKSB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQpIHsgXG4gICAgICB0aGlzLl9yZXBsYWNlU3RhdGUocGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcXVlcnkgYW5kIHVwZGF0ZSBmaWx0ZXIgdmFsdWVzXG4gICAqL1xuICBwdWJsaWMgZmV0Y2hGcm9tUXVlcnlQYXJhbXMoKSB7XG4gICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAuLi50aGlzLl9pdGVtc1N0b3JlLml0ZW1zLFxuICAgICAgdGhpcy5faXRlbXNTdG9yZS5zb3J0QnlJdGVtLFxuICAgICAgdGhpcy5faXRlbXNTdG9yZS5zb3J0RGlyZWN0aW9uSXRlbSxcbiAgICBdXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pO1xuXG4gICAgdGhpcy5fZmV0Y2hlZFBhcmFtcyA9IHJlc3RvcmVJdGVtcyhcbiAgICAgIHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLFxuICAgICAgaXRlbXMsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcGxhY2VTdGF0ZShkYXRhKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICBPYmplY3Qua2V5cyhkYXRhKVxuICAgICAgLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgaWYoZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkIHx8IGRhdGFbbmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChuYW1lLGRhdGFbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBudWxsLCB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoKTtcbiAgfVxufVxuIl19
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Location } from '@angular/common';
|
|
2
|
-
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { getNormalizedPath } from '@firestitch/common';
|
|
4
|
-
import { FsStore } from '@firestitch/store';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class QueryPersistanceController {
|
|
7
|
-
queryEnabled = false;
|
|
8
|
-
_store = inject(FsStore);
|
|
9
|
-
_name;
|
|
10
|
-
_data = {};
|
|
11
|
-
_location = inject(Location);
|
|
12
|
-
_storeKey = 'fs-filter-persist';
|
|
13
|
-
setConfig(filterConfig, inDialog) {
|
|
14
|
-
const config = this._initConfig(filterConfig.persist, inDialog);
|
|
15
|
-
if (config) {
|
|
16
|
-
this.queryEnabled = config.persistQuery;
|
|
17
|
-
this._name = config.name;
|
|
18
|
-
this._data = this._get() || {};
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
setQuery(value) {
|
|
22
|
-
this._set('query', value);
|
|
23
|
-
}
|
|
24
|
-
getQuery() {
|
|
25
|
-
return this._data.query || {};
|
|
26
|
-
}
|
|
27
|
-
_set(key, value) {
|
|
28
|
-
this._data[key] = value;
|
|
29
|
-
const storeData = this._store.get(this._storeKey) || {};
|
|
30
|
-
storeData[this._name] = this._data;
|
|
31
|
-
this._store.set(this._storeKey, storeData);
|
|
32
|
-
}
|
|
33
|
-
_get() {
|
|
34
|
-
const storeData = this._store.get(this._storeKey);
|
|
35
|
-
if (storeData) {
|
|
36
|
-
return storeData[this._name];
|
|
37
|
-
}
|
|
38
|
-
return {};
|
|
39
|
-
}
|
|
40
|
-
_initConfig(config, inDialog) {
|
|
41
|
-
let persistanceConfig = this._getConfig(config);
|
|
42
|
-
if (persistanceConfig) {
|
|
43
|
-
persistanceConfig = {
|
|
44
|
-
name: persistanceConfig.name || getNormalizedPath(this._location),
|
|
45
|
-
persistQuery: !inDialog || !!persistanceConfig.name,
|
|
46
|
-
...persistanceConfig,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return persistanceConfig;
|
|
50
|
-
}
|
|
51
|
-
_getConfig(config) {
|
|
52
|
-
if (config) {
|
|
53
|
-
return {
|
|
54
|
-
...(config === true ? {} : config),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QueryPersistanceController, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
60
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QueryPersistanceController });
|
|
61
|
-
}
|
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QueryPersistanceController, decorators: [{
|
|
63
|
-
type: Injectable
|
|
64
|
-
}] });
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGVyc2lzdGFuY2UtY29udHJvbGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9zZXJ2aWNlcy9xdWVyeS1wZXJzaXN0YW5jZS1jb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFPNUMsTUFBTSxPQUFPLDBCQUEwQjtJQUU5QixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXBCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsS0FBSyxDQUFTO0lBQ2QsS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUNoQixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BCLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztJQUUxQyxTQUFTLENBQUMsWUFBNEIsRUFBRSxRQUFpQjtRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFaEUsSUFBRyxNQUFNLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sSUFBSSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRW5DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLElBQUk7UUFDVixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQTJCLEVBQUUsUUFBaUI7UUFDaEUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhELElBQUcsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQixpQkFBaUIsR0FBRztnQkFDbEIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNqRSxZQUFZLEVBQUUsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUk7Z0JBQ25ELEdBQUcsaUJBQWlCO2FBQ3JCLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQTJCO1FBQzVDLElBQUcsTUFBTSxFQUFFLENBQUM7WUFDVixPQUFPO2dCQUNMLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUNuQyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt3R0FwRVUsMEJBQTBCOzRHQUExQiwwQkFBMEI7OzRGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZ2V0Tm9ybWFsaXplZFBhdGggfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNTdG9yZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3N0b3JlJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJQZXJzaXN0YW5jZSwgRnNGaWx0ZXJQZXJzaXN0YW5jZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvZmlsdGVyLWNvbmZpZyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyIHtcblxuICBwdWJsaWMgcXVlcnlFbmFibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfc3RvcmUgPSBpbmplY3QoRnNTdG9yZSk7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGF0YTogYW55ID0ge307XG4gIHByaXZhdGUgX2xvY2F0aW9uID0gaW5qZWN0KExvY2F0aW9uKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RvcmVLZXkgPSAnZnMtZmlsdGVyLXBlcnNpc3QnO1xuXG4gIHB1YmxpYyBzZXRDb25maWcoZmlsdGVyQ29uZmlnOiBGc0ZpbHRlckNvbmZpZywgaW5EaWFsb2c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLl9pbml0Q29uZmlnKGZpbHRlckNvbmZpZy5wZXJzaXN0LCBpbkRpYWxvZyk7XG5cbiAgICBpZihjb25maWcpIHtcbiAgICAgIHRoaXMucXVlcnlFbmFibGVkID0gY29uZmlnLnBlcnNpc3RRdWVyeTtcbiAgICAgIHRoaXMuX25hbWUgPSBjb25maWcubmFtZTtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9nZXQoKSB8fCB7fTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnkodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3NldCgncXVlcnknLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnkgfHwge307XG4gIH1cblxuICBwcml2YXRlIF9zZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9kYXRhW2tleV0gPSB2YWx1ZTtcbiAgICBjb25zdCBzdG9yZURhdGEgPSB0aGlzLl9zdG9yZS5nZXQodGhpcy5fc3RvcmVLZXkpIHx8IHt9O1xuICAgIHN0b3JlRGF0YVt0aGlzLl9uYW1lXSA9IHRoaXMuX2RhdGE7XG5cbiAgICB0aGlzLl9zdG9yZS5zZXQodGhpcy5fc3RvcmVLZXksIHN0b3JlRGF0YSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXQoKSB7XG4gICAgY29uc3Qgc3RvcmVEYXRhID0gdGhpcy5fc3RvcmUuZ2V0KHRoaXMuX3N0b3JlS2V5KTtcblxuICAgIGlmIChzdG9yZURhdGEpIHtcbiAgICAgIHJldHVybiBzdG9yZURhdGFbdGhpcy5fbmFtZV07XG4gICAgfVxuIFxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRDb25maWcoY29uZmlnOiBGc0ZpbHRlclBlcnNpc3RhbmNlLCBpbkRpYWxvZzogYm9vbGVhbik6IEZzRmlsdGVyUGVyc2lzdGFuY2VDb25maWcge1xuICAgIGxldCBwZXJzaXN0YW5jZUNvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuXG4gICAgaWYocGVyc2lzdGFuY2VDb25maWcpIHtcbiAgICAgIHBlcnNpc3RhbmNlQ29uZmlnID0ge1xuICAgICAgICBuYW1lOiBwZXJzaXN0YW5jZUNvbmZpZy5uYW1lIHx8IGdldE5vcm1hbGl6ZWRQYXRoKHRoaXMuX2xvY2F0aW9uKSxcbiAgICAgICAgcGVyc2lzdFF1ZXJ5OiAhaW5EaWFsb2cgfHwgISFwZXJzaXN0YW5jZUNvbmZpZy5uYW1lLFxuICAgICAgICAuLi5wZXJzaXN0YW5jZUNvbmZpZyxcbiAgICAgIH07XG4gICAgfVxuICBcbiAgICByZXR1cm4gcGVyc2lzdGFuY2VDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb25maWcoY29uZmlnOiBGc0ZpbHRlclBlcnNpc3RhbmNlKTogRnNGaWx0ZXJQZXJzaXN0YW5jZUNvbmZpZyB7XG4gICAgaWYoY29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4oY29uZmlnID09PSB0cnVlID8ge30gOiBjb25maWcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG59XG5cbiJdfQ==
|