nuxeo-development-framework 4.5.1 → 4.5.2
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 +224 -217
- package/bundles/nuxeo-development-framework.umd.js.map +1 -1
- package/esm2015/lib/core/core.module.js +21 -4
- package/esm2015/lib/core/services/user/user-preferences.service.js +23 -23
- package/esm2015/lib/nuxeo-development-framework.module.js +9 -10
- package/esm2015/lib/shared/components/nuxeo-dialog/nuxeo.dialog.js +5 -2
- package/esm2015/lib/shared/services/base/base.service.js +4 -1
- package/esm2015/lib/shared/services/base/cache-base.service.js +48 -64
- package/fesm2015/nuxeo-development-framework.js +87 -80
- package/fesm2015/nuxeo-development-framework.js.map +1 -1
- package/lib/core/core.module.d.ts +1 -1
- package/lib/core/services/user/user-preferences.service.d.ts +6 -6
- package/lib/nuxeo-development-framework.module.d.ts +2 -3
- package/lib/shared/components/nuxeo-dialog/nuxeo.dialog.d.ts +2 -1
- package/lib/shared/services/base/base.service.d.ts +1 -0
- package/lib/shared/services/base/cache-base.service.d.ts +5 -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 { catchError, expand, last, map, retry, take } 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 { catchError, expand, last, map, retry, take } 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)
|
|
@@ -64,6 +64,14 @@ export class CacheBaseService {
|
|
|
64
64
|
return __classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].onFinishFetching.asObservable();
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
+
validateTTLForKey(firstFetchingDate) {
|
|
68
|
+
if (!firstFetchingDate)
|
|
69
|
+
return;
|
|
70
|
+
const momentDate1 = moment(new Date(firstFetchingDate));
|
|
71
|
+
const momentDate2 = moment(new Date());
|
|
72
|
+
const difference = momentDate2.diff(momentDate1, DEFAULT_TTL_CONFIG.UNIT);
|
|
73
|
+
return difference >= DEFAULT_TTL_CONFIG.TTL;
|
|
74
|
+
}
|
|
67
75
|
}
|
|
68
76
|
_CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = new WeakSet(), _CacheBaseService_handleCacheItems = function _CacheBaseService_handleCacheItems(options) {
|
|
69
77
|
let observable;
|
|
@@ -73,7 +81,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
73
81
|
__classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_setItemInMap).call(this, options.cacheKey, Object.assign(Object.assign({}, cachedItem), { fetchingItemsFromTheServer: false, onFinishFetching: new Subject(), request: options.request }));
|
|
74
82
|
const params = {
|
|
75
83
|
[options.pageKey]: 0,
|
|
76
|
-
[options.minCompareDateKey]: __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_add1SecondToModifiedDate).call(this, new Date(__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].lastModifiedDate)).toISOString()
|
|
84
|
+
[options.minCompareDateKey]: __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_add1SecondToModifiedDate).call(this, new Date(__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].lastModifiedDate)).toISOString()
|
|
77
85
|
};
|
|
78
86
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].params = params;
|
|
79
87
|
observable = options.request(params);
|
|
@@ -81,8 +89,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
81
89
|
else {
|
|
82
90
|
__classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_setItemInMap).call(this, options.cacheKey);
|
|
83
91
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].request = options.request;
|
|
84
|
-
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].firstFetchingDate =
|
|
85
|
-
new Date().toISOString();
|
|
92
|
+
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].firstFetchingDate = new Date().toISOString();
|
|
86
93
|
observable = options.request({ [options.pageKey]: 0 });
|
|
87
94
|
}
|
|
88
95
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].fetchingItemsFromTheServer = true;
|
|
@@ -103,7 +110,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
103
110
|
data: _fetchedItems.data,
|
|
104
111
|
lastModifiedDate: _fetchedItems.lastModifiedDate,
|
|
105
112
|
firstFetchingDate: _fetchedItems.firstFetchingDate,
|
|
106
|
-
resultsCount: _fetchedItems[options.resultsCount]
|
|
113
|
+
resultsCount: _fetchedItems[options.resultsCount]
|
|
107
114
|
}, options);
|
|
108
115
|
}
|
|
109
116
|
return _fetchedItems;
|
|
@@ -111,7 +118,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
111
118
|
const result = _cloneDeep({
|
|
112
119
|
[options.mappedDataKey]: res.data,
|
|
113
120
|
[options.lastModifiedDateKey]: res.lastModifiedDate,
|
|
114
|
-
[options.resultsCount]: res[options.resultsCount]
|
|
121
|
+
[options.resultsCount]: res[options.resultsCount]
|
|
115
122
|
});
|
|
116
123
|
res.onFinishFetching.next(result);
|
|
117
124
|
res.onFinishFetching.complete();
|
|
@@ -140,8 +147,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
140
147
|
return;
|
|
141
148
|
const children = this.utilityService.getValue(node, childrenPath);
|
|
142
149
|
const nodeDate = this.utilityService.getValue(node, datePath);
|
|
143
|
-
if (nodeDate &&
|
|
144
|
-
(!largestDate || new Date(nodeDate) > new Date(largestDate))) {
|
|
150
|
+
if (nodeDate && (!largestDate || new Date(nodeDate) > new Date(largestDate))) {
|
|
145
151
|
largestDate = nodeDate;
|
|
146
152
|
}
|
|
147
153
|
if (children === null || children === void 0 ? void 0 : children.length) {
|
|
@@ -187,8 +193,7 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
187
193
|
else {
|
|
188
194
|
res[options.mappedDataKey] = options.prepareDataBeforeCaching(res[options.mappedDataKey]);
|
|
189
195
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].data = res[options.mappedDataKey];
|
|
190
|
-
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].resultsCount =
|
|
191
|
-
res[options.resultsCount];
|
|
196
|
+
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].resultsCount = res[options.resultsCount];
|
|
192
197
|
}
|
|
193
198
|
if (res[options.totalPageKey] - res[options.pageKey] > 1) {
|
|
194
199
|
return __classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].request(Object.assign(Object.assign({}, (__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[options.cacheKey].params || {})), { [options.pageKey]: res[options.pageKey] + 1 }));
|
|
@@ -206,44 +211,29 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
206
211
|
data.push(...options.prepareDataBeforeCaching([item]));
|
|
207
212
|
}
|
|
208
213
|
}, _CacheBaseService_prepareOptions = function _CacheBaseService_prepareOptions(options) {
|
|
209
|
-
options.prepareDataBeforeCaching =
|
|
210
|
-
options.prepareDataBeforeCaching || DEFAULT_CACHE_OPTIONS.PREPARE_DATA;
|
|
214
|
+
options.prepareDataBeforeCaching = options.prepareDataBeforeCaching || DEFAULT_CACHE_OPTIONS.PREPARE_DATA;
|
|
211
215
|
options.pageKey = options.pageKey || DEFAULT_CACHE_OPTIONS.PAGE_KEY;
|
|
212
|
-
options.totalPageKey =
|
|
213
|
-
|
|
214
|
-
options.
|
|
215
|
-
|
|
216
|
-
options.
|
|
217
|
-
|
|
218
|
-
options.
|
|
219
|
-
|
|
220
|
-
options.
|
|
221
|
-
options.minCompareDateKey || DEFAULT_CACHE_OPTIONS.MIN_COMPARE_DATE_KEY;
|
|
222
|
-
options.lastModifiedDateKey =
|
|
223
|
-
options.lastModifiedDateKey || DEFAULT_CACHE_OPTIONS.LAST_MODIFIED_KEY;
|
|
224
|
-
options.lastModifiedDatePath =
|
|
225
|
-
options.lastModifiedDatePath || DEFAULT_CACHE_OPTIONS.LAST_MODIFIED_PATH;
|
|
226
|
-
options.excludeKeysWhenUpdate =
|
|
227
|
-
options.excludeKeysWhenUpdate ||
|
|
228
|
-
DEFAULT_CACHE_OPTIONS.EXCLUDE_KEYS_WHEN_UPDATE;
|
|
229
|
-
options.childrenPath =
|
|
230
|
-
options.childrenPath || DEFAULT_CACHE_OPTIONS.CHILDREN_PATH;
|
|
216
|
+
options.totalPageKey = options.totalPageKey || DEFAULT_CACHE_OPTIONS.TOTAL_PAGE_KEY;
|
|
217
|
+
options.resultsCount = options.resultsCount || DEFAULT_CACHE_OPTIONS.RESULTS_COUNT_KEY;
|
|
218
|
+
options.mappedDataKey = options.mappedDataKey || DEFAULT_CACHE_OPTIONS.MAPPED_DATA_KEY;
|
|
219
|
+
options.uniqueCompareKey = options.uniqueCompareKey || DEFAULT_CACHE_OPTIONS.UNIQUE_COMPARE_KEY;
|
|
220
|
+
options.minCompareDateKey = options.minCompareDateKey || DEFAULT_CACHE_OPTIONS.MIN_COMPARE_DATE_KEY;
|
|
221
|
+
options.lastModifiedDateKey = options.lastModifiedDateKey || DEFAULT_CACHE_OPTIONS.LAST_MODIFIED_KEY;
|
|
222
|
+
options.lastModifiedDatePath = options.lastModifiedDatePath || DEFAULT_CACHE_OPTIONS.LAST_MODIFIED_PATH;
|
|
223
|
+
options.excludeKeysWhenUpdate = options.excludeKeysWhenUpdate || DEFAULT_CACHE_OPTIONS.EXCLUDE_KEYS_WHEN_UPDATE;
|
|
224
|
+
options.childrenPath = options.childrenPath || DEFAULT_CACHE_OPTIONS.CHILDREN_PATH;
|
|
231
225
|
options.parentKey = options.parentKey || DEFAULT_CACHE_OPTIONS.PARENT_KEY;
|
|
232
226
|
}, _CacheBaseService_prepareConfig = function _CacheBaseService_prepareConfig() {
|
|
233
227
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
234
|
-
DEFAULT_TTL_CONFIG.TTL =
|
|
235
|
-
|
|
236
|
-
DEFAULT_TTL_CONFIG.
|
|
237
|
-
|
|
238
|
-
DEFAULT_TTL_CONFIG.AUTO_CHECK =
|
|
239
|
-
((_f = (_e = EnvManager.environment) === null || _e === void 0 ? void 0 : _e.cache) === null || _f === void 0 ? void 0 : _f.autoCheck) == "YES";
|
|
240
|
-
DEFAULT_TTL_CONFIG.RETRY =
|
|
241
|
-
((_h = (_g = EnvManager.environment) === null || _g === void 0 ? void 0 : _g.cache) === null || _h === void 0 ? void 0 : _h.retry) || DEFAULT_TTL_CONFIG.RETRY;
|
|
228
|
+
DEFAULT_TTL_CONFIG.TTL = ((_b = (_a = EnvManager.environment) === null || _a === void 0 ? void 0 : _a.cache) === null || _b === void 0 ? void 0 : _b.ttl) || DEFAULT_TTL_CONFIG.TTL;
|
|
229
|
+
DEFAULT_TTL_CONFIG.UNIT = ((_d = (_c = EnvManager.environment) === null || _c === void 0 ? void 0 : _c.cache) === null || _d === void 0 ? void 0 : _d.ttlUnit) || DEFAULT_TTL_CONFIG.UNIT;
|
|
230
|
+
DEFAULT_TTL_CONFIG.AUTO_CHECK = ((_f = (_e = EnvManager.environment) === null || _e === void 0 ? void 0 : _e.cache) === null || _f === void 0 ? void 0 : _f.autoCheck) == 'YES';
|
|
231
|
+
DEFAULT_TTL_CONFIG.RETRY = ((_h = (_g = EnvManager.environment) === null || _g === void 0 ? void 0 : _g.cache) === null || _h === void 0 ? void 0 : _h.retry) || DEFAULT_TTL_CONFIG.RETRY;
|
|
242
232
|
}, _CacheBaseService_add1SecondToModifiedDate = function _CacheBaseService_add1SecondToModifiedDate(date) {
|
|
243
233
|
let newDate = new Date(date.getTime());
|
|
244
234
|
newDate.setSeconds(newDate.getSeconds() + 1);
|
|
245
235
|
return newDate;
|
|
246
|
-
}, _CacheBaseService_clear = function _CacheBaseService_clear(userName, keyOrAll =
|
|
236
|
+
}, _CacheBaseService_clear = function _CacheBaseService_clear(userName, keyOrAll = '') {
|
|
247
237
|
Object.keys(window.localStorage)
|
|
248
238
|
.filter((q) => q.startsWith(`${userName}__${DEFAULT_CACHE_OPTIONS.PREFIX}${keyOrAll}`))
|
|
249
239
|
.forEach((key) => {
|
|
@@ -251,22 +241,16 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
251
241
|
});
|
|
252
242
|
}, _CacheBaseService_validateTTLForKey = function _CacheBaseService_validateTTLForKey(options) {
|
|
253
243
|
var _a;
|
|
254
|
-
|
|
255
|
-
if (!firstFetchingDate)
|
|
256
|
-
return;
|
|
257
|
-
const momentDate1 = moment(new Date(firstFetchingDate));
|
|
258
|
-
const momentDate2 = moment(new Date());
|
|
259
|
-
const difference = momentDate2.diff(momentDate1, DEFAULT_TTL_CONFIG.UNIT);
|
|
260
|
-
if (difference >= DEFAULT_TTL_CONFIG.TTL)
|
|
244
|
+
if (this.validateTTLForKey((_a = __classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_getItem).call(this, options)) === null || _a === void 0 ? void 0 : _a.firstFetchingDate))
|
|
261
245
|
__classPrivateFieldGet(this, _CacheBaseService_instances, "m", _CacheBaseService_clear).call(this, options.userName, options.cacheKey);
|
|
262
246
|
}, _CacheBaseService_setItemInMap = function _CacheBaseService_setItemInMap(key, val) {
|
|
263
247
|
const empty = {
|
|
264
248
|
data: [],
|
|
265
|
-
firstFetchingDate:
|
|
266
|
-
lastModifiedDate:
|
|
249
|
+
firstFetchingDate: '',
|
|
250
|
+
lastModifiedDate: '',
|
|
267
251
|
resultsCount: 0,
|
|
268
252
|
fetchingItemsFromTheServer: false,
|
|
269
|
-
onFinishFetching: new Subject()
|
|
253
|
+
onFinishFetching: new Subject()
|
|
270
254
|
};
|
|
271
255
|
let value = val ? val : empty;
|
|
272
256
|
__classPrivateFieldGet(this, _CacheBaseService_fetchedItems, "f")[key] = value;
|
|
@@ -290,11 +274,11 @@ _CacheBaseService_fetchedItems = new WeakMap(), _CacheBaseService_instances = ne
|
|
|
290
274
|
}
|
|
291
275
|
};
|
|
292
276
|
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 });
|
|
293
|
-
CacheBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, providedIn:
|
|
277
|
+
CacheBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, providedIn: 'root' });
|
|
294
278
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: CacheBaseService, decorators: [{
|
|
295
279
|
type: Injectable,
|
|
296
280
|
args: [{
|
|
297
|
-
providedIn:
|
|
281
|
+
providedIn: 'root'
|
|
298
282
|
}]
|
|
299
283
|
}], ctorParameters: function () { return [{ type: i1.UserPreferencesService }, { type: i2.UtilityService }]; } });
|
|
300
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Jhc2UvY2FjaGUtYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFrQixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQUszRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRzNCLFlBQ1Usc0JBQThDLEVBQzlDLGNBQThCO1FBRDlCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCOztRQUp4Qyx5Q0FBd0MsSUFBSSxHQUFHLEVBQXFCLEVBQUM7UUFNbkUsdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLENBQWlCLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUFnQjtRQUN0QixPQUFPLElBQUksQ0FB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QUMsc0JBQXNCLENBQUMsR0FBRyxDQUMzQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQ3JELENBQUM7UUFDRixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUI7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsaUVBQ1EsS0FBMEIsRUFBRSxPQUF5QjtJQUM1RCxJQUFJLE9BQU8sQ0FBQyxRQUFRO1FBQUUsT0FBTztTQUN4QjtRQUNILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQzdCLEdBQUcscUJBQXFCLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FDdEIsQ0FBQztLQUNIO0FBQ0gsQ0FBQzs4R0F0WFUsZ0JBQWdCO2tIQUFoQixnQkFBZ0IsY0FGZixNQUFNOzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZXhwYW5kLCBsYXN0LCBtYXAsIHJldHJ5LCB0YWtlIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7IERFRkFVTFRfQ0FDSEVfT1BUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBCYXNlQ2FjaGVPcHRpb25zLCBDYWNoZUluZm8gfSBmcm9tIFwiLi9tb2RlbHNcIjtcclxuaW1wb3J0IF9vbWl0IGZyb20gXCJsb2Rhc2gvb21pdFwiO1xyXG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xyXG5pbXBvcnQgX2Nsb25lRGVlcCBmcm9tIFwibG9kYXNoL2Nsb25lRGVlcFwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1RUTF9DT05GSUcgfSBmcm9tIFwiLi9jb25maWdcIjtcclxuaW1wb3J0IHsgVXNlclByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3VzZXIvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL3V0aWxpdHkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBFbnZNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvZW52L2Vudi1tYW5hZ2VyXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWNoZUJhc2VTZXJ2aWNlIHtcclxuICAjZmV0Y2hlZEl0ZW1zOiBNYXA8c3RyaW5nLCBDYWNoZUluZm8+ID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlSW5mbz4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy4jcHJlcGFyZUNvbmZpZygpO1xyXG4gIH1cclxuXHJcbiAgaGFzSXRlbShjYWNoZUtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmhhc0l0ZW0oXHJcbiAgICAgIGAke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9JHtjYWNoZUtleX1gXHJcbiAgICApO1xyXG4gIH1cclxuICBjbGVhckFsbCh1c2VyTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLiNjbGVhcih1c2VyTmFtZSk7XHJcbiAgfVxyXG4gIHZhbGlkYXRlVFRMKHVzZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICghREVGQVVMVF9UVExfQ09ORklHLkFVVE9fQ0hFQ0sgfHwgIXVzZXJOYW1lKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcHJlZml4ID0gYCR7dXNlck5hbWV9X18ke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9YDtcclxuICAgIE9iamVjdC5rZXlzKHdpbmRvdy5sb2NhbFN0b3JhZ2UpXHJcbiAgICAgIC5maWx0ZXIoKHEpID0+IHEuc3RhcnRzV2l0aChwcmVmaXgpKVxyXG4gICAgICAuZmlsdGVyKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zID0ge1xyXG4gICAgICAgICAgY2FjaGVLZXk6IGtleS5yZXBsYWNlKHByZWZpeCwgXCJcIiksXHJcbiAgICAgICAgICB1c2VyTmFtZTogdXNlck5hbWUsXHJcbiAgICAgICAgICByZXF1ZXN0OiBERUZBVUxUX0NBQ0hFX09QVElPTlMuUkVRVUVTVCxcclxuICAgICAgICAgIHByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZzogREVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRVBBUkVfREFUQSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RmV0Y2hpbmdEYXRlID0gdGhpcy4jZ2V0SXRlbShvcHRpb25zKT8uZmlyc3RGZXRjaGluZ0RhdGU7XHJcbiAgICAgICAgaWYgKCFmaXJzdEZldGNoaW5nRGF0ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBtb21lbnREYXRlMSA9IG1vbWVudChuZXcgRGF0ZShmaXJzdEZldGNoaW5nRGF0ZSkpO1xyXG4gICAgICAgIGNvbnN0IG1vbWVudERhdGUyID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBtb21lbnREYXRlMi5kaWZmKFxyXG4gICAgICAgICAgbW9tZW50RGF0ZTEsXHJcbiAgICAgICAgICBERUZBVUxUX1RUTF9DT05GSUcuVU5JVFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2UgPj0gREVGQVVMVF9UVExfQ09ORklHLlRUTDtcclxuICAgICAgfSlcclxuICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgc3RhcnRGZXRjaGluZ0l0ZW1zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy4jdmFsaWRhdGVUVExGb3JLZXkob3B0aW9ucyk7XHJcblxyXG4gICAgaWYgKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XT8uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ZldGNoZWRJdGVtc1tcclxuICAgICAgICBvcHRpb25zLmNhY2hlS2V5XHJcbiAgICAgIF0ub25GaW5pc2hGZXRjaGluZy5hc09ic2VydmFibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuI2hhbmRsZUNhY2hlSXRlbXMob3B0aW9ucykucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuI2ZldGNoZWRJdGVtc1tcclxuICAgICAgICBvcHRpb25zLmNhY2hlS2V5XHJcbiAgICAgIF0ub25GaW5pc2hGZXRjaGluZy5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgI2hhbmRsZUNhY2hlSXRlbXMob3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBsZXQgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gICAgdGhpcy4jcHJlcGFyZU9wdGlvbnMob3B0aW9ucyk7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkSXRlbSA9IHRoaXMuI2dldEl0ZW0ob3B0aW9ucyk7XHJcblxyXG4gICAgaWYgKGNhY2hlZEl0ZW0pIHtcclxuICAgICAgdGhpcy4jc2V0SXRlbUluTWFwKG9wdGlvbnMuY2FjaGVLZXksIHtcclxuICAgICAgICAuLi5jYWNoZWRJdGVtLFxyXG4gICAgICAgIGZldGNoaW5nSXRlbXNGcm9tVGhlU2VydmVyOiBmYWxzZSxcclxuICAgICAgICBvbkZpbmlzaEZldGNoaW5nOiBuZXcgU3ViamVjdDxDYWNoZUluZm8+KCksXHJcbiAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICBbb3B0aW9ucy5wYWdlS2V5XTogMCxcclxuICAgICAgICBbb3B0aW9ucy5taW5Db21wYXJlRGF0ZUtleV06IHRoaXMuI2FkZDFTZWNvbmRUb01vZGlmaWVkRGF0ZShcclxuICAgICAgICAgIG5ldyBEYXRlKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5sYXN0TW9kaWZpZWREYXRlKVxyXG4gICAgICAgICkudG9JU09TdHJpbmcoKSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgb2JzZXJ2YWJsZSA9IG9wdGlvbnMucmVxdWVzdChwYXJhbXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy4jc2V0SXRlbUluTWFwKG9wdGlvbnMuY2FjaGVLZXkpO1xyXG4gICAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucmVxdWVzdCA9IG9wdGlvbnMucmVxdWVzdDtcclxuICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmZpcnN0RmV0Y2hpbmdEYXRlID1cclxuICAgICAgICBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgIG9ic2VydmFibGUgPSBvcHRpb25zLnJlcXVlc3QoeyBbb3B0aW9ucy5wYWdlS2V5XTogMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSB0cnVlO1xyXG4gICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcclxuICAgICAgcmV0cnkoREVGQVVMVF9UVExfQ09ORklHLlJFVFJZKSxcclxuICAgICAgZXhwYW5kKChyZXN1bHRzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgYW5vdGhlckNhbGw6IE9ic2VydmFibGU8YW55PiB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICBhbm90aGVyQ2FsbCA9IHRoaXMuI2hhbmRsZUZldGNoZWRJdGVtcyhvcHRpb25zLCByZXN1bHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFub3RoZXJDYWxsID8gYW5vdGhlckNhbGwgOiBFTVBUWTtcclxuICAgICAgfSksXHJcbiAgICAgIGxhc3QoKSxcclxuICAgICAgbWFwKChfKSA9PiB7XHJcbiAgICAgICAgbGV0IF9mZXRjaGVkSXRlbXMgPSB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0gYXMgQ2FjaGVJbmZvO1xyXG4gICAgICAgIF9mZXRjaGVkSXRlbXMuZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoX2ZldGNoZWRJdGVtcy5kYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgIF9mZXRjaGVkSXRlbXMubGFzdE1vZGlmaWVkRGF0ZSA9IHRoaXMuI2ZpbmRMYXJnZXN0RGF0ZShcclxuICAgICAgICAgICAgX2ZldGNoZWRJdGVtcy5kYXRhLFxyXG4gICAgICAgICAgICBvcHRpb25zLmNoaWxkcmVuUGF0aCxcclxuICAgICAgICAgICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuI3NldEl0ZW0oXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBkYXRhOiBfZmV0Y2hlZEl0ZW1zLmRhdGEsXHJcbiAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZTogX2ZldGNoZWRJdGVtcy5sYXN0TW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgIGZpcnN0RmV0Y2hpbmdEYXRlOiBfZmV0Y2hlZEl0ZW1zLmZpcnN0RmV0Y2hpbmdEYXRlLFxyXG4gICAgICAgICAgICAgIHJlc3VsdHNDb3VudDogX2ZldGNoZWRJdGVtc1tvcHRpb25zLnJlc3VsdHNDb3VudF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfZmV0Y2hlZEl0ZW1zO1xyXG4gICAgICB9KSxcclxuICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBfY2xvbmVEZWVwKHtcclxuICAgICAgICAgIFtvcHRpb25zLm1hcHBlZERhdGFLZXldOiByZXMuZGF0YSxcclxuICAgICAgICAgIFtvcHRpb25zLmxhc3RNb2RpZmllZERhdGVLZXldOiByZXMubGFzdE1vZGlmaWVkRGF0ZSxcclxuICAgICAgICAgIFtvcHRpb25zLnJlc3VsdHNDb3VudF06IHJlc1tvcHRpb25zLnJlc3VsdHNDb3VudF0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmVzLm9uRmluaXNoRmV0Y2hpbmcubmV4dChyZXN1bHQpO1xyXG4gICAgICAgIHJlcy5vbkZpbmlzaEZldGNoaW5nLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXI7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICAjZmluZE5vZGUoXHJcbiAgICBpdGVtczogYW55W10sXHJcbiAgICB1bmlxdWVDb21wYXJlS2V5OiBzdHJpbmcsXHJcbiAgICBjaGlsZHJlblBhdGg6IHN0cmluZyxcclxuICAgIHZhbHVlOiBhbnlcclxuICApIHtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAobm9kZVt1bmlxdWVDb21wYXJlS2V5XSA9PT0gdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUobm9kZSwgY2hpbGRyZW5QYXRoKTtcclxuICAgICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZmluZE5vZGUoXHJcbiAgICAgICAgICBjaGlsZHJlbixcclxuICAgICAgICAgIHVuaXF1ZUNvbXBhcmVLZXksXHJcbiAgICAgICAgICBjaGlsZHJlblBhdGgsXHJcbiAgICAgICAgICB2YWx1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICAjZmluZExhcmdlc3REYXRlKFxyXG4gICAgbm9kZUxpc3Q6IGFueVtdLFxyXG4gICAgY2hpbGRyZW5QYXRoOiBzdHJpbmcsXHJcbiAgICBkYXRlUGF0aDogc3RyaW5nXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGxldCBsYXJnZXN0RGF0ZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIW5vZGUpIHJldHVybjtcclxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKG5vZGUsIGNoaWxkcmVuUGF0aCk7XHJcbiAgICAgIGNvbnN0IG5vZGVEYXRlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShub2RlLCBkYXRlUGF0aCk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBub2RlRGF0ZSAmJlxyXG4gICAgICAgICghbGFyZ2VzdERhdGUgfHwgbmV3IERhdGUobm9kZURhdGUpID4gbmV3IERhdGUobGFyZ2VzdERhdGUpKVxyXG4gICAgICApIHtcclxuICAgICAgICBsYXJnZXN0RGF0ZSA9IG5vZGVEYXRlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICAgICAgdHJhdmVyc2UoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIG5vZGVMaXN0LmZvckVhY2goKG5vZGUpID0+IHRyYXZlcnNlKG5vZGUpKTtcclxuICAgIHJldHVybiBsYXJnZXN0RGF0ZTtcclxuICB9XHJcbiAgI2hhbmRsZUZldGNoZWRJdGVtcyhcclxuICAgIG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMsXHJcbiAgICByZXM6IGFueVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5kYXRhPy5sZW5ndGgpIHtcclxuICAgICAgcmVzW29wdGlvbnMubWFwcGVkRGF0YUtleV0uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShcclxuICAgICAgICAgIGEsXHJcbiAgICAgICAgICBvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBzZWNvbmQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKFxyXG4gICAgICAgICAgYixcclxuICAgICAgICAgIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGhcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShmaXJzdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoc2Vjb25kKS5nZXRUaW1lKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuI2ZpbmROb2RlKFxyXG4gICAgICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGEsXHJcbiAgICAgICAgICBvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXksXHJcbiAgICAgICAgICBvcHRpb25zLmNoaWxkcmVuUGF0aCxcclxuICAgICAgICAgIGVsZW1lbnRbb3B0aW9ucy51bmlxdWVDb21wYXJlS2V5XVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1hcHBlZEVsZW1lbnQgPSBvcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyhbZWxlbWVudF0pWzBdO1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAvLyBlZGl0IDogdXBkYXRlIGl0ZW0gaW4gY2FjaGVcclxuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkU291cmNlID0gX29taXQoXHJcbiAgICAgICAgICAgIG1hcHBlZEVsZW1lbnQsXHJcbiAgICAgICAgICAgIG9wdGlvbnMuZXhjbHVkZUtleXNXaGVuVXBkYXRlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgX2Fzc2lnbihpdGVtLCBmaWx0ZXJlZFNvdXJjZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGFkZCA6IGNoZWNrIGRhdGUgdG8gZGV0ZXJtaW5lIHdoZXJlIHdpbGwgaW5zZXJ0XHJcblxyXG4gICAgICAgICAgLy8gaWYgaXRlbSBwYXJlbnQgbm90IGZvdW5kIGFkZCBhcyByb290IGVsc2Ugd2lsbCBhZGQgbGVhdmVzIHRvIHN1YlBhcmVudFxyXG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuI2ZpbmROb2RlKFxyXG4gICAgICAgICAgICB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZGF0YSxcclxuICAgICAgICAgICAgb3B0aW9ucy51bmlxdWVDb21wYXJlS2V5LFxyXG4gICAgICAgICAgICBvcHRpb25zLmNoaWxkcmVuUGF0aCxcclxuICAgICAgICAgICAgZWxlbWVudFtvcHRpb25zLnBhcmVudEtleV1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgLy8gd2lsbCBjb21wYXJlIHdpdGggbm9kZSBjaGlsZCB0byBhZGRcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKFxyXG4gICAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgICAgb3B0aW9ucy5jaGlsZHJlblBhdGhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy4jYWRkSXRlbXNUbyhvcHRpb25zLCBjaGlsZHJlbiwgZWxlbWVudCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB3aWxsIGNvbXBhcmUgd2l0aCByb290IGxldmVsIHRvIGFkZFxyXG4gICAgICAgICAgICB0aGlzLiNhZGRJdGVtc1RvKFxyXG4gICAgICAgICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGEsXHJcbiAgICAgICAgICAgICAgZWxlbWVudFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XSA9IG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKFxyXG4gICAgICAgIHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5kYXRhID0gcmVzW29wdGlvbnMubWFwcGVkRGF0YUtleV07XHJcbiAgICAgIHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5yZXN1bHRzQ291bnQgPVxyXG4gICAgICAgIHJlc1tvcHRpb25zLnJlc3VsdHNDb3VudF07XHJcbiAgICB9XHJcbiAgICBpZiAocmVzW29wdGlvbnMudG90YWxQYWdlS2V5XSAtIHJlc1tvcHRpb25zLnBhZ2VLZXldID4gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnJlcXVlc3Qoe1xyXG4gICAgICAgIC4uLih0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucGFyYW1zIHx8IHt9KSxcclxuICAgICAgICBbb3B0aW9ucy5wYWdlS2V5XTogcmVzW29wdGlvbnMucGFnZUtleV0gKyAxLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAjYWRkSXRlbXNUbyhvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zLCBkYXRhOiBhbnlbXSwgaXRlbTogYW55KSB7XHJcbiAgICBjb25zdCBmaXJzdENhY2hlZE1vZGlmaWVkID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShcclxuICAgICAgZGF0YVswXSxcclxuICAgICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRNb2RpZmllZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoXHJcbiAgICAgIGl0ZW0sXHJcbiAgICAgIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGhcclxuICAgICk7XHJcbiAgICBpZiAoZmlyc3RDYWNoZWRNb2RpZmllZCA8IGN1cnJlbnRNb2RpZmllZCkge1xyXG4gICAgICBkYXRhLnVuc2hpZnQoLi4ub3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcoW2l0ZW1dKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhLnB1c2goLi4ub3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcoW2l0ZW1dKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICNwcmVwYXJlT3B0aW9ucyhvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKSB7XHJcbiAgICBvcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyA9XHJcbiAgICAgIG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nIHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVQQVJFX0RBVEE7XHJcbiAgICBvcHRpb25zLnBhZ2VLZXkgPSBvcHRpb25zLnBhZ2VLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlBBR0VfS0VZO1xyXG4gICAgb3B0aW9ucy50b3RhbFBhZ2VLZXkgPVxyXG4gICAgICBvcHRpb25zLnRvdGFsUGFnZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuVE9UQUxfUEFHRV9LRVk7XHJcbiAgICBvcHRpb25zLnJlc3VsdHNDb3VudCA9XHJcbiAgICAgIG9wdGlvbnMucmVzdWx0c0NvdW50IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5SRVNVTFRTX0NPVU5UX0tFWTtcclxuICAgIG9wdGlvbnMubWFwcGVkRGF0YUtleSA9XHJcbiAgICAgIG9wdGlvbnMubWFwcGVkRGF0YUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuTUFQUEVEX0RBVEFfS0VZO1xyXG4gICAgb3B0aW9ucy51bmlxdWVDb21wYXJlS2V5ID1cclxuICAgICAgb3B0aW9ucy51bmlxdWVDb21wYXJlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5VTklRVUVfQ09NUEFSRV9LRVk7XHJcbiAgICBvcHRpb25zLm1pbkNvbXBhcmVEYXRlS2V5ID1cclxuICAgICAgb3B0aW9ucy5taW5Db21wYXJlRGF0ZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuTUlOX0NPTVBBUkVfREFURV9LRVk7XHJcbiAgICBvcHRpb25zLmxhc3RNb2RpZmllZERhdGVLZXkgPVxyXG4gICAgICBvcHRpb25zLmxhc3RNb2RpZmllZERhdGVLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLkxBU1RfTU9ESUZJRURfS0VZO1xyXG4gICAgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aCA9XHJcbiAgICAgIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGggfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLkxBU1RfTU9ESUZJRURfUEFUSDtcclxuICAgIG9wdGlvbnMuZXhjbHVkZUtleXNXaGVuVXBkYXRlID1cclxuICAgICAgb3B0aW9ucy5leGNsdWRlS2V5c1doZW5VcGRhdGUgfHxcclxuICAgICAgREVGQVVMVF9DQUNIRV9PUFRJT05TLkVYQ0xVREVfS0VZU19XSEVOX1VQREFURTtcclxuICAgIG9wdGlvbnMuY2hpbGRyZW5QYXRoID1cclxuICAgICAgb3B0aW9ucy5jaGlsZHJlblBhdGggfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLkNISUxEUkVOX1BBVEg7XHJcbiAgICBvcHRpb25zLnBhcmVudEtleSA9IG9wdGlvbnMucGFyZW50S2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QQVJFTlRfS0VZO1xyXG4gIH1cclxuICAjcHJlcGFyZUNvbmZpZygpIHtcclxuICAgIERFRkFVTFRfVFRMX0NPTkZJRy5UVEwgPVxyXG4gICAgICBFbnZNYW5hZ2VyLmVudmlyb25tZW50Py5jYWNoZT8udHRsIHx8IERFRkFVTFRfVFRMX0NPTkZJRy5UVEw7XHJcbiAgICBERUZBVUxUX1RUTF9DT05GSUcuVU5JVCA9XHJcbiAgICAgIEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy50dGxVbml0IHx8IERFRkFVTFRfVFRMX0NPTkZJRy5VTklUO1xyXG4gICAgREVGQVVMVF9UVExfQ09ORklHLkFVVE9fQ0hFQ0sgPVxyXG4gICAgICBFbnZNYW5hZ2VyLmVudmlyb25tZW50Py5jYWNoZT8uYXV0b0NoZWNrID09IFwiWUVTXCI7XHJcbiAgICBERUZBVUxUX1RUTF9DT05GSUcuUkVUUlkgPVxyXG4gICAgICBFbnZNYW5hZ2VyLmVudmlyb25tZW50Py5jYWNoZT8ucmV0cnkgfHwgREVGQVVMVF9UVExfQ09ORklHLlJFVFJZO1xyXG4gIH1cclxuICAjYWRkMVNlY29uZFRvTW9kaWZpZWREYXRlKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIGxldCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xyXG4gICAgbmV3RGF0ZS5zZXRTZWNvbmRzKG5ld0RhdGUuZ2V0U2Vjb25kcygpICsgMSk7XHJcbiAgICByZXR1cm4gbmV3RGF0ZTtcclxuICB9XHJcbiAgI2NsZWFyKHVzZXJOYW1lOiBzdHJpbmcsIGtleU9yQWxsOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICBPYmplY3Qua2V5cyh3aW5kb3cubG9jYWxTdG9yYWdlKVxyXG4gICAgICAuZmlsdGVyKChxKSA9PlxyXG4gICAgICAgIHEuc3RhcnRzV2l0aChgJHt1c2VyTmFtZX1fXyR7REVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRUZJWH0ke2tleU9yQWxsfWApXHJcbiAgICAgIClcclxuICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgI3ZhbGlkYXRlVFRMRm9yS2V5KG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGZpcnN0RmV0Y2hpbmdEYXRlID0gdGhpcy4jZ2V0SXRlbShvcHRpb25zKT8uZmlyc3RGZXRjaGluZ0RhdGU7XHJcblxyXG4gICAgaWYgKCFmaXJzdEZldGNoaW5nRGF0ZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG1vbWVudERhdGUxID0gbW9tZW50KG5ldyBEYXRlKGZpcnN0RmV0Y2hpbmdEYXRlKSk7XHJcbiAgICBjb25zdCBtb21lbnREYXRlMiA9IG1vbWVudChuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gbW9tZW50RGF0ZTIuZGlmZihtb21lbnREYXRlMSwgREVGQVVMVF9UVExfQ09ORklHLlVOSVQpO1xyXG5cclxuICAgIGlmIChkaWZmZXJlbmNlID49IERFRkFVTFRfVFRMX0NPTkZJRy5UVEwpXHJcbiAgICAgIHRoaXMuI2NsZWFyKG9wdGlvbnMudXNlck5hbWUsIG9wdGlvbnMuY2FjaGVLZXkpO1xyXG4gIH1cclxuICAjc2V0SXRlbUluTWFwKGtleTogc3RyaW5nLCB2YWw/OiBDYWNoZUluZm8pOiB2b2lkIHtcclxuICAgIGNvbnN0IGVtcHR5OiBDYWNoZUluZm8gPSB7XHJcbiAgICAgIGRhdGE6IFtdLFxyXG4gICAgICBmaXJzdEZldGNoaW5nRGF0ZTogXCJcIixcclxuICAgICAgbGFzdE1vZGlmaWVkRGF0ZTogXCJcIixcclxuICAgICAgcmVzdWx0c0NvdW50OiAwLFxyXG4gICAgICBmZXRjaGluZ0l0ZW1zRnJvbVRoZVNlcnZlcjogZmFsc2UsXHJcbiAgICAgIG9uRmluaXNoRmV0Y2hpbmc6IG5ldyBTdWJqZWN0PENhY2hlSW5mbz4oKSxcclxuICAgIH07XHJcbiAgICBsZXQgdmFsdWU6IENhY2hlSW5mbyA9IHZhbCA/IHZhbCA6IGVtcHR5O1xyXG4gICAgdGhpcy4jZmV0Y2hlZEl0ZW1zW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcbiAgI2dldEl0ZW0ob3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucykge1xyXG4gICAgbGV0IGRhdGE6IENhY2hlSW5mbztcclxuICAgIGlmIChvcHRpb25zLmluTWVtb3J5KSB7XHJcbiAgICAgIGRhdGEgPSB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5nZXQoXHJcbiAgICAgICAgYCR7REVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRUZJWH0ke29wdGlvbnMuY2FjaGVLZXl9YFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm47XHJcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuICAjc2V0SXRlbSh2YWx1ZTogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9uczogQmFzZUNhY2hlT3B0aW9ucykge1xyXG4gICAgaWYgKG9wdGlvbnMuaW5NZW1vcnkpIHJldHVybjtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXJQcmVmZXJlbmNlc1NlcnZpY2Uuc2V0KFxyXG4gICAgICAgIGAke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9JHtvcHRpb25zLmNhY2hlS2V5fWAsXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2Jhc2UvY2FjaGUtYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFrQixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNoQyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQUszRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRzVCLFlBQW9CLHNCQUE4QyxFQUFVLGNBQThCO1FBQXRGLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7O1FBRjFHLHlDQUF3QyxJQUFJLEdBQUcsRUFBcUIsRUFBQztRQUdwRSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksQ0FBaUIsQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFD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TUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDekI7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNiLENBQUMsaUVBQ1EsS0FBMEIsRUFBRSxPQUF5QjtJQUM3RCxJQUFJLE9BQU8sQ0FBQyxRQUFRO1FBQUUsT0FBTztTQUN4QjtRQUNKLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUM3RztBQUNGLENBQUM7OEdBdlNXLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBRmhCLE1BQU07NEZBRU4sZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGV4cGFuZCwgbGFzdCwgbWFwLCByZXRyeSwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ0FDSEVfT1BUSU9OUyB9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQmFzZUNhY2hlT3B0aW9ucywgQ2FjaGVJbmZvIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgX29taXQgZnJvbSAnbG9kYXNoL29taXQnO1xyXG5pbXBvcnQgX2Fzc2lnbiBmcm9tICdsb2Rhc2gvYXNzaWduJztcclxuaW1wb3J0IF9jbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XHJcbmltcG9ydCB7IERFRkFVTFRfVFRMX0NPTkZJRyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgVXNlclByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvdXNlci91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL3V0aWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudk1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Vudi9lbnYtbWFuYWdlcic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWNoZUJhc2VTZXJ2aWNlIHtcclxuXHQjZmV0Y2hlZEl0ZW1zOiBNYXA8c3RyaW5nLCBDYWNoZUluZm8+ID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlSW5mbz4oKTtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSB1c2VyUHJlZmVyZW5jZXNTZXJ2aWNlOiBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLCBwcml2YXRlIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSkge1xyXG5cdFx0dGhpcy4jcHJlcGFyZUNvbmZpZygpO1xyXG5cdH1cclxuXHJcblx0aGFzSXRlbShjYWNoZUtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmhhc0l0ZW0oYCR7REVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRUZJWH0ke2NhY2hlS2V5fWApO1xyXG5cdH1cclxuXHRjbGVhckFsbCh1c2VyTmFtZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLiNjbGVhcih1c2VyTmFtZSk7XHJcblx0fVxyXG5cdHZhbGlkYXRlVFRMKHVzZXJOYW1lOiBzdHJpbmcpIHtcclxuXHRcdGlmICghREVGQVVMVF9UVExfQ09ORklHLkFVVE9fQ0hFQ0sgfHwgIXVzZXJOYW1lKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgcHJlZml4ID0gYCR7dXNlck5hbWV9X18ke0RFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVGSVh9YDtcclxuXHRcdE9iamVjdC5rZXlzKHdpbmRvdy5sb2NhbFN0b3JhZ2UpXHJcblx0XHRcdC5maWx0ZXIoKHEpID0+IHEuc3RhcnRzV2l0aChwcmVmaXgpKVxyXG5cdFx0XHQuZmlsdGVyKChrZXkpID0+IHtcclxuXHRcdFx0XHRjb25zdCBvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zID0ge1xyXG5cdFx0XHRcdFx0Y2FjaGVLZXk6IGtleS5yZXBsYWNlKHByZWZpeCwgJycpLFxyXG5cdFx0XHRcdFx0dXNlck5hbWU6IHVzZXJOYW1lLFxyXG5cdFx0XHRcdFx0cmVxdWVzdDogREVGQVVMVF9DQUNIRV9PUFRJT05TLlJFUVVFU1QsXHJcblx0XHRcdFx0XHRwcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmc6IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5QUkVQQVJFX0RBVEFcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGNvbnN0IGZpcnN0RmV0Y2hpbmdEYXRlID0gdGhpcy4jZ2V0SXRlbShvcHRpb25zKT8uZmlyc3RGZXRjaGluZ0RhdGU7XHJcblx0XHRcdFx0aWYgKCFmaXJzdEZldGNoaW5nRGF0ZSkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjb25zdCBtb21lbnREYXRlMSA9IG1vbWVudChuZXcgRGF0ZShmaXJzdEZldGNoaW5nRGF0ZSkpO1xyXG5cdFx0XHRcdGNvbnN0IG1vbWVudERhdGUyID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG5cdFx0XHRcdGNvbnN0IGRpZmZlcmVuY2UgPSBtb21lbnREYXRlMi5kaWZmKG1vbWVudERhdGUxLCBERUZBVUxUX1RUTF9DT05GSUcuVU5JVCk7XHJcblx0XHRcdFx0cmV0dXJuIGRpZmZlcmVuY2UgPj0gREVGQVVMVF9UVExfQ09ORklHLlRUTDtcclxuXHRcdFx0fSlcclxuXHRcdFx0LmZvckVhY2goKGtleSkgPT4ge1xyXG5cdFx0XHRcdHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblx0c3RhcnRGZXRjaGluZ0l0ZW1zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0dGhpcy4jdmFsaWRhdGVUVExGb3JLZXkob3B0aW9ucyk7XHJcblxyXG5cdFx0aWYgKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XT8uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5vbkZpbmlzaEZldGNoaW5nLmFzT2JzZXJ2YWJsZSgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy4jaGFuZGxlQ2FjaGVJdGVtcyhvcHRpb25zKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgpO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLm9uRmluaXNoRmV0Y2hpbmcuYXNPYnNlcnZhYmxlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdCNoYW5kbGVDYWNoZUl0ZW1zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IG9ic2VydmFibGU6IE9ic2VydmFibGU8YW55PjtcclxuXHRcdHRoaXMuI3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpO1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlZEl0ZW0gPSB0aGlzLiNnZXRJdGVtKG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmIChjYWNoZWRJdGVtKSB7XHJcblx0XHRcdHRoaXMuI3NldEl0ZW1Jbk1hcChvcHRpb25zLmNhY2hlS2V5LCB7XHJcblx0XHRcdFx0Li4uY2FjaGVkSXRlbSxcclxuXHRcdFx0XHRmZXRjaGluZ0l0ZW1zRnJvbVRoZVNlcnZlcjogZmFsc2UsXHJcblx0XHRcdFx0b25GaW5pc2hGZXRjaGluZzogbmV3IFN1YmplY3Q8Q2FjaGVJbmZvPigpLFxyXG5cdFx0XHRcdHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHtcclxuXHRcdFx0XHRbb3B0aW9ucy5wYWdlS2V5XTogMCxcclxuXHRcdFx0XHRbb3B0aW9ucy5taW5Db21wYXJlRGF0ZUtleV06IHRoaXMuI2FkZDFTZWNvbmRUb01vZGlmaWVkRGF0ZShcclxuXHRcdFx0XHRcdG5ldyBEYXRlKHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5sYXN0TW9kaWZpZWREYXRlKVxyXG5cdFx0XHRcdCkudG9JU09TdHJpbmcoKVxyXG5cdFx0XHR9O1xyXG5cdFx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucGFyYW1zID0gcGFyYW1zO1xyXG5cdFx0XHRvYnNlcnZhYmxlID0gb3B0aW9ucy5yZXF1ZXN0KHBhcmFtcyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLiNzZXRJdGVtSW5NYXAob3B0aW9ucy5jYWNoZUtleSk7XHJcblx0XHRcdHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5yZXF1ZXN0ID0gb3B0aW9ucy5yZXF1ZXN0O1xyXG5cdFx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZmlyc3RGZXRjaGluZ0RhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcblx0XHRcdG9ic2VydmFibGUgPSBvcHRpb25zLnJlcXVlc3QoeyBbb3B0aW9ucy5wYWdlS2V5XTogMCB9KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSB0cnVlO1xyXG5cdFx0cmV0dXJuIG9ic2VydmFibGUucGlwZShcclxuXHRcdFx0cmV0cnkoREVGQVVMVF9UVExfQ09ORklHLlJFVFJZKSxcclxuXHRcdFx0ZXhwYW5kKChyZXN1bHRzOiBhbnkpID0+IHtcclxuXHRcdFx0XHRsZXQgYW5vdGhlckNhbGw6IE9ic2VydmFibGU8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cdFx0XHRcdGlmIChyZXN1bHRzICYmIHJlc3VsdHNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XT8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRhbm90aGVyQ2FsbCA9IHRoaXMuI2hhbmRsZUZldGNoZWRJdGVtcyhvcHRpb25zLCByZXN1bHRzKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGFub3RoZXJDYWxsID8gYW5vdGhlckNhbGwgOiBFTVBUWTtcclxuXHRcdFx0fSksXHJcblx0XHRcdGxhc3QoKSxcclxuXHRcdFx0bWFwKChfKSA9PiB7XHJcblx0XHRcdFx0bGV0IF9mZXRjaGVkSXRlbXMgPSB0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0gYXMgQ2FjaGVJbmZvO1xyXG5cdFx0XHRcdF9mZXRjaGVkSXRlbXMuZmV0Y2hpbmdJdGVtc0Zyb21UaGVTZXJ2ZXIgPSBmYWxzZTtcclxuXHRcdFx0XHRpZiAoX2ZldGNoZWRJdGVtcy5kYXRhPy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdF9mZXRjaGVkSXRlbXMubGFzdE1vZGlmaWVkRGF0ZSA9IHRoaXMuI2ZpbmRMYXJnZXN0RGF0ZShcclxuXHRcdFx0XHRcdFx0X2ZldGNoZWRJdGVtcy5kYXRhLFxyXG5cdFx0XHRcdFx0XHRvcHRpb25zLmNoaWxkcmVuUGF0aCxcclxuXHRcdFx0XHRcdFx0b3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHRoaXMuI3NldEl0ZW0oXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBfZmV0Y2hlZEl0ZW1zLmRhdGEsXHJcblx0XHRcdFx0XHRcdFx0bGFzdE1vZGlmaWVkRGF0ZTogX2ZldGNoZWRJdGVtcy5sYXN0TW9kaWZpZWREYXRlLFxyXG5cdFx0XHRcdFx0XHRcdGZpcnN0RmV0Y2hpbmdEYXRlOiBfZmV0Y2hlZEl0ZW1zLmZpcnN0RmV0Y2hpbmdEYXRlLFxyXG5cdFx0XHRcdFx0XHRcdHJlc3VsdHNDb3VudDogX2ZldGNoZWRJdGVtc1tvcHRpb25zLnJlc3VsdHNDb3VudF1cclxuXHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0b3B0aW9uc1xyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIF9mZXRjaGVkSXRlbXM7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRtYXAoKHJlcykgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IF9jbG9uZURlZXAoe1xyXG5cdFx0XHRcdFx0W29wdGlvbnMubWFwcGVkRGF0YUtleV06IHJlcy5kYXRhLFxyXG5cdFx0XHRcdFx0W29wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZUtleV06IHJlcy5sYXN0TW9kaWZpZWREYXRlLFxyXG5cdFx0XHRcdFx0W29wdGlvbnMucmVzdWx0c0NvdW50XTogcmVzW29wdGlvbnMucmVzdWx0c0NvdW50XVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHJlcy5vbkZpbmlzaEZldGNoaW5nLm5leHQocmVzdWx0KTtcclxuXHRcdFx0XHRyZXMub25GaW5pc2hGZXRjaGluZy5jb21wbGV0ZSgpO1xyXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRjYXRjaEVycm9yKChlcikgPT4ge1xyXG5cdFx0XHRcdHRocm93IGVyO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblx0I2ZpbmROb2RlKGl0ZW1zOiBhbnlbXSwgdW5pcXVlQ29tcGFyZUtleTogc3RyaW5nLCBjaGlsZHJlblBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG5cdFx0Zm9yIChjb25zdCBub2RlIG9mIGl0ZW1zKSB7XHJcblx0XHRcdGlmIChub2RlW3VuaXF1ZUNvbXBhcmVLZXldID09PSB2YWx1ZSkge1xyXG5cdFx0XHRcdHJldHVybiBub2RlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShub2RlLCBjaGlsZHJlblBhdGgpO1xyXG5cdFx0XHRpZiAoY2hpbGRyZW4pIHtcclxuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLiNmaW5kTm9kZShjaGlsZHJlbiwgdW5pcXVlQ29tcGFyZUtleSwgY2hpbGRyZW5QYXRoLCB2YWx1ZSk7XHJcblx0XHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHQjZmluZExhcmdlc3REYXRlKG5vZGVMaXN0OiBhbnlbXSwgY2hpbGRyZW5QYXRoOiBzdHJpbmcsIGRhdGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0bGV0IGxhcmdlc3REYXRlOiBzdHJpbmcgPSBudWxsO1xyXG5cdFx0Y29uc3QgdHJhdmVyc2UgPSAobm9kZTogYW55KSA9PiB7XHJcblx0XHRcdGlmICghbm9kZSkgcmV0dXJuO1xyXG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUobm9kZSwgY2hpbGRyZW5QYXRoKTtcclxuXHRcdFx0Y29uc3Qgbm9kZURhdGUgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKG5vZGUsIGRhdGVQYXRoKTtcclxuXHRcdFx0aWYgKG5vZGVEYXRlICYmICghbGFyZ2VzdERhdGUgfHwgbmV3IERhdGUobm9kZURhdGUpID4gbmV3IERhdGUobGFyZ2VzdERhdGUpKSkge1xyXG5cdFx0XHRcdGxhcmdlc3REYXRlID0gbm9kZURhdGU7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGNoaWxkcmVuPy5sZW5ndGgpIHtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcblx0XHRcdFx0XHR0cmF2ZXJzZShjaGlsZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0bm9kZUxpc3QuZm9yRWFjaCgobm9kZSkgPT4gdHJhdmVyc2Uobm9kZSkpO1xyXG5cdFx0cmV0dXJuIGxhcmdlc3REYXRlO1xyXG5cdH1cclxuXHQjaGFuZGxlRmV0Y2hlZEl0ZW1zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMsIHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHwgbnVsbCB7XHJcblx0XHRpZiAodGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGE/Lmxlbmd0aCkge1xyXG5cdFx0XHRyZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XS5zb3J0KChhLCBiKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZmlyc3QgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKGEsIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGgpO1xyXG5cdFx0XHRcdGNvbnN0IHNlY29uZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUoYiwgb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aCk7XHJcblx0XHRcdFx0cmV0dXJuIG5ldyBEYXRlKGZpcnN0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzZWNvbmQpLmdldFRpbWUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuXHRcdFx0XHRjb25zdCBpdGVtID0gdGhpcy4jZmluZE5vZGUoXHJcblx0XHRcdFx0XHR0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0uZGF0YSxcclxuXHRcdFx0XHRcdG9wdGlvbnMudW5pcXVlQ29tcGFyZUtleSxcclxuXHRcdFx0XHRcdG9wdGlvbnMuY2hpbGRyZW5QYXRoLFxyXG5cdFx0XHRcdFx0ZWxlbWVudFtvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXldXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWFwcGVkRWxlbWVudCA9IG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKFtlbGVtZW50XSlbMF07XHJcblx0XHRcdFx0aWYgKGl0ZW0pIHtcclxuXHRcdFx0XHRcdC8vIGVkaXQgOiB1cGRhdGUgaXRlbSBpbiBjYWNoZVxyXG5cdFx0XHRcdFx0Y29uc3QgZmlsdGVyZWRTb3VyY2UgPSBfb21pdChtYXBwZWRFbGVtZW50LCBvcHRpb25zLmV4Y2x1ZGVLZXlzV2hlblVwZGF0ZSk7XHJcblx0XHRcdFx0XHRfYXNzaWduKGl0ZW0sIGZpbHRlcmVkU291cmNlKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gYWRkIDogY2hlY2sgZGF0ZSB0byBkZXRlcm1pbmUgd2hlcmUgd2lsbCBpbnNlcnRcclxuXHJcblx0XHRcdFx0XHQvLyBpZiBpdGVtIHBhcmVudCBub3QgZm91bmQgYWRkIGFzIHJvb3QgZWxzZSB3aWxsIGFkZCBsZWF2ZXMgdG8gc3ViUGFyZW50XHJcblx0XHRcdFx0XHRjb25zdCBub2RlID0gdGhpcy4jZmluZE5vZGUoXHJcblx0XHRcdFx0XHRcdHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XS5kYXRhLFxyXG5cdFx0XHRcdFx0XHRvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXksXHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuY2hpbGRyZW5QYXRoLFxyXG5cdFx0XHRcdFx0XHRlbGVtZW50W29wdGlvbnMucGFyZW50S2V5XVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRpZiAobm9kZSkge1xyXG5cdFx0XHRcdFx0XHQvLyB3aWxsIGNvbXBhcmUgd2l0aCBub2RlIGNoaWxkIHRvIGFkZFxyXG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0VmFsdWUobm9kZSwgb3B0aW9ucy5jaGlsZHJlblBhdGgpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLiNhZGRJdGVtc1RvKG9wdGlvbnMsIGNoaWxkcmVuLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8vIHdpbGwgY29tcGFyZSB3aXRoIHJvb3QgbGV2ZWwgdG8gYWRkXHJcblx0XHRcdFx0XHRcdHRoaXMuI2FkZEl0ZW1zVG8ob3B0aW9ucywgdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGEsIGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XSA9IG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nKHJlc1tvcHRpb25zLm1hcHBlZERhdGFLZXldKTtcclxuXHRcdFx0dGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLmRhdGEgPSByZXNbb3B0aW9ucy5tYXBwZWREYXRhS2V5XTtcclxuXHRcdFx0dGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnJlc3VsdHNDb3VudCA9IHJlc1tvcHRpb25zLnJlc3VsdHNDb3VudF07XHJcblx0XHR9XHJcblx0XHRpZiAocmVzW29wdGlvbnMudG90YWxQYWdlS2V5XSAtIHJlc1tvcHRpb25zLnBhZ2VLZXldID4gMSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy4jZmV0Y2hlZEl0ZW1zW29wdGlvbnMuY2FjaGVLZXldLnJlcXVlc3Qoe1xyXG5cdFx0XHRcdC4uLih0aGlzLiNmZXRjaGVkSXRlbXNbb3B0aW9ucy5jYWNoZUtleV0ucGFyYW1zIHx8IHt9KSxcclxuXHRcdFx0XHRbb3B0aW9ucy5wYWdlS2V5XTogcmVzW29wdGlvbnMucGFnZUtleV0gKyAxXHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdCNhZGRJdGVtc1RvKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMsIGRhdGE6IGFueVtdLCBpdGVtOiBhbnkpIHtcclxuXHRcdGNvbnN0IGZpcnN0Q2FjaGVkTW9kaWZpZWQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFZhbHVlKGRhdGFbMF0sIG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZVBhdGgpO1xyXG5cdFx0Y29uc3QgY3VycmVudE1vZGlmaWVkID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRWYWx1ZShpdGVtLCBvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoKTtcclxuXHRcdGlmIChmaXJzdENhY2hlZE1vZGlmaWVkIDwgY3VycmVudE1vZGlmaWVkKSB7XHJcblx0XHRcdGRhdGEudW5zaGlmdCguLi5vcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyhbaXRlbV0pKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGRhdGEucHVzaCguLi5vcHRpb25zLnByZXBhcmVEYXRhQmVmb3JlQ2FjaGluZyhbaXRlbV0pKTtcclxuXHRcdH1cclxuXHR9XHJcblx0I3ByZXBhcmVPcHRpb25zKG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuXHRcdG9wdGlvbnMucHJlcGFyZURhdGFCZWZvcmVDYWNoaW5nID0gb3B0aW9ucy5wcmVwYXJlRGF0YUJlZm9yZUNhY2hpbmcgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlBSRVBBUkVfREFUQTtcclxuXHRcdG9wdGlvbnMucGFnZUtleSA9IG9wdGlvbnMucGFnZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuUEFHRV9LRVk7XHJcblx0XHRvcHRpb25zLnRvdGFsUGFnZUtleSA9IG9wdGlvbnMudG90YWxQYWdlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5UT1RBTF9QQUdFX0tFWTtcclxuXHRcdG9wdGlvbnMucmVzdWx0c0NvdW50ID0gb3B0aW9ucy5yZXN1bHRzQ291bnQgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlJFU1VMVFNfQ09VTlRfS0VZO1xyXG5cdFx0b3B0aW9ucy5tYXBwZWREYXRhS2V5ID0gb3B0aW9ucy5tYXBwZWREYXRhS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5NQVBQRURfREFUQV9LRVk7XHJcblx0XHRvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXkgPSBvcHRpb25zLnVuaXF1ZUNvbXBhcmVLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlVOSVFVRV9DT01QQVJFX0tFWTtcclxuXHRcdG9wdGlvbnMubWluQ29tcGFyZURhdGVLZXkgPSBvcHRpb25zLm1pbkNvbXBhcmVEYXRlS2V5IHx8IERFRkFVTFRfQ0FDSEVfT1BUSU9OUy5NSU5fQ09NUEFSRV9EQVRFX0tFWTtcclxuXHRcdG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZUtleSA9IG9wdGlvbnMubGFzdE1vZGlmaWVkRGF0ZUtleSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuTEFTVF9NT0RJRklFRF9LRVk7XHJcblx0XHRvcHRpb25zLmxhc3RNb2RpZmllZERhdGVQYXRoID0gb3B0aW9ucy5sYXN0TW9kaWZpZWREYXRlUGF0aCB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuTEFTVF9NT0RJRklFRF9QQVRIO1xyXG5cdFx0b3B0aW9ucy5leGNsdWRlS2V5c1doZW5VcGRhdGUgPSBvcHRpb25zLmV4Y2x1ZGVLZXlzV2hlblVwZGF0ZSB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuRVhDTFVERV9LRVlTX1dIRU5fVVBEQVRFO1xyXG5cdFx0b3B0aW9ucy5jaGlsZHJlblBhdGggPSBvcHRpb25zLmNoaWxkcmVuUGF0aCB8fCBERUZBVUxUX0NBQ0hFX09QVElPTlMuQ0hJTERSRU5fUEFUSDtcclxuXHRcdG9wdGlvbnMucGFyZW50S2V5ID0gb3B0aW9ucy5wYXJlbnRLZXkgfHwgREVGQVVMVF9DQUNIRV9PUFRJT05TLlBBUkVOVF9LRVk7XHJcblx0fVxyXG5cdCNwcmVwYXJlQ29uZmlnKCkge1xyXG5cdFx0REVGQVVMVF9UVExfQ09ORklHLlRUTCA9IEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy50dGwgfHwgREVGQVVMVF9UVExfQ09ORklHLlRUTDtcclxuXHRcdERFRkFVTFRfVFRMX0NPTkZJRy5VTklUID0gRW52TWFuYWdlci5lbnZpcm9ubWVudD8uY2FjaGU/LnR0bFVuaXQgfHwgREVGQVVMVF9UVExfQ09ORklHLlVOSVQ7XHJcblx0XHRERUZBVUxUX1RUTF9DT05GSUcuQVVUT19DSEVDSyA9IEVudk1hbmFnZXIuZW52aXJvbm1lbnQ/LmNhY2hlPy5hdXRvQ2hlY2sgPT0gJ1lFUyc7XHJcblx0XHRERUZBVUxUX1RUTF9DT05GSUcuUkVUUlkgPSBFbnZNYW5hZ2VyLmVudmlyb25tZW50Py5jYWNoZT8ucmV0cnkgfHwgREVGQVVMVF9UVExfQ09ORklHLlJFVFJZO1xyXG5cdH1cclxuXHQjYWRkMVNlY29uZFRvTW9kaWZpZWREYXRlKGRhdGU6IERhdGUpOiBEYXRlIHtcclxuXHRcdGxldCBuZXdEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xyXG5cdFx0bmV3RGF0ZS5zZXRTZWNvbmRzKG5ld0RhdGUuZ2V0U2Vjb25kcygpICsgMSk7XHJcblx0XHRyZXR1cm4gbmV3RGF0ZTtcclxuXHR9XHJcblx0I2NsZWFyKHVzZXJOYW1lOiBzdHJpbmcsIGtleU9yQWxsOiBzdHJpbmcgPSAnJykge1xyXG5cdFx0T2JqZWN0LmtleXMod2luZG93LmxvY2FsU3RvcmFnZSlcclxuXHRcdFx0LmZpbHRlcigocSkgPT4gcS5zdGFydHNXaXRoKGAke3VzZXJOYW1lfV9fJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7a2V5T3JBbGx9YCkpXHJcblx0XHRcdC5mb3JFYWNoKChrZXkpID0+IHtcclxuXHRcdFx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cdCN2YWxpZGF0ZVRUTEZvcktleShvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKSB7XHJcblx0XHRpZiAodGhpcy52YWxpZGF0ZVRUTEZvcktleSh0aGlzLiNnZXRJdGVtKG9wdGlvbnMpPy5maXJzdEZldGNoaW5nRGF0ZSkpXHJcblx0XHRcdHRoaXMuI2NsZWFyKG9wdGlvbnMudXNlck5hbWUsIG9wdGlvbnMuY2FjaGVLZXkpO1xyXG5cdH1cclxuXHR2YWxpZGF0ZVRUTEZvcktleShmaXJzdEZldGNoaW5nRGF0ZTogc3RyaW5nKSB7XHJcblx0XHRpZiAoIWZpcnN0RmV0Y2hpbmdEYXRlKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgbW9tZW50RGF0ZTEgPSBtb21lbnQobmV3IERhdGUoZmlyc3RGZXRjaGluZ0RhdGUpKTtcclxuXHRcdGNvbnN0IG1vbWVudERhdGUyID0gbW9tZW50KG5ldyBEYXRlKCkpO1xyXG5cclxuXHRcdGNvbnN0IGRpZmZlcmVuY2UgPSBtb21lbnREYXRlMi5kaWZmKG1vbWVudERhdGUxLCBERUZBVUxUX1RUTF9DT05GSUcuVU5JVCk7XHJcblxyXG5cdFx0cmV0dXJuIGRpZmZlcmVuY2UgPj0gREVGQVVMVF9UVExfQ09ORklHLlRUTDtcclxuXHR9XHJcblx0I3NldEl0ZW1Jbk1hcChrZXk6IHN0cmluZywgdmFsPzogQ2FjaGVJbmZvKTogdm9pZCB7XHJcblx0XHRjb25zdCBlbXB0eTogQ2FjaGVJbmZvID0ge1xyXG5cdFx0XHRkYXRhOiBbXSxcclxuXHRcdFx0Zmlyc3RGZXRjaGluZ0RhdGU6ICcnLFxyXG5cdFx0XHRsYXN0TW9kaWZpZWREYXRlOiAnJyxcclxuXHRcdFx0cmVzdWx0c0NvdW50OiAwLFxyXG5cdFx0XHRmZXRjaGluZ0l0ZW1zRnJvbVRoZVNlcnZlcjogZmFsc2UsXHJcblx0XHRcdG9uRmluaXNoRmV0Y2hpbmc6IG5ldyBTdWJqZWN0PENhY2hlSW5mbz4oKVxyXG5cdFx0fTtcclxuXHRcdGxldCB2YWx1ZTogQ2FjaGVJbmZvID0gdmFsID8gdmFsIDogZW1wdHk7XHJcblx0XHR0aGlzLiNmZXRjaGVkSXRlbXNba2V5XSA9IHZhbHVlO1xyXG5cdH1cclxuXHQjZ2V0SXRlbShvcHRpb25zOiBCYXNlQ2FjaGVPcHRpb25zKSB7XHJcblx0XHRsZXQgZGF0YTogQ2FjaGVJbmZvO1xyXG5cdFx0aWYgKG9wdGlvbnMuaW5NZW1vcnkpIHtcclxuXHRcdFx0ZGF0YSA9IHRoaXMuI2ZldGNoZWRJdGVtc1tvcHRpb25zLmNhY2hlS2V5XTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChgJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7b3B0aW9ucy5jYWNoZUtleX1gKTtcclxuXHRcdFx0aWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG5cdFx0XHRkYXRhID0gSlNPTi5wYXJzZSh2YWx1ZSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHR9XHJcblx0I3NldEl0ZW0odmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM6IEJhc2VDYWNoZU9wdGlvbnMpIHtcclxuXHRcdGlmIChvcHRpb25zLmluTWVtb3J5KSByZXR1cm47XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLnNldChgJHtERUZBVUxUX0NBQ0hFX09QVElPTlMuUFJFRklYfSR7b3B0aW9ucy5jYWNoZUtleX1gLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iXX0=
|