nuxeo-development-framework 4.4.7 → 4.4.8
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/bundles/nuxeo-development-framework.umd.js +13 -11
- package/bundles/nuxeo-development-framework.umd.js.map +1 -1
- package/esm2015/lib/shared/services/base/cache-base.service.js +26 -24
- package/fesm2015/nuxeo-development-framework.js +15 -13
- package/fesm2015/nuxeo-development-framework.js.map +1 -1
- package/lib/shared/services/base/cache-base.service.d.ts +4 -4
- package/package.json +1 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
var _CacheBaseService_instances, _CacheBaseService_fetchedItems, _CacheBaseService_handleCacheItems, _CacheBaseService_findNode, _CacheBaseService_findLargestDate, _CacheBaseService_handleFetchedItems, _CacheBaseService_addItemsTo, _CacheBaseService_prepareOptions, _CacheBaseService_prepareConfig, _CacheBaseService_add1SecondToModifiedDate, _CacheBaseService_clear, _CacheBaseService_validateTTLForKey, _CacheBaseService_setItemInMap, _CacheBaseService_getItem, _CacheBaseService_setItem;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Injectable } from
|
|
4
|
-
import { EMPTY, Subject } from
|
|
5
|
-
import { expand, last, map, retry } from
|
|
6
|
-
import * as moment from
|
|
7
|
-
import { DEFAULT_CACHE_OPTIONS } from
|
|
8
|
-
import _omit from
|
|
9
|
-
import _assign from
|
|
10
|
-
import _cloneDeep from
|
|
11
|
-
import { DEFAULT_TTL_CONFIG } from
|
|
12
|
-
import { EnvManager } from
|
|
3
|
+
import { Injectable } from "@angular/core";
|
|
4
|
+
import { EMPTY, Subject } from "rxjs";
|
|
5
|
+
import { expand, last, map, retry } from "rxjs/operators";
|
|
6
|
+
import * as moment from "moment";
|
|
7
|
+
import { DEFAULT_CACHE_OPTIONS } from "./constants";
|
|
8
|
+
import _omit from "lodash/omit";
|
|
9
|
+
import _assign from "lodash/assign";
|
|
10
|
+
import _cloneDeep from "lodash/cloneDeep";
|
|
11
|
+
import { DEFAULT_TTL_CONFIG } from "./config";
|
|
12
|
+
import { EnvManager } from "../../../core/env/env-manager";
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
14
|
import * as i1 from "../../../core/services/user/user-preferences.service";
|
|
15
15
|
import * as i2 from "../../../core/utilities/utility.service";
|
|
@@ -36,10 +36,10 @@ export class CacheBaseService {
|
|
|
36
36
|
.filter((key) => {
|
|
37
37
|
var _a;
|
|
38
38
|
const options = {
|
|
39
|
-
cacheKey: key.replace(prefix,
|
|
39
|
+
cacheKey: key.replace(prefix, ""),
|
|
40
40
|
userName: userName,
|
|
41
41
|
request: DEFAULT_CACHE_OPTIONS.REQUEST,
|
|
42
|
-
prepareDataBeforeCaching: DEFAULT_CACHE_OPTIONS.PREPARE_DATA
|
|
42
|
+
prepareDataBeforeCaching: DEFAULT_CACHE_OPTIONS.PREPARE_DATA,
|
|
43
43
|
};
|
|
44
44
|
const firstFetchingDate = (_a = __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_getItem).call(this, options)) === null || _a === void 0 ? void 0 : _a.firstFetchingDate;
|
|
45
45
|
if (!firstFetchingDate)
|
|
@@ -72,7 +72,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
72
72
|
__classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_setItemInMap).call(this, options.cacheKey, Object.assign(Object.assign({}, cachedItem), { fetchingItemsFromTheServer: false, onFinishFetching: new Subject(), request: options.request }));
|
|
73
73
|
const params = {
|
|
74
74
|
[options.pageKey]: 0,
|
|
75
|
-
[options.minCompareDateKey]: __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_add1SecondToModifiedDate).call(this, new Date(__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].lastModifiedDate)).toISOString()
|
|
75
|
+
[options.minCompareDateKey]: __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_add1SecondToModifiedDate).call(this, new Date(__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].lastModifiedDate)).toISOString(),
|
|
76
76
|
};
|
|
77
77
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].params = params;
|
|
78
78
|
observable = options.request(params);
|
|
@@ -102,7 +102,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
102
102
|
data: _fetchedItems.data,
|
|
103
103
|
lastModifiedDate: _fetchedItems.lastModifiedDate,
|
|
104
104
|
firstFetchingDate: _fetchedItems.firstFetchingDate,
|
|
105
|
-
resultsCount: _fetchedItems[options.resultsCount]
|
|
105
|
+
resultsCount: _fetchedItems[options.resultsCount],
|
|
106
106
|
}, options);
|
|
107
107
|
}
|
|
108
108
|
return _fetchedItems;
|
|
@@ -110,9 +110,10 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
110
110
|
const result = _cloneDeep({
|
|
111
111
|
[options.mappedDataKey]: res.data,
|
|
112
112
|
[options.lastModifiedDateKey]: res.lastModifiedDate,
|
|
113
|
-
[options.resultsCount]: res[options.resultsCount]
|
|
113
|
+
[options.resultsCount]: res[options.resultsCount],
|
|
114
114
|
});
|
|
115
115
|
res.onFinishFetching.next(result);
|
|
116
|
+
res.onFinishFetching.complete();
|
|
116
117
|
return result;
|
|
117
118
|
}));
|
|
118
119
|
}, _CacheBaseService_findNode = function _CacheBaseService_findNode(items, uniqueCompareKey, childrenPath, value) {
|
|
@@ -136,7 +137,8 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
136
137
|
return;
|
|
137
138
|
const children = this.utilityService.getValue(node, childrenPath);
|
|
138
139
|
const nodeDate = this.utilityService.getValue(node, datePath);
|
|
139
|
-
if (nodeDate &&
|
|
140
|
+
if (nodeDate &&
|
|
141
|
+
(!largestDate || new Date(nodeDate) > new Date(largestDate))) {
|
|
140
142
|
largestDate = nodeDate;
|
|
141
143
|
}
|
|
142
144
|
if (children === null || children === void 0 ? void 0 : children.length) {
|
|
@@ -231,14 +233,14 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
231
233
|
DEFAULT_TTL_CONFIG.UNIT =
|
|
232
234
|
((_d = (_c = EnvManager.environment) === null || _c === void 0 ? void 0 : _c.cache) === null || _d === void 0 ? void 0 : _d.ttlUnit) || DEFAULT_TTL_CONFIG.UNIT;
|
|
233
235
|
DEFAULT_TTL_CONFIG.AUTO_CHECK =
|
|
234
|
-
((_f = (_e = EnvManager.environment) === null || _e === void 0 ? void 0 : _e.cache) === null || _f === void 0 ? void 0 : _f.autoCheck) ==
|
|
236
|
+
((_f = (_e = EnvManager.environment) === null || _e === void 0 ? void 0 : _e.cache) === null || _f === void 0 ? void 0 : _f.autoCheck) == "YES";
|
|
235
237
|
DEFAULT_TTL_CONFIG.RETRY =
|
|
236
238
|
((_h = (_g = EnvManager.environment) === null || _g === void 0 ? void 0 : _g.cache) === null || _h === void 0 ? void 0 : _h.retry) || DEFAULT_TTL_CONFIG.RETRY;
|
|
237
239
|
}, _CacheBaseService_add1SecondToModifiedDate = function _CacheBaseService_add1SecondToModifiedDate(date) {
|
|
238
240
|
let newDate = new Date(date.getTime());
|
|
239
241
|
newDate.setSeconds(newDate.getSeconds() + 1);
|
|
240
242
|
return newDate;
|
|
241
|
-
}, _CacheBaseService_clear = function _CacheBaseService_clear(userName, keyOrAll =
|
|
243
|
+
}, _CacheBaseService_clear = function _CacheBaseService_clear(userName, keyOrAll = "") {
|
|
242
244
|
Object.keys(window.localStorage)
|
|
243
245
|
.filter((q) => q.startsWith(`${userName}__${DEFAULT_CACHE_OPTIONS.PREFIX}${keyOrAll}`))
|
|
244
246
|
.forEach((key) => {
|
|
@@ -257,11 +259,11 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
257
259
|
}, _CacheBaseService_setItemInMap = function _CacheBaseService_setItemInMap(key, val) {
|
|
258
260
|
const empty = {
|
|
259
261
|
data: [],
|
|
260
|
-
firstFetchingDate:
|
|
261
|
-
lastModifiedDate:
|
|
262
|
+
firstFetchingDate: "",
|
|
263
|
+
lastModifiedDate: "",
|
|
262
264
|
resultsCount: 0,
|
|
263
265
|
fetchingItemsFromTheServer: false,
|
|
264
|
-
onFinishFetching: new Subject()
|
|
266
|
+
onFinishFetching: new Subject(),
|
|
265
267
|
};
|
|
266
268
|
let value = val ? val : empty;
|
|
267
269
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[key] = value;
|
|
@@ -285,11 +287,11 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
285
287
|
}
|
|
286
288
|
};
|
|
287
289
|
CacheBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, deps: [{ token: i1.UserPreferencesService }, { token: i2.UtilityService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
288
|
-
CacheBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, providedIn:
|
|
290
|
+
CacheBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, providedIn: "root" });
|
|
289
291
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, decorators: [{
|
|
290
292
|
type: Injectable,
|
|
291
293
|
args: [{
|
|
292
|
-
providedIn:
|
|
294
|
+
providedIn: "root",
|
|
293
295
|
}]
|
|
294
296
|
}], ctorParameters: function () { return [{ type: i1.UserPreferencesService }, { type: i2.UtilityService }]; } });
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Jhc2UvY2FjaGUtYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQUszRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRzVCLFlBQ1Msc0JBQThDLEVBQzlDLGNBQThCO1FBRDlCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCOztRQUp2Qyx5Q0FBd0MsSUFBSSxHQUFHLEVBQXFCLEVBQUM7UUFNcEUsdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLENBQWlCLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENB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QkFBcUIsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUNyQixDQUFDO0tBQ0Y7QUFDRixDQUFDOzhHQTVXVyxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQUZoQixNQUFNOzRGQUVOLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGV4cGFuZCwgbGFzdCwgbWFwLCByZXRyeSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ0FDSEVfT1BUSU9OUyB9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQmFzZUNhY2hlT3B0aW9ucywgQ2FjaGVJbmZvIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgX29taXQgZnJvbSAnbG9kYXNoL29taXQnO1xyXG5pbXBvcnQgX2Fzc2lnbiBmcm9tICdsb2Rhc2gvYXNzaWduJztcclxuaW1wb3J0IF9jbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XHJcbmltcG9ydCB7IERFRkFVTFRfVFRMX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgVXNlclByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvdXNlci91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL3V0aWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudk1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Vudi9lbnYtbWFuYWdlcic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWNoZUJhc2VTZXJ2aWNlIHtcclxuXHQjZmV0Y2hlZEl0ZW1zOiBNYXA8c3RyaW5nLCBDYWNoZUluZm8+ID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlSW5mbz4oKTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXHJcblx0XHRwcml2YXRlIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZVxyXG5cdCkge1xyXG5cdFx0dGhpcy4jcHJlcGFyZUNvbmZpZygpO1xyXG5cdH1cclxuXHJcblx0aGFzSXRlbShjYWNoZUtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmhhc0l0ZW0oXHJcblx0XHRcdGAke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9JHtjYWNoZUtleX1gXHJcblx0XHQpO1xyXG5cdH1cclxuXHRjbGVhckFsbCh1c2VyTmFtZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLiNjbGVhcih1c2VyTmFtZSk7XHJcblx0fVxyXG5cdHZhbGlkYXRlVFRMKHVzZXJOYW1lOiBzdHJpbmcpIHtcclxuXHRcdGlmICghREVGQVVMVF9UVExfQ09ORklHLkFVVE9fQ0hFQ0sgfHwgIXVzZXJOYW1lKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgcHJlZml4ID0gYCR7dXNlck5hbWV9X18ke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9YDtcclxuXHRcdE9iamVjdC5rZXlzKHdpbmRvdy5sb2NhbFN0b3JhZ2UpXHJcblx0XHRcdC5maWx0ZXIoKHEpID0+IHEuc3RhcnRzV2l0aChwcmVmaXgpKVxyXG5cdFx0XHQuZmlsdGVyKChrZXkpID0+IHtcclxuXHRcdFx0XHRjb25zdCBvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zID0ge1xyXG5cdFx0XHRcdFx0Y2FjaGVLZXk6IGtleS5yZXBsYWNlKHByZWZpeCwgJycpLFxyXG5cdFx0XHRcdFx0dXNlck5hbWU6IHVzZXJOYW1lLFxyXG5cdFx0XHRcdFx0cmVxdWVzdDogREVGQVVMVF9DQUNIRV9PUFRJT05TLlJFUVVFU1QsXHJcblx0XHRcdFx0XHRwcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmc6IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVQQVJFX0RBVEFcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnN0IGZpcnN0RmV0Y2hpbmdEYXRlID0gdGhpcy4jZ2V0SXRlbShvcHRpb25zKT8uZmlyc3RGZXRjaGluZ0RhdGU7XHJcblx0XHRcdFx0aWYgKCFmaXJzdEZldGNoaW5nRGF0ZSkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjb25zdCBtb21lbnREYXRlMSA9IG1vbWVudChuZXcgRGF0ZShmaXJzdEZldGNoaW5nRGF0ZSkpO1xyXG5cdFx0XHRcdGNvbnN0IG1vbWVudERhdGUyID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG5cdFx0XHRcdGNvbnN0IGRpZmZlcmVuY2UgPSBtb21lbnREYXRlMi5kaWZmKFxyXG5cdFx0XHRcdFx0bW9tZW50RGF0ZTEsXHJcblx0XHRcdFx0XHRERUZBVUxUX1RUTF9DT05GSUcuVU5JVFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0cmV0dXJuIGRpZmZlcmVuY2UgPj0gREVGQVVMVF9UVExfQ09ORklHLlRUTDtcclxuXHRcdFx0fSlcclxuXHRcdFx0LmZvckVhY2goKGtleSkgPT4ge1xyXG5cdFx0XHRcdHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblx0c3RhcnRGZXRjaGluZ0l0ZW1zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0dGhpcy4jdmFsaWRhdGVUVExGb3JLZXkob3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XT8uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuI2ZldGNoZWRJdGVtc1tcclxuXHRcdFx0XHRvcHRpb25zLmNhY2hlS2V5XHJcblx0XHRcdF0ub25GaW5pc2hGZXRjaGluZy5hc09ic2VydmFibGUoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiB0aGlzLiNoYW5kbGVDYWNoZUl0ZW1zKG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQjaGFuZGxlQ2FjaGVJdGVtcyhvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT47XHJcblx0XHR0aGlzLiNwcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcclxuXHJcblx0XHRjb25zdCBjYWNoZWRJdGVtID0gdGhpcy4jZ2V0SXRlbShvcHRpb25zKTtcclxuXHJcblx0XHRpZiAoY2FjaGVkSXRlbSkge1xyXG5cdFx0XHR0aGlzLiNzZXRJdGVtSW5NYXAob3B0aW9ucy5jYWNoZUtleSwge1xyXG5cdFx0XHRcdC4uLmNhY2hlZEl0ZW0sXHJcblx0XHRcdFx0ZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXI6IGZhbHNlLFxyXG5cdFx0XHRcdG9uRmluaXNoRmV0Y2hpbmc6IG5ldyBTdWJqZWN0PENhY2hlSW5mbz4oKSxcclxuXHRcdFx0XHRyZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3RcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRjb25zdCBwYXJhbXMgPSB7XHJcblx0XHRcdFx0W29wdGlvbnMucGFnZUtleV06IDAsXHJcblx0XHRcdFx0W29wdGlvbnMubWluQ29tcGFyZURhdGVLZXldOiB0aGlzLiNhZGQxU2Vjb25kVG9Nb2RpZmllZERhdGUoXHJcblx0XHRcdFx0XHRuZXcgRGF0ZSh0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ubGFzdE1vZGlmaWVkRGF0ZSlcclxuXHRcdFx0XHQpLnRvSVNPU3RyaW5nKClcclxuXHRcdFx0fTtcclxuXHRcdFx0dGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnBhcmFtcyA9IHBhcmFtcztcclxuXHRcdFx0b2JzZXJ2YWJsZSA9IG9wdGlvbnMucmVxdWVzdChwYXJhbXMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy4jc2V0SXRlbUluTWFwKG9wdGlvbnMuY2FjaGVLZXkpO1xyXG5cdFx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucmVxdWVzdCA9IG9wdGlvbnMucmVxdWVzdDtcclxuXHRcdFx0dGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmZpcnN0RmV0Y2hpbmdEYXRlID1cclxuXHRcdFx0XHRuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcblx0XHRcdG9ic2VydmFibGUgPSBvcHRpb25zLnJlcXVlc3QoeyBbb3B0aW9ucy5wYWdlS2V5XTogMCB9KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSB0cnVlO1xyXG5cdFx0cmV0dXJuIG9ic2VydmFibGUucGlwZShcclxuXHRcdFx0cmV0cnkoREVGQVVMVF9UVExfQ09ORklHLlJFVFJZKSxcclxuXHRcdFx0ZXhwYW5kKChyZXN1bHRzOiBhbnkpID0+IHtcclxuXHRcdFx0XHRsZXQgYW5vdGhlckNhbGw6IE9ic2VydmFibGU8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cdFx0XHRcdGlmIChyZXN1bHRzICYmIHJlc3VsdHNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XT8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRhbm90aGVyQ2FsbCA9IHRoaXMuI2hhbmRsZUZldGNoZWRJdGVtcyhvcHRpb25zLCByZXN1bHRzKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGFub3RoZXJDYWxsID8gYW5vdGhlckNhbGwgOiBFTVBUWTtcclxuXHRcdFx0fSksXHJcblx0XHRcdGxhc3QoKSxcclxuXHRcdFx0bWFwKChfKSA9PiB7XHJcblx0XHRcdFx0bGV0IF9mZXRjaGVkSXRlbXMgPSB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0gYXMgQ2FjaGVJbmZvO1xyXG5cdFx0XHRcdF9mZXRjaGVkSXRlbXMuZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSBmYWxzZTtcclxuXHRcdFx0XHRpZiAoX2ZldGNoZWRJdGVtcy5kYXRhPy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdF9mZXRjaGVkSXRlbXMubGFzdE1vZGlmaWVkRGF0ZSA9IHRoaXMuI2ZpbmRMYXJnZXN0RGF0ZShcclxuXHRcdFx0XHRcdFx0X2ZldGNoZWRJdGVtcy5kYXRhLFxyXG5cdFx0XHRcdFx0XHRvcHRpb25zLmNoaWxkcmVuUGF0aCxcclxuXHRcdFx0XHRcdFx0b3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHRoaXMuI3NldEl0ZW0oXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBfZmV0Y2hlZEl0ZW1zLmRhdGEsXHJcblx0XHRcdFx0XHRcdFx0bGFzdE1vZGlmaWVkRGF0ZTogX2ZldGNoZWRJdGVtcy5sYXN0TW9kaWZpZWREYXRlLFxyXG5cdFx0XHRcdFx0XHRcdGZpcnN0RmV0Y2hpbmdEYXRlOiBfZmV0Y2hlZEl0ZW1zLmZpcnN0RmV0Y2hpbmdEYXRlLFxyXG5cdFx0XHRcdFx0XHRcdHJlc3VsdHNDb3VudDogX2ZldGNoZWRJdGVtc1tvcHRpb25zLnJlc3VsdHNDb3VudF1cclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0b3B0aW9uc1xyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIF9mZXRjaGVkSXRlbXM7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRtYXAoKHJlcykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IF9jbG9uZURlZXAoe1xyXG5cdFx0XHRcdFx0W29wdGlvbnMubWFwcGVkRGF0YUtleV06IHJlcy5kYXRhLFxyXG5cdFx0XHRcdFx0W29wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZUtleV06IHJlcy5sYXN0TW9kaWZpZWREYXRlLFxyXG5cdFx0XHRcdFx0W29wdGlvbnMucmVzdWx0c0NvdW50XTogcmVzW29wdGlvbnMucmVzdWx0c0NvdW50XVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHJlcy5vbkZpbmlzaEZldGNoaW5nLm5leHQocmVzdWx0KTtcclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblx0I2ZpbmROb2RlKFxyXG5cdFx0aXRlbXM6IGFueVtdLFxyXG5cdFx0dW5pcXVlQ29tcGFyZUtleTogc3RyaW5nLFxyXG5cdFx0Y2hpbGRyZW5QYXRoOiBzdHJpbmcsXHJcblx0XHR2YWx1ZTogYW55XHJcblx0KSB7XHJcblx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgaXRlbXMpIHtcclxuXHRcdFx0aWYgKG5vZGVbdW5pcXVlQ29tcGFyZUtleV0gPT09IHZhbHVlKSB7XHJcblx0XHRcdFx0cmV0dXJuIG5vZGU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKG5vZGUsIGNoaWxkcmVuUGF0aCk7XHJcblx0XHRcdGlmIChjaGlsZHJlbikge1xyXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMuI2ZpbmROb2RlKFxyXG5cdFx0XHRcdFx0Y2hpbGRyZW4sXHJcblx0XHRcdFx0XHR1bmlxdWVDb21wYXJlS2V5LFxyXG5cdFx0XHRcdFx0Y2hpbGRyZW5QYXRoLFxyXG5cdFx0XHRcdFx0dmFsdWVcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0I2ZpbmRMYXJnZXN0RGF0ZShcclxuXHRcdG5vZGVMaXN0OiBhbnlbXSxcclxuXHRcdGNoaWxkcmVuUGF0aDogc3RyaW5nLFxyXG5cdFx0ZGF0ZVBhdGg6IHN0cmluZ1xyXG5cdCk6IHN0cmluZyB7XHJcblx0XHRsZXQgbGFyZ2VzdERhdGU6IHN0cmluZyA9IG51bGw7XHJcblx0XHRjb25zdCB0cmF2ZXJzZSA9IChub2RlOiBhbnkpID0+IHtcclxuXHRcdFx0aWYgKCFub2RlKSByZXR1cm47XHJcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShub2RlLCBjaGlsZHJlblBhdGgpO1xyXG5cdFx0XHRjb25zdCBub2RlRGF0ZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUobm9kZSwgZGF0ZVBhdGgpO1xyXG5cdFx0XHRpZiAobm9kZURhdGUgJiYgKCFsYXJnZXN0RGF0ZSB8fCBub2RlRGF0ZSA+IGxhcmdlc3REYXRlKSkge1xyXG5cdFx0XHRcdGxhcmdlc3REYXRlID0gbm9kZURhdGU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGNoaWxkcmVuPy5sZW5ndGgpIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcblx0XHRcdFx0XHR0cmF2ZXJzZShjaGlsZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0bm9kZUxpc3QuZm9yRWFjaCgobm9kZSkgPT4gdHJhdmVyc2Uobm9kZSkpO1xyXG5cdFx0cmV0dXJuIGxhcmdlc3REYXRlO1xyXG5cdH1cclxuXHQjaGFuZGxlRmV0Y2hlZEl0ZW1zKFxyXG5cdFx0b3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucyxcclxuXHRcdHJlczogYW55XHJcblx0KTogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCB7XHJcblx0XHRpZiAodGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGE/Lmxlbmd0aCkge1xyXG5cdFx0XHRyZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XS5zb3J0KChhLCBiKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZmlyc3QgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKFxyXG5cdFx0XHRcdFx0YSxcclxuXHRcdFx0XHRcdG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGhcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGNvbnN0IHNlY29uZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoXHJcblx0XHRcdFx0XHRiLFxyXG5cdFx0XHRcdFx0b3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0cmV0dXJuIG5ldyBEYXRlKGZpcnN0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzZWNvbmQpLmdldFRpbWUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuXHRcdFx0XHRjb25zdCBpdGVtID0gdGhpcy4jZmluZE5vZGUoXHJcblx0XHRcdFx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZGF0YSxcclxuXHRcdFx0XHRcdG9wdGlvbnMudW5pcXVlQ29tcGFyZUtleSxcclxuXHRcdFx0XHRcdG9wdGlvbnMuY2hpbGRyZW5QYXRoLFxyXG5cdFx0XHRcdFx0ZWxlbWVudFtvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXldXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWFwcGVkRWxlbWVudCA9IG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKFtlbGVtZW50XSlbMF07XHJcblx0XHRcdFx0aWYgKGl0ZW0pIHtcclxuXHRcdFx0XHRcdC8vIGVkaXQgOiB1cGRhdGUgaXRlbSBpbiBjYWNoZVxyXG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVyZWRTb3VyY2UgPSBfb21pdChcclxuXHRcdFx0XHRcdFx0bWFwcGVkRWxlbWVudCxcclxuXHRcdFx0XHRcdFx0b3B0aW9ucy5leGNsdWRlS2V5c1doZW5VcGRhdGVcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRfYXNzaWduKGl0ZW0sIGZpbHRlcmVkU291cmNlKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gYWRkIDogY2hlY2sgZGF0ZSB0byBkZXRlcm1pbmUgd2hlcmUgd2lsbCBpbnNlcnRcclxuXHJcblx0XHRcdFx0XHQvLyBpZiBpdGVtIHBhcmVudCBub3QgZm91bmQgYWRkIGFzIHJvb3QgZWxzZSB3aWxsIGFkZCBsZWF2ZXMgdG8gc3ViUGFyZW50XHJcblx0XHRcdFx0XHRjb25zdCBub2RlID0gdGhpcy4jZmluZE5vZGUoXHJcblx0XHRcdFx0XHRcdHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5kYXRhLFxyXG5cdFx0XHRcdFx0XHRvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXksXHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuY2hpbGRyZW5QYXRoLFxyXG5cdFx0XHRcdFx0XHRlbGVtZW50W29wdGlvbnMucGFyZW50S2V5XVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRpZiAobm9kZSkge1xyXG5cdFx0XHRcdFx0XHQvLyB3aWxsIGNvbXBhcmUgd2l0aCBub2RlIGNoaWxkIHRvIGFkZFxyXG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoXHJcblx0XHRcdFx0XHRcdFx0bm9kZSxcclxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLmNoaWxkcmVuUGF0aFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLiNhZGRJdGVtc1RvKG9wdGlvbnMsIGNoaWxkcmVuLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8vIHdpbGwgY29tcGFyZSB3aXRoIHJvb3QgbGV2ZWwgdG8gYWRkXHJcblx0XHRcdFx0XHRcdHRoaXMuI2FkZEl0ZW1zVG8oXHJcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyxcclxuXHRcdFx0XHRcdFx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZGF0YSxcclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldID0gb3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcoXHJcblx0XHRcdFx0cmVzW29wdGlvbnMubWFwcGVkRGF0YUtleV1cclxuXHRcdFx0KTtcclxuXHRcdFx0dGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGEgPSByZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XTtcclxuXHRcdFx0dGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnJlc3VsdHNDb3VudCA9XHJcblx0XHRcdFx0cmVzW29wdGlvbnMucmVzdWx0c0NvdW50XTtcclxuXHRcdH1cclxuXHRcdGlmIChyZXNbb3B0aW9ucy50b3RhbFBhZ2VLZXldIC0gcmVzW29wdGlvbnMucGFnZUtleV0gPiAxKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucmVxdWVzdCh7XHJcblx0XHRcdFx0Li4uKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5wYXJhbXMgfHwge30pLFxyXG5cdFx0XHRcdFtvcHRpb25zLnBhZ2VLZXldOiByZXNbb3B0aW9ucy5wYWdlS2V5XSArIDFcclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblx0I2FkZEl0ZW1zVG8ob3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucywgZGF0YTogYW55W10sIGl0ZW06IGFueSkge1xyXG5cdFx0Y29uc3QgZmlyc3RDYWNoZWRNb2RpZmllZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoXHJcblx0XHRcdGRhdGFbMF0sXHJcblx0XHRcdG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGhcclxuXHRcdCk7XHJcblx0XHRjb25zdCBjdXJyZW50TW9kaWZpZWQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKFxyXG5cdFx0XHRpdGVtLFxyXG5cdFx0XHRvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoXHJcblx0XHQpO1xyXG5cdFx0aWYgKGZpcnN0Q2FjaGVkTW9kaWZpZWQgPCBjdXJyZW50TW9kaWZpZWQpIHtcclxuXHRcdFx0ZGF0YS51bnNoaWZ0KC4uLm9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKFtpdGVtXSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZGF0YS5wdXNoKC4uLm9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKFtpdGVtXSkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHQjcHJlcGFyZU9wdGlvbnMob3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucykge1xyXG5cdFx0b3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcgPVxyXG5cdFx0XHRvcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFUEFSRV9EQVRBO1xyXG5cdFx0b3B0aW9ucy5wYWdlS2V5ID0gb3B0aW9ucy5wYWdlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QQUdFX0tFWTtcclxuXHRcdG9wdGlvbnMudG90YWxQYWdlS2V5ID1cclxuXHRcdFx0b3B0aW9ucy50b3RhbFBhZ2VLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlRPVEFMX1BBR0VfS0VZO1xyXG5cdFx0b3B0aW9ucy5yZXN1bHRzQ291bnQgPVxyXG5cdFx0XHRvcHRpb25zLnJlc3VsdHNDb3VudCB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuUkVTVUxUU19DT1VOVF9LRVk7XHJcblx0XHRvcHRpb25zLm1hcHBlZERhdGFLZXkgPVxyXG5cdFx0XHRvcHRpb25zLm1hcHBlZERhdGFLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLk1BUFBFRF9EQVRBX0tFWTtcclxuXHRcdG9wdGlvbnMudW5pcXVlQ29tcGFyZUtleSA9XHJcblx0XHRcdG9wdGlvbnMudW5pcXVlQ29tcGFyZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuVU5JUVVFX0NPTVBBUkVfS0VZO1xyXG5cdFx0b3B0aW9ucy5taW5Db21wYXJlRGF0ZUtleSA9XHJcblx0XHRcdG9wdGlvbnMubWluQ29tcGFyZURhdGVLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLk1JTl9DT01QQVJFX0RBVEVfS0VZO1xyXG5cdFx0b3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlS2V5ID1cclxuXHRcdFx0b3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5MQVNUX01PRElGSUVEX0tFWTtcclxuXHRcdG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGggPVxyXG5cdFx0XHRvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoIHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5MQVNUX01PRElGSUVEX1BBVEg7XHJcblx0XHRvcHRpb25zLmV4Y2x1ZGVLZXlzV2hlblVwZGF0ZSA9XHJcblx0XHRcdG9wdGlvbnMuZXhjbHVkZUtleXNXaGVuVXBkYXRlIHx8XHJcblx0XHRcdERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5FWENMVURFX0tFWVNfV0hFTl9VUERBVEU7XHJcblx0XHRvcHRpb25zLmNoaWxkcmVuUGF0aCA9XHJcblx0XHRcdG9wdGlvbnMuY2hpbGRyZW5QYXRoIHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5DSElMRFJFTl9QQVRIO1xyXG5cdFx0b3B0aW9ucy5wYXJlbnRLZXkgPSBvcHRpb25zLnBhcmVudEtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuUEFSRU5UX0tFWTtcclxuXHR9XHJcblx0I3ByZXBhcmVDb25maWcoKSB7XHJcblx0XHRERUZBVUxUX1RUTF9DT05GSUcuVFRMID1cclxuXHRcdFx0RW52TWFuYWdlci5lbnZpcm9ubWVudD8uY2FjaGU/LnR0bCB8fCBERUZBVUxUX1RUTF9DT05GSUcuVFRMO1xyXG5cdFx0REVGQVVMVF9UVExfQ09ORklHLlVOSVQgPVxyXG5cdFx0XHRFbnZNYW5hZ2VyLmVudmlyb25tZW50Py5jYWNoZT8udHRsVW5pdCB8fCBERUZBVUxUX1RUTF9DT05GSUcuVU5JVDtcclxuXHRcdERFRkFVTFRfVFRMX0NPTkZJRy5BVVRPX0NIRUNLID1cclxuXHRcdFx0RW52TWFuYWdlci5lbnZpcm9ubWVudD8uY2FjaGU/LmF1dG9DaGVjayA9PSAnWUVTJztcclxuXHRcdERFRkFVTFRfVFRMX0NPTkZJRy5SRVRSWSA9XHJcblx0XHRcdEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy5yZXRyeSB8fCBERUZBVUxUX1RUTF9DT05GSUcuUkVUUlk7XHJcblx0fVxyXG5cdCNhZGQxU2Vjb25kVG9Nb2RpZmllZERhdGUoZGF0ZTogRGF0ZSk6IERhdGUge1xyXG5cdFx0bGV0IG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XHJcblx0XHRuZXdEYXRlLnNldFNlY29uZHMobmV3RGF0ZS5nZXRTZWNvbmRzKCkgKyAxKTtcclxuXHRcdHJldHVybiBuZXdEYXRlO1xyXG5cdH1cclxuXHQjY2xlYXIodXNlck5hbWU6IHN0cmluZywga2V5T3JBbGw6IHN0cmluZyA9ICcnKSB7XHJcblx0XHRPYmplY3Qua2V5cyh3aW5kb3cubG9jYWxTdG9yYWdlKVxyXG5cdFx0XHQuZmlsdGVyKChxKSA9PlxyXG5cdFx0XHRcdHEuc3RhcnRzV2l0aChgJHt1c2VyTmFtZX1fXyR7REVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRUZJWH0ke2tleU9yQWxsfWApXHJcblx0XHRcdClcclxuXHRcdFx0LmZvckVhY2goKGtleSkgPT4ge1xyXG5cdFx0XHRcdHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblx0I3ZhbGlkYXRlVFRMRm9yS2V5KG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuXHRcdGNvbnN0IGZpcnN0RmV0Y2hpbmdEYXRlID0gdGhpcy4jZ2V0SXRlbShvcHRpb25zKT8uZmlyc3RGZXRjaGluZ0RhdGU7XHJcblxyXG5cdFx0aWYgKCFmaXJzdEZldGNoaW5nRGF0ZSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IG1vbWVudERhdGUxID0gbW9tZW50KG5ldyBEYXRlKGZpcnN0RmV0Y2hpbmdEYXRlKSk7XHJcblx0XHRjb25zdCBtb21lbnREYXRlMiA9IG1vbWVudChuZXcgRGF0ZSgpKTtcclxuXHJcblx0XHRjb25zdCBkaWZmZXJlbmNlID0gbW9tZW50RGF0ZTIuZGlmZihtb21lbnREYXRlMSwgREVGQVVMVF9UVExfQ09ORklHLlVOSVQpO1xyXG5cclxuXHRcdGlmIChkaWZmZXJlbmNlID49IERFRkFVTFRfVFRMX0NPTkZJRy5UVEwpXHJcblx0XHRcdHRoaXMuI2NsZWFyKG9wdGlvbnMudXNlck5hbWUsIG9wdGlvbnMuY2FjaGVLZXkpO1xyXG5cdH1cclxuXHQjc2V0SXRlbUluTWFwKGtleTogc3RyaW5nLCB2YWw/OiBDYWNoZUluZm8pOiB2b2lkIHtcclxuXHRcdGNvbnN0IGVtcHR5OiBDYWNoZUluZm8gPSB7XHJcblx0XHRcdGRhdGE6IFtdLFxyXG5cdFx0XHRmaXJzdEZldGNoaW5nRGF0ZTogJycsXHJcblx0XHRcdGxhc3RNb2RpZmllZERhdGU6ICcnLFxyXG5cdFx0XHRyZXN1bHRzQ291bnQ6IDAsXHJcblx0XHRcdGZldGNoaW5nSXRlbXNGcm9tVGhlU2VydmVyOiBmYWxzZSxcclxuXHRcdFx0b25GaW5pc2hGZXRjaGluZzogbmV3IFN1YmplY3Q8Q2FjaGVJbmZvPigpXHJcblx0XHR9O1xyXG5cdFx0bGV0IHZhbHVlOiBDYWNoZUluZm8gPSB2YWwgPyB2YWwgOiBlbXB0eTtcclxuXHRcdHRoaXMuI2ZldGNoZWRJdGVtc1trZXldID0gdmFsdWU7XHJcblx0fVxyXG5cdCNnZXRJdGVtKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuXHRcdGxldCBkYXRhOiBDYWNoZUluZm87XHJcblx0XHRpZiAob3B0aW9ucy5pbk1lbW9yeSkge1xyXG5cdFx0XHRkYXRhID0gdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLnVzZXJQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFxyXG5cdFx0XHRcdGAke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9JHtvcHRpb25zLmNhY2hlS2V5fWBcclxuXHRcdFx0KTtcclxuXHRcdFx0aWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG5cdFx0XHRkYXRhID0gSlNPTi5wYXJzZSh2YWx1ZSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHR9XHJcblx0I3NldEl0ZW0odmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuXHRcdGlmIChvcHRpb25zLmluTWVtb3J5KSByZXR1cm47XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLnNldChcclxuXHRcdFx0XHRgJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7b3B0aW9ucy5jYWNoZUtleX1gLFxyXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iXX0=
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Jhc2UvY2FjaGUtYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQUszRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRzNCLFlBQ1Usc0JBQThDLEVBQzlDLGNBQThCO1FBRDlCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCOztRQUp4Qyx5Q0FBd0MsSUFBSSxHQUFHLEVBQXFCLEVBQUM7UUFNbkUsdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLENBQWlCLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUFnQjtRQUN0QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENB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LElBQUksT0FBTyxDQUFDLFFBQVE7UUFBRSxPQUFPO1NBQ3hCO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FDN0IsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUN0QixDQUFDO0tBQ0g7QUFDSCxDQUFDOzhHQWhYVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQUZmLE1BQU07NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGV4cGFuZCwgbGFzdCwgbWFwLCByZXRyeSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX0NBQ0hFX09QVElPTlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgQmFzZUNhY2hlT3B0aW9ucywgQ2FjaGVJbmZvIH0gZnJvbSBcIi4vbW9kZWxzXCI7XHJcbmltcG9ydCBfb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcclxuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcclxuaW1wb3J0IF9jbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcclxuaW1wb3J0IHsgREVGQVVMVF9UVExfQ09ORklHIH0gZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy91c2VyL3VzZXItcHJlZmVyZW5jZXMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3V0aWxpdGllcy91dGlsaXR5LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRW52TWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL2Vudi9lbnYtbWFuYWdlclwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FjaGVCYXNlU2VydmljZSB7XHJcbiAgI2ZldGNoZWRJdGVtczogTWFwPHN0cmluZywgQ2FjaGVJbmZvPiA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZUluZm8+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dGlsaXR5U2VydmljZTogVXRpbGl0eVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuI3ByZXBhcmVDb25maWcoKTtcclxuICB9XHJcblxyXG4gIGhhc0l0ZW0oY2FjaGVLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5oYXNJdGVtKFxyXG4gICAgICBgJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7Y2FjaGVLZXl9YFxyXG4gICAgKTtcclxuICB9XHJcbiAgY2xlYXJBbGwodXNlck5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy4jY2xlYXIodXNlck5hbWUpO1xyXG4gIH1cclxuICB2YWxpZGF0ZVRUTCh1c2VyTmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIURFRkFVTFRfVFRMX0NPTkZJRy5BVVRPX0NIRUNLIHx8ICF1c2VyTmFtZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHByZWZpeCA9IGAke3VzZXJOYW1lfV9fJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfWA7XHJcbiAgICBPYmplY3Qua2V5cyh3aW5kb3cubG9jYWxTdG9yYWdlKVxyXG4gICAgICAuZmlsdGVyKChxKSA9PiBxLnN0YXJ0c1dpdGgocHJlZml4KSlcclxuICAgICAgLmZpbHRlcigoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucyA9IHtcclxuICAgICAgICAgIGNhY2hlS2V5OiBrZXkucmVwbGFjZShwcmVmaXgsIFwiXCIpLFxyXG4gICAgICAgICAgdXNlck5hbWU6IHVzZXJOYW1lLFxyXG4gICAgICAgICAgcmVxdWVzdDogREVGQVVMVF9DQUNIRV9PUFRJT05TLlJFUVVFU1QsXHJcbiAgICAgICAgICBwcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmc6IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVQQVJFX0RBVEEsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBmaXJzdEZldGNoaW5nRGF0ZSA9IHRoaXMuI2dldEl0ZW0ob3B0aW9ucyk/LmZpcnN0RmV0Y2hpbmdEYXRlO1xyXG4gICAgICAgIGlmICghZmlyc3RGZXRjaGluZ0RhdGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgbW9tZW50RGF0ZTEgPSBtb21lbnQobmV3IERhdGUoZmlyc3RGZXRjaGluZ0RhdGUpKTtcclxuICAgICAgICBjb25zdCBtb21lbnREYXRlMiA9IG1vbWVudChuZXcgRGF0ZSgpKTtcclxuICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gbW9tZW50RGF0ZTIuZGlmZihcclxuICAgICAgICAgIG1vbWVudERhdGUxLFxyXG4gICAgICAgICAgREVGQVVMVF9UVExfQ09ORklHLlVOSVRcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBkaWZmZXJlbmNlID49IERFRkFVTFRfVFRMX0NPTkZJRy5UVEw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIHN0YXJ0RmV0Y2hpbmdJdGVtcyhvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuI3ZhbGlkYXRlVFRMRm9yS2V5KG9wdGlvbnMpO1xyXG5cclxuICAgIGlmICh0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0/LmZldGNoaW5nSXRlbXNGcm9tVGhlU2VydmVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmZXRjaGVkSXRlbXNbXHJcbiAgICAgICAgb3B0aW9ucy5jYWNoZUtleVxyXG4gICAgICBdLm9uRmluaXNoRmV0Y2hpbmcuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy4jaGFuZGxlQ2FjaGVJdGVtcyhvcHRpb25zKTtcclxuICAgIH1cclxuICB9XHJcbiAgI2hhbmRsZUNhY2hlSXRlbXMob3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBsZXQgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gICAgdGhpcy4jcHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkSXRlbSA9IHRoaXMuI2dldEl0ZW0ob3B0aW9ucyk7XHJcblxyXG4gICAgaWYgKGNhY2hlZEl0ZW0pIHtcclxuICAgICAgdGhpcy4jc2V0SXRlbUluTWFwKG9wdGlvbnMuY2FjaGVLZXksIHtcclxuICAgICAgICAuLi5jYWNoZWRJdGVtLFxyXG4gICAgICAgIGZldGNoaW5nSXRlbXNGcm9tVGhlU2VydmVyOiBmYWxzZSxcclxuICAgICAgICBvbkZpbmlzaEZldGNoaW5nOiBuZXcgU3ViamVjdDxDYWNoZUluZm8+KCksXHJcbiAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICBbb3B0aW9ucy5wYWdlS2V5XTogMCxcclxuICAgICAgICBbb3B0aW9ucy5taW5Db21wYXJlRGF0ZUtleV06IHRoaXMuI2FkZDFTZWNvbmRUb01vZGlmaWVkRGF0ZShcclxuICAgICAgICAgIG5ldyBEYXRlKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5sYXN0TW9kaWZpZWREYXRlKVxyXG4gICAgICAgICkudG9JU09TdHJpbmcoKSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgb2JzZXJ2YWJsZSA9IG9wdGlvbnMucmVxdWVzdChwYXJhbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy4jc2V0SXRlbUluTWFwKG9wdGlvbnMuY2FjaGVLZXkpO1xyXG4gICAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucmVxdWVzdCA9IG9wdGlvbnMucmVxdWVzdDtcclxuICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmZpcnN0RmV0Y2hpbmdEYXRlID1cclxuICAgICAgICBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgIG9ic2VydmFibGUgPSBvcHRpb25zLnJlcXVlc3QoeyBbb3B0aW9ucy5wYWdlS2V5XTogMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSB0cnVlO1xyXG4gICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcclxuICAgICAgcmV0cnkoREVGQVVMVF9UVExfQ09ORklHLlJFVFJZKSxcclxuICAgICAgZXhwYW5kKChyZXN1bHRzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgYW5vdGhlckNhbGw6IE9ic2VydmFibGU8YW55PiB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBhbm90aGVyQ2FsbCA9IHRoaXMuI2hhbmRsZUZldGNoZWRJdGVtcyhvcHRpb25zLCByZXN1bHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFub3RoZXJDYWxsID8gYW5vdGhlckNhbGwgOiBFTVBUWTtcclxuICAgICAgfSksXHJcbiAgICAgIGxhc3QoKSxcclxuICAgICAgbWFwKChfKSA9PiB7XHJcbiAgICAgICAgbGV0IF9mZXRjaGVkSXRlbXMgPSB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0gYXMgQ2FjaGVJbmZvO1xyXG4gICAgICAgIF9mZXRjaGVkSXRlbXMuZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoX2ZldGNoZWRJdGVtcy5kYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgIF9mZXRjaGVkSXRlbXMubGFzdE1vZGlmaWVkRGF0ZSA9IHRoaXMuI2ZpbmRMYXJnZXN0RGF0ZShcclxuICAgICAgICAgICAgX2ZldGNoZWRJdGVtcy5kYXRhLFxyXG4gICAgICAgICAgICBvcHRpb25zLmNoaWxkcmVuUGF0aCxcclxuICAgICAgICAgICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuI3NldEl0ZW0oXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBkYXRhOiBfZmV0Y2hlZEl0ZW1zLmRhdGEsXHJcbiAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZTogX2ZldGNoZWRJdGVtcy5sYXN0TW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgIGZpcnN0RmV0Y2hpbmdEYXRlOiBfZmV0Y2hlZEl0ZW1zLmZpcnN0RmV0Y2hpbmdEYXRlLFxyXG4gICAgICAgICAgICAgIHJlc3VsdHNDb3VudDogX2ZldGNoZWRJdGVtc1tvcHRpb25zLnJlc3VsdHNDb3VudF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfZmV0Y2hlZEl0ZW1zO1xyXG4gICAgICB9KSxcclxuICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBfY2xvbmVEZWVwKHtcclxuICAgICAgICAgIFtvcHRpb25zLm1hcHBlZERhdGFLZXldOiByZXMuZGF0YSxcclxuICAgICAgICAgIFtvcHRpb25zLmxhc3RNb2RpZmllZERhdGVLZXldOiByZXMubGFzdE1vZGlmaWVkRGF0ZSxcclxuICAgICAgICAgIFtvcHRpb25zLnJlc3VsdHNDb3VudF06IHJlc1tvcHRpb25zLnJlc3VsdHNDb3VudF0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVzLm9uRmluaXNoRmV0Y2hpbmcubmV4dChyZXN1bHQpO1xyXG4gICAgICAgIHJlcy5vbkZpbmlzaEZldGNoaW5nLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gICNmaW5kTm9kZShcclxuICAgIGl0ZW1zOiBhbnlbXSxcclxuICAgIHVuaXF1ZUNvbXBhcmVLZXk6IHN0cmluZyxcclxuICAgIGNoaWxkcmVuUGF0aDogc3RyaW5nLFxyXG4gICAgdmFsdWU6IGFueVxyXG4gICkge1xyXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmIChub2RlW3VuaXF1ZUNvbXBhcmVLZXldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShub2RlLCBjaGlsZHJlblBhdGgpO1xyXG4gICAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNmaW5kTm9kZShcclxuICAgICAgICAgIGNoaWxkcmVuLFxyXG4gICAgICAgICAgdW5pcXVlQ29tcGFyZUtleSxcclxuICAgICAgICAgIGNoaWxkcmVuUGF0aCxcclxuICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gICNmaW5kTGFyZ2VzdERhdGUoXHJcbiAgICBub2RlTGlzdDogYW55W10sXHJcbiAgICBjaGlsZHJlblBhdGg6IHN0cmluZyxcclxuICAgIGRhdGVQYXRoOiBzdHJpbmdcclxuICApOiBzdHJpbmcge1xyXG4gICAgbGV0IGxhcmdlc3REYXRlOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUobm9kZSwgY2hpbGRyZW5QYXRoKTtcclxuICAgICAgY29uc3Qgbm9kZURhdGUgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKG5vZGUsIGRhdGVQYXRoKTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIG5vZGVEYXRlICYmXHJcbiAgICAgICAgKCFsYXJnZXN0RGF0ZSB8fCBuZXcgRGF0ZShub2RlRGF0ZSkgPiBuZXcgRGF0ZShsYXJnZXN0RGF0ZSkpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxhcmdlc3REYXRlID0gbm9kZURhdGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoaWxkcmVuPy5sZW5ndGgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICB0cmF2ZXJzZShjaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgbm9kZUxpc3QuZm9yRWFjaCgobm9kZSkgPT4gdHJhdmVyc2Uobm9kZSkpO1xyXG4gICAgcmV0dXJuIGxhcmdlc3REYXRlO1xyXG4gIH1cclxuICAjaGFuZGxlRmV0Y2hlZEl0ZW1zKFxyXG4gICAgb3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucyxcclxuICAgIHJlczogYW55XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGE/Lmxlbmd0aCkge1xyXG4gICAgICByZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKFxyXG4gICAgICAgICAgYSxcclxuICAgICAgICAgIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGhcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHNlY29uZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoXHJcbiAgICAgICAgICBiLFxyXG4gICAgICAgICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGZpcnN0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzZWNvbmQpLmdldFRpbWUoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy4jZmluZE5vZGUoXHJcbiAgICAgICAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZGF0YSxcclxuICAgICAgICAgIG9wdGlvbnMudW5pcXVlQ29tcGFyZUtleSxcclxuICAgICAgICAgIG9wdGlvbnMuY2hpbGRyZW5QYXRoLFxyXG4gICAgICAgICAgZWxlbWVudFtvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXldXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWFwcGVkRWxlbWVudCA9IG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKFtlbGVtZW50XSlbMF07XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgIC8vIGVkaXQgOiB1cGRhdGUgaXRlbSBpbiBjYWNoZVxyXG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRTb3VyY2UgPSBfb21pdChcclxuICAgICAgICAgICAgbWFwcGVkRWxlbWVudCxcclxuICAgICAgICAgICAgb3B0aW9ucy5leGNsdWRlS2V5c1doZW5VcGRhdGVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBfYXNzaWduKGl0ZW0sIGZpbHRlcmVkU291cmNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gYWRkIDogY2hlY2sgZGF0ZSB0byBkZXRlcm1pbmUgd2hlcmUgd2lsbCBpbnNlcnRcclxuXHJcbiAgICAgICAgICAvLyBpZiBpdGVtIHBhcmVudCBub3QgZm91bmQgYWRkIGFzIHJvb3QgZWxzZSB3aWxsIGFkZCBsZWF2ZXMgdG8gc3ViUGFyZW50XHJcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy4jZmluZE5vZGUoXHJcbiAgICAgICAgICAgIHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5kYXRhLFxyXG4gICAgICAgICAgICBvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXksXHJcbiAgICAgICAgICAgIG9wdGlvbnMuY2hpbGRyZW5QYXRoLFxyXG4gICAgICAgICAgICBlbGVtZW50W29wdGlvbnMucGFyZW50S2V5XVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICAvLyB3aWxsIGNvbXBhcmUgd2l0aCBub2RlIGNoaWxkIHRvIGFkZFxyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgbm9kZSxcclxuICAgICAgICAgICAgICBvcHRpb25zLmNoaWxkcmVuUGF0aFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLiNhZGRJdGVtc1RvKG9wdGlvbnMsIGNoaWxkcmVuLCBlbGVtZW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHdpbGwgY29tcGFyZSB3aXRoIHJvb3QgbGV2ZWwgdG8gYWRkXHJcbiAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1zVG8oXHJcbiAgICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZGF0YSxcclxuICAgICAgICAgICAgICBlbGVtZW50XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldID0gb3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcoXHJcbiAgICAgICAgcmVzW29wdGlvbnMubWFwcGVkRGF0YUtleV1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGEgPSByZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XTtcclxuICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnJlc3VsdHNDb3VudCA9XHJcbiAgICAgICAgcmVzW29wdGlvbnMucmVzdWx0c0NvdW50XTtcclxuICAgIH1cclxuICAgIGlmIChyZXNbb3B0aW9ucy50b3RhbFBhZ2VLZXldIC0gcmVzW29wdGlvbnMucGFnZUtleV0gPiAxKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucmVxdWVzdCh7XHJcbiAgICAgICAgLi4uKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5wYXJhbXMgfHwge30pLFxyXG4gICAgICAgIFtvcHRpb25zLnBhZ2VLZXldOiByZXNbb3B0aW9ucy5wYWdlS2V5XSArIDEsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gICNhZGRJdGVtc1RvKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMsIGRhdGE6IGFueVtdLCBpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IGZpcnN0Q2FjaGVkTW9kaWZpZWQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKFxyXG4gICAgICBkYXRhWzBdLFxyXG4gICAgICBvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoXHJcbiAgICApO1xyXG4gICAgY29uc3QgY3VycmVudE1vZGlmaWVkID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShcclxuICAgICAgaXRlbSxcclxuICAgICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG4gICAgKTtcclxuICAgIGlmIChmaXJzdENhY2hlZE1vZGlmaWVkIDwgY3VycmVudE1vZGlmaWVkKSB7XHJcbiAgICAgIGRhdGEudW5zaGlmdCguLi5vcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyhbaXRlbV0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGEucHVzaCguLi5vcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyhbaXRlbV0pKTtcclxuICAgIH1cclxuICB9XHJcbiAgI3ByZXBhcmVPcHRpb25zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuICAgIG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nID1cclxuICAgICAgb3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRVBBUkVfREFUQTtcclxuICAgIG9wdGlvbnMucGFnZUtleSA9IG9wdGlvbnMucGFnZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuUEFHRV9LRVk7XHJcbiAgICBvcHRpb25zLnRvdGFsUGFnZUtleSA9XHJcbiAgICAgIG9wdGlvbnMudG90YWxQYWdlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5UT1RBTF9QQUdFX0tFWTtcclxuICAgIG9wdGlvbnMucmVzdWx0c0NvdW50ID1cclxuICAgICAgb3B0aW9ucy5yZXN1bHRzQ291bnQgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlJFU1VMVFNfQ09VTlRfS0VZO1xyXG4gICAgb3B0aW9ucy5tYXBwZWREYXRhS2V5ID1cclxuICAgICAgb3B0aW9ucy5tYXBwZWREYXRhS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5NQVBQRURfREFUQV9LRVk7XHJcbiAgICBvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXkgPVxyXG4gICAgICBvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlVOSVFVRV9DT01QQVJFX0tFWTtcclxuICAgIG9wdGlvbnMubWluQ29tcGFyZURhdGVLZXkgPVxyXG4gICAgICBvcHRpb25zLm1pbkNvbXBhcmVEYXRlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5NSU5fQ09NUEFSRV9EQVRFX0tFWTtcclxuICAgIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZUtleSA9XHJcbiAgICAgIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuTEFTVF9NT0RJRklFRF9LRVk7XHJcbiAgICBvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoID1cclxuICAgICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aCB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuTEFTVF9NT0RJRklFRF9QQVRIO1xyXG4gICAgb3B0aW9ucy5leGNsdWRlS2V5c1doZW5VcGRhdGUgPVxyXG4gICAgICBvcHRpb25zLmV4Y2x1ZGVLZXlzV2hlblVwZGF0ZSB8fFxyXG4gICAgICBERUZBVUxUX0NBQ0hFX09QVElPTlMuRVhDTFVERV9LRVlTX1dIRU5fVVBEQVRFO1xyXG4gICAgb3B0aW9ucy5jaGlsZHJlblBhdGggPVxyXG4gICAgICBvcHRpb25zLmNoaWxkcmVuUGF0aCB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuQ0hJTERSRU5fUEFUSDtcclxuICAgIG9wdGlvbnMucGFyZW50S2V5ID0gb3B0aW9ucy5wYXJlbnRLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlBBUkVOVF9LRVk7XHJcbiAgfVxyXG4gICNwcmVwYXJlQ29uZmlnKCkge1xyXG4gICAgREVGQVVMVF9UVExfQ09ORklHLlRUTCA9XHJcbiAgICAgIEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy50dGwgfHwgREVGQVVMVF9UVExfQ09ORklHLlRUTDtcclxuICAgIERFRkFVTFRfVFRMX0NPTkZJRy5VTklUID1cclxuICAgICAgRW52TWFuYWdlci5lbnZpcm9ubWVudD8uY2FjaGU/LnR0bFVuaXQgfHwgREVGQVVMVF9UVExfQ09ORklHLlVOSVQ7XHJcbiAgICBERUZBVUxUX1RUTF9DT05GSUcuQVVUT19DSEVDSyA9XHJcbiAgICAgIEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy5hdXRvQ2hlY2sgPT0gXCJZRVNcIjtcclxuICAgIERFRkFVTFRfVFRMX0NPTkZJRy5SRVRSWSA9XHJcbiAgICAgIEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy5yZXRyeSB8fCBERUZBVUxUX1RUTF9DT05GSUcuUkVUUlk7XHJcbiAgfVxyXG4gICNhZGQxU2Vjb25kVG9Nb2RpZmllZERhdGUoZGF0ZTogRGF0ZSk6IERhdGUge1xyXG4gICAgbGV0IG5ld0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7XHJcbiAgICBuZXdEYXRlLnNldFNlY29uZHMobmV3RGF0ZS5nZXRTZWNvbmRzKCkgKyAxKTtcclxuICAgIHJldHVybiBuZXdEYXRlO1xyXG4gIH1cclxuICAjY2xlYXIodXNlck5hbWU6IHN0cmluZywga2V5T3JBbGw6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgIE9iamVjdC5rZXlzKHdpbmRvdy5sb2NhbFN0b3JhZ2UpXHJcbiAgICAgIC5maWx0ZXIoKHEpID0+XHJcbiAgICAgICAgcS5zdGFydHNXaXRoKGAke3VzZXJOYW1lfV9fJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7a2V5T3JBbGx9YClcclxuICAgICAgKVxyXG4gICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAjdmFsaWRhdGVUVExGb3JLZXkob3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucykge1xyXG4gICAgY29uc3QgZmlyc3RGZXRjaGluZ0RhdGUgPSB0aGlzLiNnZXRJdGVtKG9wdGlvbnMpPy5maXJzdEZldGNoaW5nRGF0ZTtcclxuXHJcbiAgICBpZiAoIWZpcnN0RmV0Y2hpbmdEYXRlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbW9tZW50RGF0ZTEgPSBtb21lbnQobmV3IERhdGUoZmlyc3RGZXRjaGluZ0RhdGUpKTtcclxuICAgIGNvbnN0IG1vbWVudERhdGUyID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG5cclxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBtb21lbnREYXRlMi5kaWZmKG1vbWVudERhdGUxLCBERUZBVUxUX1RUTF9DT05GSUcuVU5JVCk7XHJcblxyXG4gICAgaWYgKGRpZmZlcmVuY2UgPj0gREVGQVVMVF9UVExfQ09ORklHLlRUTClcclxuICAgICAgdGhpcy4jY2xlYXIob3B0aW9ucy51c2VyTmFtZSwgb3B0aW9ucy5jYWNoZUtleSk7XHJcbiAgfVxyXG4gICNzZXRJdGVtSW5NYXAoa2V5OiBzdHJpbmcsIHZhbD86IENhY2hlSW5mbyk6IHZvaWQge1xyXG4gICAgY29uc3QgZW1wdHk6IENhY2hlSW5mbyA9IHtcclxuICAgICAgZGF0YTogW10sXHJcbiAgICAgIGZpcnN0RmV0Y2hpbmdEYXRlOiBcIlwiLFxyXG4gICAgICBsYXN0TW9kaWZpZWREYXRlOiBcIlwiLFxyXG4gICAgICByZXN1bHRzQ291bnQ6IDAsXHJcbiAgICAgIGZldGNoaW5nSXRlbXNGcm9tVGhlU2VydmVyOiBmYWxzZSxcclxuICAgICAgb25GaW5pc2hGZXRjaGluZzogbmV3IFN1YmplY3Q8Q2FjaGVJbmZvPigpLFxyXG4gICAgfTtcclxuICAgIGxldCB2YWx1ZTogQ2FjaGVJbmZvID0gdmFsID8gdmFsIDogZW1wdHk7XHJcbiAgICB0aGlzLiNmZXRjaGVkSXRlbXNba2V5XSA9IHZhbHVlO1xyXG4gIH1cclxuICAjZ2V0SXRlbShvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKSB7XHJcbiAgICBsZXQgZGF0YTogQ2FjaGVJbmZvO1xyXG4gICAgaWYgKG9wdGlvbnMuaW5NZW1vcnkpIHtcclxuICAgICAgZGF0YSA9IHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChcclxuICAgICAgICBgJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7b3B0aW9ucy5jYWNoZUtleX1gXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICghdmFsdWUpIHJldHVybjtcclxuICAgICAgZGF0YSA9IEpTT04ucGFyc2UodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG4gICNzZXRJdGVtKHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKSB7XHJcbiAgICBpZiAob3B0aW9ucy5pbk1lbW9yeSkgcmV0dXJuO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5zZXQoXHJcbiAgICAgICAgYCR7REVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRUZJWH0ke29wdGlvbnMuY2FjaGVLZXl9YCxcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
@@ -2586,10 +2586,10 @@ class CacheBaseService {
|
|
|
2586
2586
|
.filter((key) => {
|
|
2587
2587
|
var _a;
|
|
2588
2588
|
const options = {
|
|
2589
|
-
cacheKey: key.replace(prefix,
|
|
2589
|
+
cacheKey: key.replace(prefix, ""),
|
|
2590
2590
|
userName: userName,
|
|
2591
2591
|
request: DEFAULT_CACHE_OPTIONS.REQUEST,
|
|
2592
|
-
prepareDataBeforeCaching: DEFAULT_CACHE_OPTIONS.PREPARE_DATA
|
|
2592
|
+
prepareDataBeforeCaching: DEFAULT_CACHE_OPTIONS.PREPARE_DATA,
|
|
2593
2593
|
};
|
|
2594
2594
|
const firstFetchingDate = (_a = __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_getItem).call(this, options)) === null || _a === void 0 ? void 0 : _a.firstFetchingDate;
|
|
2595
2595
|
if (!firstFetchingDate)
|
|
@@ -2622,7 +2622,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2622
2622
|
__classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_setItemInMap).call(this, options.cacheKey, Object.assign(Object.assign({}, cachedItem), { fetchingItemsFromTheServer: false, onFinishFetching: new Subject(), request: options.request }));
|
|
2623
2623
|
const params = {
|
|
2624
2624
|
[options.pageKey]: 0,
|
|
2625
|
-
[options.minCompareDateKey]: __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_add1SecondToModifiedDate).call(this, new Date(__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].lastModifiedDate)).toISOString()
|
|
2625
|
+
[options.minCompareDateKey]: __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_add1SecondToModifiedDate).call(this, new Date(__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].lastModifiedDate)).toISOString(),
|
|
2626
2626
|
};
|
|
2627
2627
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].params = params;
|
|
2628
2628
|
observable = options.request(params);
|
|
@@ -2652,7 +2652,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2652
2652
|
data: _fetchedItems.data,
|
|
2653
2653
|
lastModifiedDate: _fetchedItems.lastModifiedDate,
|
|
2654
2654
|
firstFetchingDate: _fetchedItems.firstFetchingDate,
|
|
2655
|
-
resultsCount: _fetchedItems[options.resultsCount]
|
|
2655
|
+
resultsCount: _fetchedItems[options.resultsCount],
|
|
2656
2656
|
}, options);
|
|
2657
2657
|
}
|
|
2658
2658
|
return _fetchedItems;
|
|
@@ -2660,9 +2660,10 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2660
2660
|
const result = _cloneDeep({
|
|
2661
2661
|
[options.mappedDataKey]: res.data,
|
|
2662
2662
|
[options.lastModifiedDateKey]: res.lastModifiedDate,
|
|
2663
|
-
[options.resultsCount]: res[options.resultsCount]
|
|
2663
|
+
[options.resultsCount]: res[options.resultsCount],
|
|
2664
2664
|
});
|
|
2665
2665
|
res.onFinishFetching.next(result);
|
|
2666
|
+
res.onFinishFetching.complete();
|
|
2666
2667
|
return result;
|
|
2667
2668
|
}));
|
|
2668
2669
|
}, _CacheBaseService_findNode = function _CacheBaseService_findNode(items, uniqueCompareKey, childrenPath, value) {
|
|
@@ -2686,7 +2687,8 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2686
2687
|
return;
|
|
2687
2688
|
const children = this.utilityService.getValue(node, childrenPath);
|
|
2688
2689
|
const nodeDate = this.utilityService.getValue(node, datePath);
|
|
2689
|
-
if (nodeDate &&
|
|
2690
|
+
if (nodeDate &&
|
|
2691
|
+
(!largestDate || new Date(nodeDate) > new Date(largestDate))) {
|
|
2690
2692
|
largestDate = nodeDate;
|
|
2691
2693
|
}
|
|
2692
2694
|
if (children === null || children === void 0 ? void 0 : children.length) {
|
|
@@ -2781,14 +2783,14 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2781
2783
|
DEFAULT_TTL_CONFIG.UNIT =
|
|
2782
2784
|
((_d = (_c = EnvManager.environment) === null || _c === void 0 ? void 0 : _c.cache) === null || _d === void 0 ? void 0 : _d.ttlUnit) || DEFAULT_TTL_CONFIG.UNIT;
|
|
2783
2785
|
DEFAULT_TTL_CONFIG.AUTO_CHECK =
|
|
2784
|
-
((_f = (_e = EnvManager.environment) === null || _e === void 0 ? void 0 : _e.cache) === null || _f === void 0 ? void 0 : _f.autoCheck) ==
|
|
2786
|
+
((_f = (_e = EnvManager.environment) === null || _e === void 0 ? void 0 : _e.cache) === null || _f === void 0 ? void 0 : _f.autoCheck) == "YES";
|
|
2785
2787
|
DEFAULT_TTL_CONFIG.RETRY =
|
|
2786
2788
|
((_h = (_g = EnvManager.environment) === null || _g === void 0 ? void 0 : _g.cache) === null || _h === void 0 ? void 0 : _h.retry) || DEFAULT_TTL_CONFIG.RETRY;
|
|
2787
2789
|
}, _CacheBaseService_add1SecondToModifiedDate = function _CacheBaseService_add1SecondToModifiedDate(date) {
|
|
2788
2790
|
let newDate = new Date(date.getTime());
|
|
2789
2791
|
newDate.setSeconds(newDate.getSeconds() + 1);
|
|
2790
2792
|
return newDate;
|
|
2791
|
-
}, _CacheBaseService_clear = function _CacheBaseService_clear(userName, keyOrAll =
|
|
2793
|
+
}, _CacheBaseService_clear = function _CacheBaseService_clear(userName, keyOrAll = "") {
|
|
2792
2794
|
Object.keys(window.localStorage)
|
|
2793
2795
|
.filter((q) => q.startsWith(`${userName}__${DEFAULT_CACHE_OPTIONS.PREFIX}${keyOrAll}`))
|
|
2794
2796
|
.forEach((key) => {
|
|
@@ -2807,11 +2809,11 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2807
2809
|
}, _CacheBaseService_setItemInMap = function _CacheBaseService_setItemInMap(key, val) {
|
|
2808
2810
|
const empty = {
|
|
2809
2811
|
data: [],
|
|
2810
|
-
firstFetchingDate:
|
|
2811
|
-
lastModifiedDate:
|
|
2812
|
+
firstFetchingDate: "",
|
|
2813
|
+
lastModifiedDate: "",
|
|
2812
2814
|
resultsCount: 0,
|
|
2813
2815
|
fetchingItemsFromTheServer: false,
|
|
2814
|
-
onFinishFetching: new Subject()
|
|
2816
|
+
onFinishFetching: new Subject(),
|
|
2815
2817
|
};
|
|
2816
2818
|
let value = val ? val : empty;
|
|
2817
2819
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[key] = value;
|
|
@@ -2835,11 +2837,11 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
2835
2837
|
}
|
|
2836
2838
|
};
|
|
2837
2839
|
CacheBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, deps: [{ token: UserPreferencesService }, { token: UtilityService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2838
|
-
CacheBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, providedIn:
|
|
2840
|
+
CacheBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, providedIn: "root" });
|
|
2839
2841
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, decorators: [{
|
|
2840
2842
|
type: Injectable,
|
|
2841
2843
|
args: [{
|
|
2842
|
-
providedIn:
|
|
2844
|
+
providedIn: "root",
|
|
2843
2845
|
}]
|
|
2844
2846
|
}], ctorParameters: function () { return [{ type: UserPreferencesService }, { type: UtilityService }]; } });
|
|
2845
2847
|
|