@k8slens/injectable 26.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +809 -0
- package/dist/index.js +2182 -0
- package/index.d.ts +1683 -0
- package/package.json +53 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,2182 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// index.js
|
|
20
|
+
var index_exports = {};
|
|
21
|
+
__export(index_exports, {
|
|
22
|
+
createContainer: () => createContainer_default,
|
|
23
|
+
deregistrationCallbackToken: () => deregistrationCallbackToken,
|
|
24
|
+
deregistrationDecoratorToken: () => deregistrationDecoratorToken,
|
|
25
|
+
getInjectable: () => getInjectable_default,
|
|
26
|
+
getInjectable2: () => getInjectable2_default,
|
|
27
|
+
getInjectableBunch: () => getInjectableBunch_default,
|
|
28
|
+
getInjectionToken: () => getInjectionToken,
|
|
29
|
+
getInjectionToken2: () => getInjectionToken2,
|
|
30
|
+
getKeyedSingletonCompositeKey: () => getKeyedSingletonCompositeKey,
|
|
31
|
+
getSpecificInjectionToken: () => getSpecificInjectionToken,
|
|
32
|
+
getTypedSpecifier: () => getTypedSpecifier,
|
|
33
|
+
injectionDecoratorToken: () => injectionDecoratorToken,
|
|
34
|
+
injectionTokenTag: () => injectionTokenTag,
|
|
35
|
+
instancePurgeCallbackToken: () => instancePurgeCallbackToken,
|
|
36
|
+
instantiationDecoratorToken: () => instantiationDecoratorToken,
|
|
37
|
+
isInjectable: () => isInjectable_default,
|
|
38
|
+
isInjectableBunch: () => isInjectableBunch_default,
|
|
39
|
+
isInjectionToken: () => isInjectionToken_default,
|
|
40
|
+
lifecycleEnum: () => lifecycleEnum_default,
|
|
41
|
+
preInjectCallbackToken: () => preInjectCallbackToken,
|
|
42
|
+
registrationCallbackToken: () => registrationCallbackToken,
|
|
43
|
+
registrationDecoratorToken: () => registrationDecoratorToken,
|
|
44
|
+
toFlatInjectables: () => toFlatInjectables_default
|
|
45
|
+
});
|
|
46
|
+
module.exports = __toCommonJS(index_exports);
|
|
47
|
+
|
|
48
|
+
// src/dependency-injection-container/lifecycleEnum.js
|
|
49
|
+
var nonStoredInstanceKey = Symbol("non-stored-instance-key");
|
|
50
|
+
var storedInstanceKey = Symbol("stored-instance-key");
|
|
51
|
+
var lifecycleEnum_default = {
|
|
52
|
+
singleton: {
|
|
53
|
+
id: "singleton",
|
|
54
|
+
getInstanceKey: () => storedInstanceKey
|
|
55
|
+
},
|
|
56
|
+
keyedSingleton: ({ getInstanceKey }) => ({
|
|
57
|
+
id: "keyedSingleton",
|
|
58
|
+
getInstanceKey
|
|
59
|
+
}),
|
|
60
|
+
transient: {
|
|
61
|
+
id: "transient",
|
|
62
|
+
getInstanceKey: () => nonStoredInstanceKey
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// src/getCompositeKey/getCompositeKey.js
|
|
67
|
+
var compositeKeySymbol = Symbol("composite-key");
|
|
68
|
+
var getCompositeKey = (...keys) => ({
|
|
69
|
+
[compositeKeySymbol]: true,
|
|
70
|
+
keys
|
|
71
|
+
});
|
|
72
|
+
var isCompositeKey = (thing) => thing && thing[compositeKeySymbol] === true;
|
|
73
|
+
|
|
74
|
+
// src/getInjectable/getInjectable.js
|
|
75
|
+
var injectableSymbol = "injectable";
|
|
76
|
+
var getInjectable_default = ({ lifecycle = lifecycleEnum_default.singleton, ...injectable }) => ({
|
|
77
|
+
aliasType: injectableSymbol,
|
|
78
|
+
lifecycle,
|
|
79
|
+
...injectable
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// src/getInjectable2/getInjectable2.js
|
|
83
|
+
var injectableSymbol2 = "injectable2";
|
|
84
|
+
var v2DefaultLifecycle = lifecycleEnum_default.keyedSingleton({
|
|
85
|
+
getInstanceKey: (di, ...args) => {
|
|
86
|
+
if (args.length === 0) return storedInstanceKey;
|
|
87
|
+
return getCompositeKey(...args);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
v2DefaultLifecycle._isV2DefaultLifecycle = true;
|
|
91
|
+
var getInjectable2_default = ({ instantiate: instantiate2, transient = false, ...rest }) => ({
|
|
92
|
+
aliasType: injectableSymbol2,
|
|
93
|
+
instantiate: instantiate2,
|
|
94
|
+
transient,
|
|
95
|
+
lifecycle: transient ? lifecycleEnum_default.transient : v2DefaultLifecycle,
|
|
96
|
+
...rest
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// src/getInjectionToken/injectionTokenTag.js
|
|
100
|
+
var injectionTokenTag = "injectionToken";
|
|
101
|
+
|
|
102
|
+
// src/getInjectionToken/getInjectionToken.js
|
|
103
|
+
var injectionTokenSymbol = "injection-token";
|
|
104
|
+
var getInjectionToken = ({
|
|
105
|
+
specificInjectionTokenFactory: specificTokenFactory = getSpecificTokenById,
|
|
106
|
+
target,
|
|
107
|
+
tags,
|
|
108
|
+
...rest
|
|
109
|
+
}) => {
|
|
110
|
+
const specificTokensBySpeciality = /* @__PURE__ */ new Map();
|
|
111
|
+
const specificTokensBySpecifier = /* @__PURE__ */ new Map();
|
|
112
|
+
const generalToken = Object.assign(target ?? {}, {
|
|
113
|
+
...rest,
|
|
114
|
+
tags: [injectionTokenTag, ...tags ?? []],
|
|
115
|
+
aliasType: injectionTokenSymbol,
|
|
116
|
+
for: (...specifiers) => {
|
|
117
|
+
const memoizedToken = specifiers.length === 1 ? specificTokensBySpecifier.get(specifiers[0]) : void 0;
|
|
118
|
+
if (memoizedToken) {
|
|
119
|
+
return memoizedToken;
|
|
120
|
+
}
|
|
121
|
+
const specificTokenCandidate = specificTokenFactory(...specifiers);
|
|
122
|
+
const existingSpecificToken = specificTokensBySpeciality.get(
|
|
123
|
+
specificTokenCandidate.speciality
|
|
124
|
+
);
|
|
125
|
+
if (existingSpecificToken) {
|
|
126
|
+
if (specifiers.length === 1) {
|
|
127
|
+
specificTokensBySpecifier.set(specifiers[0], existingSpecificToken);
|
|
128
|
+
}
|
|
129
|
+
return existingSpecificToken;
|
|
130
|
+
}
|
|
131
|
+
const specificToken = specificTokenCandidate;
|
|
132
|
+
specificToken.id = `${generalToken.id}/${specificToken.id}`;
|
|
133
|
+
specificToken.specificTokenOf = generalToken;
|
|
134
|
+
specificToken.maxCacheSize = generalToken.maxCacheSize;
|
|
135
|
+
specificToken.tags = generalToken.tags;
|
|
136
|
+
specificTokensBySpeciality.set(specificToken.speciality, specificToken);
|
|
137
|
+
if (specifiers.length === 1) {
|
|
138
|
+
specificTokensBySpecifier.set(specifiers[0], specificToken);
|
|
139
|
+
}
|
|
140
|
+
return specificToken;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return generalToken;
|
|
144
|
+
};
|
|
145
|
+
var getSpecificInjectionToken = (...args) => getInjectionToken(...args);
|
|
146
|
+
var getSpecificTokenById = (id) => getInjectionToken({ id, speciality: id });
|
|
147
|
+
|
|
148
|
+
// src/getInjectionToken2/getInjectionToken2.js
|
|
149
|
+
var injectionTokenSymbol2 = "injection-token2";
|
|
150
|
+
var cardinalities = ["one", "zero-or-one", "zero-or-many", "one-or-many"];
|
|
151
|
+
var buildToken = ({
|
|
152
|
+
specificInjectionTokenFactory,
|
|
153
|
+
target,
|
|
154
|
+
tags,
|
|
155
|
+
...rest
|
|
156
|
+
}) => {
|
|
157
|
+
if (rest.cardinality === void 0) {
|
|
158
|
+
if (rest.speciality === void 0) {
|
|
159
|
+
throw new Error(
|
|
160
|
+
`Tried to create injection token "${rest.id}" without cardinality.`
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
} else if (!cardinalities.includes(rest.cardinality)) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
`Tried to create injection token "${rest.id}" with unknown cardinality "${rest.cardinality}".`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
const specificTokensBySpeciality = /* @__PURE__ */ new Map();
|
|
169
|
+
const specificTokensBySpecifier = /* @__PURE__ */ new Map();
|
|
170
|
+
const generalToken = Object.assign(target ?? {}, {
|
|
171
|
+
...rest,
|
|
172
|
+
tags: [injectionTokenTag, ...tags ?? []],
|
|
173
|
+
aliasType: injectionTokenSymbol2,
|
|
174
|
+
// No factory means no `.for()` at all, matching the type: a token isn't
|
|
175
|
+
// required to be part of a family. A factory also makes the token
|
|
176
|
+
// abstract: it's only ever useful resolved via a real `.for()`, so it
|
|
177
|
+
// cannot be injected/registered directly — see checkForAbstractTokenFor
|
|
178
|
+
// and register.js's `injectionToken?.abstract` check.
|
|
179
|
+
...specificInjectionTokenFactory && {
|
|
180
|
+
abstract: true,
|
|
181
|
+
for: (...specifiers) => {
|
|
182
|
+
const memoizedToken = specifiers.length === 1 ? specificTokensBySpecifier.get(specifiers[0]) : void 0;
|
|
183
|
+
if (memoizedToken) {
|
|
184
|
+
return memoizedToken;
|
|
185
|
+
}
|
|
186
|
+
const specificTokenCandidate = specificInjectionTokenFactory(
|
|
187
|
+
...specifiers
|
|
188
|
+
);
|
|
189
|
+
const existingSpecificToken = specificTokensBySpeciality.get(
|
|
190
|
+
specificTokenCandidate.speciality
|
|
191
|
+
);
|
|
192
|
+
if (existingSpecificToken) {
|
|
193
|
+
if (specifiers.length === 1) {
|
|
194
|
+
specificTokensBySpecifier.set(specifiers[0], existingSpecificToken);
|
|
195
|
+
}
|
|
196
|
+
return existingSpecificToken;
|
|
197
|
+
}
|
|
198
|
+
const specificToken = specificTokenCandidate;
|
|
199
|
+
specificToken.id = `${generalToken.id}/${specificToken.id}`;
|
|
200
|
+
specificToken.specificTokenOf = generalToken;
|
|
201
|
+
specificToken.maxCacheSize = generalToken.maxCacheSize;
|
|
202
|
+
specificToken.tags = generalToken.tags;
|
|
203
|
+
specificToken.cardinality = specificToken.cardinality ?? generalToken.cardinality;
|
|
204
|
+
specificTokensBySpeciality.set(specificToken.speciality, specificToken);
|
|
205
|
+
if (specifiers.length === 1) {
|
|
206
|
+
specificTokensBySpecifier.set(specifiers[0], specificToken);
|
|
207
|
+
}
|
|
208
|
+
return specificToken;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
return generalToken;
|
|
213
|
+
};
|
|
214
|
+
var getInjectionToken2 = (...args) => {
|
|
215
|
+
var _a;
|
|
216
|
+
if (args.length !== 1) {
|
|
217
|
+
throw new Error(
|
|
218
|
+
`Tried to create injection token${((_a = args[0]) == null ? void 0 : _a.id) ? ` "${args[0].id}"` : ""} with ${args.length} arguments; getInjectionToken2 takes exactly one (options).`
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
const [options] = args;
|
|
222
|
+
return (specificInjectionTokenFactory) => buildToken({ ...options, specificInjectionTokenFactory });
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// src/dependency-injection-container/tokens.js
|
|
226
|
+
var untagged = (token) => {
|
|
227
|
+
token.tags = void 0;
|
|
228
|
+
return token;
|
|
229
|
+
};
|
|
230
|
+
var registrationCallbackToken = untagged(
|
|
231
|
+
getInjectionToken({
|
|
232
|
+
id: "registration-callback-token"
|
|
233
|
+
})
|
|
234
|
+
);
|
|
235
|
+
var deregistrationCallbackToken = untagged(
|
|
236
|
+
getInjectionToken({
|
|
237
|
+
id: "deregistration-callback-token"
|
|
238
|
+
})
|
|
239
|
+
);
|
|
240
|
+
var instantiationDecoratorToken = untagged(
|
|
241
|
+
getInjectionToken2({
|
|
242
|
+
id: "instantiate-decorator-token",
|
|
243
|
+
cardinality: "zero-or-many"
|
|
244
|
+
})((target) => getInjectionToken2({ id: target.id, speciality: target })())
|
|
245
|
+
);
|
|
246
|
+
var injectionDecoratorToken = untagged(
|
|
247
|
+
getInjectionToken2({
|
|
248
|
+
id: "injection-decorator-token",
|
|
249
|
+
cardinality: "zero-or-many"
|
|
250
|
+
})((target) => getInjectionToken2({ id: target.id, speciality: target })())
|
|
251
|
+
);
|
|
252
|
+
var instancePurgeCallbackToken = untagged(
|
|
253
|
+
getInjectionToken2({
|
|
254
|
+
id: "instance-purge-callback-token",
|
|
255
|
+
cardinality: "zero-or-many"
|
|
256
|
+
})((target) => getInjectionToken2({ id: target.id, speciality: target })())
|
|
257
|
+
);
|
|
258
|
+
var registrationDecoratorToken = untagged(
|
|
259
|
+
getInjectionToken2({
|
|
260
|
+
id: "registration-decorator-token",
|
|
261
|
+
cardinality: "zero-or-many"
|
|
262
|
+
})((target) => getInjectionToken2({ id: target.id, speciality: target })())
|
|
263
|
+
);
|
|
264
|
+
var deregistrationDecoratorToken = untagged(
|
|
265
|
+
getInjectionToken2({
|
|
266
|
+
id: "deregistration-decorator-token",
|
|
267
|
+
cardinality: "zero-or-many"
|
|
268
|
+
})((target) => getInjectionToken2({ id: target.id, speciality: target })())
|
|
269
|
+
);
|
|
270
|
+
var preInjectCallbackToken = untagged(
|
|
271
|
+
getInjectionToken2({
|
|
272
|
+
id: "pre-inject-callback-token",
|
|
273
|
+
cardinality: "zero-or-many"
|
|
274
|
+
})((target) => getInjectionToken2({ id: target.id, speciality: target })())
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
// src/composite-map/composite-map.js
|
|
278
|
+
var isObjectKey = (key) => typeof key === "object" && key !== null || typeof key === "function";
|
|
279
|
+
var makeNode = () => ({
|
|
280
|
+
layer: /* @__PURE__ */ new Map(),
|
|
281
|
+
weakLayer: /* @__PURE__ */ new WeakMap(),
|
|
282
|
+
children: /* @__PURE__ */ new Map(),
|
|
283
|
+
weakChildren: /* @__PURE__ */ new WeakMap(),
|
|
284
|
+
hasWeakEntries: false
|
|
285
|
+
});
|
|
286
|
+
var CompositeMap = class {
|
|
287
|
+
#internalMap = makeNode();
|
|
288
|
+
constructor(initialValues = []) {
|
|
289
|
+
for (const [key, value] of initialValues) {
|
|
290
|
+
this.set(key, value);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
#layerFor(mapEntry, key) {
|
|
294
|
+
return isObjectKey(key) ? mapEntry.weakLayer : mapEntry.layer;
|
|
295
|
+
}
|
|
296
|
+
#childrenFor(mapEntry, key) {
|
|
297
|
+
return isObjectKey(key) ? mapEntry.weakChildren : mapEntry.children;
|
|
298
|
+
}
|
|
299
|
+
#set(mapEntry, key, value) {
|
|
300
|
+
if (key.length === 1) {
|
|
301
|
+
const first = key[0];
|
|
302
|
+
this.#layerFor(mapEntry, first).set(first, value);
|
|
303
|
+
if (isObjectKey(first)) mapEntry.hasWeakEntries = true;
|
|
304
|
+
} else {
|
|
305
|
+
const [first, ...rest] = key;
|
|
306
|
+
const childMap = this.#childrenFor(mapEntry, first);
|
|
307
|
+
let nextMapEntry = childMap.get(first);
|
|
308
|
+
if (!nextMapEntry) {
|
|
309
|
+
nextMapEntry = makeNode();
|
|
310
|
+
childMap.set(first, nextMapEntry);
|
|
311
|
+
if (isObjectKey(first)) mapEntry.hasWeakEntries = true;
|
|
312
|
+
}
|
|
313
|
+
this.#set(nextMapEntry, rest, value);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
set(key, value) {
|
|
317
|
+
if (!Array.isArray(key)) {
|
|
318
|
+
throw new TypeError("Expected key to be an array");
|
|
319
|
+
}
|
|
320
|
+
if (key.length === 0) {
|
|
321
|
+
throw new TypeError("Keys must be at least length 1");
|
|
322
|
+
}
|
|
323
|
+
this.#set(this.#internalMap, key, value);
|
|
324
|
+
}
|
|
325
|
+
#get(mapEntry, key) {
|
|
326
|
+
if (key.length === 1) {
|
|
327
|
+
return this.#layerFor(mapEntry, key[0]).get(key[0]);
|
|
328
|
+
} else {
|
|
329
|
+
const [first, ...rest] = key;
|
|
330
|
+
const nextMapEntry = this.#childrenFor(mapEntry, first).get(first);
|
|
331
|
+
if (!nextMapEntry) {
|
|
332
|
+
return void 0;
|
|
333
|
+
}
|
|
334
|
+
return this.#get(nextMapEntry, rest);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
get(key) {
|
|
338
|
+
if (!Array.isArray(key)) {
|
|
339
|
+
throw new TypeError("Expected key to be an array");
|
|
340
|
+
}
|
|
341
|
+
if (key.length === 0) {
|
|
342
|
+
return void 0;
|
|
343
|
+
}
|
|
344
|
+
return this.#get(this.#internalMap, key);
|
|
345
|
+
}
|
|
346
|
+
#has(mapEntry, key) {
|
|
347
|
+
if (key.length === 1) {
|
|
348
|
+
return this.#layerFor(mapEntry, key[0]).has(key[0]);
|
|
349
|
+
} else {
|
|
350
|
+
const [first, ...rest] = key;
|
|
351
|
+
const nextMapEntry = this.#childrenFor(mapEntry, first).get(first);
|
|
352
|
+
if (!nextMapEntry) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
return this.#has(nextMapEntry, rest);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
has(key) {
|
|
359
|
+
if (!Array.isArray(key)) {
|
|
360
|
+
throw new TypeError("Expected key to be an array");
|
|
361
|
+
}
|
|
362
|
+
if (key.length === 0) {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
return this.#has(this.#internalMap, key);
|
|
366
|
+
}
|
|
367
|
+
*values() {
|
|
368
|
+
for (const [, value] of this.entries()) {
|
|
369
|
+
yield value;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
*keys() {
|
|
373
|
+
for (const [key] of this.entries()) {
|
|
374
|
+
yield key;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
*#entries(mapEntry, key) {
|
|
378
|
+
for (const [layerKey, layerValue] of mapEntry.layer.entries()) {
|
|
379
|
+
yield [[...key, layerKey], layerValue];
|
|
380
|
+
}
|
|
381
|
+
for (const [layerKey, layerMapEntry] of mapEntry.children.entries()) {
|
|
382
|
+
yield* this.#entries(layerMapEntry, [...key, layerKey]);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
*entries() {
|
|
386
|
+
yield* this.#entries(this.#internalMap, []);
|
|
387
|
+
}
|
|
388
|
+
#canPrune(node) {
|
|
389
|
+
return !node.hasWeakEntries && node.layer.size === 0 && node.children.size === 0;
|
|
390
|
+
}
|
|
391
|
+
#delete(mapEntry, key) {
|
|
392
|
+
if (key.length === 1) {
|
|
393
|
+
return this.#layerFor(mapEntry, key[0]).delete(key[0]);
|
|
394
|
+
}
|
|
395
|
+
const [first, ...rest] = key;
|
|
396
|
+
const childMap = this.#childrenFor(mapEntry, first);
|
|
397
|
+
const nextMapEntry = childMap.get(first);
|
|
398
|
+
if (!nextMapEntry) {
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
const deleted = this.#delete(nextMapEntry, rest);
|
|
402
|
+
if (deleted && this.#canPrune(nextMapEntry)) {
|
|
403
|
+
childMap.delete(first);
|
|
404
|
+
}
|
|
405
|
+
return deleted;
|
|
406
|
+
}
|
|
407
|
+
delete(key) {
|
|
408
|
+
if (!Array.isArray(key) || key.length === 0) {
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
return this.#delete(this.#internalMap, key);
|
|
412
|
+
}
|
|
413
|
+
#forEachInSubtree(mapEntry, onValue) {
|
|
414
|
+
for (const value of mapEntry.layer.values()) {
|
|
415
|
+
onValue(value);
|
|
416
|
+
}
|
|
417
|
+
for (const childEntry of mapEntry.children.values()) {
|
|
418
|
+
this.#forEachInSubtree(childEntry, onValue);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
#deleteByPrefix(mapEntry, keyPrefix, onValue) {
|
|
422
|
+
if (keyPrefix.length === 1) {
|
|
423
|
+
const key = keyPrefix[0];
|
|
424
|
+
const layer = this.#layerFor(mapEntry, key);
|
|
425
|
+
const childMap2 = this.#childrenFor(mapEntry, key);
|
|
426
|
+
let deleted2 = false;
|
|
427
|
+
if (layer.has(key)) {
|
|
428
|
+
if (onValue) onValue(layer.get(key));
|
|
429
|
+
layer.delete(key);
|
|
430
|
+
deleted2 = true;
|
|
431
|
+
}
|
|
432
|
+
const childEntry = childMap2.get(key);
|
|
433
|
+
if (childEntry) {
|
|
434
|
+
if (onValue) this.#forEachInSubtree(childEntry, onValue);
|
|
435
|
+
childMap2.delete(key);
|
|
436
|
+
deleted2 = true;
|
|
437
|
+
}
|
|
438
|
+
return deleted2;
|
|
439
|
+
}
|
|
440
|
+
const [first, ...rest] = keyPrefix;
|
|
441
|
+
const childMap = this.#childrenFor(mapEntry, first);
|
|
442
|
+
const nextMapEntry = childMap.get(first);
|
|
443
|
+
if (!nextMapEntry) {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
const deleted = this.#deleteByPrefix(nextMapEntry, rest, onValue);
|
|
447
|
+
if (deleted && this.#canPrune(nextMapEntry)) {
|
|
448
|
+
childMap.delete(first);
|
|
449
|
+
}
|
|
450
|
+
return deleted;
|
|
451
|
+
}
|
|
452
|
+
deleteByPrefix(keyPrefix, onValue) {
|
|
453
|
+
if (!Array.isArray(keyPrefix) || keyPrefix.length === 0) {
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
return this.#deleteByPrefix(this.#internalMap, keyPrefix, onValue);
|
|
457
|
+
}
|
|
458
|
+
clear() {
|
|
459
|
+
this.#internalMap = makeNode();
|
|
460
|
+
}
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
// src/composite-map/lru-composite-map.js
|
|
464
|
+
var LruCompositeMap = class {
|
|
465
|
+
#inner = new CompositeMap();
|
|
466
|
+
#maxSize;
|
|
467
|
+
#size = 0;
|
|
468
|
+
#head = null;
|
|
469
|
+
#tail = null;
|
|
470
|
+
#onEvict;
|
|
471
|
+
constructor(maxSize, { onEvict } = {}) {
|
|
472
|
+
this.#maxSize = maxSize;
|
|
473
|
+
this.#onEvict = onEvict;
|
|
474
|
+
}
|
|
475
|
+
#addToHead(node) {
|
|
476
|
+
node.next = this.#head;
|
|
477
|
+
node.prev = null;
|
|
478
|
+
if (this.#head) {
|
|
479
|
+
this.#head.prev = node;
|
|
480
|
+
}
|
|
481
|
+
this.#head = node;
|
|
482
|
+
if (!this.#tail) {
|
|
483
|
+
this.#tail = node;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
#removeNode(node) {
|
|
487
|
+
if (node.prev) {
|
|
488
|
+
node.prev.next = node.next;
|
|
489
|
+
} else {
|
|
490
|
+
this.#head = node.next;
|
|
491
|
+
}
|
|
492
|
+
if (node.next) {
|
|
493
|
+
node.next.prev = node.prev;
|
|
494
|
+
} else {
|
|
495
|
+
this.#tail = node.prev;
|
|
496
|
+
}
|
|
497
|
+
node.prev = null;
|
|
498
|
+
node.next = null;
|
|
499
|
+
}
|
|
500
|
+
#promoteNode(node) {
|
|
501
|
+
if (node === this.#head) return;
|
|
502
|
+
this.#removeNode(node);
|
|
503
|
+
this.#addToHead(node);
|
|
504
|
+
}
|
|
505
|
+
#evictLru() {
|
|
506
|
+
const lruNode = this.#tail;
|
|
507
|
+
const key = lruNode.key;
|
|
508
|
+
const wrapper = this.#inner.get(key);
|
|
509
|
+
this.#removeNode(lruNode);
|
|
510
|
+
this.#inner.delete(key);
|
|
511
|
+
this.#size--;
|
|
512
|
+
if (this.#onEvict) this.#onEvict(wrapper.value, key);
|
|
513
|
+
}
|
|
514
|
+
get(key) {
|
|
515
|
+
const wrapper = this.#inner.get(key);
|
|
516
|
+
if (wrapper === void 0) {
|
|
517
|
+
return void 0;
|
|
518
|
+
}
|
|
519
|
+
this.#promoteNode(wrapper.lruNode);
|
|
520
|
+
return wrapper.value;
|
|
521
|
+
}
|
|
522
|
+
set(key, value) {
|
|
523
|
+
const existing = this.#inner.get(key);
|
|
524
|
+
if (existing) {
|
|
525
|
+
existing.value = value;
|
|
526
|
+
this.#promoteNode(existing.lruNode);
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
529
|
+
const lruNode = { key, prev: null, next: null };
|
|
530
|
+
this.#inner.set(key, { value, lruNode });
|
|
531
|
+
this.#addToHead(lruNode);
|
|
532
|
+
this.#size++;
|
|
533
|
+
if (this.#size > this.#maxSize) {
|
|
534
|
+
this.#evictLru();
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
has(key) {
|
|
538
|
+
return this.#inner.has(key);
|
|
539
|
+
}
|
|
540
|
+
*values() {
|
|
541
|
+
for (const wrapper of this.#inner.values()) {
|
|
542
|
+
yield wrapper.value;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
*keys() {
|
|
546
|
+
yield* this.#inner.keys();
|
|
547
|
+
}
|
|
548
|
+
*entries() {
|
|
549
|
+
for (const [key, wrapper] of this.#inner.entries()) {
|
|
550
|
+
yield [key, wrapper.value];
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
deleteByPrefix(keyPrefix) {
|
|
554
|
+
return this.#inner.deleteByPrefix(keyPrefix, (wrapper) => {
|
|
555
|
+
this.#removeNode(wrapper.lruNode);
|
|
556
|
+
this.#size--;
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
clear() {
|
|
560
|
+
this.#inner.clear();
|
|
561
|
+
this.#head = null;
|
|
562
|
+
this.#tail = null;
|
|
563
|
+
this.#size = 0;
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
// src/dependency-injection-container/fastFlow.js
|
|
568
|
+
var fastFlow_default = (...functions) => (x) => {
|
|
569
|
+
let val = x;
|
|
570
|
+
functions.forEach((f) => {
|
|
571
|
+
val = f(val);
|
|
572
|
+
});
|
|
573
|
+
return val;
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
// src/dependency-injection-container/privateInjectFor.js
|
|
577
|
+
var singletonCompositeKey = [storedInstanceKey];
|
|
578
|
+
var isCompositeStorage = (stored) => stored instanceof CompositeMap || stored instanceof LruCompositeMap;
|
|
579
|
+
var privateInjectFor = ({
|
|
580
|
+
getRelatedInjectables,
|
|
581
|
+
injectableSet,
|
|
582
|
+
alreadyInjected,
|
|
583
|
+
overridingInjectables,
|
|
584
|
+
instancesByInjectableMap,
|
|
585
|
+
getDi,
|
|
586
|
+
checkForNoMatches,
|
|
587
|
+
checkForTooManyMatches,
|
|
588
|
+
checkForSideEffects,
|
|
589
|
+
checkForAbstractToken,
|
|
590
|
+
checkForNonMaybeCardinality,
|
|
591
|
+
namespacedIdByInjectableMap,
|
|
592
|
+
getNamespacedId,
|
|
593
|
+
getApplicableDecorators
|
|
594
|
+
}) => ({ withMeta }) => ({ alias, instantiationParameters, injectingInjectable }) => {
|
|
595
|
+
const di = getDi();
|
|
596
|
+
let originalInjectable;
|
|
597
|
+
const aliasType = alias.aliasType;
|
|
598
|
+
if (aliasType === injectableSymbol || aliasType === injectableSymbol2) {
|
|
599
|
+
if (!injectableSet.has(alias)) {
|
|
600
|
+
checkForNoMatches([], alias, injectingInjectable);
|
|
601
|
+
}
|
|
602
|
+
originalInjectable = alias;
|
|
603
|
+
} else {
|
|
604
|
+
checkForAbstractToken(alias, injectingInjectable);
|
|
605
|
+
const relatedInjectables = getRelatedInjectables(alias);
|
|
606
|
+
checkForTooManyMatches(relatedInjectables, alias, injectingInjectable);
|
|
607
|
+
checkForNoMatches(relatedInjectables, alias, injectingInjectable);
|
|
608
|
+
originalInjectable = relatedInjectables[0];
|
|
609
|
+
}
|
|
610
|
+
alreadyInjected.add(originalInjectable);
|
|
611
|
+
const injectable = overridingInjectables.size > 0 ? overridingInjectables.get(originalInjectable) || originalInjectable : originalInjectable;
|
|
612
|
+
checkForSideEffects(injectable, injectingInjectable);
|
|
613
|
+
if (injectable.aliasType !== injectableSymbol2 && injectable.lifecycle.id === "singleton" && instantiationParameters.length > 0 && instantiationParameters.every((p) => p === void 0)) {
|
|
614
|
+
instantiationParameters = [];
|
|
615
|
+
}
|
|
616
|
+
if (instantiationParameters.length === 0) {
|
|
617
|
+
const stored = instancesByInjectableMap.get(
|
|
618
|
+
injectable.overriddenInjectable || injectable
|
|
619
|
+
);
|
|
620
|
+
let existingInstance;
|
|
621
|
+
if (injectable.lifecycle.id === "singleton") {
|
|
622
|
+
existingInstance = stored;
|
|
623
|
+
} else if (isCompositeStorage(stored)) {
|
|
624
|
+
existingInstance = stored.get(singletonCompositeKey);
|
|
625
|
+
} else {
|
|
626
|
+
existingInstance = stored;
|
|
627
|
+
}
|
|
628
|
+
if (existingInstance) {
|
|
629
|
+
if (!withMeta) {
|
|
630
|
+
return existingInstance;
|
|
631
|
+
}
|
|
632
|
+
return {
|
|
633
|
+
instance: existingInstance,
|
|
634
|
+
meta: { id: namespacedIdByInjectableMap.get(injectable) }
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
const instance = getInstance(
|
|
639
|
+
di,
|
|
640
|
+
injectable,
|
|
641
|
+
instantiationParameters,
|
|
642
|
+
instancesByInjectableMap,
|
|
643
|
+
injectingInjectable,
|
|
644
|
+
namespacedIdByInjectableMap,
|
|
645
|
+
getNamespacedId,
|
|
646
|
+
getApplicableDecorators,
|
|
647
|
+
checkForNonMaybeCardinality
|
|
648
|
+
);
|
|
649
|
+
if (!withMeta) {
|
|
650
|
+
return instance;
|
|
651
|
+
}
|
|
652
|
+
return {
|
|
653
|
+
instance,
|
|
654
|
+
meta: { id: namespacedIdByInjectableMap.get(injectable) }
|
|
655
|
+
};
|
|
656
|
+
};
|
|
657
|
+
var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, namespacedIdByInjectableMap, checkForNonMaybeCardinality) => {
|
|
658
|
+
const shared = {
|
|
659
|
+
register: (...injectables) => {
|
|
660
|
+
di.register({
|
|
661
|
+
injectables,
|
|
662
|
+
context: [{ injectable: injectableToBeInstantiated }],
|
|
663
|
+
source: injectableToBeInstantiated
|
|
664
|
+
});
|
|
665
|
+
},
|
|
666
|
+
deregister: (...injectables) => {
|
|
667
|
+
di.deregister({
|
|
668
|
+
injectables,
|
|
669
|
+
context: [{ injectable: injectableToBeInstantiated }],
|
|
670
|
+
source: injectableToBeInstantiated
|
|
671
|
+
});
|
|
672
|
+
},
|
|
673
|
+
get sourceNamespace() {
|
|
674
|
+
const nsId = namespacedIdByInjectableMap.get(injectingInjectable);
|
|
675
|
+
const lastColon = nsId ? nsId.lastIndexOf(":") : -1;
|
|
676
|
+
return lastColon > 0 ? nsId.slice(0, lastColon) : void 0;
|
|
677
|
+
},
|
|
678
|
+
hasRegistrations: di.hasRegistrations,
|
|
679
|
+
getNumberOfRegistrations: di.getNumberOfRegistrations,
|
|
680
|
+
getNumberOfInstances: di.getNumberOfInstances,
|
|
681
|
+
purge: (alias, ...keyParts) => di.scopedPurge(injectableToBeInstantiated, alias, ...keyParts),
|
|
682
|
+
registeredInLocalScope: (alias) => di.registeredInScopeOf(injectableToBeInstantiated, alias),
|
|
683
|
+
registeredInLocalScopeSubtree: (alias) => di.registeredInSubtreeOf(injectableToBeInstantiated, alias)
|
|
684
|
+
};
|
|
685
|
+
if (injectableToBeInstantiated.aliasType === injectableSymbol2) {
|
|
686
|
+
return {
|
|
687
|
+
...shared,
|
|
688
|
+
inject: (alias) => (...params) => di.inject({
|
|
689
|
+
alias,
|
|
690
|
+
instantiationParameters: params,
|
|
691
|
+
injectingInjectable: injectableToBeInstantiated
|
|
692
|
+
}),
|
|
693
|
+
injectMany: (alias) => (...params) => di.injectMany({
|
|
694
|
+
alias,
|
|
695
|
+
instantiationParameters: params,
|
|
696
|
+
injectingInjectable: injectableToBeInstantiated
|
|
697
|
+
}),
|
|
698
|
+
injectMaybe: (alias) => {
|
|
699
|
+
checkForNonMaybeCardinality(alias, injectableToBeInstantiated);
|
|
700
|
+
return (...params) => di.injectMany({
|
|
701
|
+
alias,
|
|
702
|
+
instantiationParameters: params,
|
|
703
|
+
injectingInjectable: injectableToBeInstantiated
|
|
704
|
+
})[0];
|
|
705
|
+
},
|
|
706
|
+
injectWithMeta: (alias) => (...params) => di.injectWithMeta({
|
|
707
|
+
alias,
|
|
708
|
+
instantiationParameters: params,
|
|
709
|
+
injectingInjectable: injectableToBeInstantiated
|
|
710
|
+
}),
|
|
711
|
+
injectManyWithMeta: (alias) => (...params) => di.injectManyWithMeta({
|
|
712
|
+
alias,
|
|
713
|
+
instantiationParameters: params,
|
|
714
|
+
injectingInjectable: injectableToBeInstantiated
|
|
715
|
+
}),
|
|
716
|
+
injectMaybeWithMeta: (alias) => {
|
|
717
|
+
checkForNonMaybeCardinality(alias, injectableToBeInstantiated);
|
|
718
|
+
return (...params) => di.injectManyWithMeta({
|
|
719
|
+
alias,
|
|
720
|
+
instantiationParameters: params,
|
|
721
|
+
injectingInjectable: injectableToBeInstantiated
|
|
722
|
+
})[0];
|
|
723
|
+
}
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
const minimalInject = (alias, ...args) => di.inject({
|
|
727
|
+
alias,
|
|
728
|
+
instantiationParameters: args,
|
|
729
|
+
injectingInjectable: injectableToBeInstantiated
|
|
730
|
+
});
|
|
731
|
+
const minimalInjectMany = (alias, ...args) => di.injectMany({
|
|
732
|
+
alias,
|
|
733
|
+
instantiationParameters: args,
|
|
734
|
+
injectingInjectable: injectableToBeInstantiated
|
|
735
|
+
});
|
|
736
|
+
const minimalInjectWithMeta = (alias, ...args) => di.injectWithMeta({
|
|
737
|
+
alias,
|
|
738
|
+
instantiationParameters: args,
|
|
739
|
+
injectingInjectable: injectableToBeInstantiated
|
|
740
|
+
});
|
|
741
|
+
const minimalInjectManyWithMeta = (alias, ...args) => di.injectManyWithMeta({
|
|
742
|
+
alias,
|
|
743
|
+
instantiationParameters: args,
|
|
744
|
+
injectingInjectable: injectableToBeInstantiated
|
|
745
|
+
});
|
|
746
|
+
return {
|
|
747
|
+
...shared,
|
|
748
|
+
inject: minimalInject,
|
|
749
|
+
injectMany: minimalInjectMany,
|
|
750
|
+
injectWithMeta: minimalInjectWithMeta,
|
|
751
|
+
injectManyWithMeta: minimalInjectManyWithMeta,
|
|
752
|
+
injectFactory: (alias) => (...params) => minimalInject(alias, ...params)
|
|
753
|
+
};
|
|
754
|
+
};
|
|
755
|
+
var instantiate = (di, injectableToBeInstantiated, minimalDi, instantiationParameters, getApplicableDecorators) => {
|
|
756
|
+
const target = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
|
|
757
|
+
const decorators = getApplicableDecorators({
|
|
758
|
+
decoratorToken: instantiationDecoratorToken,
|
|
759
|
+
target,
|
|
760
|
+
injectingInjectable: injectableToBeInstantiated
|
|
761
|
+
});
|
|
762
|
+
const decorated = decorators.length === 0 ? injectableToBeInstantiated.instantiate : fastFlow_default(...decorators)(injectableToBeInstantiated.instantiate);
|
|
763
|
+
if (injectableToBeInstantiated.aliasType === injectableSymbol2) {
|
|
764
|
+
return decorated(minimalDi)(...instantiationParameters);
|
|
765
|
+
}
|
|
766
|
+
return decorated(minimalDi, ...instantiationParameters);
|
|
767
|
+
};
|
|
768
|
+
var ensureInstanceMap = (instancesByInjectableMap, key) => {
|
|
769
|
+
let instanceMap = instancesByInjectableMap.get(key);
|
|
770
|
+
if (!instanceMap) {
|
|
771
|
+
instanceMap = new CompositeMap();
|
|
772
|
+
instancesByInjectableMap.set(key, instanceMap);
|
|
773
|
+
}
|
|
774
|
+
return instanceMap;
|
|
775
|
+
};
|
|
776
|
+
var getInstance = (di, injectableToBeInstantiated, instantiationParameters, instancesByInjectableMap, injectingInjectable, namespacedIdByInjectableMap, getNamespacedId, getApplicableDecorators, checkForNonMaybeCardinality) => {
|
|
777
|
+
const cacheKey = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
|
|
778
|
+
const lifecycleId = injectableToBeInstantiated.lifecycle.id;
|
|
779
|
+
if (lifecycleId === "singleton") {
|
|
780
|
+
if (instantiationParameters.length > 0) {
|
|
781
|
+
throw new Error(
|
|
782
|
+
`Tried to inject singleton "${getNamespacedId(
|
|
783
|
+
injectableToBeInstantiated
|
|
784
|
+
)}" from "${getNamespacedId(
|
|
785
|
+
injectingInjectable
|
|
786
|
+
)}", but illegally to singletons, instantiationParameters were provided: "${instantiationParameters}".`
|
|
787
|
+
);
|
|
788
|
+
}
|
|
789
|
+
const minimalDi2 = createMinimalDi(
|
|
790
|
+
di,
|
|
791
|
+
injectableToBeInstantiated,
|
|
792
|
+
injectingInjectable,
|
|
793
|
+
namespacedIdByInjectableMap,
|
|
794
|
+
checkForNonMaybeCardinality
|
|
795
|
+
);
|
|
796
|
+
const newInstance2 = instantiate(
|
|
797
|
+
di,
|
|
798
|
+
injectableToBeInstantiated,
|
|
799
|
+
minimalDi2,
|
|
800
|
+
instantiationParameters,
|
|
801
|
+
getApplicableDecorators
|
|
802
|
+
);
|
|
803
|
+
instancesByInjectableMap.set(cacheKey, newInstance2);
|
|
804
|
+
return newInstance2;
|
|
805
|
+
}
|
|
806
|
+
if (lifecycleId === "transient") {
|
|
807
|
+
const minimalDi2 = createMinimalDi(
|
|
808
|
+
di,
|
|
809
|
+
injectableToBeInstantiated,
|
|
810
|
+
injectingInjectable,
|
|
811
|
+
namespacedIdByInjectableMap,
|
|
812
|
+
checkForNonMaybeCardinality
|
|
813
|
+
);
|
|
814
|
+
return instantiate(
|
|
815
|
+
di,
|
|
816
|
+
injectableToBeInstantiated,
|
|
817
|
+
minimalDi2,
|
|
818
|
+
instantiationParameters,
|
|
819
|
+
getApplicableDecorators
|
|
820
|
+
);
|
|
821
|
+
}
|
|
822
|
+
if (instantiationParameters.length === 0 && injectableToBeInstantiated.lifecycle._isV2DefaultLifecycle) {
|
|
823
|
+
const existing = instancesByInjectableMap.get(cacheKey);
|
|
824
|
+
if (!isCompositeStorage(existing)) {
|
|
825
|
+
const minimalDi2 = createMinimalDi(
|
|
826
|
+
di,
|
|
827
|
+
injectableToBeInstantiated,
|
|
828
|
+
injectingInjectable,
|
|
829
|
+
namespacedIdByInjectableMap,
|
|
830
|
+
checkForNonMaybeCardinality
|
|
831
|
+
);
|
|
832
|
+
const newInstance2 = instantiate(
|
|
833
|
+
di,
|
|
834
|
+
injectableToBeInstantiated,
|
|
835
|
+
minimalDi2,
|
|
836
|
+
instantiationParameters,
|
|
837
|
+
getApplicableDecorators
|
|
838
|
+
);
|
|
839
|
+
instancesByInjectableMap.set(cacheKey, newInstance2);
|
|
840
|
+
return newInstance2;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
const minimalDi = createMinimalDi(
|
|
844
|
+
di,
|
|
845
|
+
injectableToBeInstantiated,
|
|
846
|
+
injectingInjectable,
|
|
847
|
+
namespacedIdByInjectableMap,
|
|
848
|
+
checkForNonMaybeCardinality
|
|
849
|
+
);
|
|
850
|
+
const instanceKey = injectableToBeInstantiated.lifecycle.getInstanceKey(
|
|
851
|
+
minimalDi,
|
|
852
|
+
...instantiationParameters
|
|
853
|
+
);
|
|
854
|
+
const instanceCompositeKey = isCompositeKey(instanceKey) ? instanceKey.keys : [instanceKey];
|
|
855
|
+
let existingMap = instancesByInjectableMap.get(cacheKey);
|
|
856
|
+
if (injectableToBeInstantiated.lifecycle._isV2DefaultLifecycle && existingMap !== void 0 && !isCompositeStorage(existingMap)) {
|
|
857
|
+
const previousInstance = existingMap;
|
|
858
|
+
existingMap = new CompositeMap();
|
|
859
|
+
existingMap.set(singletonCompositeKey, previousInstance);
|
|
860
|
+
instancesByInjectableMap.set(cacheKey, existingMap);
|
|
861
|
+
}
|
|
862
|
+
const existingInstance = existingMap == null ? void 0 : existingMap.get(instanceCompositeKey);
|
|
863
|
+
if (existingInstance) {
|
|
864
|
+
return existingInstance;
|
|
865
|
+
}
|
|
866
|
+
const newInstance = instantiate(
|
|
867
|
+
di,
|
|
868
|
+
injectableToBeInstantiated,
|
|
869
|
+
minimalDi,
|
|
870
|
+
instantiationParameters,
|
|
871
|
+
getApplicableDecorators
|
|
872
|
+
);
|
|
873
|
+
if (instanceCompositeKey[0] !== nonStoredInstanceKey) {
|
|
874
|
+
ensureInstanceMap(instancesByInjectableMap, cacheKey).set(
|
|
875
|
+
instanceCompositeKey,
|
|
876
|
+
newInstance
|
|
877
|
+
);
|
|
878
|
+
}
|
|
879
|
+
return newInstance;
|
|
880
|
+
};
|
|
881
|
+
|
|
882
|
+
// src/dependency-injection-container/withInjectionDecoratorsFor.js
|
|
883
|
+
var withInjectionDecoratorsFor = ({ decoratorCache, getApplicableDecorators }) => (toBeDecorated) => ({ alias, instantiationParameters, injectingInjectable }) => {
|
|
884
|
+
if (decoratorCache.injection === null) {
|
|
885
|
+
decoratorCache.injection = true;
|
|
886
|
+
decoratorCache.injectionByAlias = /* @__PURE__ */ new Map();
|
|
887
|
+
}
|
|
888
|
+
let decorated = decoratorCache.injectionByAlias.get(alias);
|
|
889
|
+
if (decorated === void 0) {
|
|
890
|
+
const decorators = getApplicableDecorators({
|
|
891
|
+
decoratorToken: injectionDecoratorToken,
|
|
892
|
+
target: alias,
|
|
893
|
+
injectingInjectable
|
|
894
|
+
});
|
|
895
|
+
if (decorators.length > 0) {
|
|
896
|
+
const boundInject = (...params) => toBeDecorated({
|
|
897
|
+
alias,
|
|
898
|
+
instantiationParameters: params,
|
|
899
|
+
injectingInjectable
|
|
900
|
+
});
|
|
901
|
+
decorated = fastFlow_default(...decorators)(boundInject);
|
|
902
|
+
} else {
|
|
903
|
+
decorated = null;
|
|
904
|
+
}
|
|
905
|
+
decoratorCache.injectionByAlias.set(alias, decorated);
|
|
906
|
+
}
|
|
907
|
+
if (decorated === null) {
|
|
908
|
+
return toBeDecorated({
|
|
909
|
+
alias,
|
|
910
|
+
instantiationParameters,
|
|
911
|
+
injectingInjectable
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
return decorated(...instantiationParameters);
|
|
915
|
+
};
|
|
916
|
+
|
|
917
|
+
// src/dependency-injection-container/privateInjectManyFor.js
|
|
918
|
+
var privateInjectManyFor = ({ getRelatedInjectables, getInject, namespacedIdByInjectableMap }) => ({ withMeta }) => ({ alias, instantiationParameters, injectingInjectable }) => {
|
|
919
|
+
const inject = getInject();
|
|
920
|
+
const relatedInjectables = getRelatedInjectables(alias);
|
|
921
|
+
const n = relatedInjectables.length;
|
|
922
|
+
if (n === 0) {
|
|
923
|
+
return [];
|
|
924
|
+
}
|
|
925
|
+
const result = new Array(n);
|
|
926
|
+
const arg = {
|
|
927
|
+
alias: void 0,
|
|
928
|
+
instantiationParameters,
|
|
929
|
+
injectingInjectable: alias
|
|
930
|
+
};
|
|
931
|
+
if (withMeta) {
|
|
932
|
+
for (let i = 0; i < n; i++) {
|
|
933
|
+
const injectable = relatedInjectables[i];
|
|
934
|
+
arg.alias = injectable;
|
|
935
|
+
const instance = inject(arg);
|
|
936
|
+
result[i] = {
|
|
937
|
+
instance,
|
|
938
|
+
meta: { id: namespacedIdByInjectableMap.get(injectable) }
|
|
939
|
+
};
|
|
940
|
+
}
|
|
941
|
+
} else {
|
|
942
|
+
for (let i = 0; i < n; i++) {
|
|
943
|
+
arg.alias = relatedInjectables[i];
|
|
944
|
+
result[i] = inject(arg);
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
return result;
|
|
948
|
+
};
|
|
949
|
+
|
|
950
|
+
// src/getInjectionToken/isInjectionToken.js
|
|
951
|
+
var isInjectionToken_default = (maybeInjectionToken) => (maybeInjectionToken == null ? void 0 : maybeInjectionToken.aliasType) === injectionTokenSymbol || (maybeInjectionToken == null ? void 0 : maybeInjectionToken.aliasType) === injectionTokenSymbol2;
|
|
952
|
+
|
|
953
|
+
// src/dependency-injection-container/getNamespacedIdFor.js
|
|
954
|
+
var getNamespacedIdFor = (injectableAndRegistrationContext) => {
|
|
955
|
+
return (alias) => {
|
|
956
|
+
const id = isInjectionToken_default(alias) ? `(${alias.id})` : alias.id;
|
|
957
|
+
const registrationContext = injectableAndRegistrationContext.get(alias);
|
|
958
|
+
if (!registrationContext) {
|
|
959
|
+
return id;
|
|
960
|
+
}
|
|
961
|
+
const immediateParent = registrationContext[registrationContext.length - 1];
|
|
962
|
+
if (!immediateParent || immediateParent.injectable.aliasType === "container") {
|
|
963
|
+
return id;
|
|
964
|
+
}
|
|
965
|
+
const ids = [immediateParent.injectable.id];
|
|
966
|
+
let current = immediateParent.injectable;
|
|
967
|
+
while (true) {
|
|
968
|
+
const parentContext = injectableAndRegistrationContext.get(current);
|
|
969
|
+
if (!parentContext) {
|
|
970
|
+
break;
|
|
971
|
+
}
|
|
972
|
+
const parent = parentContext[parentContext.length - 1];
|
|
973
|
+
if (!parent || parent.injectable.aliasType === "container") {
|
|
974
|
+
break;
|
|
975
|
+
}
|
|
976
|
+
ids.push(parent.injectable.id);
|
|
977
|
+
current = parent.injectable;
|
|
978
|
+
}
|
|
979
|
+
ids.reverse();
|
|
980
|
+
ids.push(id);
|
|
981
|
+
return ids.join(":");
|
|
982
|
+
};
|
|
983
|
+
};
|
|
984
|
+
|
|
985
|
+
// src/getInjectableBunch/getInjectableBunch.js
|
|
986
|
+
var injectableBunchSymbol = "injectable-bunch";
|
|
987
|
+
var getInjectableBunch_default = (bunch) => Object.assign(bunch, {
|
|
988
|
+
aliasType: injectableBunchSymbol
|
|
989
|
+
});
|
|
990
|
+
|
|
991
|
+
// src/getInjectableBunch/isInjectableBunch.js
|
|
992
|
+
var isInjectableBunch_default = (maybeInjectableBunch) => (maybeInjectableBunch == null ? void 0 : maybeInjectableBunch.aliasType) === injectableBunchSymbol;
|
|
993
|
+
|
|
994
|
+
// src/getInjectable/isInjectable.js
|
|
995
|
+
var isInjectable_default = (maybeInjectable) => (maybeInjectable == null ? void 0 : maybeInjectable.aliasType) === injectableSymbol || (maybeInjectable == null ? void 0 : maybeInjectable.aliasType) === injectableSymbol2;
|
|
996
|
+
|
|
997
|
+
// src/dependency-injection-container/toFlatInjectables.js
|
|
998
|
+
var collectDeepBunchValues = (bunch, out) => {
|
|
999
|
+
const values = Object.values(bunch);
|
|
1000
|
+
for (let i = 0; i < values.length; i++) {
|
|
1001
|
+
const thing = values[i];
|
|
1002
|
+
if (isInjectableBunch_default(thing)) {
|
|
1003
|
+
collectDeepBunchValues(thing, out);
|
|
1004
|
+
} else if (isInjectable_default(thing)) {
|
|
1005
|
+
out.push(thing);
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
};
|
|
1009
|
+
var toFlatInjectables_default = (injectables) => {
|
|
1010
|
+
const result = [];
|
|
1011
|
+
for (let i = 0; i < injectables.length; i++) {
|
|
1012
|
+
const injectable = injectables[i];
|
|
1013
|
+
if (isInjectableBunch_default(injectable)) {
|
|
1014
|
+
collectDeepBunchValues(injectable, result);
|
|
1015
|
+
} else {
|
|
1016
|
+
result.push(injectable);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
return result;
|
|
1020
|
+
};
|
|
1021
|
+
|
|
1022
|
+
// src/dependency-injection-container/getRelatedTokens.js
|
|
1023
|
+
var tokenChainCache = /* @__PURE__ */ new WeakMap();
|
|
1024
|
+
var getRelatedTokens = (token) => {
|
|
1025
|
+
if (token === void 0) {
|
|
1026
|
+
return emptyArray;
|
|
1027
|
+
}
|
|
1028
|
+
let cached = tokenChainCache.get(token);
|
|
1029
|
+
if (cached) {
|
|
1030
|
+
return cached;
|
|
1031
|
+
}
|
|
1032
|
+
const tokens = [];
|
|
1033
|
+
let current = token;
|
|
1034
|
+
while (current !== void 0) {
|
|
1035
|
+
tokens.push(current);
|
|
1036
|
+
current = current.specificTokenOf;
|
|
1037
|
+
}
|
|
1038
|
+
tokenChainCache.set(token, tokens);
|
|
1039
|
+
return tokens;
|
|
1040
|
+
};
|
|
1041
|
+
var isRelatedToToken = (token, ancestor) => {
|
|
1042
|
+
let current = token;
|
|
1043
|
+
while (current) {
|
|
1044
|
+
if (current === ancestor) return true;
|
|
1045
|
+
current = current.specificTokenOf;
|
|
1046
|
+
}
|
|
1047
|
+
return false;
|
|
1048
|
+
};
|
|
1049
|
+
var emptyArray = [];
|
|
1050
|
+
|
|
1051
|
+
// src/dependency-injection-container/getRelatedInjectablesFor.js
|
|
1052
|
+
var arrayCache = /* @__PURE__ */ new WeakMap();
|
|
1053
|
+
var EMPTY = Object.freeze([]);
|
|
1054
|
+
var getCachedArray = (set) => {
|
|
1055
|
+
let arr = arrayCache.get(set);
|
|
1056
|
+
if (!arr) {
|
|
1057
|
+
arr = [...set];
|
|
1058
|
+
arrayCache.set(set, arr);
|
|
1059
|
+
}
|
|
1060
|
+
return arr;
|
|
1061
|
+
};
|
|
1062
|
+
var invalidateRelatedInjectablesCache = (set) => {
|
|
1063
|
+
arrayCache.delete(set);
|
|
1064
|
+
};
|
|
1065
|
+
var getRelatedInjectablesFor = ({ injectablesByInjectionToken, injectableSet }) => (alias) => {
|
|
1066
|
+
if (isInjectable_default(alias)) {
|
|
1067
|
+
return injectableSet.has(alias) ? [alias] : EMPTY;
|
|
1068
|
+
}
|
|
1069
|
+
const set = injectablesByInjectionToken.get(alias);
|
|
1070
|
+
if (!set || set.size === 0) {
|
|
1071
|
+
return EMPTY;
|
|
1072
|
+
}
|
|
1073
|
+
return getCachedArray(set);
|
|
1074
|
+
};
|
|
1075
|
+
|
|
1076
|
+
// src/dependency-injection-container/register.js
|
|
1077
|
+
var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => ({ injectables, context, source }) => {
|
|
1078
|
+
const flatInjectables = toFlatInjectables_default(injectables);
|
|
1079
|
+
const phase0Injectables = [];
|
|
1080
|
+
const registeredRegistrationDecoratorInjectables = [];
|
|
1081
|
+
const phase2Injectables = [];
|
|
1082
|
+
for (let i = 0; i < flatInjectables.length; i++) {
|
|
1083
|
+
const injectable = flatInjectables[i];
|
|
1084
|
+
if (isRelatedToToken(injectable.injectionToken, registrationDecoratorToken)) {
|
|
1085
|
+
registerSingle(injectable, context);
|
|
1086
|
+
registeredRegistrationDecoratorInjectables.push(injectable);
|
|
1087
|
+
} else if (isRelatedToToken(injectable.injectionToken, instantiationDecoratorToken)) {
|
|
1088
|
+
phase0Injectables.push(injectable);
|
|
1089
|
+
} else {
|
|
1090
|
+
phase2Injectables.push(injectable);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
let batchInProgress = true;
|
|
1094
|
+
const registeredInjectables = [];
|
|
1095
|
+
const fireCallbacksFor = (injectable) => {
|
|
1096
|
+
const callbacks2 = injectMany({
|
|
1097
|
+
alias: registrationCallbackToken,
|
|
1098
|
+
instantiationParameters: [],
|
|
1099
|
+
injectingInjectable: source
|
|
1100
|
+
});
|
|
1101
|
+
for (let j = 0; j < callbacks2.length; j++) {
|
|
1102
|
+
callbacks2[j](injectable);
|
|
1103
|
+
}
|
|
1104
|
+
};
|
|
1105
|
+
const registerThroughPipeline = (injectable) => {
|
|
1106
|
+
const decorators = getApplicableDecorators({
|
|
1107
|
+
decoratorToken: registrationDecoratorToken,
|
|
1108
|
+
target: injectable,
|
|
1109
|
+
injectingInjectable: source
|
|
1110
|
+
});
|
|
1111
|
+
if (decorators.length === 0) {
|
|
1112
|
+
registerSingle(injectable, context);
|
|
1113
|
+
registeredInjectables.push(injectable);
|
|
1114
|
+
return;
|
|
1115
|
+
}
|
|
1116
|
+
let wasRegisteredThisInjectable = false;
|
|
1117
|
+
const boundRegisterSingle = (inj) => {
|
|
1118
|
+
registerSingle(inj, context);
|
|
1119
|
+
wasRegisteredThisInjectable = true;
|
|
1120
|
+
if (!batchInProgress) {
|
|
1121
|
+
fireCallbacksFor(inj);
|
|
1122
|
+
}
|
|
1123
|
+
};
|
|
1124
|
+
const decoratedRegister = fastFlow_default(...decorators)(boundRegisterSingle);
|
|
1125
|
+
decoratedRegister(injectable);
|
|
1126
|
+
if (wasRegisteredThisInjectable) {
|
|
1127
|
+
registeredInjectables.push(injectable);
|
|
1128
|
+
}
|
|
1129
|
+
};
|
|
1130
|
+
phase0Injectables.forEach(registerThroughPipeline);
|
|
1131
|
+
phase2Injectables.forEach(registerThroughPipeline);
|
|
1132
|
+
batchInProgress = false;
|
|
1133
|
+
const callbacks = injectMany({
|
|
1134
|
+
alias: registrationCallbackToken,
|
|
1135
|
+
instantiationParameters: [],
|
|
1136
|
+
injectingInjectable: source
|
|
1137
|
+
});
|
|
1138
|
+
if (callbacks.length === 0) {
|
|
1139
|
+
return;
|
|
1140
|
+
}
|
|
1141
|
+
const fireBatchCallbacks = (injectable) => {
|
|
1142
|
+
for (let j = 0; j < callbacks.length; j++) {
|
|
1143
|
+
callbacks[j](injectable);
|
|
1144
|
+
}
|
|
1145
|
+
};
|
|
1146
|
+
registeredRegistrationDecoratorInjectables.forEach(fireBatchCallbacks);
|
|
1147
|
+
registeredInjectables.forEach(fireBatchCallbacks);
|
|
1148
|
+
};
|
|
1149
|
+
var registerSingleFor = ({
|
|
1150
|
+
injectableSet,
|
|
1151
|
+
injectableIdSet,
|
|
1152
|
+
instancesByInjectableMap,
|
|
1153
|
+
namespacedIdByInjectableMap,
|
|
1154
|
+
injectablesByInjectionToken,
|
|
1155
|
+
injectableAndRegistrationContext,
|
|
1156
|
+
childrenByParentMap,
|
|
1157
|
+
firePurgeCallbacks
|
|
1158
|
+
}) => {
|
|
1159
|
+
const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
|
|
1160
|
+
return (injectable, injectionContext) => {
|
|
1161
|
+
var _a, _b, _c, _d;
|
|
1162
|
+
const injectableId = injectable.id;
|
|
1163
|
+
if (!injectableId) {
|
|
1164
|
+
throw new Error("Tried to register injectable without ID.");
|
|
1165
|
+
}
|
|
1166
|
+
for (let i = 0; i < injectionContext.length; i++) {
|
|
1167
|
+
const parent = injectionContext[i].injectable;
|
|
1168
|
+
let children = childrenByParentMap.get(parent);
|
|
1169
|
+
if (!children) {
|
|
1170
|
+
children = /* @__PURE__ */ new Set();
|
|
1171
|
+
childrenByParentMap.set(parent, children);
|
|
1172
|
+
}
|
|
1173
|
+
children.add(injectable);
|
|
1174
|
+
}
|
|
1175
|
+
const immediateParent = injectionContext.length > 0 ? injectionContext[injectionContext.length - 1] : void 0;
|
|
1176
|
+
const isContainerLevel = !immediateParent || immediateParent.injectable.aliasType === "container";
|
|
1177
|
+
if (!isContainerLevel) {
|
|
1178
|
+
injectableAndRegistrationContext.set(injectable, injectionContext);
|
|
1179
|
+
}
|
|
1180
|
+
const namespacedId = isContainerLevel ? injectableId : getNamespacedId(injectable);
|
|
1181
|
+
if (namespacedIdByInjectableMap.has(injectable)) {
|
|
1182
|
+
throw new Error(
|
|
1183
|
+
`Tried to register same injectable multiple times: "${namespacedIdByInjectableMap.get(
|
|
1184
|
+
injectable
|
|
1185
|
+
)}"`
|
|
1186
|
+
);
|
|
1187
|
+
}
|
|
1188
|
+
if (injectableIdSet.has(namespacedId)) {
|
|
1189
|
+
throw new Error(
|
|
1190
|
+
`Tried to register multiple injectables for ID "${namespacedId}"`
|
|
1191
|
+
);
|
|
1192
|
+
}
|
|
1193
|
+
const upperBoundedCardinality = ((_a = injectable.injectionToken) == null ? void 0 : _a.cardinality) === "one" || ((_b = injectable.injectionToken) == null ? void 0 : _b.cardinality) === "zero-or-one" ? injectable.injectionToken.cardinality : void 0;
|
|
1194
|
+
if (upperBoundedCardinality) {
|
|
1195
|
+
const token = injectable.injectionToken;
|
|
1196
|
+
const registered = injectablesByInjectionToken.get(token);
|
|
1197
|
+
if (registered) {
|
|
1198
|
+
for (const member of registered) {
|
|
1199
|
+
if (member.injectionToken === token) {
|
|
1200
|
+
throw new Error(
|
|
1201
|
+
`Tried to register injectable "${namespacedId}" with injection token "${token.id}", but its cardinality "${upperBoundedCardinality}" allows at most one registration and "${namespacedIdByInjectableMap.get(
|
|
1202
|
+
member
|
|
1203
|
+
)}" is already registered.`
|
|
1204
|
+
);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
injectableIdSet.add(namespacedId);
|
|
1210
|
+
injectableSet.add(injectable);
|
|
1211
|
+
namespacedIdByInjectableMap.set(injectable, namespacedId);
|
|
1212
|
+
if ((_c = injectable.injectionToken) == null ? void 0 : _c.abstract) {
|
|
1213
|
+
throw new Error(
|
|
1214
|
+
`Tried to register injectable "${namespacedId}" with injection token "${injectable.injectionToken.id}", but it is abstract. Use ".for(specifier)" for a concrete token.`
|
|
1215
|
+
);
|
|
1216
|
+
}
|
|
1217
|
+
const maxCacheSize = injectable.maxCacheSize ?? ((_d = injectable.injectionToken) == null ? void 0 : _d.maxCacheSize);
|
|
1218
|
+
if (maxCacheSize > 0 && injectable.lifecycle.id !== "singleton") {
|
|
1219
|
+
const instanceMap = new LruCompositeMap(maxCacheSize, {
|
|
1220
|
+
onEvict: (instance, keyArray) => firePurgeCallbacks(injectable, instance, keyArray)
|
|
1221
|
+
});
|
|
1222
|
+
instancesByInjectableMap.set(injectable, instanceMap);
|
|
1223
|
+
}
|
|
1224
|
+
const tokens = getRelatedTokens(injectable.injectionToken);
|
|
1225
|
+
for (let t = 0; t < tokens.length; t++) {
|
|
1226
|
+
const token = tokens[t];
|
|
1227
|
+
let injectablesSet = injectablesByInjectionToken.get(token);
|
|
1228
|
+
if (!injectablesSet) {
|
|
1229
|
+
injectablesSet = /* @__PURE__ */ new Set();
|
|
1230
|
+
injectablesByInjectionToken.set(token, injectablesSet);
|
|
1231
|
+
}
|
|
1232
|
+
injectablesSet.add(injectable);
|
|
1233
|
+
invalidateRelatedInjectablesCache(injectablesSet);
|
|
1234
|
+
}
|
|
1235
|
+
};
|
|
1236
|
+
};
|
|
1237
|
+
|
|
1238
|
+
// src/dependency-injection-container/purgeInstances.js
|
|
1239
|
+
var singletonKeyArray = [storedInstanceKey];
|
|
1240
|
+
var keyArrayStartsWith = (keyArray, prefix) => {
|
|
1241
|
+
if (prefix.length > keyArray.length) return false;
|
|
1242
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
1243
|
+
if (keyArray[i] !== prefix[i]) return false;
|
|
1244
|
+
}
|
|
1245
|
+
return true;
|
|
1246
|
+
};
|
|
1247
|
+
var evict = (instancesByInjectableMap, injectablesInScope, keyParts) => {
|
|
1248
|
+
for (const injectable of injectablesInScope) {
|
|
1249
|
+
const stored = instancesByInjectableMap.get(injectable);
|
|
1250
|
+
if (stored === void 0) continue;
|
|
1251
|
+
if (!isCompositeStorage(stored)) {
|
|
1252
|
+
if (keyParts.length === 0 || keyArrayStartsWith(singletonKeyArray, keyParts)) {
|
|
1253
|
+
instancesByInjectableMap.delete(injectable);
|
|
1254
|
+
}
|
|
1255
|
+
continue;
|
|
1256
|
+
}
|
|
1257
|
+
if (keyParts.length === 0) {
|
|
1258
|
+
stored.clear();
|
|
1259
|
+
} else {
|
|
1260
|
+
stored.deleteByPrefix(keyParts);
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
};
|
|
1264
|
+
var purgeStoredInstancesFor = ({
|
|
1265
|
+
instancesByInjectableMap,
|
|
1266
|
+
firePurgeCallbacks,
|
|
1267
|
+
anyPurgeCallbacksRegistered
|
|
1268
|
+
}) => (injectablesInScope, keyParts) => {
|
|
1269
|
+
if (!anyPurgeCallbacksRegistered()) {
|
|
1270
|
+
evict(instancesByInjectableMap, injectablesInScope, keyParts);
|
|
1271
|
+
return;
|
|
1272
|
+
}
|
|
1273
|
+
const tuples = [];
|
|
1274
|
+
for (const injectable of injectablesInScope) {
|
|
1275
|
+
const stored = instancesByInjectableMap.get(injectable);
|
|
1276
|
+
if (stored === void 0) continue;
|
|
1277
|
+
if (!isCompositeStorage(stored)) {
|
|
1278
|
+
if (keyParts.length > 0 && !keyArrayStartsWith(singletonKeyArray, keyParts)) {
|
|
1279
|
+
continue;
|
|
1280
|
+
}
|
|
1281
|
+
tuples.push({
|
|
1282
|
+
injectable,
|
|
1283
|
+
instance: stored,
|
|
1284
|
+
keyArray: singletonKeyArray
|
|
1285
|
+
});
|
|
1286
|
+
continue;
|
|
1287
|
+
}
|
|
1288
|
+
for (const [keyArray, instance] of stored.entries()) {
|
|
1289
|
+
if (keyParts.length > 0 && !keyArrayStartsWith(keyArray, keyParts)) {
|
|
1290
|
+
continue;
|
|
1291
|
+
}
|
|
1292
|
+
tuples.push({ injectable, instance, keyArray });
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
for (const { injectable, instance, keyArray } of tuples) {
|
|
1296
|
+
firePurgeCallbacks(injectable, instance, keyArray);
|
|
1297
|
+
}
|
|
1298
|
+
evict(instancesByInjectableMap, injectablesInScope, keyParts);
|
|
1299
|
+
};
|
|
1300
|
+
var purgeInstancesFor = ({
|
|
1301
|
+
getRelatedInjectables,
|
|
1302
|
+
instancesByInjectableMap,
|
|
1303
|
+
firePurgeCallbacks,
|
|
1304
|
+
anyPurgeCallbacksRegistered
|
|
1305
|
+
}) => {
|
|
1306
|
+
const purgeStoredInstances = purgeStoredInstancesFor({
|
|
1307
|
+
instancesByInjectableMap,
|
|
1308
|
+
firePurgeCallbacks,
|
|
1309
|
+
anyPurgeCallbacksRegistered
|
|
1310
|
+
});
|
|
1311
|
+
return (alias, ...keyParts) => purgeStoredInstances(
|
|
1312
|
+
alias === void 0 ? [...instancesByInjectableMap.keys()] : getRelatedInjectables(alias),
|
|
1313
|
+
keyParts
|
|
1314
|
+
);
|
|
1315
|
+
};
|
|
1316
|
+
|
|
1317
|
+
// src/dependency-injection-container/deregister.js
|
|
1318
|
+
var deregisterFor = ({
|
|
1319
|
+
injectMany,
|
|
1320
|
+
getApplicableDecorators,
|
|
1321
|
+
injectableSet,
|
|
1322
|
+
injectableAndRegistrationContext,
|
|
1323
|
+
injectablesByInjectionToken,
|
|
1324
|
+
overridingInjectables,
|
|
1325
|
+
purgeInstances,
|
|
1326
|
+
injectableIdSet,
|
|
1327
|
+
namespacedIdByInjectableMap,
|
|
1328
|
+
childrenByParentMap,
|
|
1329
|
+
// Todo: get rid of function usage.
|
|
1330
|
+
getDi,
|
|
1331
|
+
decoratorCache,
|
|
1332
|
+
syncInjectWiring
|
|
1333
|
+
}) => ({ injectables, context, source }) => {
|
|
1334
|
+
const callbacks = injectMany({
|
|
1335
|
+
alias: deregistrationCallbackToken,
|
|
1336
|
+
instantiationParameters: [],
|
|
1337
|
+
injectingInjectable: source
|
|
1338
|
+
});
|
|
1339
|
+
const flatInjectables = toFlatInjectables_default(injectables);
|
|
1340
|
+
flatInjectables.forEach((injectable) => {
|
|
1341
|
+
callbacks.forEach((callback) => {
|
|
1342
|
+
callback(injectable);
|
|
1343
|
+
});
|
|
1344
|
+
});
|
|
1345
|
+
const di = getDi();
|
|
1346
|
+
const deregisterSingle = deregisterSingleFor({
|
|
1347
|
+
injectableSet,
|
|
1348
|
+
injectableAndRegistrationContext,
|
|
1349
|
+
injectablesByInjectionToken,
|
|
1350
|
+
overridingInjectables,
|
|
1351
|
+
purgeInstances,
|
|
1352
|
+
injectableIdSet,
|
|
1353
|
+
namespacedIdByInjectableMap,
|
|
1354
|
+
childrenByParentMap,
|
|
1355
|
+
di
|
|
1356
|
+
});
|
|
1357
|
+
let injectWiringChanged = false;
|
|
1358
|
+
flatInjectables.forEach((injectable) => {
|
|
1359
|
+
if (isRelatedToToken(injectable.injectionToken, injectionDecoratorToken)) {
|
|
1360
|
+
decoratorCache.injection = null;
|
|
1361
|
+
injectWiringChanged = true;
|
|
1362
|
+
}
|
|
1363
|
+
if (isRelatedToToken(injectable.injectionToken, preInjectCallbackToken)) {
|
|
1364
|
+
decoratorCache.preInject = null;
|
|
1365
|
+
injectWiringChanged = true;
|
|
1366
|
+
}
|
|
1367
|
+
const decorators = getApplicableDecorators({
|
|
1368
|
+
decoratorToken: deregistrationDecoratorToken,
|
|
1369
|
+
target: injectable,
|
|
1370
|
+
injectingInjectable: source
|
|
1371
|
+
});
|
|
1372
|
+
if (decorators.length === 0) {
|
|
1373
|
+
deregisterSingle(injectable);
|
|
1374
|
+
return;
|
|
1375
|
+
}
|
|
1376
|
+
const decoratedDeregister = fastFlow_default(...decorators)(deregisterSingle);
|
|
1377
|
+
decoratedDeregister(injectable);
|
|
1378
|
+
});
|
|
1379
|
+
if (injectWiringChanged) {
|
|
1380
|
+
syncInjectWiring();
|
|
1381
|
+
}
|
|
1382
|
+
};
|
|
1383
|
+
var deregisterSingleFor = ({
|
|
1384
|
+
injectableSet,
|
|
1385
|
+
injectableAndRegistrationContext,
|
|
1386
|
+
injectablesByInjectionToken,
|
|
1387
|
+
overridingInjectables,
|
|
1388
|
+
purgeInstances,
|
|
1389
|
+
injectableIdSet,
|
|
1390
|
+
namespacedIdByInjectableMap,
|
|
1391
|
+
childrenByParentMap,
|
|
1392
|
+
di
|
|
1393
|
+
}) => (injectable) => {
|
|
1394
|
+
if (isInjectionToken_default(injectable)) {
|
|
1395
|
+
throw new Error(
|
|
1396
|
+
`Tried to deregister using injection token "${injectable.id}", but deregistration using token is illegal.`
|
|
1397
|
+
);
|
|
1398
|
+
}
|
|
1399
|
+
if (!injectableSet.has(injectable)) {
|
|
1400
|
+
throw new Error(
|
|
1401
|
+
`Tried to deregister non-registered injectable "${injectable.id}".`
|
|
1402
|
+
);
|
|
1403
|
+
}
|
|
1404
|
+
const children = childrenByParentMap.get(injectable);
|
|
1405
|
+
if (children) {
|
|
1406
|
+
children.forEach((child) => {
|
|
1407
|
+
injectableAndRegistrationContext.delete(child);
|
|
1408
|
+
if (injectableSet.has(child)) {
|
|
1409
|
+
di.deregister({
|
|
1410
|
+
injectables: [child]
|
|
1411
|
+
});
|
|
1412
|
+
}
|
|
1413
|
+
});
|
|
1414
|
+
childrenByParentMap.delete(injectable);
|
|
1415
|
+
}
|
|
1416
|
+
purgeInstances(injectable);
|
|
1417
|
+
injectableAndRegistrationContext.delete(injectable);
|
|
1418
|
+
const namespacedId = namespacedIdByInjectableMap.get(injectable);
|
|
1419
|
+
injectableIdSet.delete(namespacedId);
|
|
1420
|
+
injectableSet.delete(injectable);
|
|
1421
|
+
namespacedIdByInjectableMap.delete(injectable);
|
|
1422
|
+
const tokens = getRelatedTokens(injectable.injectionToken);
|
|
1423
|
+
tokens.forEach((token) => {
|
|
1424
|
+
const tokenSet = injectablesByInjectionToken.get(token);
|
|
1425
|
+
tokenSet.delete(injectable);
|
|
1426
|
+
invalidateRelatedInjectablesCache(tokenSet);
|
|
1427
|
+
});
|
|
1428
|
+
overridingInjectables.delete(injectable);
|
|
1429
|
+
};
|
|
1430
|
+
|
|
1431
|
+
// src/dependency-injection-container/override.js
|
|
1432
|
+
var overrideFor = ({ getRelatedInjectables, earlyOverride }) => (alias, instantiateStub) => {
|
|
1433
|
+
const relatedInjectables = getRelatedInjectables(alias);
|
|
1434
|
+
if (relatedInjectables.length === 0) {
|
|
1435
|
+
if (alias.aliasType === "injection-token") {
|
|
1436
|
+
throw new Error(
|
|
1437
|
+
`Tried to override single implementation of injection token "${alias.id}", but found no registered implementations.`
|
|
1438
|
+
);
|
|
1439
|
+
}
|
|
1440
|
+
throw new Error(
|
|
1441
|
+
`Tried to override "${alias.id}" which is not registered.`
|
|
1442
|
+
);
|
|
1443
|
+
}
|
|
1444
|
+
earlyOverride(alias, instantiateStub);
|
|
1445
|
+
};
|
|
1446
|
+
var unoverrideFor = ({ overridingInjectables, getRelatedInjectables, getNamespacedId }) => (alias) => {
|
|
1447
|
+
const [injectable] = getRelatedInjectables(alias);
|
|
1448
|
+
if (!injectable) {
|
|
1449
|
+
throw new Error(
|
|
1450
|
+
`Tried to unoverride "${alias.id}", but it was not registered.`
|
|
1451
|
+
);
|
|
1452
|
+
}
|
|
1453
|
+
if (!overridingInjectables.has(injectable)) {
|
|
1454
|
+
throw new Error(
|
|
1455
|
+
`Tried to unoverride "${getNamespacedId(
|
|
1456
|
+
injectable
|
|
1457
|
+
)}", but it was not overridden.`
|
|
1458
|
+
);
|
|
1459
|
+
}
|
|
1460
|
+
overridingInjectables.delete(injectable);
|
|
1461
|
+
};
|
|
1462
|
+
|
|
1463
|
+
// src/dependency-injection-container/checkForNoMatchesFor.js
|
|
1464
|
+
var checkForNoMatchesFor = ({ getNamespacedId }) => (relatedInjectables, alias, injectingInjectable) => {
|
|
1465
|
+
if (relatedInjectables.length === 0) {
|
|
1466
|
+
throw new Error(
|
|
1467
|
+
`Tried to inject non-registered injectable "${alias.id}" from "${getNamespacedId(injectingInjectable)}".`
|
|
1468
|
+
);
|
|
1469
|
+
}
|
|
1470
|
+
};
|
|
1471
|
+
|
|
1472
|
+
// src/dependency-injection-container/checkForTooManyMatches.js
|
|
1473
|
+
var checkForTooManyMatchesFor = ({ getNamespacedId }) => (relatedInjectables, alias, injectingInjectable) => {
|
|
1474
|
+
if (relatedInjectables.length > 1) {
|
|
1475
|
+
throw new Error(
|
|
1476
|
+
`Tried to inject single injectable for injection token "${alias.id}" from "${getNamespacedId(
|
|
1477
|
+
injectingInjectable
|
|
1478
|
+
)}" but found multiple injectables: "${relatedInjectables.map(getNamespacedId).join('", "')}"`
|
|
1479
|
+
);
|
|
1480
|
+
}
|
|
1481
|
+
};
|
|
1482
|
+
|
|
1483
|
+
// src/dependency-injection-container/checkForSideEffectsFor.js
|
|
1484
|
+
var checkForSideEffectsFor = ({ getSideEffectsArePrevented, getNamespacedId }) => (injectable, injectingInjectable) => {
|
|
1485
|
+
if (getSideEffectsArePrevented(injectable)) {
|
|
1486
|
+
throw new Error(
|
|
1487
|
+
`Tried to inject "${getNamespacedId(
|
|
1488
|
+
injectable
|
|
1489
|
+
)}" from "${getNamespacedId(
|
|
1490
|
+
injectingInjectable
|
|
1491
|
+
)}" when side-effects are prevented.`
|
|
1492
|
+
);
|
|
1493
|
+
}
|
|
1494
|
+
};
|
|
1495
|
+
|
|
1496
|
+
// src/dependency-injection-container/checkForAbstractTokenFor.js
|
|
1497
|
+
var checkForAbstractTokenFor = ({ getNamespacedId }) => (alias, injectingInjectable) => {
|
|
1498
|
+
if (alias.abstract) {
|
|
1499
|
+
throw new Error(
|
|
1500
|
+
`Tried to inject injection token "${alias.id}" from "${getNamespacedId(
|
|
1501
|
+
injectingInjectable
|
|
1502
|
+
)}", but it is abstract. Use ".for(specifier)" for a concrete token.`
|
|
1503
|
+
);
|
|
1504
|
+
}
|
|
1505
|
+
};
|
|
1506
|
+
|
|
1507
|
+
// src/dependency-injection-container/checkForNonMaybeCardinalityFor.js
|
|
1508
|
+
var checkForNonMaybeCardinalityFor = ({ getNamespacedId }) => (alias, injectingInjectable) => {
|
|
1509
|
+
if (alias.cardinality !== "zero-or-one") {
|
|
1510
|
+
throw new Error(
|
|
1511
|
+
`Tried to injectMaybe "${alias.id}" from "${getNamespacedId(
|
|
1512
|
+
injectingInjectable
|
|
1513
|
+
)}", but its cardinality is "${alias.cardinality}" instead of "zero-or-one".`
|
|
1514
|
+
);
|
|
1515
|
+
}
|
|
1516
|
+
};
|
|
1517
|
+
|
|
1518
|
+
// src/dependency-injection-container/checkForUndeclaredConsumptionFor.js
|
|
1519
|
+
var declaredSetsByInjectable = /* @__PURE__ */ new WeakMap();
|
|
1520
|
+
var getDeclaredSet = (injectable) => {
|
|
1521
|
+
let declared = declaredSetsByInjectable.get(injectable);
|
|
1522
|
+
if (!declared) {
|
|
1523
|
+
declared = new Set(injectable.consumptions ?? []);
|
|
1524
|
+
declaredSetsByInjectable.set(injectable, declared);
|
|
1525
|
+
}
|
|
1526
|
+
return declared;
|
|
1527
|
+
};
|
|
1528
|
+
var checkForUndeclaredConsumptionFor = ({ getNamespacedId }) => ({ alias, injectingInjectable }) => {
|
|
1529
|
+
if (injectingInjectable.aliasType !== injectableSymbol2) {
|
|
1530
|
+
return;
|
|
1531
|
+
}
|
|
1532
|
+
if (isInjectable_default(alias)) {
|
|
1533
|
+
return;
|
|
1534
|
+
}
|
|
1535
|
+
const declared = getDeclaredSet(injectingInjectable);
|
|
1536
|
+
let candidate = alias;
|
|
1537
|
+
while (candidate !== void 0) {
|
|
1538
|
+
if (declared.has(candidate)) {
|
|
1539
|
+
return;
|
|
1540
|
+
}
|
|
1541
|
+
candidate = candidate.specificTokenOf;
|
|
1542
|
+
}
|
|
1543
|
+
throw new Error(
|
|
1544
|
+
`Tried to inject "${alias.id}" from "${getNamespacedId(
|
|
1545
|
+
injectingInjectable
|
|
1546
|
+
)}", but it is not a declared consumption.`
|
|
1547
|
+
);
|
|
1548
|
+
};
|
|
1549
|
+
|
|
1550
|
+
// src/dependency-injection-container/validate.js
|
|
1551
|
+
var isToken2 = (alias) => alias.aliasType === "injection-token2";
|
|
1552
|
+
var validateFor = ({
|
|
1553
|
+
containerId,
|
|
1554
|
+
injectableSet,
|
|
1555
|
+
injectablesByInjectionToken,
|
|
1556
|
+
namespacedIdByInjectableMap,
|
|
1557
|
+
overridingInjectables
|
|
1558
|
+
}) => () => {
|
|
1559
|
+
const verifiedIds = [];
|
|
1560
|
+
const unverifiedIds = [];
|
|
1561
|
+
const unverifiableConsumptions = [];
|
|
1562
|
+
const violations = [];
|
|
1563
|
+
for (const injectable of injectableSet) {
|
|
1564
|
+
const namespacedId = namespacedIdByInjectableMap.get(injectable);
|
|
1565
|
+
if (injectable.aliasType !== injectableSymbol2) {
|
|
1566
|
+
unverifiedIds.push(namespacedId);
|
|
1567
|
+
continue;
|
|
1568
|
+
}
|
|
1569
|
+
verifiedIds.push(namespacedId);
|
|
1570
|
+
if (overridingInjectables.has(injectable)) {
|
|
1571
|
+
continue;
|
|
1572
|
+
}
|
|
1573
|
+
for (const consumption of injectable.consumptions ?? []) {
|
|
1574
|
+
if (!isToken2(consumption)) {
|
|
1575
|
+
unverifiableConsumptions.push({
|
|
1576
|
+
injectableId: namespacedId,
|
|
1577
|
+
consumptionId: consumption.id
|
|
1578
|
+
});
|
|
1579
|
+
continue;
|
|
1580
|
+
}
|
|
1581
|
+
const { cardinality } = consumption;
|
|
1582
|
+
if (cardinality !== "one" && cardinality !== "one-or-many") {
|
|
1583
|
+
continue;
|
|
1584
|
+
}
|
|
1585
|
+
const registered = injectablesByInjectionToken.get(consumption);
|
|
1586
|
+
if (registered === void 0 || registered.size === 0) {
|
|
1587
|
+
violations.push(
|
|
1588
|
+
`Injectable "${namespacedId}" consumes injection token "${consumption.id}" with cardinality "${cardinality}", but it has no registrations.`
|
|
1589
|
+
);
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
}
|
|
1593
|
+
if (violations.length > 0) {
|
|
1594
|
+
throw new Error(
|
|
1595
|
+
`Tried to validate container "${containerId}", but found violations:
|
|
1596
|
+
${violations.map((violation) => ` - ${violation}`).join("\n")}`
|
|
1597
|
+
);
|
|
1598
|
+
}
|
|
1599
|
+
const sorted = (ids) => [...ids].sort();
|
|
1600
|
+
return {
|
|
1601
|
+
verifiedInjectables: {
|
|
1602
|
+
count: verifiedIds.length,
|
|
1603
|
+
ids: sorted(verifiedIds)
|
|
1604
|
+
},
|
|
1605
|
+
unverifiedInjectables: {
|
|
1606
|
+
count: unverifiedIds.length,
|
|
1607
|
+
ids: sorted(unverifiedIds)
|
|
1608
|
+
},
|
|
1609
|
+
unverifiableConsumptions
|
|
1610
|
+
};
|
|
1611
|
+
};
|
|
1612
|
+
|
|
1613
|
+
// src/dependency-injection-container/early-override.js
|
|
1614
|
+
var targetIsV2 = (injectable) => injectable.aliasType === injectableSymbol2 || injectable.aliasType === injectionTokenSymbol2;
|
|
1615
|
+
var asV1Shape = (stub, isV2Target) => isV2Target ? (di) => (...params) => stub(di, ...params) : stub;
|
|
1616
|
+
var asV2Shape = (stub, isV2Target) => isV2Target ? stub : (di, ...params) => stub(di)(...params);
|
|
1617
|
+
var earlyOverrideImplFor = (normalize) => ({
|
|
1618
|
+
getRelatedInjectables,
|
|
1619
|
+
alreadyInjected,
|
|
1620
|
+
overridingInjectables,
|
|
1621
|
+
getNamespacedId
|
|
1622
|
+
}) => (alias, instantiateStub) => {
|
|
1623
|
+
const relatedInjectables = getRelatedInjectables(alias);
|
|
1624
|
+
if (relatedInjectables.length > 1) {
|
|
1625
|
+
throw new Error(
|
|
1626
|
+
`Tried to override single implementation of injection token "${alias.id}", but found multiple registered implementations: "${relatedInjectables.map(getNamespacedId).join('", "')}".`
|
|
1627
|
+
);
|
|
1628
|
+
}
|
|
1629
|
+
if (relatedInjectables.length === 0 && isInjectionToken_default(alias)) {
|
|
1630
|
+
throw new Error(
|
|
1631
|
+
`Tried to early-override an injection token "${alias.id}", but that is currently not supported.`
|
|
1632
|
+
);
|
|
1633
|
+
}
|
|
1634
|
+
const originalInjectable = relatedInjectables[0] || alias;
|
|
1635
|
+
if (alreadyInjected.has(alias) || alreadyInjected.has(originalInjectable)) {
|
|
1636
|
+
throw new Error(
|
|
1637
|
+
`Tried to override injectable "${getNamespacedId(
|
|
1638
|
+
originalInjectable
|
|
1639
|
+
)}", but it was already injected.`
|
|
1640
|
+
);
|
|
1641
|
+
}
|
|
1642
|
+
overridingInjectables.set(originalInjectable, {
|
|
1643
|
+
...originalInjectable,
|
|
1644
|
+
overriddenInjectable: originalInjectable,
|
|
1645
|
+
causesSideEffects: false,
|
|
1646
|
+
instantiate: normalize(instantiateStub, targetIsV2(originalInjectable))
|
|
1647
|
+
});
|
|
1648
|
+
};
|
|
1649
|
+
var earlyOverrideFor = earlyOverrideImplFor(asV1Shape);
|
|
1650
|
+
var earlyOverride2For = earlyOverrideImplFor(asV2Shape);
|
|
1651
|
+
|
|
1652
|
+
// src/dependency-injection-container/withPreInjectCallbacksFor.js
|
|
1653
|
+
var withPreInjectCallbacksFor = ({ decoratorCache, getApplicableDecorators }) => (kind) => (toBeCalled) => (args) => {
|
|
1654
|
+
if (decoratorCache.preInject === null) {
|
|
1655
|
+
decoratorCache.preInject = true;
|
|
1656
|
+
decoratorCache.preInjectByAlias = /* @__PURE__ */ new Map();
|
|
1657
|
+
}
|
|
1658
|
+
let callbacks = decoratorCache.preInjectByAlias.get(args.alias);
|
|
1659
|
+
if (callbacks === void 0) {
|
|
1660
|
+
const applicable = getApplicableDecorators({
|
|
1661
|
+
decoratorToken: preInjectCallbackToken,
|
|
1662
|
+
target: args.alias,
|
|
1663
|
+
injectingInjectable: args.injectingInjectable
|
|
1664
|
+
});
|
|
1665
|
+
callbacks = applicable.length > 0 ? applicable : null;
|
|
1666
|
+
decoratorCache.preInjectByAlias.set(args.alias, callbacks);
|
|
1667
|
+
}
|
|
1668
|
+
if (callbacks !== null) {
|
|
1669
|
+
for (const callback of callbacks) {
|
|
1670
|
+
callback(args.alias, kind, args.injectingInjectable);
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
return toBeCalled(args);
|
|
1674
|
+
};
|
|
1675
|
+
|
|
1676
|
+
// src/dependency-injection-container/firePurgeCallbacksFor.js
|
|
1677
|
+
var firePurgeCallbacksFor = ({ getApplicableDecorators }) => (injectable, instance, keyArray) => {
|
|
1678
|
+
const payload = { instance };
|
|
1679
|
+
const callbacks = getApplicableDecorators({
|
|
1680
|
+
decoratorToken: instancePurgeCallbackToken,
|
|
1681
|
+
target: injectable,
|
|
1682
|
+
injectingInjectable: injectable
|
|
1683
|
+
});
|
|
1684
|
+
for (const cb of callbacks) {
|
|
1685
|
+
cb(payload)(...keyArray);
|
|
1686
|
+
}
|
|
1687
|
+
};
|
|
1688
|
+
|
|
1689
|
+
// src/dependency-injection-container/getApplicableDecoratorsFor.js
|
|
1690
|
+
var EMPTY2 = Object.freeze([]);
|
|
1691
|
+
var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) => ({ decoratorToken, target, injectingInjectable }) => {
|
|
1692
|
+
const registered = injectablesByInjectionToken.get(decoratorToken);
|
|
1693
|
+
if (!registered || registered.size === 0) {
|
|
1694
|
+
return EMPTY2;
|
|
1695
|
+
}
|
|
1696
|
+
const out = [];
|
|
1697
|
+
const dispatch = (alias) => {
|
|
1698
|
+
const registeredForAlias = injectablesByInjectionToken.get(alias);
|
|
1699
|
+
if (registeredForAlias && registeredForAlias.size > 0) {
|
|
1700
|
+
out.push(
|
|
1701
|
+
...injectMany({
|
|
1702
|
+
alias,
|
|
1703
|
+
instantiationParameters: [],
|
|
1704
|
+
injectingInjectable
|
|
1705
|
+
})
|
|
1706
|
+
);
|
|
1707
|
+
}
|
|
1708
|
+
};
|
|
1709
|
+
dispatch(decoratorToken.for(target));
|
|
1710
|
+
const chain = getRelatedTokens(
|
|
1711
|
+
target.injectionToken ?? target.specificTokenOf
|
|
1712
|
+
);
|
|
1713
|
+
for (const t of chain) {
|
|
1714
|
+
dispatch(decoratorToken.for(t));
|
|
1715
|
+
}
|
|
1716
|
+
const targetTags = target.tags;
|
|
1717
|
+
if (targetTags) {
|
|
1718
|
+
for (const tag of targetTags) {
|
|
1719
|
+
dispatch(decoratorToken.for(tag));
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
let processedChainTags = targetTags;
|
|
1723
|
+
for (const t of chain) {
|
|
1724
|
+
const chainTags = t.tags;
|
|
1725
|
+
if (!chainTags || chainTags === processedChainTags) {
|
|
1726
|
+
continue;
|
|
1727
|
+
}
|
|
1728
|
+
processedChainTags = chainTags;
|
|
1729
|
+
for (const tag of chainTags) {
|
|
1730
|
+
if (targetTags && targetTags.indexOf(tag) !== -1) {
|
|
1731
|
+
continue;
|
|
1732
|
+
}
|
|
1733
|
+
dispatch(decoratorToken.for(tag));
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
return out;
|
|
1737
|
+
};
|
|
1738
|
+
|
|
1739
|
+
// src/dependency-injection-container/createContainer.js
|
|
1740
|
+
var createContainer_default = (containerId) => {
|
|
1741
|
+
const injectableSet = /* @__PURE__ */ new Set();
|
|
1742
|
+
const decoratorCache = {
|
|
1743
|
+
injection: null,
|
|
1744
|
+
injectionByAlias: /* @__PURE__ */ new Map(),
|
|
1745
|
+
preInject: null,
|
|
1746
|
+
preInjectByAlias: /* @__PURE__ */ new Map()
|
|
1747
|
+
};
|
|
1748
|
+
const overridingInjectables = /* @__PURE__ */ new Map();
|
|
1749
|
+
let sideEffectsArePrevented = true;
|
|
1750
|
+
const alreadyInjected = /* @__PURE__ */ new Set();
|
|
1751
|
+
const injectablesWithPermittedSideEffects = /* @__PURE__ */ new Set();
|
|
1752
|
+
const injectableIdSet = /* @__PURE__ */ new Set();
|
|
1753
|
+
const injectableAndRegistrationContext = /* @__PURE__ */ new Map();
|
|
1754
|
+
const instancesByInjectableMap = /* @__PURE__ */ new Map();
|
|
1755
|
+
const injectablesByInjectionToken = /* @__PURE__ */ new Map();
|
|
1756
|
+
const namespacedIdByInjectableMap = /* @__PURE__ */ new Map();
|
|
1757
|
+
const childrenByParentMap = /* @__PURE__ */ new Map();
|
|
1758
|
+
const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
|
|
1759
|
+
const getRelatedInjectables = getRelatedInjectablesFor({
|
|
1760
|
+
injectablesByInjectionToken,
|
|
1761
|
+
injectableSet
|
|
1762
|
+
});
|
|
1763
|
+
const containerRootContextItem = {
|
|
1764
|
+
injectable: { id: containerId, aliasType: "container" }
|
|
1765
|
+
};
|
|
1766
|
+
const rootInjectable = containerRootContextItem.injectable;
|
|
1767
|
+
const checkForAbstractToken = checkForAbstractTokenFor({ getNamespacedId });
|
|
1768
|
+
const nonDecoratedPrivateInjectManyForUnknownMeta = privateInjectManyFor({
|
|
1769
|
+
getRelatedInjectables,
|
|
1770
|
+
// Elements go through the element slot, not `privateDi.inject`: entry
|
|
1771
|
+
// wrappers (once-per-operation hooks) must not re-fire per element,
|
|
1772
|
+
// while injection decorators still apply per element.
|
|
1773
|
+
getInject: () => elementInject,
|
|
1774
|
+
namespacedIdByInjectableMap
|
|
1775
|
+
});
|
|
1776
|
+
const nonDecoratedPrivateInjectMany = nonDecoratedPrivateInjectManyForUnknownMeta({
|
|
1777
|
+
withMeta: false
|
|
1778
|
+
});
|
|
1779
|
+
const nonDecoratedPrivateInjectManyWithMeta = nonDecoratedPrivateInjectManyForUnknownMeta({
|
|
1780
|
+
withMeta: true
|
|
1781
|
+
});
|
|
1782
|
+
const getApplicableDecorators = getApplicableDecoratorsFor({
|
|
1783
|
+
injectMany: nonDecoratedPrivateInjectMany,
|
|
1784
|
+
injectablesByInjectionToken
|
|
1785
|
+
});
|
|
1786
|
+
const getSideEffectsArePrevented = (injectable) => sideEffectsArePrevented && injectable.causesSideEffects && !injectablesWithPermittedSideEffects.has(injectable);
|
|
1787
|
+
const checkForSideEffects = checkForSideEffectsFor({
|
|
1788
|
+
getSideEffectsArePrevented,
|
|
1789
|
+
getNamespacedId
|
|
1790
|
+
});
|
|
1791
|
+
const checkForNoMatches = checkForNoMatchesFor({
|
|
1792
|
+
getNamespacedId
|
|
1793
|
+
});
|
|
1794
|
+
const checkForTooManyMatches = checkForTooManyMatchesFor({
|
|
1795
|
+
getNamespacedId
|
|
1796
|
+
});
|
|
1797
|
+
const checkForNonMaybeCardinality = checkForNonMaybeCardinalityFor({
|
|
1798
|
+
getNamespacedId
|
|
1799
|
+
});
|
|
1800
|
+
const checkForUndeclaredConsumption = checkForUndeclaredConsumptionFor({
|
|
1801
|
+
getNamespacedId
|
|
1802
|
+
});
|
|
1803
|
+
const withConsumptionEnforcement = (toBeCalled) => (args) => {
|
|
1804
|
+
checkForUndeclaredConsumption(args);
|
|
1805
|
+
return toBeCalled(args);
|
|
1806
|
+
};
|
|
1807
|
+
const nonDecoratedPrivateInjectUnknownMeta = privateInjectFor({
|
|
1808
|
+
getRelatedInjectables,
|
|
1809
|
+
injectableSet,
|
|
1810
|
+
alreadyInjected,
|
|
1811
|
+
overridingInjectables,
|
|
1812
|
+
instancesByInjectableMap,
|
|
1813
|
+
getDi: () => privateDi,
|
|
1814
|
+
checkForNoMatches,
|
|
1815
|
+
checkForTooManyMatches,
|
|
1816
|
+
checkForSideEffects,
|
|
1817
|
+
checkForAbstractToken,
|
|
1818
|
+
checkForNonMaybeCardinality,
|
|
1819
|
+
namespacedIdByInjectableMap,
|
|
1820
|
+
getNamespacedId,
|
|
1821
|
+
getApplicableDecorators
|
|
1822
|
+
});
|
|
1823
|
+
const nonDecoratedPrivateInject = nonDecoratedPrivateInjectUnknownMeta({
|
|
1824
|
+
withMeta: false
|
|
1825
|
+
});
|
|
1826
|
+
const nonDecoratedPrivateInjectWithMeta = nonDecoratedPrivateInjectUnknownMeta({
|
|
1827
|
+
withMeta: true
|
|
1828
|
+
});
|
|
1829
|
+
const withInjectionDecorators = withInjectionDecoratorsFor({
|
|
1830
|
+
decoratorCache,
|
|
1831
|
+
getApplicableDecorators
|
|
1832
|
+
});
|
|
1833
|
+
const decoratedPrivateInject = withInjectionDecorators(
|
|
1834
|
+
nonDecoratedPrivateInject
|
|
1835
|
+
);
|
|
1836
|
+
const decoratedPrivateInjectWithMeta = withInjectionDecorators(
|
|
1837
|
+
nonDecoratedPrivateInjectWithMeta
|
|
1838
|
+
);
|
|
1839
|
+
const withPreInjectCallbacks = withPreInjectCallbacksFor({
|
|
1840
|
+
decoratorCache,
|
|
1841
|
+
getApplicableDecorators
|
|
1842
|
+
});
|
|
1843
|
+
const withPreInjectCallbacksForInject = withPreInjectCallbacks("inject");
|
|
1844
|
+
const withPreInjectCallbacksForInjectMany = withPreInjectCallbacks("injectMany");
|
|
1845
|
+
const preInjectNonDecoratedInject = withPreInjectCallbacksForInject(
|
|
1846
|
+
nonDecoratedPrivateInject
|
|
1847
|
+
);
|
|
1848
|
+
const preInjectDecoratedInject = withPreInjectCallbacksForInject(
|
|
1849
|
+
decoratedPrivateInject
|
|
1850
|
+
);
|
|
1851
|
+
const preInjectNonDecoratedInjectWithMeta = withPreInjectCallbacksForInject(
|
|
1852
|
+
nonDecoratedPrivateInjectWithMeta
|
|
1853
|
+
);
|
|
1854
|
+
const preInjectDecoratedInjectWithMeta = withPreInjectCallbacksForInject(
|
|
1855
|
+
decoratedPrivateInjectWithMeta
|
|
1856
|
+
);
|
|
1857
|
+
const preInjectInjectMany = withPreInjectCallbacksForInjectMany(
|
|
1858
|
+
nonDecoratedPrivateInjectMany
|
|
1859
|
+
);
|
|
1860
|
+
const preInjectInjectManyWithMeta = withPreInjectCallbacksForInjectMany(
|
|
1861
|
+
nonDecoratedPrivateInjectManyWithMeta
|
|
1862
|
+
);
|
|
1863
|
+
let elementInject = nonDecoratedPrivateInject;
|
|
1864
|
+
const syncInjectWiring = () => {
|
|
1865
|
+
const registeredDecorators = injectablesByInjectionToken.get(
|
|
1866
|
+
injectionDecoratorToken
|
|
1867
|
+
);
|
|
1868
|
+
const decoratorsActive = registeredDecorators !== void 0 && registeredDecorators.size > 0;
|
|
1869
|
+
const registeredPreInjectCallbacks = injectablesByInjectionToken.get(
|
|
1870
|
+
preInjectCallbackToken
|
|
1871
|
+
);
|
|
1872
|
+
const preInjectActive = registeredPreInjectCallbacks !== void 0 && registeredPreInjectCallbacks.size > 0;
|
|
1873
|
+
elementInject = decoratorsActive ? decoratedPrivateInject : nonDecoratedPrivateInject;
|
|
1874
|
+
privateDi.inject = preInjectActive ? decoratorsActive ? preInjectDecoratedInject : preInjectNonDecoratedInject : elementInject;
|
|
1875
|
+
privateDi.injectWithMeta = preInjectActive ? decoratorsActive ? preInjectDecoratedInjectWithMeta : preInjectNonDecoratedInjectWithMeta : decoratorsActive ? decoratedPrivateInjectWithMeta : nonDecoratedPrivateInjectWithMeta;
|
|
1876
|
+
privateDi.injectMany = preInjectActive ? preInjectInjectMany : nonDecoratedPrivateInjectMany;
|
|
1877
|
+
privateDi.injectManyWithMeta = preInjectActive ? preInjectInjectManyWithMeta : nonDecoratedPrivateInjectManyWithMeta;
|
|
1878
|
+
privateDi.inject = withConsumptionEnforcement(privateDi.inject);
|
|
1879
|
+
privateDi.injectWithMeta = withConsumptionEnforcement(
|
|
1880
|
+
privateDi.injectWithMeta
|
|
1881
|
+
);
|
|
1882
|
+
privateDi.injectMany = withConsumptionEnforcement(privateDi.injectMany);
|
|
1883
|
+
privateDi.injectManyWithMeta = withConsumptionEnforcement(
|
|
1884
|
+
privateDi.injectManyWithMeta
|
|
1885
|
+
);
|
|
1886
|
+
};
|
|
1887
|
+
const firePurgeCallbacks = firePurgeCallbacksFor({
|
|
1888
|
+
getApplicableDecorators
|
|
1889
|
+
});
|
|
1890
|
+
const rawRegisterSingle = registerSingleFor({
|
|
1891
|
+
injectableSet,
|
|
1892
|
+
namespacedIdByInjectableMap,
|
|
1893
|
+
instancesByInjectableMap,
|
|
1894
|
+
injectablesByInjectionToken,
|
|
1895
|
+
injectableIdSet,
|
|
1896
|
+
injectableAndRegistrationContext,
|
|
1897
|
+
childrenByParentMap,
|
|
1898
|
+
firePurgeCallbacks
|
|
1899
|
+
});
|
|
1900
|
+
const registerSingle = (injectable, context) => {
|
|
1901
|
+
rawRegisterSingle(injectable, context);
|
|
1902
|
+
let wiringChanged = false;
|
|
1903
|
+
if (isRelatedToToken(injectable.injectionToken, injectionDecoratorToken)) {
|
|
1904
|
+
decoratorCache.injection = null;
|
|
1905
|
+
wiringChanged = true;
|
|
1906
|
+
}
|
|
1907
|
+
if (isRelatedToToken(injectable.injectionToken, preInjectCallbackToken)) {
|
|
1908
|
+
decoratorCache.preInject = null;
|
|
1909
|
+
wiringChanged = true;
|
|
1910
|
+
}
|
|
1911
|
+
if (wiringChanged) {
|
|
1912
|
+
syncInjectWiring();
|
|
1913
|
+
}
|
|
1914
|
+
};
|
|
1915
|
+
const anyPurgeCallbacksRegistered = () => {
|
|
1916
|
+
const registered = injectablesByInjectionToken.get(
|
|
1917
|
+
instancePurgeCallbackToken
|
|
1918
|
+
);
|
|
1919
|
+
return registered !== void 0 && registered.size > 0;
|
|
1920
|
+
};
|
|
1921
|
+
const purgeInstances = purgeInstancesFor({
|
|
1922
|
+
getRelatedInjectables,
|
|
1923
|
+
instancesByInjectableMap,
|
|
1924
|
+
firePurgeCallbacks,
|
|
1925
|
+
anyPurgeCallbacksRegistered
|
|
1926
|
+
});
|
|
1927
|
+
const purgeStoredInstances = purgeStoredInstancesFor({
|
|
1928
|
+
instancesByInjectableMap,
|
|
1929
|
+
firePurgeCallbacks,
|
|
1930
|
+
anyPurgeCallbacksRegistered
|
|
1931
|
+
});
|
|
1932
|
+
const deregister = deregisterFor({
|
|
1933
|
+
injectMany: nonDecoratedPrivateInjectMany,
|
|
1934
|
+
getApplicableDecorators,
|
|
1935
|
+
injectableSet,
|
|
1936
|
+
injectableAndRegistrationContext,
|
|
1937
|
+
injectablesByInjectionToken,
|
|
1938
|
+
overridingInjectables,
|
|
1939
|
+
purgeInstances,
|
|
1940
|
+
injectableIdSet,
|
|
1941
|
+
namespacedIdByInjectableMap,
|
|
1942
|
+
childrenByParentMap,
|
|
1943
|
+
// Todo: get rid of function usage.
|
|
1944
|
+
getDi: () => privateDi,
|
|
1945
|
+
decoratorCache,
|
|
1946
|
+
syncInjectWiring
|
|
1947
|
+
});
|
|
1948
|
+
const privateRegister = registerFor({
|
|
1949
|
+
registerSingle,
|
|
1950
|
+
injectMany: nonDecoratedPrivateInjectMany,
|
|
1951
|
+
getApplicableDecorators
|
|
1952
|
+
});
|
|
1953
|
+
const earlyOverride = earlyOverrideFor({
|
|
1954
|
+
getRelatedInjectables,
|
|
1955
|
+
alreadyInjected,
|
|
1956
|
+
overridingInjectables,
|
|
1957
|
+
getNamespacedId
|
|
1958
|
+
});
|
|
1959
|
+
const earlyOverride2 = earlyOverride2For({
|
|
1960
|
+
getRelatedInjectables,
|
|
1961
|
+
alreadyInjected,
|
|
1962
|
+
overridingInjectables,
|
|
1963
|
+
getNamespacedId
|
|
1964
|
+
});
|
|
1965
|
+
const override = overrideFor({
|
|
1966
|
+
getRelatedInjectables,
|
|
1967
|
+
earlyOverride
|
|
1968
|
+
});
|
|
1969
|
+
const override2 = overrideFor({
|
|
1970
|
+
getRelatedInjectables,
|
|
1971
|
+
earlyOverride: earlyOverride2
|
|
1972
|
+
});
|
|
1973
|
+
const unoverride = unoverrideFor({
|
|
1974
|
+
overridingInjectables,
|
|
1975
|
+
getRelatedInjectables,
|
|
1976
|
+
getNamespacedId
|
|
1977
|
+
});
|
|
1978
|
+
const purgeAllButOverrides = () => {
|
|
1979
|
+
injectableSet.clear();
|
|
1980
|
+
alreadyInjected.clear();
|
|
1981
|
+
injectableIdSet.clear();
|
|
1982
|
+
injectableAndRegistrationContext.clear();
|
|
1983
|
+
instancesByInjectableMap.clear();
|
|
1984
|
+
injectablesByInjectionToken.clear();
|
|
1985
|
+
namespacedIdByInjectableMap.clear();
|
|
1986
|
+
childrenByParentMap.clear();
|
|
1987
|
+
decoratorCache.injection = null;
|
|
1988
|
+
decoratorCache.preInject = null;
|
|
1989
|
+
syncInjectWiring();
|
|
1990
|
+
};
|
|
1991
|
+
const getImmediateScopeOf = (injectable) => {
|
|
1992
|
+
var _a;
|
|
1993
|
+
const context = injectableAndRegistrationContext.get(injectable);
|
|
1994
|
+
const immediateParent = (_a = context == null ? void 0 : context[context.length - 1]) == null ? void 0 : _a.injectable;
|
|
1995
|
+
return !immediateParent || immediateParent.aliasType === "container" ? rootInjectable : immediateParent;
|
|
1996
|
+
};
|
|
1997
|
+
const privateDi = {
|
|
1998
|
+
// Swapped by syncInjectWiring: the decorated variants are wired
|
|
1999
|
+
// in only while at least one injection decorator is registered, so the
|
|
2000
|
+
// common no-decorator case pays no wrapper frame at all.
|
|
2001
|
+
inject: nonDecoratedPrivateInject,
|
|
2002
|
+
injectWithMeta: nonDecoratedPrivateInjectWithMeta,
|
|
2003
|
+
injectMany: nonDecoratedPrivateInjectMany,
|
|
2004
|
+
injectManyWithMeta: nonDecoratedPrivateInjectManyWithMeta,
|
|
2005
|
+
injectFactory: (alias) => (...params) => publicInject(alias, ...params),
|
|
2006
|
+
register: privateRegister,
|
|
2007
|
+
deregister,
|
|
2008
|
+
override,
|
|
2009
|
+
override2,
|
|
2010
|
+
earlyOverride,
|
|
2011
|
+
earlyOverride2,
|
|
2012
|
+
unoverride,
|
|
2013
|
+
reset: () => {
|
|
2014
|
+
overridingInjectables.clear();
|
|
2015
|
+
},
|
|
2016
|
+
permitSideEffects: (alias) => {
|
|
2017
|
+
if (alias === void 0) {
|
|
2018
|
+
sideEffectsArePrevented = false;
|
|
2019
|
+
return;
|
|
2020
|
+
}
|
|
2021
|
+
getRelatedInjectables(alias).forEach(
|
|
2022
|
+
(injectable) => injectablesWithPermittedSideEffects.add(injectable)
|
|
2023
|
+
);
|
|
2024
|
+
},
|
|
2025
|
+
purge: purgeInstances,
|
|
2026
|
+
scopedPurge: (scopeInjectable, alias, ...keyParts) => {
|
|
2027
|
+
if (alias === void 0) {
|
|
2028
|
+
const children = childrenByParentMap.get(scopeInjectable);
|
|
2029
|
+
purgeStoredInstances(
|
|
2030
|
+
children === void 0 ? [scopeInjectable] : [scopeInjectable, ...children],
|
|
2031
|
+
keyParts
|
|
2032
|
+
);
|
|
2033
|
+
return;
|
|
2034
|
+
}
|
|
2035
|
+
const injectables = getRelatedInjectables(alias);
|
|
2036
|
+
const allowedChildren = childrenByParentMap.get(scopeInjectable);
|
|
2037
|
+
for (let i = 0; i < injectables.length; i++) {
|
|
2038
|
+
const injectable = injectables[i];
|
|
2039
|
+
if (injectable !== scopeInjectable && !(allowedChildren == null ? void 0 : allowedChildren.has(injectable))) {
|
|
2040
|
+
throw new Error(
|
|
2041
|
+
`Tried to purge "${namespacedIdByInjectableMap.get(
|
|
2042
|
+
injectable
|
|
2043
|
+
)}" from "${namespacedIdByInjectableMap.get(
|
|
2044
|
+
scopeInjectable
|
|
2045
|
+
)}", but it is not within its registration context tree.`
|
|
2046
|
+
);
|
|
2047
|
+
}
|
|
2048
|
+
}
|
|
2049
|
+
purgeStoredInstances(injectables, keyParts);
|
|
2050
|
+
},
|
|
2051
|
+
purgeAllButOverrides,
|
|
2052
|
+
hasRegistrations: (alias) => !!getRelatedInjectables(alias).length,
|
|
2053
|
+
getNumberOfRegistrations: (alias) => getRelatedInjectables(alias).length,
|
|
2054
|
+
registeredInScopeOf: (scopeInjectable, alias) => getRelatedInjectables(alias).some(
|
|
2055
|
+
(injectable) => getImmediateScopeOf(injectable) === scopeInjectable
|
|
2056
|
+
),
|
|
2057
|
+
registeredInSubtreeOf: (scopeInjectable, alias) => getRelatedInjectables(alias).some((injectable) => {
|
|
2058
|
+
let scope = getImmediateScopeOf(injectable);
|
|
2059
|
+
while (scope !== scopeInjectable && scope !== rootInjectable) {
|
|
2060
|
+
scope = getImmediateScopeOf(scope);
|
|
2061
|
+
}
|
|
2062
|
+
return scope === scopeInjectable;
|
|
2063
|
+
}),
|
|
2064
|
+
getNumberOfInstances: () => {
|
|
2065
|
+
const result = {};
|
|
2066
|
+
for (const [injectable, stored] of instancesByInjectableMap) {
|
|
2067
|
+
const namespacedId = namespacedIdByInjectableMap.get(injectable);
|
|
2068
|
+
if (!namespacedId) continue;
|
|
2069
|
+
let count = 0;
|
|
2070
|
+
if (isCompositeStorage(stored)) {
|
|
2071
|
+
for (const _ of stored.values()) count++;
|
|
2072
|
+
} else {
|
|
2073
|
+
count = 1;
|
|
2074
|
+
}
|
|
2075
|
+
if (count > 0) result[namespacedId] = count;
|
|
2076
|
+
}
|
|
2077
|
+
return result;
|
|
2078
|
+
}
|
|
2079
|
+
};
|
|
2080
|
+
syncInjectWiring();
|
|
2081
|
+
const publicInject = (alias, ...args) => privateDi.inject({
|
|
2082
|
+
alias,
|
|
2083
|
+
instantiationParameters: args,
|
|
2084
|
+
injectingInjectable: rootInjectable
|
|
2085
|
+
});
|
|
2086
|
+
const publicInjectMany = (alias, ...args) => privateDi.injectMany({
|
|
2087
|
+
alias,
|
|
2088
|
+
instantiationParameters: args,
|
|
2089
|
+
injectingInjectable: rootInjectable
|
|
2090
|
+
});
|
|
2091
|
+
const publicInjectWithMeta = (alias, ...args) => privateDi.injectWithMeta({
|
|
2092
|
+
alias,
|
|
2093
|
+
instantiationParameters: args,
|
|
2094
|
+
injectingInjectable: rootInjectable
|
|
2095
|
+
});
|
|
2096
|
+
const publicInjectManyWithMeta = (alias, ...args) => privateDi.injectManyWithMeta({
|
|
2097
|
+
alias,
|
|
2098
|
+
instantiationParameters: args,
|
|
2099
|
+
injectingInjectable: rootInjectable
|
|
2100
|
+
});
|
|
2101
|
+
const publicDi = {
|
|
2102
|
+
...privateDi,
|
|
2103
|
+
inject: publicInject,
|
|
2104
|
+
injectWithMeta: publicInjectWithMeta,
|
|
2105
|
+
injectMany: publicInjectMany,
|
|
2106
|
+
injectManyWithMeta: publicInjectManyWithMeta,
|
|
2107
|
+
inject2: (alias) => (...params) => publicInject(alias, ...params),
|
|
2108
|
+
injectMany2: (alias) => (...params) => publicInjectMany(alias, ...params),
|
|
2109
|
+
// Resolves per call like injectMany, but unwraps to the single instance or
|
|
2110
|
+
// undefined — the 'zero-or-one' upper bound guarantees at most one.
|
|
2111
|
+
injectMaybe2: (alias) => {
|
|
2112
|
+
checkForNonMaybeCardinality(alias, rootInjectable);
|
|
2113
|
+
return (...params) => publicInjectMany(alias, ...params)[0];
|
|
2114
|
+
},
|
|
2115
|
+
injectWithMeta2: (alias) => (...params) => publicInjectWithMeta(alias, ...params),
|
|
2116
|
+
injectManyWithMeta2: (alias) => (...params) => publicInjectManyWithMeta(alias, ...params),
|
|
2117
|
+
// injectMaybe2 over the with-meta plane: unwraps to the single
|
|
2118
|
+
// meta-wrapped instance or undefined.
|
|
2119
|
+
injectMaybeWithMeta2: (alias) => {
|
|
2120
|
+
checkForNonMaybeCardinality(alias, rootInjectable);
|
|
2121
|
+
return (...params) => publicInjectManyWithMeta(alias, ...params)[0];
|
|
2122
|
+
},
|
|
2123
|
+
register: (...injectables) => {
|
|
2124
|
+
privateDi.register({
|
|
2125
|
+
injectables,
|
|
2126
|
+
context: [containerRootContextItem],
|
|
2127
|
+
source: rootInjectable
|
|
2128
|
+
});
|
|
2129
|
+
},
|
|
2130
|
+
deregister: (...injectables) => {
|
|
2131
|
+
privateDi.deregister({
|
|
2132
|
+
injectables,
|
|
2133
|
+
context: [containerRootContextItem],
|
|
2134
|
+
source: rootInjectable
|
|
2135
|
+
});
|
|
2136
|
+
},
|
|
2137
|
+
registeredInLocalScope: (alias) => privateDi.registeredInScopeOf(rootInjectable, alias),
|
|
2138
|
+
validate: validateFor({
|
|
2139
|
+
containerId,
|
|
2140
|
+
injectableSet,
|
|
2141
|
+
injectablesByInjectionToken,
|
|
2142
|
+
namespacedIdByInjectableMap,
|
|
2143
|
+
overridingInjectables
|
|
2144
|
+
}),
|
|
2145
|
+
registeredInLocalScopeSubtree: (alias) => privateDi.registeredInSubtreeOf(rootInjectable, alias)
|
|
2146
|
+
};
|
|
2147
|
+
return publicDi;
|
|
2148
|
+
};
|
|
2149
|
+
|
|
2150
|
+
// src/getInjectionToken/getTypedSpecifier.js
|
|
2151
|
+
var import_fp = require("lodash/fp");
|
|
2152
|
+
var getTypedSpecifier = (0, import_fp.constant)(import_fp.identity);
|
|
2153
|
+
|
|
2154
|
+
// index.js
|
|
2155
|
+
var getKeyedSingletonCompositeKey = getCompositeKey;
|
|
2156
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
2157
|
+
0 && (module.exports = {
|
|
2158
|
+
createContainer,
|
|
2159
|
+
deregistrationCallbackToken,
|
|
2160
|
+
deregistrationDecoratorToken,
|
|
2161
|
+
getInjectable,
|
|
2162
|
+
getInjectable2,
|
|
2163
|
+
getInjectableBunch,
|
|
2164
|
+
getInjectionToken,
|
|
2165
|
+
getInjectionToken2,
|
|
2166
|
+
getKeyedSingletonCompositeKey,
|
|
2167
|
+
getSpecificInjectionToken,
|
|
2168
|
+
getTypedSpecifier,
|
|
2169
|
+
injectionDecoratorToken,
|
|
2170
|
+
injectionTokenTag,
|
|
2171
|
+
instancePurgeCallbackToken,
|
|
2172
|
+
instantiationDecoratorToken,
|
|
2173
|
+
isInjectable,
|
|
2174
|
+
isInjectableBunch,
|
|
2175
|
+
isInjectionToken,
|
|
2176
|
+
lifecycleEnum,
|
|
2177
|
+
preInjectCallbackToken,
|
|
2178
|
+
registrationCallbackToken,
|
|
2179
|
+
registrationDecoratorToken,
|
|
2180
|
+
toFlatInjectables
|
|
2181
|
+
});
|
|
2182
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXROYW1lc3BhY2VkSWRGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2guanMiLCAiLi4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b0ZsYXRJbmplY3RhYmxlcy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRUb2tlbnMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9yZWdpc3Rlci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3B1cmdlSW5zdGFuY2VzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZGVyZWdpc3Rlci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL292ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb01hdGNoZXNGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclRvb01hbnlNYXRjaGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JTaWRlRWZmZWN0c0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yQWJzdHJhY3RUb2tlbkZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvdmFsaWRhdGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9lYXJseS1vdmVycmlkZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9maXJlUHVyZ2VDYWxsYmFja3NGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NyZWF0ZUNvbnRhaW5lci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0VHlwZWRTcGVjaWZpZXIuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBjcmVhdGVDb250YWluZXIgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NyZWF0ZUNvbnRhaW5lcic7XG5cbmltcG9ydCBnZXRJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgZ2V0SW5qZWN0YWJsZTIgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgbGlmZWN5Y2xlRW51bSBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5cbmltcG9ydCB7XG4gIGdldEluamVjdGlvblRva2VuLFxuICBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuLFxufSBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRJbmplY3Rpb25Ub2tlbic7XG5cbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5pbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcblxuaW1wb3J0IGdldEluamVjdGFibGVCdW5jaCBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlQnVuY2gvZ2V0SW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IHsgZ2V0VHlwZWRTcGVjaWZpZXIgfSBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllcic7XG5leHBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGdldEtleWVkU2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gZ2V0Q29tcG9zaXRlS2V5O1xuXG5cblxuZXhwb3J0IHtcbiAgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gIGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG59IGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMnO1xuXG5leHBvcnQge1xuICBjcmVhdGVDb250YWluZXIsXG4gIGdldEluamVjdGFibGUsXG4gIGdldEluamVjdGFibGUyLFxuICBpc0luamVjdGFibGUsXG4gIGdldEluamVjdGFibGVCdW5jaCxcbiAgaXNJbmplY3RhYmxlQnVuY2gsXG4gIGdldEluamVjdGlvblRva2VuLFxuICBnZXRJbmplY3Rpb25Ub2tlbjIsXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG4gIGlzSW5qZWN0aW9uVG9rZW4sXG4gIGxpZmVjeWNsZUVudW0sXG4gIHRvRmxhdEluamVjdGFibGVzLFxufTtcbiIsICJleHBvcnQgY29uc3Qgbm9uU3RvcmVkSW5zdGFuY2VLZXkgPSBTeW1ib2woJ25vbi1zdG9yZWQtaW5zdGFuY2Uta2V5Jyk7XG5leHBvcnQgY29uc3Qgc3RvcmVkSW5zdGFuY2VLZXkgPSBTeW1ib2woJ3N0b3JlZC1pbnN0YW5jZS1rZXknKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzaW5nbGV0b246IHtcbiAgICBpZDogJ3NpbmdsZXRvbicsXG5cbiAgICBnZXRJbnN0YW5jZUtleTogKCkgPT4gc3RvcmVkSW5zdGFuY2VLZXksXG4gIH0sXG5cbiAga2V5ZWRTaW5nbGV0b246ICh7IGdldEluc3RhbmNlS2V5IH0pID0+ICh7XG4gICAgaWQ6ICdrZXllZFNpbmdsZXRvbicsXG4gICAgZ2V0SW5zdGFuY2VLZXksXG4gIH0pLFxuXG4gIHRyYW5zaWVudDoge1xuICAgIGlkOiAndHJhbnNpZW50JyxcbiAgICBnZXRJbnN0YW5jZUtleTogKCkgPT4gbm9uU3RvcmVkSW5zdGFuY2VLZXksXG4gIH0sXG59O1xuIiwgImV4cG9ydCBjb25zdCBjb21wb3NpdGVLZXlTeW1ib2wgPSBTeW1ib2woJ2NvbXBvc2l0ZS1rZXknKTtcbmV4cG9ydCBjb25zdCBnZXRDb21wb3NpdGVLZXkgPSAoLi4ua2V5cykgPT4gKHtcbiAgW2NvbXBvc2l0ZUtleVN5bWJvbF06IHRydWUsXG4gIGtleXMsXG59KTtcblxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlS2V5ID0gdGhpbmcgPT5cbiAgdGhpbmcgJiYgdGhpbmdbY29tcG9zaXRlS2V5U3ltYm9sXSA9PT0gdHJ1ZTtcbiIsICJpbXBvcnQgbGlmZWN5Y2xlRW51bSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlU3ltYm9sID0gJ2luamVjdGFibGUnO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBsaWZlY3ljbGUgPSBsaWZlY3ljbGVFbnVtLnNpbmdsZXRvbiwgLi4uaW5qZWN0YWJsZSB9KSA9PiAoe1xuICBhbGlhc1R5cGU6IGluamVjdGFibGVTeW1ib2wsXG4gIGxpZmVjeWNsZSxcbiAgLi4uaW5qZWN0YWJsZSxcbn0pO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcbmltcG9ydCB7IHN0b3JlZEluc3RhbmNlS2V5IH0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgZ2V0Q29tcG9zaXRlS2V5IH0gZnJvbSAnLi4vZ2V0Q29tcG9zaXRlS2V5L2dldENvbXBvc2l0ZUtleSc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlU3ltYm9sMiA9ICdpbmplY3RhYmxlMic7XG5cbi8vIEhvaXN0ZWQgYW5kIHNoYXJlZCBhY3Jvc3MgZXZlcnkgbm9uLXRyYW5zaWVudCBnZXRJbmplY3RhYmxlMiBcdTIwMTQgc2F2ZXMgYVxuLy8gcGVyLWNhbGwgbGlmZWN5Y2xlIGFsbG9jYXRpb24sIGFuZCB0aGUgYF9pc1YyRGVmYXVsdExpZmVjeWNsZWAgdGFnIGxldHNcbi8vIHByaXZhdGVJbmplY3RGb3Igc2tpcCB0aGUgZ2V0SW5zdGFuY2VLZXkgY2FsbCArIGtleS1hcnJheSBhbGxvY2F0aW9uIHdoZW5cbi8vIGEgdjIgaW5qZWN0YWJsZSBpcyBpbmplY3RlZCB3aXRoIG5vIGFyZ3MgKHRoZSBjb21tb24gY2FzZSBmb3Jcbi8vIG5vbi1wYXJhbWV0cmljIHYyKS4gVGhlIHRhZyBpcyB0aGUgKm9ubHkqIHNpZ25hbCB3ZSB0cnVzdCB0byBieXBhc3Ncbi8vIGdldEluc3RhbmNlS2V5IGJlY2F1c2UgdXNlci1wcm92aWRlZCBnZXRJbnN0YW5jZUtleSBtYXkgbGVnaXRpbWF0ZWx5XG4vLyByZXR1cm4gc29tZXRoaW5nIG90aGVyIHRoYW4gYHN0b3JlZEluc3RhbmNlS2V5YCBmb3IgZW1wdHkgYXJncy5cbmNvbnN0IHYyRGVmYXVsdExpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0ua2V5ZWRTaW5nbGV0b24oe1xuICBnZXRJbnN0YW5jZUtleTogKGRpLCAuLi5hcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gc3RvcmVkSW5zdGFuY2VLZXk7XG4gICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleSguLi5hcmdzKTtcbiAgfSxcbn0pO1xuXG52MkRlZmF1bHRMaWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlID0gdHJ1ZTtcblxuZXhwb3J0IGRlZmF1bHQgKHsgaW5zdGFudGlhdGUsIHRyYW5zaWVudCA9IGZhbHNlLCAuLi5yZXN0IH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbDIsXG4gIGluc3RhbnRpYXRlLFxuICB0cmFuc2llbnQsXG4gIGxpZmVjeWNsZTogdHJhbnNpZW50ID8gbGlmZWN5Y2xlRW51bS50cmFuc2llbnQgOiB2MkRlZmF1bHRMaWZlY3ljbGUsXG4gIC4uLnJlc3QsXG59KTtcbiIsICIvLyBUaGUgaW5pdGlhbCB0YWcgY2FycmllZCBieSBldmVyeSBpbmplY3Rpb24gdG9rZW4gKHYxIGFuZCB2MiksIHBlcm1pdHRpbmdcbi8vIHRhZy1rZXllZCBkZWNvcmF0b3JzIHRvIHRhcmdldCBhbnkgdG9rZW4sIGUuZy5cbi8vIGBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbi5mb3IoaW5qZWN0aW9uVG9rZW5UYWcpYC5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25Ub2tlblRhZyA9ICdpbmplY3Rpb25Ub2tlbic7XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5UYWcgfSBmcm9tICcuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sID0gJ2luamVjdGlvbi10b2tlbic7XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbiA9ICh7XG4gIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5OiBzcGVjaWZpY1Rva2VuRmFjdG9yeSA9IGdldFNwZWNpZmljVG9rZW5CeUlkLFxuXG4gIHRhcmdldCxcblxuICB0YWdzLFxuXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGZhY3RvcnkgaXMgYXNzdW1lZCBwdXJlIGFuZCBkZXRlcm1pbmlzdGljOiBhIHNwZWNpZmllciBhbHdheXMgbWFwc1xuICAvLyB0byB0aGUgc2FtZSB0b2tlbiwgc28gc2luZ2xlLXNwZWNpZmllciBjYWxscyBhcmUgbWVtb2l6ZWQgYnkgc3BlY2lmaWVyXG4gIC8vIHRvIHNraXAgY29uc3RydWN0aW5nIGEgdGhyb3dhd2F5IGNhbmRpZGF0ZSBvbiByZXBlYXQgYC5mb3IoKWAgY2FsbHMuXG4gIGNvbnN0IHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgZ2VuZXJhbFRva2VuID0gT2JqZWN0LmFzc2lnbih0YXJnZXQgPz8ge30sIHtcbiAgICAuLi5yZXN0LFxuXG4gICAgdGFnczogW2luamVjdGlvblRva2VuVGFnLCAuLi4odGFncyA/PyBbXSldLFxuXG4gICAgYWxpYXNUeXBlOiBpbmplY3Rpb25Ub2tlblN5bWJvbCxcblxuICAgIGZvcjogKC4uLnNwZWNpZmllcnMpID0+IHtcbiAgICAgIGNvbnN0IG1lbW9pemVkVG9rZW4gPVxuICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgID8gc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5nZXQoc3BlY2lmaWVyc1swXSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY1Rva2VuRmFjdG9yeSguLi5zcGVjaWZpZXJzKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpY1Rva2VuID0gc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkuZ2V0KFxuICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICApO1xuXG4gICAgICBpZiAoZXhpc3RpbmdTcGVjaWZpY1Rva2VuKSB7XG4gICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIGV4aXN0aW5nU3BlY2lmaWNUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjaWZpY1Rva2VuID0gc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZTtcblxuICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICBzcGVjaWZpY1Rva2VuLnNwZWNpZmljVG9rZW5PZiA9IGdlbmVyYWxUb2tlbjtcbiAgICAgIHNwZWNpZmljVG9rZW4ubWF4Q2FjaGVTaXplID0gZ2VuZXJhbFRva2VuLm1heENhY2hlU2l6ZTtcbiAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuXG4gICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIHNwZWNpZmljVG9rZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3BlY2lmaWNUb2tlbjtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gZ2VuZXJhbFRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4gPSAoLi4uYXJncykgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4oLi4uYXJncyk7XG5cbmNvbnN0IGdldFNwZWNpZmljVG9rZW5CeUlkID0gaWQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4oeyBpZCwgc3BlY2lhbGl0eTogaWQgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5UYWcgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZyc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25Ub2tlblN5bWJvbDIgPSAnaW5qZWN0aW9uLXRva2VuMic7XG5cbmNvbnN0IGNhcmRpbmFsaXRpZXMgPSBbJ29uZScsICd6ZXJvLW9yLW9uZScsICd6ZXJvLW9yLW1hbnknLCAnb25lLW9yLW1hbnknXTtcblxuY29uc3QgYnVpbGRUb2tlbiA9ICh7XG4gIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5LFxuICB0YXJnZXQsXG4gIHRhZ3MsXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgLy8gQSBzcGVjaWZpYyB0b2tlbiBtYXkgZGVjbGFyZSBpdHMgb3duIGNhcmRpbmFsaXR5IFx1MjAxNCBpdHMgZmFtaWx5J3MgZ2VuZXJhbFxuICAvLyB0b2tlbiBvZnRlbiBoYXMgYSBkaWZmZXJlbnQgb25lIFx1MjAxNCBhbmQgaW5oZXJpdHMgd2hlbiBpdCBkb2VzIG5vdCwgd2hpY2hcbiAgLy8gaXMgd2h5IG9ubHkgZ2VuZXJhbCB0b2tlbnMgYXJlIHJlcXVpcmVkIHRvIGRlY2xhcmUuXG4gIGlmIChyZXN0LmNhcmRpbmFsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmVzdC5zcGVjaWFsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4gXCIke3Jlc3QuaWR9XCIgd2l0aG91dCBjYXJkaW5hbGl0eS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWNhcmRpbmFsaXRpZXMuaW5jbHVkZXMocmVzdC5jYXJkaW5hbGl0eSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRoIHVua25vd24gY2FyZGluYWxpdHkgXCIke3Jlc3QuY2FyZGluYWxpdHl9XCIuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGZhY3RvcnkgaXMgYXNzdW1lZCBwdXJlIGFuZCBkZXRlcm1pbmlzdGljOiBhIHNwZWNpZmllciBhbHdheXMgbWFwc1xuICAvLyB0byB0aGUgc2FtZSB0b2tlbiwgc28gc2luZ2xlLXNwZWNpZmllciBjYWxscyBhcmUgbWVtb2l6ZWQgYnkgc3BlY2lmaWVyXG4gIC8vIHRvIHNraXAgY29uc3RydWN0aW5nIGEgdGhyb3dhd2F5IGNhbmRpZGF0ZSBvbiByZXBlYXQgYC5mb3IoKWAgY2FsbHMuXG4gIGNvbnN0IHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgZ2VuZXJhbFRva2VuID0gT2JqZWN0LmFzc2lnbih0YXJnZXQgPz8ge30sIHtcbiAgICAuLi5yZXN0LFxuXG4gICAgdGFnczogW2luamVjdGlvblRva2VuVGFnLCAuLi4odGFncyA/PyBbXSldLFxuXG4gICAgYWxpYXNUeXBlOiBpbmplY3Rpb25Ub2tlblN5bWJvbDIsXG5cbiAgICAvLyBObyBmYWN0b3J5IG1lYW5zIG5vIGAuZm9yKClgIGF0IGFsbCwgbWF0Y2hpbmcgdGhlIHR5cGU6IGEgdG9rZW4gaXNuJ3RcbiAgICAvLyByZXF1aXJlZCB0byBiZSBwYXJ0IG9mIGEgZmFtaWx5LiBBIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW5cbiAgICAvLyBhYnN0cmFjdDogaXQncyBvbmx5IGV2ZXIgdXNlZnVsIHJlc29sdmVkIHZpYSBhIHJlYWwgYC5mb3IoKWAsIHNvIGl0XG4gICAgLy8gY2Fubm90IGJlIGluamVjdGVkL3JlZ2lzdGVyZWQgZGlyZWN0bHkgXHUyMDE0IHNlZSBjaGVja0ZvckFic3RyYWN0VG9rZW5Gb3JcbiAgICAvLyBhbmQgcmVnaXN0ZXIuanMncyBgaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0YCBjaGVjay5cbiAgICAuLi4oc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgJiYge1xuICAgICAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgICAgIGZvcjogKC4uLnNwZWNpZmllcnMpID0+IHtcbiAgICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgICAgc3BlY2lmaWVycy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5nZXQoc3BlY2lmaWVyc1swXSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbW9pemVkVG9rZW47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlID0gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkoXG4gICAgICAgICAgLi4uc3BlY2lmaWVycyxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgICAgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZS5zcGVjaWFsaXR5LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIGV4aXN0aW5nU3BlY2lmaWNUb2tlbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nU3BlY2lmaWNUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICAgIHNwZWNpZmljVG9rZW4uaWQgPSBgJHtnZW5lcmFsVG9rZW4uaWR9LyR7c3BlY2lmaWNUb2tlbi5pZH1gO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLnNwZWNpZmljVG9rZW5PZiA9IGdlbmVyYWxUb2tlbjtcbiAgICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLnRhZ3MgPSBnZW5lcmFsVG9rZW4udGFncztcbiAgICAgICAgc3BlY2lmaWNUb2tlbi5jYXJkaW5hbGl0eSA9XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbi5jYXJkaW5hbGl0eSA/PyBnZW5lcmFsVG9rZW4uY2FyZGluYWxpdHk7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkuc2V0KHNwZWNpZmljVG9rZW4uc3BlY2lhbGl0eSwgc3BlY2lmaWNUb2tlbik7XG5cbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3BlY2lmaWNUb2tlbjtcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0aW9uVG9rZW4yID0gKC4uLmFyZ3MpID0+IHtcbiAgLy8gQSBzaW5nbGUsIG5vbi1jdXJyaWVkIGNhbGw6IG9wdGlvbnMgZ2l2ZW4gZGlyZWN0bHksIGZhY3RvcnkgY3VycmllZCBhc1xuICAvLyBpdHMgb3duIHRyYWlsaW5nIGNhbGwgXHUyMDE0IGdldEluamVjdGlvblRva2VuMihvcHRpb25zKShmYWN0b3J5KSwgb3JcbiAgLy8gZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKCkgZm9yIGEgY29uY3JldGUgdG9rZW4gd2l0aCBubyBgLmZvcigpYCBhdFxuICAvLyBhbGwuIFBhc3NpbmcgYSBmYWN0b3J5IGFsc28gbWFrZXMgdGhlIHRva2VuIGFic3RyYWN0IFx1MjAxNCBzZWUgYnVpbGRUb2tlbi5cbiAgLy8gVGhlIGV4cGxpY2l0LVNGIGVzY2FwZSBoYXRjaCAoZ2V0SW5qZWN0aW9uVG9rZW4yPEYsIE1GLCBTRj4ob3B0aW9ucykpXG4gIC8vIHVzZXMgdGhpcyBleGFjdCBzYW1lIHNoYXBlLCBmYWN0b3J5IGp1c3Qgb3B0aW9uYWwgb24gdGhlIHRyYWlsaW5nIGNhbGxcbiAgLy8gaW5zdGVhZCBvZiByZXF1aXJlZCBcdTIwMTQgbm90aGluZyBkaXN0aW5ndWlzaGVzIHRoZW0gYXQgcnVudGltZSwgc2luY2UgU0ZcbiAgLy8gYmVpbmcgc3BlbGxlZCBvdXQgZXhwbGljaXRseSB2cyBpbmZlcnJlZCBmcm9tIHRoZSBmYWN0b3J5IHZhbHVlIGlzXG4gIC8vIGVyYXNlZCBieSB0aGUgdGltZSB0aGlzIGNvZGUgcnVucy5cbiAgLy9cbiAgLy8gQSBgc3BlY2lhbGl0eWAgaW4gb3B0aW9ucyBidWlsZHMgYSBzcGVjaWZpYyB0b2tlbiBkaXJlY3RseSBcdTIwMTQgdGhpcyBpcyBob3dcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIgdXNlZCB0byBiZSBpdHMgb3duIGZ1bmN0aW9uOyBmb2xkZWQgaW4gaGVyZVxuICAvLyBzaW5jZSBidWlsZFRva2VuIGFscmVhZHkgdGhyZWFkcyBgc3BlY2lhbGl0eWAgdGhyb3VnaCB2aWEgYC4uLnJlc3RgXG4gIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY3JlYXRvciBpcyBjYWxsZWQuIFVubGlrZSB0aGUgb2xkXG4gIC8vIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4yLCB0aGlzIGFsc28gYWNjZXB0cyBhIGZhY3RvcnksIHNvIGEgc3BlY2lmaWNcbiAgLy8gdG9rZW4gY2FuIGl0c2VsZiBiZSBhIGZhbWlseSByb290IGZvciBuZXN0ZWQgc3BlY2lmaWNpdHkgXHUyMDE0IHNlZSB0aGVcbiAgLy8gY29tbWVudCBvbiBidWlsZFRva2VuIGZvciB3aHkgdGhhdCBtYWtlcyBpdCBhYnN0cmFjdCB0b28uXG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuJHtcbiAgICAgICAgYXJnc1swXT8uaWQgPyBgIFwiJHthcmdzWzBdLmlkfVwiYCA6ICcnXG4gICAgICB9IHdpdGggJHtcbiAgICAgICAgYXJncy5sZW5ndGhcbiAgICAgIH0gYXJndW1lbnRzOyBnZXRJbmplY3Rpb25Ub2tlbjIgdGFrZXMgZXhhY3RseSBvbmUgKG9wdGlvbnMpLmAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFtvcHRpb25zXSA9IGFyZ3M7XG5cbiAgcmV0dXJuIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5ID0+XG4gICAgYnVpbGRUb2tlbih7IC4uLm9wdGlvbnMsIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5IH0pO1xufTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG4vLyBNYWNoaW5lcnkgdG9rZW5zIGNhcnJ5IG5vIHRhZ3M6IHRhZyBkaXNwYXRjaCByZWFkcyB0aGUgdGFyZ2V0J3MgdG9rZW5cbi8vIGNoYWluLCBzbyBhIGRlY29yYXRvciByZWdpc3RlcmVkIHVuZGVyIGUuZy5cbi8vIGBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4uZm9yKCdpbmplY3Rpb25Ub2tlbicpYCB3b3VsZCBvdGhlcndpc2UgYmVcbi8vIGZvdW5kIHZpYSBpdHMgb3duIHJlZ2lzdHJhdGlvbiB0b2tlbiBkdXJpbmcgaXRzIG93biBpbnN0YW50aWF0aW9uIFx1MjAxNFxuLy8gaW5maW5pdGUgcmVjdXJzaW9uLiBgLmZvcigpYCBjaGlsZHJlbiBjb3B5IHRoZSBnZW5lcmFsIHRva2VuJ3MgdGFncyBhdFxuLy8gY3JlYXRpb24sIHNvIHRoZSBleGVtcHRpb24gcHJvcGFnYXRlcyB0byB0aGVtLiAoU2FtZSByb2xlIHRoZSByZW1vdmVkXG4vLyBgZGVjb3JhYmxlOiBmYWxzZWAgZmxhZyBoYWQuKVxuY29uc3QgdW50YWdnZWQgPSB0b2tlbiA9PiB7XG4gIHRva2VuLnRhZ3MgPSB1bmRlZmluZWQ7XG4gIHJldHVybiB0b2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ3JlZ2lzdHJhdGlvbi1jYWxsYmFjay10b2tlbicsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbih7XG4gICAgaWQ6ICdkZXJlZ2lzdHJhdGlvbi1jYWxsYmFjay10b2tlbicsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5zdGFudGlhdGUtZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ2luamVjdGlvbi1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5zdGFuY2UtcHVyZ2UtY2FsbGJhY2stdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHByZUluamVjdENhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ3ByZS1pbmplY3QtY2FsbGJhY2stdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG4iLCAiY29uc3QgaXNPYmplY3RLZXkgPSBrZXkgPT5cbiAgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleSAhPT0gbnVsbCkgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgbWFrZU5vZGUgPSAoKSA9PiAoe1xuICBsYXllcjogbmV3IE1hcCgpLFxuICB3ZWFrTGF5ZXI6IG5ldyBXZWFrTWFwKCksXG4gIGNoaWxkcmVuOiBuZXcgTWFwKCksXG4gIHdlYWtDaGlsZHJlbjogbmV3IFdlYWtNYXAoKSxcbiAgaGFzV2Vha0VudHJpZXM6IGZhbHNlLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVNYXAge1xuICAjaW50ZXJuYWxNYXAgPSBtYWtlTm9kZSgpO1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxWYWx1ZXMgPSBbXSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGluaXRpYWxWYWx1ZXMpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gICNsYXllckZvcihtYXBFbnRyeSwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0S2V5KGtleSkgPyBtYXBFbnRyeS53ZWFrTGF5ZXIgOiBtYXBFbnRyeS5sYXllcjtcbiAgfVxuXG4gICNjaGlsZHJlbkZvcihtYXBFbnRyeSwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0S2V5KGtleSkgPyBtYXBFbnRyeS53ZWFrQ2hpbGRyZW4gOiBtYXBFbnRyeS5jaGlsZHJlbjtcbiAgfVxuXG4gICNzZXQobWFwRW50cnksIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3QgPSBrZXlbMF07XG4gICAgICB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwgZmlyc3QpLnNldChmaXJzdCwgdmFsdWUpO1xuICAgICAgaWYgKGlzT2JqZWN0S2V5KGZpcnN0KSkgbWFwRW50cnkuaGFzV2Vha0VudHJpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgY2hpbGRNYXAgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpO1xuICAgICAgbGV0IG5leHRNYXBFbnRyeSA9IGNoaWxkTWFwLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIG5leHRNYXBFbnRyeSA9IG1ha2VOb2RlKCk7XG4gICAgICAgIGNoaWxkTWFwLnNldChmaXJzdCwgbmV4dE1hcEVudHJ5KTtcbiAgICAgICAgaWYgKGlzT2JqZWN0S2V5KGZpcnN0KSkgbWFwRW50cnkuaGFzV2Vha0VudHJpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNzZXQobmV4dE1hcEVudHJ5LCByZXN0LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQga2V5IHRvIGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0tleXMgbXVzdCBiZSBhdCBsZWFzdCBsZW5ndGggMScpO1xuICAgIH1cblxuICAgIHRoaXMuI3NldCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAjZ2V0KG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmdldChrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy4jZ2V0KG5leHRNYXBFbnRyeSwgcmVzdCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZ2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2hhcyhtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5oYXMoa2V5WzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleTtcbiAgICAgIGNvbnN0IG5leHRNYXBFbnRyeSA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCkuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy4jaGFzKG5leHRNYXBFbnRyeSwgcmVzdCk7XG4gICAgfVxuICB9XG5cbiAgaGFzKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNoYXModGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXldIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBrZXk7XG4gICAgfVxuICB9XG5cbiAgKiNlbnRyaWVzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBmb3IgKGNvbnN0IFtsYXllcktleSwgbGF5ZXJWYWx1ZV0gb2YgbWFwRW50cnkubGF5ZXIuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBbWy4uLmtleSwgbGF5ZXJLZXldLCBsYXllclZhbHVlXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtsYXllcktleSwgbGF5ZXJNYXBFbnRyeV0gb2YgbWFwRW50cnkuY2hpbGRyZW4uZW50cmllcygpKSB7XG4gICAgICB5aWVsZCogdGhpcy4jZW50cmllcyhsYXllck1hcEVudHJ5LCBbLi4ua2V5LCBsYXllcktleV0pO1xuICAgIH1cbiAgfVxuXG4gICplbnRyaWVzKCkge1xuICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKHRoaXMuI2ludGVybmFsTWFwLCBbXSk7XG4gIH1cblxuICAjY2FuUHJ1bmUobm9kZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhbm9kZS5oYXNXZWFrRW50cmllcyAmJiBub2RlLmxheWVyLnNpemUgPT09IDAgJiYgbm9kZS5jaGlsZHJlbi5zaXplID09PSAwXG4gICAgKTtcbiAgfVxuXG4gICNkZWxldGUobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZGVsZXRlKGtleVswXSk7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleTtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZShuZXh0TWFwRW50cnksIHJlc3QpO1xuXG4gICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy4jY2FuUHJ1bmUobmV4dE1hcEVudHJ5KSkge1xuICAgICAgY2hpbGRNYXAuZGVsZXRlKGZpcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGRlbGV0ZShrZXkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSB8fCBrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZSh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICNmb3JFYWNoSW5TdWJ0cmVlKG1hcEVudHJ5LCBvblZhbHVlKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXBFbnRyeS5sYXllci52YWx1ZXMoKSkge1xuICAgICAgb25WYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZEVudHJ5IG9mIG1hcEVudHJ5LmNoaWxkcmVuLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLiNmb3JFYWNoSW5TdWJ0cmVlKGNoaWxkRW50cnksIG9uVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gICNkZWxldGVCeVByZWZpeChtYXBFbnRyeSwga2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKGtleVByZWZpeC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleVByZWZpeFswXTtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleSk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpO1xuICAgICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGxheWVyLmhhcyhrZXkpKSB7XG4gICAgICAgIGlmIChvblZhbHVlKSBvblZhbHVlKGxheWVyLmdldChrZXkpKTtcbiAgICAgICAgbGF5ZXIuZGVsZXRlKGtleSk7XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGtleSk7XG5cbiAgICAgIGlmIChjaGlsZEVudHJ5KSB7XG4gICAgICAgIGlmIChvblZhbHVlKSB0aGlzLiNmb3JFYWNoSW5TdWJ0cmVlKGNoaWxkRW50cnksIG9uVmFsdWUpO1xuICAgICAgICBjaGlsZE1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXlQcmVmaXg7XG4gICAgY29uc3QgY2hpbGRNYXAgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpO1xuICAgIGNvbnN0IG5leHRNYXBFbnRyeSA9IGNoaWxkTWFwLmdldChmaXJzdCk7XG5cbiAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLiNkZWxldGVCeVByZWZpeChuZXh0TWFwRW50cnksIHJlc3QsIG9uVmFsdWUpO1xuXG4gICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy4jY2FuUHJ1bmUobmV4dE1hcEVudHJ5KSkge1xuICAgICAgY2hpbGRNYXAuZGVsZXRlKGZpcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCwgb25WYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlQcmVmaXgpIHx8IGtleVByZWZpeC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlQnlQcmVmaXgodGhpcy4jaW50ZXJuYWxNYXAsIGtleVByZWZpeCwgb25WYWx1ZSk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLiNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb21wb3NpdGVNYXAgfSBmcm9tICcuL2NvbXBvc2l0ZS1tYXAnO1xuXG5leHBvcnQgY2xhc3MgTHJ1Q29tcG9zaXRlTWFwIHtcbiAgI2lubmVyID0gbmV3IENvbXBvc2l0ZU1hcCgpO1xuICAjbWF4U2l6ZTtcbiAgI3NpemUgPSAwO1xuICAjaGVhZCA9IG51bGw7XG4gICN0YWlsID0gbnVsbDtcbiAgI29uRXZpY3Q7XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZSwgeyBvbkV2aWN0IH0gPSB7fSkge1xuICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuI29uRXZpY3QgPSBvbkV2aWN0O1xuICB9XG5cbiAgI2FkZFRvSGVhZChub2RlKSB7XG4gICAgbm9kZS5uZXh0ID0gdGhpcy4jaGVhZDtcbiAgICBub2RlLnByZXYgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuI2hlYWQpIHtcbiAgICAgIHRoaXMuI2hlYWQucHJldiA9IG5vZGU7XG4gICAgfVxuXG4gICAgdGhpcy4jaGVhZCA9IG5vZGU7XG5cbiAgICBpZiAoIXRoaXMuI3RhaWwpIHtcbiAgICAgIHRoaXMuI3RhaWwgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gICNyZW1vdmVOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wcmV2KSB7XG4gICAgICBub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaGVhZCA9IG5vZGUubmV4dDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICBub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGUucHJldjtcbiAgICB9XG5cbiAgICBub2RlLnByZXYgPSBudWxsO1xuICAgIG5vZGUubmV4dCA9IG51bGw7XG4gIH1cblxuICAjcHJvbW90ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlID09PSB0aGlzLiNoZWFkKSByZXR1cm47XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShub2RlKTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobm9kZSk7XG4gIH1cblxuICAjZXZpY3RMcnUoKSB7XG4gICAgY29uc3QgbHJ1Tm9kZSA9IHRoaXMuI3RhaWw7XG4gICAgY29uc3Qga2V5ID0gbHJ1Tm9kZS5rZXk7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuICAgIHRoaXMuI3JlbW92ZU5vZGUobHJ1Tm9kZSk7XG4gICAgdGhpcy4jaW5uZXIuZGVsZXRlKGtleSk7XG4gICAgdGhpcy4jc2l6ZS0tO1xuXG4gICAgaWYgKHRoaXMuI29uRXZpY3QpIHRoaXMuI29uRXZpY3Qod3JhcHBlci52YWx1ZSwga2V5KTtcbiAgfVxuXG4gIGdldChrZXkpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG5cbiAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuI3Byb21vdGVOb2RlKHdyYXBwZXIubHJ1Tm9kZSk7XG5cbiAgICByZXR1cm4gd3JhcHBlci52YWx1ZTtcbiAgfVxuXG4gIHNldChrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI3Byb21vdGVOb2RlKGV4aXN0aW5nLmxydU5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxydU5vZGUgPSB7IGtleSwgcHJldjogbnVsbCwgbmV4dDogbnVsbCB9O1xuICAgIHRoaXMuI2lubmVyLnNldChrZXksIHsgdmFsdWUsIGxydU5vZGUgfSk7XG4gICAgdGhpcy4jYWRkVG9IZWFkKGxydU5vZGUpO1xuICAgIHRoaXMuI3NpemUrKztcblxuICAgIGlmICh0aGlzLiNzaXplID4gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhpcy4jZXZpY3RMcnUoKTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuI2lubmVyLmhhcyhrZXkpO1xuICB9XG5cbiAgKnZhbHVlcygpIHtcbiAgICBmb3IgKGNvbnN0IHdyYXBwZXIgb2YgdGhpcy4jaW5uZXIudmFsdWVzKCkpIHtcbiAgICAgIHlpZWxkIHdyYXBwZXIudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2lubmVyLmtleXMoKTtcbiAgfVxuXG4gICplbnRyaWVzKCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgd3JhcHBlcl0gb2YgdGhpcy4jaW5uZXIuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBba2V5LCB3cmFwcGVyLnZhbHVlXTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVCeVByZWZpeChrZXlQcmVmaXgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCB3cmFwcGVyID0+IHtcbiAgICAgIHRoaXMuI3JlbW92ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcbiAgICAgIHRoaXMuI3NpemUtLTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2lubmVyLmNsZWFyKCk7XG4gICAgdGhpcy4jaGVhZCA9IG51bGw7XG4gICAgdGhpcy4jdGFpbCA9IG51bGw7XG4gICAgdGhpcy4jc2l6ZSA9IDA7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAoLi4uZnVuY3Rpb25zKSA9PlxuICB4ID0+IHtcbiAgICBsZXQgdmFsID0geDtcblxuICAgIGZ1bmN0aW9ucy5mb3JFYWNoKGYgPT4ge1xuICAgICAgdmFsID0gZih2YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbiIsICJpbXBvcnQgeyBub25TdG9yZWRJbnN0YW5jZUtleSwgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2NvbXBvc2l0ZS1tYXAnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuLy8gUHJlLWFsbG9jYXRlZCBrZXkgZm9yIHNpbmdsZXRvbiBpbnN0YW5jZSBsb29rdXAgXHUyMDE0IGF2b2lkcyBhcnJheSBjcmVhdGlvbiBwZXIgaW5qZWN0KClcbmNvbnN0IHNpbmdsZXRvbkNvbXBvc2l0ZUtleSA9IFtzdG9yZWRJbnN0YW5jZUtleV07XG5cbi8vIERldGVjdHMgdGhlIGtleWVkU2luZ2xldG9uIHN0b3JhZ2Ugc2hhcGUuIFNpbmdsZXRvbnMgKGFuZCB2Mi1kZWZhdWx0XG4vLyBpbmplY3RhYmxlcyB0aGF0IGhhdmUgb25seSBldmVyIGJlZW4gY2FsbGVkIHdpdGhvdXQgYXJncykgc3RvcmUgdGhlXG4vLyBpbnN0YW5jZSBkaXJlY3RseTsga2V5ZWRTaW5nbGV0b24gd2l0aC1hcmdzIHN0b3JhZ2UgdXNlcyBhIENvbXBvc2l0ZU1hcC5cbmV4cG9ydCBjb25zdCBpc0NvbXBvc2l0ZVN0b3JhZ2UgPSBzdG9yZWQgPT5cbiAgc3RvcmVkIGluc3RhbmNlb2YgQ29tcG9zaXRlTWFwIHx8IHN0b3JlZCBpbnN0YW5jZW9mIExydUNvbXBvc2l0ZU1hcDtcblxuZXhwb3J0IGNvbnN0IHByaXZhdGVJbmplY3RGb3IgPVxuICAoe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpLFxuICAgIGNoZWNrRm9yTm9NYXRjaGVzLFxuICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMsXG4gICAgY2hlY2tGb3JTaWRlRWZmZWN0cyxcbiAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4sXG4gICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgZGkgPSBnZXREaSgpO1xuXG4gICAgbGV0IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIC8vIEZhc3QgcGF0aDogYWxpYXMgaXMgaXRzZWxmIGFuIGluamVjdGFibGUgKHRoZSBkb21pbmFudCBjYXNlIFx1MjAxNCBldmVyeVxuICAgIC8vIGNhbGwgZnJvbSBwcml2YXRlSW5qZWN0TWFueSBsYW5kcyBoZXJlIGJlY2F1c2UgaXQgaXRlcmF0ZXMgcmVzb2x2ZWRcbiAgICAvLyBpbmplY3RhYmxlcykuIFNraXAgZ2V0UmVsYXRlZEluamVjdGFibGVzICh3aGljaCB3b3VsZCBhbGxvY2F0ZSBhXG4gICAgLy8gc2luZ2xlLWVsZW1lbnQgW2FsaWFzXSBhcnJheSksIHRoZSBzaW5nbGUtbWF0Y2gvbm8tbWF0Y2ggdmFsaWRhdG9ycyxcbiAgICAvLyBhbmQgdGhlIGFic3RyYWN0LXRva2VuIGNoZWNrIChpbmplY3RhYmxlcyBhcmUgbmV2ZXIgYWJzdHJhY3QpLlxuICAgIGNvbnN0IGFsaWFzVHlwZSA9IGFsaWFzLmFsaWFzVHlwZTtcblxuICAgIGlmIChhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHwgYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgaWYgKCFpbmplY3RhYmxlU2V0LmhhcyhhbGlhcykpIHtcbiAgICAgICAgLy8gUmV1c2UgdGhlIGV4aXN0aW5nIHRocm93IHdpdGggdGhlIHNhbWUgd29yZGluZyBhcyB0aGUgdG9rZW4gcGF0aC5cbiAgICAgICAgY2hlY2tGb3JOb01hdGNoZXMoW10sIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsSW5qZWN0YWJsZSA9IGFsaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4oYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuXG4gICAgICBjaGVja0ZvclRvb01hbnlNYXRjaGVzKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgY2hlY2tGb3JOb01hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXTtcbiAgICB9XG5cbiAgICBhbHJlYWR5SW5qZWN0ZWQuYWRkKG9yaWdpbmFsSW5qZWN0YWJsZSk7XG5cbiAgICBjb25zdCBpbmplY3RhYmxlID1cbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5zaXplID4gMFxuICAgICAgICA/IG92ZXJyaWRpbmdJbmplY3RhYmxlcy5nZXQob3JpZ2luYWxJbmplY3RhYmxlKSB8fCBvcmlnaW5hbEluamVjdGFibGVcbiAgICAgICAgOiBvcmlnaW5hbEluamVjdGFibGU7XG5cbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gQmFja3dhcmQgY29tcGF0OiBvbGQtc3R5bGUgc2luZ2xldG9ucyB0b2xlcmF0ZWQgYGluamVjdChhbGlhcywgdW5kZWZpbmVkKWAuXG4gICAgLy8gTm9ybWFsaXplIGFsbC11bmRlZmluZWQgYXJncyB0byBbXSBzbyBmYXN0LXBhdGggYW5kIHNpbmdsZXRvbiBndWFyZCBiZWhhdmVcbiAgICAvLyBhcyBpZiBubyBwYXJhbWV0ZXIgd2FzIHN1cHBsaWVkLlxuICAgIGlmIChcbiAgICAgIGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMiAmJlxuICAgICAgaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgPT09ICdzaW5nbGV0b24nICYmXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwICYmXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5ldmVyeShwID0+IHAgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzID0gW107XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoOiBzaW5nbGV0b24gY2FjaGUgaGl0IFx1MjAxNCBhdm9pZCBjcmVhdGluZyBtaW5pbWFsRGkgZW50aXJlbHkuXG4gICAgLy8gVGhlIHN0b3JlZCB2YWx1ZSBpcyBvbmUgb2Y6XG4gICAgLy8gICAtIHVuZGVmaW5lZDogbm90aGluZyBjYWNoZWQgeWV0XG4gICAgLy8gICAtIENvbXBvc2l0ZU1hcCAvIExydUNvbXBvc2l0ZU1hcDoga2V5ZWRTaW5nbGV0b24gY2FjaGUsIGxvb2sgdXAgYnlcbiAgICAvLyAgICAgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGZvciBhIG5vLWFyZ3MgY2FsbFxuICAgIC8vICAgLSBhbnkgb3RoZXIgdmFsdWU6IGluc3RhbmNlIGRpcmVjdGx5IChzaW5nbGV0b24gbGlmZWN5Y2xlLCBvciB2MlxuICAgIC8vICAgICBkZWZhdWx0IGxpZmVjeWNsZSB0aGF0IGhhcyBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aCBubyBhcmdzKVxuICAgIC8vXG4gICAgLy8gV2UgZGlzcGF0Y2ggb24gbGlmZWN5Y2xlLmlkIGZpcnN0IHNvIHBsYWluIHNpbmdsZXRvbnMgKHRoZSBkb21pbmFudFxuICAgIC8vIGNhc2UpIHNraXAgdGhlIGluc3RhbmNlb2YgY2hlY2tzIGVudGlyZWx5OyBvbmx5IGtleWVkU2luZ2xldG9uLXNoYXBlZFxuICAgIC8vIGxpZmVjeWNsZXMgZmFsbCB0aHJvdWdoIHRvIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoXG4gICAgICAgIGluamVjdGFibGUub3ZlcnJpZGRlbkluamVjdGFibGUgfHwgaW5qZWN0YWJsZSxcbiAgICAgICk7XG5cbiAgICAgIGxldCBleGlzdGluZ0luc3RhbmNlO1xuXG4gICAgICBpZiAoaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgPT09ICdzaW5nbGV0b24nKSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQuZ2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0luc3RhbmNlID0gc3RvcmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluc3RhbmNlOiBleGlzdGluZ0luc3RhbmNlLFxuICAgICAgICAgIG1ldGE6IHsgaWQ6IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSkgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgZ2V0TmFtZXNwYWNlZElkLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFuY2UsXG4gICAgICBtZXRhOiB7IGlkOiBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpIH0sXG4gICAgfTtcbiAgfTtcblxuY29uc3QgY3JlYXRlTWluaW1hbERpID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIGluamVjdGluZ0luamVjdGFibGUsXG4gIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIC8vIENsb3N1cmUtY2FwdHVyZWQgbWV0aG9kcyBhcmUgZml4ZWQgdXAtZnJvbnQgKGBzaGFyZWRgIHBsdXMgaW5qZWN0KiksXG4gIC8vIHNvIHVzZXIgY29kZSBjYW4gZGV0YWNoIHRoZW0gXHUyMDE0IGBjb25zdCB7IHJlZ2lzdGVyIH0gPSBkaTsgcmVnaXN0ZXIoLi4uKWBcbiAgLy8gYW5kIHNpbWlsYXIgcGF0dGVybnMgYXBwZWFyIGluIHRlc3RzLiBBIGNsYXNzLXdpdGgtcHJvdG90eXBlIGRpc3BhdGNoZXJcbiAgLy8gd291bGQgYmUgY2hlYXBlciB0byBhbGxvY2F0ZSBidXQgbG9zZXMgdGhhdCBkZXRhY2gtZnJpZW5kbHkgYmVoYXZpb3IuXG4gIGNvbnN0IHNoYXJlZCA9IHtcbiAgICByZWdpc3RlcjogKC4uLmluamVjdGFibGVzKSA9PiB7XG4gICAgICBkaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLmRlcmVnaXN0ZXIoe1xuICAgICAgICBpbmplY3RhYmxlcyxcbiAgICAgICAgY29udGV4dDogW3sgaW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQgfV0sXG4gICAgICAgIHNvdXJjZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0IHNvdXJjZU5hbWVzcGFjZSgpIHtcbiAgICAgIGNvbnN0IG5zSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgY29uc3QgbGFzdENvbG9uID0gbnNJZCA/IG5zSWQubGFzdEluZGV4T2YoJzonKSA6IC0xO1xuXG4gICAgICByZXR1cm4gbGFzdENvbG9uID4gMCA/IG5zSWQuc2xpY2UoMCwgbGFzdENvbG9uKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgaGFzUmVnaXN0cmF0aW9uczogZGkuaGFzUmVnaXN0cmF0aW9ucyxcbiAgICBnZXROdW1iZXJPZlJlZ2lzdHJhdGlvbnM6IGRpLmdldE51bWJlck9mUmVnaXN0cmF0aW9ucyxcbiAgICBnZXROdW1iZXJPZkluc3RhbmNlczogZGkuZ2V0TnVtYmVyT2ZJbnN0YW5jZXMsXG5cbiAgICBwdXJnZTogKGFsaWFzLCAuLi5rZXlQYXJ0cykgPT5cbiAgICAgIGRpLnNjb3BlZFB1cmdlKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcywgLi4ua2V5UGFydHMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZTogYWxpYXMgPT5cbiAgICAgIGRpLnJlZ2lzdGVyZWRJblNjb3BlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU3VidHJlZU9mKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcyksXG4gIH07XG5cbiAgaWYgKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIpIHtcbiAgICAvLyBWMiBtaW5pbWFsRGk6IGluamVjdC9pbmplY3RNYW55L2V0YyBhcmUgZmFjdG9yeS1yZXR1cm5pbmcuIEVhY2ggbWV0aG9kXG4gICAgLy8gaXMgaW5saW5lZCBkaXJlY3RseSBhZ2FpbnN0IGBkaWAgKG5vIG1pbmltYWxJbmplY3QqIGludGVybWVkaWFyeSkgc29cbiAgICAvLyB3ZSBkb24ndCBhbGxvY2F0ZSBmb3VyIGV4dHJhIGNsb3N1cmVzIHBlciBtaW5pbWFsRGkganVzdCB0byBmb3J3YXJkLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFyZWQsXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgY29uc3QgY2FjaGVLZXkgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgbGlmZWN5Y2xlSWQgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuaWQ7XG5cbiAgLy8gU2luZ2xldG9uOiBmYXN0IHBhdGggaW4gcHJpdmF0ZUluamVjdEZvciBhbHJlYWR5IGNoZWNrZWQgY2FjaGUgYW5kIG1pc3NlZC5cbiAgLy8gU2tpcCByZWR1bmRhbnQgZ2V0SW5zdGFuY2VLZXkgKyBjYWNoZSBjaGVjayBcdTIwMTQgZ28gc3RyYWlnaHQgdG8gaW5zdGFudGlhdGlvbi5cbiAgaWYgKGxpZmVjeWNsZUlkID09PSAnc2luZ2xldG9uJykge1xuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xldG9uIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpbGxlZ2FsbHkgdG8gc2luZ2xldG9ucywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgd2VyZSBwcm92aWRlZDogXCIke2luc3RhbnRpYXRpb25QYXJhbWV0ZXJzfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIHJldHVybiBpbnN0YW50aWF0ZShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBtaW5pbWFsRGksXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICk7XG4gIH1cblxuICAvLyBWMi1kZWZhdWx0ICsgbm8tYXJncyBmYXN0IHBhdGg6IGJlaGF2ZXMgbGlrZSBhIHNpbmdsZXRvbi4gU2tpcFxuICAvLyBnZXRJbnN0YW5jZUtleSArIGtleS1hcnJheSBhbGxvY2F0aW9uICsgQ29tcG9zaXRlTWFwIGFsbG9jYXRpb24uIFRoZVxuICAvLyBpbnN0YW5jZSBpcyBzdG9yZWQgZGlyZWN0bHkgdW5kZXIgY2FjaGVLZXksIG1hdGNoaW5nIHRoZSBzaW5nbGV0b25cbiAgLy8gc2hhcGUuIElmIHRoZSBzYW1lIHYyIGluamVjdGFibGUgaXMgbGF0ZXIgY2FsbGVkIHdpdGggYXJncyAocmFyZSBtaXhlZFxuICAvLyB1c2FnZSksIHRoZSBrZXllZFNpbmdsZXRvbiBwYXRoIGJlbG93IG1pZ3JhdGVzIHRoZSBleGlzdGluZyBpbnN0YW5jZVxuICAvLyBpbnRvIGEgQ29tcG9zaXRlTWFwIHVuZGVyIHNpbmdsZXRvbkNvbXBvc2l0ZUtleSBiZWZvcmUgYWRkaW5nIHRoZSBuZXdcbiAgLy8ga2V5ZWQgZW50cnkuXG4gIGlmIChcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDAgJiZcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlXG4gICkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChjYWNoZUtleSk7XG5cbiAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShleGlzdGluZykpIHtcbiAgICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgICAgZGksXG4gICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5cbmV4cG9ydCBjb25zdCBnZXROYW1lc3BhY2VkSWRGb3IgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9PiB7XG4gIHJldHVybiBhbGlhcyA9PiB7XG4gICAgY29uc3QgaWQgPSBpc0luamVjdGlvblRva2VuKGFsaWFzKSA/IGAoJHthbGlhcy5pZH0pYCA6IGFsaWFzLmlkO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9uICh0aGUgY29tbW9uIGNhc2UpLlxuICAgIC8vIENvbnRleHQgaXMgW2NvbnRhaW5lclJvb3RDb250ZXh0SXRlbV0gXHUyMDE0IHBhcmVudCBpcyB0aGUgY29udGFpbmVyIGl0c2VsZi5cbiAgICBjb25zdCByZWdpc3RyYXRpb25Db250ZXh0ID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZ2V0KGFsaWFzKTtcblxuICAgIGlmICghcmVnaXN0cmF0aW9uQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9IHJlZ2lzdHJhdGlvbkNvbnRleHRbcmVnaXN0cmF0aW9uQ29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmIChcbiAgICAgICFpbW1lZGlhdGVQYXJlbnQgfHxcbiAgICAgIGltbWVkaWF0ZVBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICApIHtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBTbG93IHBhdGg6IG5lc3RlZCByZWdpc3RyYXRpb24gXHUyMDE0IHdhbGsgdGhlIHBhcmVudCBjaGFpbi5cbiAgICBjb25zdCBpZHMgPSBbaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGUuaWRdO1xuICAgIGxldCBjdXJyZW50ID0gaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGU7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChjdXJyZW50KTtcblxuICAgICAgaWYgKCFwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRDb250ZXh0W3BhcmVudENvbnRleHQubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQuaW5qZWN0YWJsZTtcbiAgICB9XG5cbiAgICBpZHMucmV2ZXJzZSgpO1xuICAgIGlkcy5wdXNoKGlkKTtcbiAgICByZXR1cm4gaWRzLmpvaW4oJzonKTtcbiAgfTtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGluamVjdGFibGVCdW5jaFN5bWJvbCA9ICdpbmplY3RhYmxlLWJ1bmNoJztcblxuZXhwb3J0IGRlZmF1bHQgYnVuY2ggPT5cbiAgT2JqZWN0LmFzc2lnbihidW5jaCwge1xuICAgIGFsaWFzVHlwZTogaW5qZWN0YWJsZUJ1bmNoU3ltYm9sLFxuICB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlQnVuY2hTeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGFibGVCdW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IG1heWJlSW5qZWN0YWJsZUJ1bmNoID0+XG4gIG1heWJlSW5qZWN0YWJsZUJ1bmNoPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVCdW5jaFN5bWJvbDtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlJztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGUgPT5cbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHxcbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyO1xuIiwgImltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuLi9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbmNvbnN0IGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMgPSAoYnVuY2gsIG91dCkgPT4ge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGJ1bmNoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRoaW5nID0gdmFsdWVzW2ldO1xuXG4gICAgaWYgKGlzSW5qZWN0YWJsZUJ1bmNoKHRoaW5nKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyh0aGluZywgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGlzSW5qZWN0YWJsZSh0aGluZykpIHtcbiAgICAgIG91dC5wdXNoKHRoaW5nKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdGFibGVzID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaChpbmplY3RhYmxlKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyhpbmplY3RhYmxlLCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChpbmplY3RhYmxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICIvLyBUb2tlbiBoaWVyYXJjaGllcyAoc3BlY2lmaWNUb2tlbk9mIGNoYWlucykgYXJlIGltbXV0YWJsZSBcdTIwMTQgY2FjaGUgcGVyIHRva2VuLlxuY29uc3QgdG9rZW5DaGFpbkNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbGF0ZWRUb2tlbnMgPSB0b2tlbiA9PiB7XG4gIGlmICh0b2tlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVtcHR5QXJyYXk7XG4gIH1cblxuICBsZXQgY2FjaGVkID0gdG9rZW5DaGFpbkNhY2hlLmdldCh0b2tlbik7XG5cbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSB0b2tlbjtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuc3BlY2lmaWNUb2tlbk9mO1xuICB9XG5cbiAgdG9rZW5DaGFpbkNhY2hlLnNldCh0b2tlbiwgdG9rZW5zKTtcblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVsYXRlZFRvVG9rZW4gPSAodG9rZW4sIGFuY2VzdG9yKSA9PiB7XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gYW5jZXN0b3IpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGVtcHR5QXJyYXkgPSBbXTtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4uL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcblxuLy8gQ2FjaGVkIGFycmF5IHBlciB0b2tlbiBcdTIwMTQgYXZvaWRzIHNwcmVhZGluZyBTZXQgdG8gQXJyYXkgb24gZXZlcnkgaW5qZWN0KCkgY2FsbC5cbi8vIEludmFsaWRhdGVkIGJ5IHNldHRpbmcgdG8gbnVsbCB3aGVuIHRoZSBTZXQgaXMgbXV0YXRlZCAocmVnaXN0ZXIvZGVyZWdpc3RlcikuXG5jb25zdCBhcnJheUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuY29uc3QgZ2V0Q2FjaGVkQXJyYXkgPSBzZXQgPT4ge1xuICBsZXQgYXJyID0gYXJyYXlDYWNoZS5nZXQoc2V0KTtcblxuICBpZiAoIWFycikge1xuICAgIGFyciA9IFsuLi5zZXRdO1xuICAgIGFycmF5Q2FjaGUuc2V0KHNldCwgYXJyKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlID0gc2V0ID0+IHtcbiAgYXJyYXlDYWNoZS5kZWxldGUoc2V0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IgPVxuICAoeyBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sIGluamVjdGFibGVTZXQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm4gaW5qZWN0YWJsZVNldC5oYXMoYWxpYXMpID8gW2FsaWFzXSA6IEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IHNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKCFzZXQgfHwgc2V0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0Q2FjaGVkQXJyYXkoc2V0KTtcbiAgfTtcbiIsICJpbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQge1xuICBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMsIGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IGZsb3cgZnJvbSAnLi9mYXN0Rmxvdyc7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckZvciA9XG4gICh7IHJlZ2lzdGVyU2luZ2xlLCBpbmplY3RNYW55LCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICBjb25zdCBmbGF0SW5qZWN0YWJsZXMgPSB0b0ZsYXRJbmplY3RhYmxlcyhpbmplY3RhYmxlcyk7XG5cbiAgICAvLyBQaGFzZSAwOiBpbnN0YW50aWF0aW9uLWRlY29yYXRvci10YWdnZWQgaW5qZWN0YWJsZXMuIFRoZXkgcmVnaXN0ZXJcbiAgICAvLyAgIGZpcnN0IHNvIHRoYXQgYW55IHNhbWUtYmF0Y2ggb3ZlcnJpZGVzIG9mIChyZWdpc3RyYXRpb24tKWRlY29yYXRvcnNcbiAgICAvLyAgIGFyZSBhbHJlYWR5IGluIHBsYWNlIGJ5IHRoZSB0aW1lIHRob3NlIGRlY29yYXRvcnMgYXJlIGluc3RhbnRpYXRlZFxuICAgIC8vICAgaW4gcGhhc2UgMi4gVGhleSBnbyB0aHJvdWdoIHRoZSByZWdpc3RyYXRpb24tZGVjb3JhdG9yIHBpcGVsaW5lIHNvXG4gICAgLy8gICBwcm9kdWN0aW9uIGNvZGUgY2FuIG9wdCB0aGVtIG91dCB2aWEgdGFnL3RhcmdldC1rZXllZCBkZWNvcmF0b3JzLlxuICAgIC8vIFBoYXNlIDE6IHJlZ2lzdHJhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBkaXJlY3RseSB2aWEgcmVnaXN0ZXJTaW5nbGUgKG5vIHJlY3Vyc2l2ZSBkZWNvcmF0aW9uKSB0byBhdm9pZFxuICAgIC8vICAgYm9vdHN0cmFwIGNoYW9zLlxuICAgIC8vIFBoYXNlIDI6IHJlZ3VsYXIgaW5qZWN0YWJsZXMgcmVnaXN0ZXIgdGhyb3VnaCB0aGUgZGVjb3JhdG9yIHBpcGVsaW5lLlxuICAgIGNvbnN0IHBoYXNlMEluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcGhhc2UySW5qZWN0YWJsZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdEluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmplY3RhYmxlID0gZmxhdEluamVjdGFibGVzW2ldO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4pXG4gICAgICApIHtcbiAgICAgICAgcmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG4gICAgICAgIHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4pXG4gICAgICApIHtcbiAgICAgICAgcGhhc2UwSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoYXNlMkluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGVzID0gW107XG5cbiAgICBjb25zdCBmaXJlQ2FsbGJhY2tzRm9yID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tqXShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGJvdW5kUmVnaXN0ZXJTaW5nbGUgPSBpbmogPT4ge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmosIGNvbnRleHQpO1xuICAgICAgICB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghYmF0Y2hJblByb2dyZXNzKSB7XG4gICAgICAgICAgZmlyZUNhbGxiYWNrc0ZvcihpbmopO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkZWNvcmF0ZWRSZWdpc3RlciA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRSZWdpc3RlclNpbmdsZSk7XG5cbiAgICAgIGRlY29yYXRlZFJlZ2lzdGVyKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAod2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwaGFzZTBJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcbiAgICBwaGFzZTJJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcblxuICAgIGJhdGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgdGhlIHBlci1pbmplY3RhYmxlIGZvckVhY2ggbG9vcCBlbnRpcmVseSB3aGVuIG5vIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNhbGxiYWNrcyBhcmUgd2lyZWQgdXAgXHUyMDE0IHRoaXMgYXZvaWRzIDMwaysgdHJpdmlhbCBmdW5jdGlvbiBjYWxsc1xuICAgIC8vIGR1cmluZyBhIDMway1pbmplY3RhYmxlIGJvb3RzdHJhcCB3aXRoIG5vIGNhbGxiYWNrcyAodGhlIHBlcmYtdGVzdFxuICAgIC8vIGNhc2UgYW5kIHRoZSBjb21tb24gY2FzZSkuXG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJlQmF0Y2hDYWxsYmFja3MgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tqXShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTaW5nbGVGb3IgPSAoe1xuICBpbmplY3RhYmxlU2V0LFxuICBpbmplY3RhYmxlSWRTZXQsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG59KSA9PiB7XG4gIGNvbnN0IGdldE5hbWVzcGFjZWRJZCA9IGdldE5hbWVzcGFjZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0YWJsZUlkID0gaW5qZWN0YWJsZS5pZDtcblxuICAgIGlmICghaW5qZWN0YWJsZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgd2l0aG91dCBJRC4nKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZXZlcnNlIGluZGV4OiBmb3IgZWFjaCBwYXJlbnQgaW4gdGhlIGNvbnRleHQsIHJlY29yZCB0aGlzIGluamVjdGFibGUgYXMgYSBjaGlsZC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGlvbkNvbnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGluamVjdGlvbkNvbnRleHRbaV0uaW5qZWN0YWJsZTtcbiAgICAgIGxldCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHBhcmVudCk7XG5cbiAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuc2V0KHBhcmVudCwgY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICBjaGlsZHJlbi5hZGQoaW5qZWN0YWJsZSk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoOiBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9uICh0aGUgZG9taW5hbnQgY2FzZSkgeWllbGRzIGFcbiAgICAvLyBuYW1lc3BhY2VkIGlkIGVxdWFsIHRvIHRoZSBiYXJlIGlkIFx1MjAxNCBza2lwIHRoZSBNYXAgcm91bmR0cmlwICsgcGFyZW50XG4gICAgLy8gd2FsayBpbnNpZGUgZ2V0TmFtZXNwYWNlZElkLCBhbmQgc2tpcCByZWNvcmRpbmcgdGhlIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNvbnRleHQgYWx0b2dldGhlciAoYGdldE5hbWVzcGFjZWRJZEZvcmAgYW5kIGBkZXJlZ2lzdGVyYCBib3RoIHRyZWF0XG4gICAgLy8gYSBtaXNzaW5nIGVudHJ5IGFzIFwibm8gbmVzdGVkIGNvbnRleHRcIiBhbHJlYWR5KS5cbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPVxuICAgICAgaW5qZWN0aW9uQ29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgID8gaW5qZWN0aW9uQ29udGV4dFtpbmplY3Rpb25Db250ZXh0Lmxlbmd0aCAtIDFdXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaXNDb250YWluZXJMZXZlbCA9XG4gICAgICAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcic7XG5cbiAgICBpZiAoIWlzQ29udGFpbmVyTGV2ZWwpIHtcbiAgICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LnNldChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBpc0NvbnRhaW5lckxldmVsXG4gICAgICA/IGluamVjdGFibGVJZFxuICAgICAgOiBnZXROYW1lc3BhY2VkSWQoaW5qZWN0YWJsZSk7XG5cbiAgICBpZiAobmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgc2FtZSBpbmplY3RhYmxlIG11bHRpcGxlIHRpbWVzOiBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICApfVwiYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGFibGVJZFNldC5oYXMobmFtZXNwYWNlZElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgaW5qZWN0YWJsZXMgZm9yIElEIFwiJHtuYW1lc3BhY2VkSWR9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cHBlckJvdW5kZWRDYXJkaW5hbGl0eSA9XG4gICAgICBpbmplY3RhYmxlLmluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ29uZScgfHxcbiAgICAgIGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4/LmNhcmRpbmFsaXR5ID09PSAnemVyby1vci1vbmUnXG4gICAgICAgID8gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbi5jYXJkaW5hbGl0eVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh1cHBlckJvdW5kZWRDYXJkaW5hbGl0eSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBpbmplY3RhYmxlLmluamVjdGlvblRva2VuO1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgLy8gRXhhY3QgcmVnaXN0cmF0aW9ucyBvbmx5OiB0aGUgaW5kZXggYWxzbyBob2xkcyBgLmZvcigpYFxuICAgICAgICAgIC8vIGRlc2NlbmRhbnRzIG9mIHRoZSB0b2tlbiwgYW5kIHNwZWNpYWxpemF0aW9uIG11c3Qgbm90IGJlXG4gICAgICAgICAgLy8gb3V0bGF3ZWQgYnkgdGhlIGJhc2UgdG9rZW4ncyBib3VuZC5cbiAgICAgICAgICBpZiAobWVtYmVyLmluamVjdGlvblRva2VuID09PSB0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIHdpdGggaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICAgICAgICB0b2tlbi5pZFxuICAgICAgICAgICAgICB9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgXCIke3VwcGVyQm91bmRlZENhcmRpbmFsaXR5fVwiIGFsbG93cyBhdCBtb3N0IG9uZSByZWdpc3RyYXRpb24gYW5kIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgKX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5qZWN0YWJsZUlkU2V0LmFkZChuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuYWRkKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgbmFtZXNwYWNlZElkKTtcbiAgICBpZiAoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiB3aXRoIGluamVjdGlvbiB0b2tlbiBcIiR7aW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbi5pZH1cIiwgYnV0IGl0IGlzIGFic3RyYWN0LiBVc2UgXCIuZm9yKHNwZWNpZmllcilcIiBmb3IgYSBjb25jcmV0ZSB0b2tlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhDYWNoZVNpemUgPVxuICAgICAgaW5qZWN0YWJsZS5tYXhDYWNoZVNpemUgPz8gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8ubWF4Q2FjaGVTaXplO1xuXG4gICAgLy8gTFJVIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Iga2V5ZWQgbGlmZWN5Y2xlcyBcdTIwMTQgc2luZ2xldG9ucyBob2xkIG9uZVxuICAgIC8vIGluc3RhbmNlIGFuZCB3b3VsZCBuZXZlciBvdmVyZmxvdy4gRm9yIGtleWVkIGxpZmVjeWNsZXMgd2l0aCBhIHNpemVcbiAgICAvLyBjYXAsIGFsbG9jYXRlIGVhZ2VybHkgc28gdGhlIGV2aWN0aW9uIGNhbGxiYWNrIGlzIHdpcmVkIGJlZm9yZSBhbnlcbiAgICAvLyBzdG9yZS4gRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgdGhlIG1hcCBpcyBhbGxvY2F0ZWQgbGF6aWx5IG9uIGZpcnN0XG4gICAgLy8gc3RvcmUgKHNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiBzdG9yZXNcbiAgICAvLyBhIENvbXBvc2l0ZU1hcCBcdTIwMTQgc2VlIHByaXZhdGVJbmplY3RGb3IuanMpLlxuICAgIGlmIChtYXhDYWNoZVNpemUgPiAwICYmIGluamVjdGFibGUubGlmZWN5Y2xlLmlkICE9PSAnc2luZ2xldG9uJykge1xuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBuZXcgTHJ1Q29tcG9zaXRlTWFwKG1heENhY2hlU2l6ZSwge1xuICAgICAgICBvbkV2aWN0OiAoaW5zdGFuY2UsIGtleUFycmF5KSA9PlxuICAgICAgICAgIGZpcmVQdXJnZUNhbGxiYWNrcyhpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpLFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgaW5zdGFuY2VNYXApO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VucyA9IGdldFJlbGF0ZWRUb2tlbnMoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbik7XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdF07XG4gICAgICBsZXQgaW5qZWN0YWJsZXNTZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKCFpbmplY3RhYmxlc1NldCkge1xuICAgICAgICBpbmplY3RhYmxlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLnNldCh0b2tlbiwgaW5qZWN0YWJsZXNTZXQpO1xuICAgICAgfVxuXG4gICAgICBpbmplY3RhYmxlc1NldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUoaW5qZWN0YWJsZXNTZXQpO1xuICAgIH1cbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVTdG9yYWdlIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcblxuY29uc3Qgc2luZ2xldG9uS2V5QXJyYXkgPSBbc3RvcmVkSW5zdGFuY2VLZXldO1xuXG5jb25zdCBrZXlBcnJheVN0YXJ0c1dpdGggPSAoa2V5QXJyYXksIHByZWZpeCkgPT4ge1xuICBpZiAocHJlZml4Lmxlbmd0aCA+IGtleUFycmF5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlBcnJheVtpXSAhPT0gcHJlZml4W2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBldmljdCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5UGFydHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN0b3JlZC5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZWQuZGVsZXRlQnlQcmVmaXgoa2V5UGFydHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUHVyZ2VzIHRoZSBzdG9yZWQgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2V0IG9mIGluamVjdGFibGVzLiBTaGFyZWQgYnkgdGhlXG4vLyBjb250YWluZXItd2lkZSBwdXJnZSBhbmQgdGhlIHNjb3BlLXJlc3RyaWN0ZWQgb25lLCBzbyB0aGF0IGJvdGggZmlyZVxuLy8gaW5zdGFuY2UtcHVyZ2UgY2FsbGJhY2tzIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciA9XG4gICh7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pID0+XG4gIChpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gICAgLy8gTm90aGluZyBjYW4gb2JzZXJ2ZSB0aGlzIHB1cmdlLCBzbyBza2lwIGdhdGhlcmluZyB0aGUgc25hcHNob3QgYW5kIGdvXG4gICAgLy8gc3RyYWlnaHQgdG8gZXZpY3Rpb24gXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIGluamVjdCB3aXJpbmcgZm9sbG93cywgd2hlcmUgYVxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG5vIGRlY29yYXRvcnMgcGF5cyBmb3Igbm9uZS5cbiAgICBpZiAoIWFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCgpKSB7XG4gICAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDEgXHUyMDE0IEdhdGhlciBzbmFwc2hvdCB0dXBsZXMgd2l0aG91dCBtdXRhdGluZyBjYWNoZXMuIFRoZSBzdG9yZWRcbiAgICAvLyB2YWx1ZSBpcyBkaXNwYXRjaGVkIHN0cnVjdHVyYWxseTogYSBDb21wb3NpdGVNYXAtc2hhcGUgc3RvcmVzIGtleWVkXG4gICAgLy8gZW50cmllczsgYW55dGhpbmcgZWxzZSBpcyBhIGRpcmVjdGx5LXN0b3JlZCBpbnN0YW5jZSAoc2luZ2xldG9uIG9yXG4gICAgLy8gdjItZGVmYXVsdC1uby1hcmdzKS5cbiAgICBjb25zdCB0dXBsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgIWtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHtcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGluc3RhbmNlOiBzdG9yZWQsXG4gICAgICAgICAga2V5QXJyYXk6IHNpbmdsZXRvbktleUFycmF5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleUFycmF5LCBpbnN0YW5jZV0gb2Ygc3RvcmVkLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID4gMCAmJiAha2V5QXJyYXlTdGFydHNXaXRoKGtleUFycmF5LCBrZXlQYXJ0cykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyIFx1MjAxNCBGaXJlIGNhbGxiYWNrcy4gQ2FjaGVzIHN0YXkgcG9wdWxhdGVkIHNvIHBlZXItY29vcmRpbmF0aW9uXG4gICAgLy8gaW5zaWRlIGEgY2FsbGJhY2sgd29ya3MgKGBkaS5pbmplY3QocGVlcilgIHJldHVybnMgdGhlIGNhY2hlZCBpbnN0YW5jZSkuXG4gICAgZm9yIChjb25zdCB7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9IG9mIHR1cGxlcykge1xuICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSk7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMyBcdTIwMTQgRXZpY3QuIFN3ZWVwcyBib3RoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBlbnRyaWVzIGFuZCBhbnl0aGluZ1xuICAgIC8vIHJlLXBvcHVsYXRlZCBieSBwaGFzZSAyIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGRvIE5PVCByZS1maXJlIGhlcmUuXG4gICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHB1cmdlSW5zdGFuY2VzRm9yID0gKHtcbiAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxufSkgPT4ge1xuICBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlcyA9IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIChhbGlhcywgLi4ua2V5UGFydHMpID0+XG4gICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICBhbGlhcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gWy4uLmluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5rZXlzKCldXG4gICAgICAgIDogZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKSxcbiAgICAgIGtleVBhcnRzLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0b0ZsYXRJbmplY3RhYmxlcyBmcm9tICcuL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucywgaXNSZWxhdGVkVG9Ub2tlbiB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpLFxuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIHN5bmNJbmplY3RXaXJpbmcsXG4gIH0pID0+XG4gICh7IGluamVjdGFibGVzLCBjb250ZXh0LCBzb3VyY2UgfSkgPT4ge1xuICAgIC8vIENvbGxlY3QgY2FsbGJhY2tzIGZpcnN0ICh3aGlsZSBhbGwgaW5qZWN0YWJsZXMgYXJlIHN0aWxsIHJlZ2lzdGVyZWQpXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gRmlyZSBjYWxsYmFja3MgZm9yIGFsbCBpbmplY3RhYmxlcyBiZWluZyBkZXJlZ2lzdGVyZWQgKG9yaWdpbmFsIGJhdGNoIHNlbWFudGljcylcbiAgICBmbGF0SW5qZWN0YWJsZXMuZm9yRWFjaChpbmplY3RhYmxlID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2soaW5qZWN0YWJsZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRpID0gZ2V0RGkoKTtcblxuICAgIGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGUgPSBkZXJlZ2lzdGVyU2luZ2xlRm9yKHtcbiAgICAgIGluamVjdGFibGVTZXQsXG4gICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAgIGRpLFxuICAgIH0pO1xuXG4gICAgbGV0IGluamVjdFdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZsYXRJbmplY3RhYmxlcy5mb3JFYWNoKGluamVjdGFibGUgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4sIGluamVjdGlvbkRlY29yYXRvclRva2VuKVxuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICAgIGluamVjdFdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBwcmVJbmplY3RDYWxsYmFja1Rva2VuKSkge1xuICAgICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSBudWxsO1xuICAgICAgICBpbmplY3RXaXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICAgICAgZGVjb3JhdG9yVG9rZW46IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogaW5qZWN0YWJsZSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZXJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRlZERlcmVnaXN0ZXIgPSBmbG93KC4uLmRlY29yYXRvcnMpKGRlcmVnaXN0ZXJTaW5nbGUpO1xuXG4gICAgICBkZWNvcmF0ZWREZXJlZ2lzdGVyKGluamVjdGFibGUpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVjb21wdXRlZCBmcm9tIHRoZSByZWdpc3RyYXRpb24gaW5kZXggYWZ0ZXIgdGhlIHJlbW92YWxzLCBzbyBhXG4gICAgLy8gZGVyZWdpc3RyYXRpb24gZGVjb3JhdG9yIHRoYXQgcHJldmVudGVkIHRoZSByZW1vdmFsIGlzIGhhbmRsZWQgdG9vLlxuICAgIGlmIChpbmplY3RXaXJpbmdDaGFuZ2VkKSB7XG4gICAgICBzeW5jSW5qZWN0V2lyaW5nKCk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RlclNpbmdsZUZvciA9XG4gICh7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBkaSxcbiAgfSkgPT5cbiAgaW5qZWN0YWJsZSA9PiB7XG4gICAgaWYgKGlzSW5qZWN0aW9uVG9rZW4oaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGRlcmVnaXN0ZXIgdXNpbmcgaW5qZWN0aW9uIHRva2VuIFwiJHtpbmplY3RhYmxlLmlkfVwiLCBidXQgZGVyZWdpc3RyYXRpb24gdXNpbmcgdG9rZW4gaXMgaWxsZWdhbC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBkZXJlZ2lzdGVyIG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke2luamVjdGFibGUuaWR9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2FzY2FkZSBkZXJlZ2lzdGVyIGNoaWxkcmVuIHVzaW5nIHRoZSByZXZlcnNlIGluZGV4IChPKDEpIGxvb2t1cCkuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmRlbGV0ZShjaGlsZCk7XG5cbiAgICAgICAgaWYgKGluamVjdGFibGVTZXQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgIGRpLmRlcmVnaXN0ZXIoe1xuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtjaGlsZF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICBwdXJnZUluc3RhbmNlcyhpbmplY3RhYmxlKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuZGVsZXRlKG5hbWVzcGFjZWRJZCk7XG4gICAgaW5qZWN0YWJsZVNldC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IHRva2VucyA9IGdldFJlbGF0ZWRUb2tlbnMoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbik7XG5cbiAgICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICBjb25zdCB0b2tlblNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuICAgICAgdG9rZW5TZXQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgICAgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlKHRva2VuU2V0KTtcbiAgICB9KTtcblxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5kZWxldGUoaW5qZWN0YWJsZSk7XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IG92ZXJyaWRlRm9yID1cbiAgKHsgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBlYXJseU92ZXJyaWRlIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYWxpYXMuYWxpYXNUeXBlID09PSAnaW5qZWN0aW9uLXRva2VuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgZm91bmQgbm8gcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiIHdoaWNoIGlzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGVhcmx5T3ZlcnJpZGUoYWxpYXMsIGluc3RhbnRpYXRlU3R1Yik7XG4gIH07XG5cbmV4cG9ydCBjb25zdCB1bm92ZXJyaWRlRm9yID1cbiAgKHsgb3ZlcnJpZGluZ0luamVjdGFibGVzLCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICBhbGlhcyA9PiB7XG4gICAgY29uc3QgW2luamVjdGFibGVdID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmICghaW5qZWN0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7YWxpYXMuaWR9XCIsIGJ1dCBpdCB3YXMgbm90IHJlZ2lzdGVyZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB1bm92ZXJyaWRlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiwgYnV0IGl0IHdhcyBub3Qgb3ZlcnJpZGRlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vTWF0Y2hlc0ZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChpbmplY3RpbmdJbmplY3RhYmxlKX1cIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBzaW5nbGUgaW5qZWN0YWJsZSBmb3IgaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICBhbGlhcy5pZFxuICAgICAgICB9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgYnV0IGZvdW5kIG11bHRpcGxlIGluamVjdGFibGVzOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzRm9yID1cbiAgKHsgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChnZXRTaWRlRWZmZWN0c0FyZVByZXZlbnRlZChpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiB3aGVuIHNpZGUtZWZmZWN0cyBhcmUgcHJldmVudGVkLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5hYnN0cmFjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCBpcyBhYnN0cmFjdC4gVXNlIFwiLmZvcihzcGVjaWZpZXIpXCIgZm9yIGEgY29uY3JldGUgdG9rZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKGFsaWFzLmNhcmRpbmFsaXR5ICE9PSAnemVyby1vci1vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3RNYXliZSBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgaXMgXCIke1xuICAgICAgICAgIGFsaWFzLmNhcmRpbmFsaXR5XG4gICAgICAgIH1cIiBpbnN0ZWFkIG9mIFwiemVyby1vci1vbmVcIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuLy8gRGVjbGFyZWQgc2V0cyBhcmUgZGVyaXZlZCBvbmNlIHBlciBpbmplY3RhYmxlOiBhIGBjb25zdW1wdGlvbnNgIGFycmF5IGlzXG4vLyBmaXhlZCBhdCBjcmVhdGlvbiwgYW5kIGluamVjdGFibGUgaWRlbnRpdHkgb3V0bGl2ZXMgYW55IHNpbmdsZSBjb250YWluZXIuXG5jb25zdCBkZWNsYXJlZFNldHNCeUluamVjdGFibGUgPSBuZXcgV2Vha01hcCgpO1xuXG5jb25zdCBnZXREZWNsYXJlZFNldCA9IGluamVjdGFibGUgPT4ge1xuICBsZXQgZGVjbGFyZWQgPSBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuZ2V0KGluamVjdGFibGUpO1xuXG4gIGlmICghZGVjbGFyZWQpIHtcbiAgICBkZWNsYXJlZCA9IG5ldyBTZXQoaW5qZWN0YWJsZS5jb25zdW1wdGlvbnMgPz8gW10pO1xuICAgIGRlY2xhcmVkU2V0c0J5SW5qZWN0YWJsZS5zZXQoaW5qZWN0YWJsZSwgZGVjbGFyZWQpO1xuICB9XG5cbiAgcmV0dXJuIGRlY2xhcmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gICh7IGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICAvLyBPbmx5IGluamVjdGFibGUyIGRlY2xhcmVzIGNvbnN1bXB0aW9ucy4gRXZlcnl0aGluZyBlbHNlIGlzIGV4ZW1wdCBieVxuICAgIC8vIHRoaXMgb25lIGNoZWNrOiB0aGUgY29udGFpbmVyIHJvb3QsIHYxIGluamVjdGFibGVzLCBhbmQgdGhlIHRva2VuIHRoYXRcbiAgICAvLyBzdGFuZHMgaW4gYXMgdGhlIGluamVjdGluZyBwYXJ0eSBmb3IgaW5qZWN0TWFueSdzIGVsZW1lbnQgaW5qZWN0cy5cbiAgICBpZiAoaW5qZWN0aW5nSW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0aW5nIGFuIGluamVjdGFibGUgYnkgcmVmZXJlbmNlIGFscmVhZHkgaW1wbGllcyBhIGRlcGVuZGVuY3kgb25cbiAgICAvLyB3aGF0ZXZlciBwYWNrYWdlIGl0IGxpdmVzIGluLCBzbyBvbmx5IHRva2VucyBhcmUgZGVjbGFyZWQuXG4gICAgaWYgKGlzSW5qZWN0YWJsZShhbGlhcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IGdldERlY2xhcmVkU2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gRGVjbGFyaW5nIGEgZ2VuZXJhbCB0b2tlbiBjb3ZlcnMgZXZlcnkgYC5mb3IoKWAgZGVyaXZhdGl2ZSBvZiBpdCwgd2hpY2hcbiAgICAvLyBpcyB3aGF0IG1ha2VzIHJ1bnRpbWUgc3BlY2lmaWVycyBkZWNsYXJhYmxlIGF0IGFsbC4gVGhlIHdhbGsgaXMgdXB3YXJkc1xuICAgIC8vIG9ubHk6IGRlY2xhcmluZyBhIHNwZWNpZmljIHRva2VuIGRvZXMgbm90IGNvdmVyIGl0cyBnZW5lcmFsIHRva2VuLlxuICAgIGxldCBjYW5kaWRhdGUgPSBhbGlhcztcblxuICAgIHdoaWxlIChjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlY2xhcmVkLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnNwZWNpZmljVG9rZW5PZjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHthbGlhcy5pZH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICApfVwiLCBidXQgaXQgaXMgbm90IGEgZGVjbGFyZWQgY29uc3VtcHRpb24uYCxcbiAgICApO1xuICB9O1xuIiwgImltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5jb25zdCBpc1Rva2VuMiA9IGFsaWFzID0+IGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbjInO1xuXG4vLyBSZWFkLW9ubHk6IHJlYWRzIHRoZSByZWdpc3RyYXRpb24gc3RhdGUgZGlyZWN0bHkgYW5kIGhvbGRzIG5vdGhpbmcgb2YgaXRzXG4vLyBvd24sIHNvIHJlZ2lzdGVyaW5nIGFmdGVyIHZhbGlkYXRpbmcgd29ya3MgYW5kIHZhbGlkYXRpbmcgYWdhaW4gcmVmbGVjdHMgaXQuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVGb3IgPVxuICAoe1xuICAgIGNvbnRhaW5lcklkLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gIH0pID0+XG4gICgpID0+IHtcbiAgICBjb25zdCB2ZXJpZmllZElkcyA9IFtdO1xuICAgIGNvbnN0IHVudmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMgPSBbXTtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluamVjdGFibGUgb2YgaW5qZWN0YWJsZVNldCkge1xuICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnM7IHYxIGluamVjdGFibGVzIGFyZSBiZXlvbmRcbiAgICAgIC8vIHdoYXQgdGhpcyBjYW4gY2hlY2suXG4gICAgICBpZiAoaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICAgIHVudmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuXG4gICAgICAvLyBBbiBvdmVycmlkZGVuIGluamVjdGFibGUncyBvd24gaW5zdGFudGlhdGUgbmV2ZXIgcnVucywgc28gaXRzXG4gICAgICAvLyBkZWNsYXJhdGlvbnMgc2F5IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGlzIGNvbnRhaW5lciBuZWVkcy5cbiAgICAgIGlmIChvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNvbnN1bXB0aW9uIG9mIGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmICghaXNUb2tlbjIoY29uc3VtcHRpb24pKSB7XG4gICAgICAgICAgLy8gQSB2MSB0b2tlbiBjYXJyaWVzIG5vIGNhcmRpbmFsaXR5LCBzbyB0aGVyZSBpcyBubyBhcml0eSB0byBjaGVjay5cbiAgICAgICAgICB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBpbmplY3RhYmxlSWQ6IG5hbWVzcGFjZWRJZCxcbiAgICAgICAgICAgIGNvbnN1bXB0aW9uSWQ6IGNvbnN1bXB0aW9uLmlkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNhcmRpbmFsaXR5IH0gPSBjb25zdW1wdGlvbjtcblxuICAgICAgICBpZiAoY2FyZGluYWxpdHkgIT09ICdvbmUnICYmIGNhcmRpbmFsaXR5ICE9PSAnb25lLW9yLW1hbnknKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgaW5kZXggaG9sZHMgZXZlcnkgcmVnaXN0cmF0aW9uIG1hZGUgYWdhaW5zdCB0aGUgdG9rZW4gb3IgYW55IG9mXG4gICAgICAgIC8vIGl0cyBgLmZvcigpYCBkZXJpdmF0aXZlcywgd2hpY2ggaXMgaG93IGEgZ2VuZXJhbC10b2tlbiBkZWNsYXJhdGlvblxuICAgICAgICAvLyBpcyBzYXRpc2ZpZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2Ygb25lIG9mIGl0cyBzcGVjaWZpYyB0b2tlbnMuXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGNvbnN1bXB0aW9uKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBsb3dlciBib3VuZCBpcyBjaGVja2VkIGhlcmU6IHRoZSB1cHBlciBib3VuZCBjYW5ub3QgYmVcbiAgICAgICAgLy8gZXhjZWVkZWQsIHNpbmNlIHJlZ2lzdGVyaW5nIHJlamVjdHMgdGhlIHNlY29uZCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgaWYgKHJlZ2lzdGVyZWQgPT09IHVuZGVmaW5lZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICB2aW9sYXRpb25zLnB1c2goXG4gICAgICAgICAgICBgSW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIGNvbnN1bWVzIGluamVjdGlvbiB0b2tlbiBcIiR7Y29uc3VtcHRpb24uaWR9XCIgd2l0aCBjYXJkaW5hbGl0eSBcIiR7Y2FyZGluYWxpdHl9XCIsIGJ1dCBpdCBoYXMgbm8gcmVnaXN0cmF0aW9ucy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB2YWxpZGF0ZSBjb250YWluZXIgXCIke2NvbnRhaW5lcklkfVwiLCBidXQgZm91bmQgdmlvbGF0aW9uczpcXG4ke3Zpb2xhdGlvbnNcbiAgICAgICAgICAubWFwKHZpb2xhdGlvbiA9PiBgIC0gJHt2aW9sYXRpb259YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkID0gaWRzID0+IFsuLi5pZHNdLnNvcnQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJpZmllZEluamVjdGFibGVzOiB7XG4gICAgICAgIGNvdW50OiB2ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdW52ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHVudmVyaWZpZWRJZHMpLFxuICAgICAgfSxcblxuICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLFxuICAgIH07XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5jb25zdCB0YXJnZXRJc1YyID0gaW5qZWN0YWJsZSA9PlxuICBpbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIgfHxcbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGlvblRva2VuU3ltYm9sMjtcblxuLy8gdjEtc2hhcGUgc3R1YjogKGRpLCAuLi5wYXJhbXMpID0+IGluc3RhbmNlLiBXcmFwcyBmb3IgdjIgdGFyZ2V0cy5cbmNvbnN0IGFzVjFTaGFwZSA9IChzdHViLCBpc1YyVGFyZ2V0KSA9PlxuICBpc1YyVGFyZ2V0XG4gICAgPyBkaSA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIHN0dWIoZGksIC4uLnBhcmFtcylcbiAgICA6IHN0dWI7XG5cbi8vIHYyLXNoYXBlIHN0dWI6IChkaSkgPT4gKC4uLnBhcmFtcykgPT4gaW5zdGFuY2UuIFVud3JhcHMgZm9yIHYxIHRhcmdldHMuXG5jb25zdCBhc1YyU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldCA/IHN0dWIgOiAoZGksIC4uLnBhcmFtcykgPT4gc3R1YihkaSkoLi4ucGFyYW1zKTtcblxuY29uc3QgZWFybHlPdmVycmlkZUltcGxGb3IgPVxuICBub3JtYWxpemUgPT5cbiAgKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgc2luZ2xlIGltcGxlbWVudGF0aW9uIG9mIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiLCBidXQgZm91bmQgbXVsdGlwbGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnM6IFwiJHtyZWxhdGVkSW5qZWN0YWJsZXNcbiAgICAgICAgICAubWFwKGdldE5hbWVzcGFjZWRJZClcbiAgICAgICAgICAuam9pbignXCIsIFwiJyl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPT09IDAgJiYgaXNJbmplY3Rpb25Ub2tlbihhbGlhcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGVhcmx5LW92ZXJyaWRlIGFuIGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIsIGJ1dCB0aGF0IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXSB8fCBhbGlhcztcblxuICAgIGlmIChhbHJlYWR5SW5qZWN0ZWQuaGFzKGFsaWFzKSB8fCBhbHJlYWR5SW5qZWN0ZWQuaGFzKG9yaWdpbmFsSW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIGluamVjdGFibGUgXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgYWxyZWFkeSBpbmplY3RlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuc2V0KG9yaWdpbmFsSW5qZWN0YWJsZSwge1xuICAgICAgLi4ub3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgb3ZlcnJpZGRlbkluamVjdGFibGU6IG9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIGNhdXNlc1NpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgIGluc3RhbnRpYXRlOiBub3JtYWxpemUoaW5zdGFudGlhdGVTdHViLCB0YXJnZXRJc1YyKG9yaWdpbmFsSW5qZWN0YWJsZSkpLFxuICAgIH0pO1xuICB9O1xuXG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZUZvciA9IGVhcmx5T3ZlcnJpZGVJbXBsRm9yKGFzVjFTaGFwZSk7XG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZTJGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YyU2hhcGUpO1xuIiwgImltcG9ydCB7IHByZUluamVjdENhbGxiYWNrVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5cbi8vIE5vbi13cmFwcGluZyBlbnRyeSBob29rOiBmaXJlcyBldmVyeSBwcmUtaW5qZWN0IGNhbGxiYWNrIGFwcGxpY2FibGUgdG8gdGhlXG4vLyBhbGlhcywgdGhlbiBjYWxscyB0aHJvdWdoLiBGaXJlcyBiZWZvcmUgYW55IHJlc29sdXRpb24gb3IgZmFpbHVyZSBjaGVjayxcbi8vIHNvIGEgY2FsbGJhY2sgY2FuIHJlZ2lzdGVyIGltcGxlbWVudGF0aW9ucyB0aGF0IHRoZSBzYW1lIG9wZXJhdGlvbiB0aGVuXG4vLyBvYnNlcnZlcy4gYGtpbmRgIGlzIGJha2VkIGluIGF0IHdyYXAgdGltZTogJ2luamVjdCcgZm9yIHRoZSBpbmplY3Rcbi8vIHZhcmlhbnRzLCAnaW5qZWN0TWFueScgZm9yIHRoZSBpbmplY3RNYW55IHZhcmlhbnRzICh3aXRoTWV0YSB2YXJpYW50c1xuLy8gcmVwb3J0IHRoZWlyIGJhc2Uga2luZCkuIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgaW5qZWN0aW5nIHBhcnR5OiB0aGVcbi8vIGluamVjdGFibGUgd2hvc2UgaW5zdGFudGlhdGUgbWFkZSB0aGUgY2FsbCwgb3IgdGhlIGNvbnRhaW5lciByb290IGZvclxuLy8gaW5qZWN0cyBtYWRlIGRpcmVjdGx5IG9uIGBkaWAuXG5leHBvcnQgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciA9XG4gICh7IGRlY29yYXRvckNhY2hlLCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICBraW5kID0+XG4gIHRvQmVDYWxsZWQgPT5cbiAgYXJncyA9PiB7XG4gICAgLy8gV2hlbiBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgaXMgbnVsbCwgYSBjYWxsYmFjayB3YXMgcmVnaXN0ZXJlZCBvclxuICAgIC8vIGRlcmVnaXN0ZXJlZCBcdTIwMTQgaW52YWxpZGF0ZSBhbGwgcGVyLWFsaWFzIGNhY2hlZCBjYWxsYmFjayBsaXN0cy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgY2FsbGJhY2tzID0gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5nZXQoYXJncy5hbGlhcyk7XG5cbiAgICBpZiAoY2FsbGJhY2tzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFwcGxpY2FibGUgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICAgICAgICB0YXJnZXQ6IGFyZ3MuYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGFyZ3MuaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjYWxsYmFja3MgPSBhcHBsaWNhYmxlLmxlbmd0aCA+IDAgPyBhcHBsaWNhYmxlIDogbnVsbDtcblxuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5zZXQoYXJncy5hbGlhcywgY2FsbGJhY2tzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFjayhhcmdzLmFsaWFzLCBraW5kLCBhcmdzLmluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuIiwgImltcG9ydCB7IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzRm9yID1cbiAgKHsgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSkgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGluc3RhbmNlIH07XG5cbiAgICBjb25zdCBjYWxsYmFja3MgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBjYiBvZiBjYWxsYmFja3MpIHtcbiAgICAgIGNiKHBheWxvYWQpKC4uLmtleUFycmF5KTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucyB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5cbi8vIFJldHVybnMgZXZlcnkgZGVjb3JhdG9yL2NhbGxiYWNrIGluc3RhbmNlIHRoYXQgYXBwbGllcyB0byBgdGFyZ2V0YCBmb3IgdGhlXG4vLyBnaXZlbiBgZGVjb3JhdG9yVG9rZW5gLiBUaHJlZSBsb29rdXAgZGltZW5zaW9ucyBhcmUgdW5pZmllZDpcbi8vXG4vLyAgIDEuIERpcmVjdDogICBkZWNvcmF0b3JUb2tlbi5mb3IodGFyZ2V0KS5cbi8vICAgMi4gQ2hhaW46ICAgIHdhbGsgYHNwZWNpZmljVG9rZW5PZmAgYW5jZXN0b3JzIG9mIHRoZSBjb250cmFjdCB0b2tlbiBcdTIwMTRcbi8vICAgICAgICAgICAgICAgIGB0YXJnZXQuaW5qZWN0aW9uVG9rZW5gIGZvciBpbmplY3RhYmxlIHRhcmdldHMsXG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LnNwZWNpZmljVG9rZW5PZmAgZm9yIHRva2VuIHRhcmdldHMgXHUyMDE0IGFuZCBsb29rIHVwXG4vLyAgICAgICAgICAgICAgICBgZGVjb3JhdG9yVG9rZW4uZm9yKGFuY2VzdG9yKWAgZm9yIGVhY2guIFRoaXMgaXMgc3ltbWV0cmljXG4vLyAgICAgICAgICAgICAgICB3aXRoIHRoZSByZWdpc3RyYXRpb24tdGltZSBjaGFpbiBpbmRleGluZyBpblxuLy8gICAgICAgICAgICAgICAgYGdldFJlbGF0ZWRUb2tlbnNgOiBhIGNvbnRyaWJ1dG9yIHJlZ2lzdGVyZWQgdW5kZXJcbi8vICAgICAgICAgICAgICAgIGBzb21lVG9rZW4uZm9yKHNwZWNpZmllcilgIGlzIGFscmVhZHkgcmV0cmlldmFibGUgdmlhXG4vLyAgICAgICAgICAgICAgICBgaW5qZWN0TWFueShzb21lVG9rZW4pYCwgYW5kIGEgZGVjb3JhdG9yIHRhcmdldGluZyB0aGVcbi8vICAgICAgICAgICAgICAgIHBhcmVudCBjb250cmFjdCBzaG91bGQgZmlyZSBmb3IgdGhlIGNoaWxkIHNwZWNpYWxpemF0aW9uLlxuLy8gICAzLiBUYWdzOiAgICAgZm9yIGV2ZXJ5IHRhZyBvZiB0aGUgdGFyZ2V0IGFuZCBvZiBldmVyeSB0b2tlbiBpbiBpdHNcbi8vICAgICAgICAgICAgICAgIGNoYWluLCBsb29rIHVwIGBkZWNvcmF0b3JUb2tlbi5mb3IodGFnKWAuIFRhZ3MgYXJlIGRlZHVwZWRcbi8vICAgICAgICAgICAgICAgIGFjcm9zcyB0aGVzZSBzb3VyY2VzOiBgLmZvcigpYCBjaGlsZHJlbiBpbmhlcml0IHRoZSBnZW5lcmFsXG4vLyAgICAgICAgICAgICAgICB0b2tlbidzIHRhZ3MsIHNvIHRoZSBzYW1lIHRhZyB0eXBpY2FsbHkgb2NjdXJzIG9uIGV2ZXJ5XG4vLyAgICAgICAgICAgICAgICBjaGFpbiBsZXZlbC4gVGhpcyBtYWtlcyBhIHRhZyBvbiBhIHRva2VuIGZpcmUgZXZlcnl3aGVyZVxuLy8gICAgICAgICAgICAgICAgYC5mb3IodG9rZW4pYCB3b3VsZC5cbi8vXG4vLyBJbmplY3RhYmxlcyB3aXRob3V0IGFuIGBpbmplY3Rpb25Ub2tlbmAgc2tpcCB0aGUgY2hhaW4gZGltZW5zaW9uLlxuLy9cbi8vIEZhc3QgcGF0aDogaWYgbm8gaW5qZWN0YWJsZSBpcyByZWdpc3RlcmVkIHVuZGVyIHRoZSBhYnN0cmFjdCBgZGVjb3JhdG9yVG9rZW5gXG4vLyBpdHNlbGYsIG5vbmUgb2YgdGhlIHRocmVlIGxvb2t1cCBkaW1lbnNpb25zIGNhbiBldmVyIG1hdGNoLiBgcmVnaXN0ZXIuanNgXG4vLyBpbmRleGVzIGV2ZXJ5IHNwZWNpZmljIGRlY29yYXRvciBieSB3YWxraW5nIGBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGlvblRva2VuKWAsXG4vLyB3aGljaCB0ZXJtaW5hdGVzIGF0IHRoZSBhYnN0cmFjdCB0b2tlbiBcdTIwMTQgc28gdGhlIGFic3RyYWN0IHNldCBpcyBub24tZW1wdHlcbi8vIGlmZiBhdCBsZWFzdCBvbmUgZGVjb3JhdG9yIG9mIHRoaXMgdHlwZSBpcyByZWdpc3RlcmVkIGFueXdoZXJlLlxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yID1cbiAgKHsgaW5qZWN0TWFueSwgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuIH0pID0+XG4gICh7IGRlY29yYXRvclRva2VuLCB0YXJnZXQsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGRlY29yYXRvclRva2VuKTtcblxuICAgIGlmICghcmVnaXN0ZXJlZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXQgPSBbXTtcblxuICAgIC8vIE1vc3QgZGlzcGF0Y2gga2V5cyBoYXZlIG5vIHJlZ2lzdHJhdGlvbnMgXHUyMDE0IGNoZWNraW5nIHRoZSByZWdpc3RyYXRpb25cbiAgICAvLyBpbmRleCBkaXJlY3RseSBza2lwcyB0aGUgaW5qZWN0TWFueSBtYWNoaW5lcnkgZm9yIHRoZW0uIGAuZm9yKClgIGl0c2VsZlxuICAgIC8vIGlzIGNoZWFwIG9uIHJlcGVhdCBjYWxscyAobWVtb2l6ZWQgYnkgc3BlY2lmaWVyKS5cbiAgICBjb25zdCBkaXNwYXRjaCA9IGFsaWFzID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGb3JBbGlhcyA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZEZvckFsaWFzICYmIHJlZ2lzdGVyZWRGb3JBbGlhcy5zaXplID4gMCkge1xuICAgICAgICBvdXQucHVzaChcbiAgICAgICAgICAuLi5pbmplY3RNYW55KHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkpO1xuXG4gICAgY29uc3QgY2hhaW4gPSBnZXRSZWxhdGVkVG9rZW5zKFxuICAgICAgdGFyZ2V0LmluamVjdGlvblRva2VuID8/IHRhcmdldC5zcGVjaWZpY1Rva2VuT2YsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgdCBvZiBjaGFpbikge1xuICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRUYWdzID0gdGFyZ2V0LnRhZ3M7XG5cbiAgICBpZiAodGFyZ2V0VGFncykge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFyZ2V0VGFncykge1xuICAgICAgICBkaXNwYXRjaChkZWNvcmF0b3JUb2tlbi5mb3IodGFnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVkdXAgd2l0aG91dCBhbGxvY2F0aW9uczogYC5mb3IoKWAgY2hpbGRyZW4gc2hhcmUgdGhlIGdlbmVyYWwgdG9rZW4nc1xuICAgIC8vIHRhZ3MgYXJyYXksIHNvIGEgY2hhaW4gY2FycmllcyBhdCBtb3N0IG9uZSBkaXN0aW5jdCB0YWdzIGFycmF5IFx1MjAxNCBza2lwXG4gICAgLy8gcmVwZWF0cyBieSByZWZlcmVuY2UsIGFuZCBza2lwIHRhZ3MgYWxyZWFkeSBkaXNwYXRjaGVkIHZpYSB0YXJnZXQudGFnc1xuICAgIC8vIHdpdGggaW5kZXhPZiAodGhlIGFycmF5cyBhcmUgdGlueSkuXG4gICAgbGV0IHByb2Nlc3NlZENoYWluVGFncyA9IHRhcmdldFRhZ3M7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGNoYWluVGFncyA9IHQudGFncztcblxuICAgICAgaWYgKCFjaGFpblRhZ3MgfHwgY2hhaW5UYWdzID09PSBwcm9jZXNzZWRDaGFpblRhZ3MpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3NlZENoYWluVGFncyA9IGNoYWluVGFncztcblxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgY2hhaW5UYWdzKSB7XG4gICAgICAgIGlmICh0YXJnZXRUYWdzICYmIHRhcmdldFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgcHJpdmF0ZUluamVjdEZvciB9IGZyb20gJy4vcHJpdmF0ZUluamVjdEZvcic7XG5pbXBvcnQgeyB3aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0ZvciB9IGZyb20gJy4vd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3InO1xuaW1wb3J0IHsgcHJpdmF0ZUluamVjdE1hbnlGb3IgYXMgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3IgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RNYW55Rm9yJztcbmltcG9ydCB7IHJlZ2lzdGVyRm9yLCByZWdpc3RlclNpbmdsZUZvciB9IGZyb20gJy4vcmVnaXN0ZXInO1xuaW1wb3J0IHsgcHVyZ2VJbnN0YW5jZXNGb3IsIHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yIH0gZnJvbSAnLi9wdXJnZUluc3RhbmNlcyc7XG5pbXBvcnQgeyBkZXJlZ2lzdGVyRm9yIH0gZnJvbSAnLi9kZXJlZ2lzdGVyJztcbmltcG9ydCB7IG92ZXJyaWRlRm9yLCB1bm92ZXJyaWRlRm9yIH0gZnJvbSAnLi9vdmVycmlkZSc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQgeyBjaGVja0Zvck5vTWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JOb01hdGNoZXNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JUb29NYW55TWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JUb29NYW55TWF0Y2hlcyc7XG5pbXBvcnQgeyBjaGVja0ZvclNpZGVFZmZlY3RzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclNpZGVFZmZlY3RzRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciB9IGZyb20gJy4vY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvciB9IGZyb20gJy4vY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yJztcbmltcG9ydCB7IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yIH0gZnJvbSAnLi9jaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IHsgZWFybHlPdmVycmlkZUZvciwgZWFybHlPdmVycmlkZTJGb3IgfSBmcm9tICcuL2Vhcmx5LW92ZXJyaWRlJztcbmltcG9ydCB7XG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciB9IGZyb20gJy4vd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcic7XG5pbXBvcnQgeyBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciB9IGZyb20gJy4vZmlyZVB1cmdlQ2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXJJZCA9PiB7XG4gIGNvbnN0IGluamVjdGFibGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yQ2FjaGUgPSB7XG4gICAgaW5qZWN0aW9uOiBudWxsLFxuICAgIGluamVjdGlvbkJ5QWxpYXM6IG5ldyBNYXAoKSxcbiAgICBwcmVJbmplY3Q6IG51bGwsXG4gICAgcHJlSW5qZWN0QnlBbGlhczogbmV3IE1hcCgpLFxuICB9O1xuICBjb25zdCBvdmVycmlkaW5nSW5qZWN0YWJsZXMgPSBuZXcgTWFwKCk7XG4gIGxldCBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IHRydWU7XG4gIGNvbnN0IGFscmVhZHlJbmplY3RlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluamVjdGFibGVJZFNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudE1hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIH0pO1xuXG4gIGNvbnN0IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gaW5qZWN0YWJsZSA9PlxuICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkICYmXG4gICAgaW5qZWN0YWJsZS5jYXVzZXNTaWRlRWZmZWN0cyAmJlxuICAgICFpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cy5oYXMoaW5qZWN0YWJsZSk7XG5cbiAgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0cyA9IGNoZWNrRm9yU2lkZUVmZmVjdHNGb3Ioe1xuICAgIGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JOb01hdGNoZXMgPSBjaGVja0Zvck5vTWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzID0gY2hlY2tGb3JUb29NYW55TWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkgPSBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb24gPSBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICAvLyBFbmZvcmNlbWVudCB3cmFwcyB0aGUgc2xvdHMgcmF0aGVyIHRoYW4gbGl2aW5nIGluc2lkZSB0aGUgb3BlcmF0aW9uXG4gIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB0aGUgbWFjaGluZXJ5IFx1MjAxNCBkZWNvcmF0b3IgYW5kIGNhbGxiYWNrIGRpc3BhdGNoLCBwdXJnZVxuICAvLyBjYWxsYmFja3MgXHUyMDE0IHN0YXlzIGV4ZW1wdDogaXQgaG9sZHMgdGhlIHJhdyBvcGVyYXRpb25zIGNhcHR1cmVkIGF0XG4gIC8vIGNvbnN0cnVjdGlvbiBhbmQgbmV2ZXIgcmVhZHMgdGhlc2Ugc2xvdHMuXG4gIGNvbnN0IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50ID0gdG9CZUNhbGxlZCA9PiBhcmdzID0+IHtcbiAgICBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbihhcmdzKTtcblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSA9IHByaXZhdGVJbmplY3RGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCA9IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgd2l0aE1ldGE6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yKHtcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgLy8gSW5qZWN0aW9uIGRlY29yYXRvcnMgYXBwbHkgb25seSBvbiB0aGUgcGVyLWluamVjdGFibGUgaW5qZWN0IHBhdGguXG4gIC8vIGluamVjdE1hbnkgcmVzb2x2ZXMgcmVsYXRlZCBpbmplY3RhYmxlcyBhbmQgY2FsbHMgdGhlIChkZWNvcmF0ZWQpIGluamVjdFxuICAvLyBvbiBlYWNoLCBzbyBkZWNvcmF0b3JzIHN0aWxsIGZpcmUgcGVyIGVsZW1lbnQgXHUyMDE0IGJ1dCB0aGUgdG9rZW4tbGV2ZWxcbiAgLy8gaW5qZWN0TWFueSBpcyBuZXZlciB3cmFwcGVkLlxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnMoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrcyA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0Jyk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkgPVxuICAgIHdpdGhQcmVJbmplY3RDYWxsYmFja3MoJ2luamVjdE1hbnknKTtcblxuICBjb25zdCBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0SW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSxcbiAgKTtcblxuICAvLyBUaGUgaW5qZWN0IHVzZWQgZm9yIGluamVjdE1hbnkgZWxlbWVudHM6IGRlY29yYXRlZCBwZXIgZWxlbWVudCB3aGVuXG4gIC8vIGluamVjdGlvbiBkZWNvcmF0b3JzIGV4aXN0LCBidXQgbmV2ZXIgd3JhcHBlZCBieSBlbnRyeS1sZXZlbCBob29rc1xuICAvLyAocHJlLWluamVjdCBjYWxsYmFja3MgZmlyZSBvbmNlIHBlciBvcGVyYXRpb24sIG5vdCBwZXIgZWxlbWVudCkuXG4gIGxldCBlbGVtZW50SW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAvLyBXaXJlcyB0aGUgZGVjb3JhdGVkIGFuZCBwcmUtaW5qZWN0LWhvb2tlZCB2YXJpYW50cyBpbiBvbmx5IHdoaWxlIGF0XG4gIC8vIGxlYXN0IG9uZSBtYXRjaGluZyBjb250cmlidXRvciBpcyByZWdpc3RlcmVkLCBzbyB0aGUgY29tbW9uIGJhcmUgY2FzZVxuICAvLyBwYXlzIG5vIHdyYXBwZXIgZnJhbWUgYXQgYWxsLiBFdmVyeSByZWFkZXIgb2YgdGhlIHByaXZhdGVEaSBzbG90cyAoYW5kXG4gIC8vIGBlbGVtZW50SW5qZWN0YCwgdmlhIHRoZSBnZXRJbmplY3QgdGh1bmspIHJlYWRzIHRoZW0gYXQgY2FsbCB0aW1lLlxuICBjb25zdCBzeW5jSW5qZWN0V2lyaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWREZWNvcmF0b3JzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzQWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWREZWNvcmF0b3JzICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZERlY29yYXRvcnMuc2l6ZSA+IDA7XG5cbiAgICBjb25zdCByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IHByZUluamVjdEFjdGl2ZSA9XG4gICAgICByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3Muc2l6ZSA+IDA7XG5cbiAgICBlbGVtZW50SW5qZWN0ID0gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgPyBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3Q7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RcbiAgICAgIDogZWxlbWVudEluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICAgID8gcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGFcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgOiBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGE7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGFcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YTtcblxuICAgIC8vIGBlbGVtZW50SW5qZWN0YCBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bndyYXBwZWQ6IGVuZm9yY2VtZW50IGlzIHBlclxuICAgIC8vIGluamVjdCBvcGVyYXRpb24sIGFuZCBhbiBpbmplY3RNYW55J3MgZWxlbWVudHMgd2VyZSBhbHJlYWR5IGNvdmVyZWQgYnlcbiAgICAvLyB0aGUgY2hlY2sgb24gdGhlIG9wZXJhdGlvbiBpdHNlbGYuXG4gICAgcHJpdmF0ZURpLmluamVjdCA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3QpO1xuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhLFxuICAgICk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnkgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChwcml2YXRlRGkuaW5qZWN0TWFueSk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSxcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrcyA9IGZpcmVQdXJnZUNhbGxiYWNrc0Zvcih7XG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHJhd1JlZ2lzdGVyU2luZ2xlID0gcmVnaXN0ZXJTaW5nbGVGb3Ioe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICB9KTtcblxuICBjb25zdCByZWdpc3RlclNpbmdsZSA9IChpbmplY3RhYmxlLCBjb250ZXh0KSA9PiB7XG4gICAgcmF3UmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICBsZXQgd2lyaW5nQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgICAgd2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgfSk7XG5cbiAgY29uc3QgcHJpdmF0ZVJlZ2lzdGVyID0gcmVnaXN0ZXJGb3Ioe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnk6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQU8sSUFBTSx1QkFBdUIsT0FBTyx5QkFBeUI7QUFDN0QsSUFBTSxvQkFBb0IsT0FBTyxxQkFBcUI7QUFFN0QsSUFBTyx3QkFBUTtBQUFBLEVBQ2IsV0FBVztBQUFBLElBQ1QsSUFBSTtBQUFBLElBRUosZ0JBQWdCLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsZ0JBQWdCLENBQUMsRUFBRSxlQUFlLE9BQU87QUFBQSxJQUN2QyxJQUFJO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQVc7QUFBQSxJQUNULElBQUk7QUFBQSxJQUNKLGdCQUFnQixNQUFNO0FBQUEsRUFDeEI7QUFDRjs7O0FDbkJPLElBQU0scUJBQXFCLE9BQU8sZUFBZTtBQUNqRCxJQUFNLGtCQUFrQixJQUFJLFVBQVU7QUFBQSxFQUMzQyxDQUFDLGtCQUFrQixHQUFHO0FBQUEsRUFDdEI7QUFDRjtBQUVPLElBQU0saUJBQWlCLFdBQzVCLFNBQVMsTUFBTSxrQkFBa0IsTUFBTTs7O0FDTGxDLElBQU0sbUJBQW1CO0FBRWhDLElBQU8sd0JBQVEsQ0FBQyxFQUFFLFlBQVksc0JBQWMsV0FBVyxHQUFHLFdBQVcsT0FBTztBQUFBLEVB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QVUsbUJBQW1CO0FBQUEsSUFDM0I7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLHFCQUFxQjtBQUFBLEVBQ3ZCLENBQUM7QUFFSCxRQUFNLFdBQVc7QUFBQSxJQUNmLEdBQUc7QUFBQSxJQUVILFFBQVE7QUFBQSxJQUNSLGdCQUFnQjtBQUFBLElBQ2hCLFlBQVk7QUFBQSxJQUNaLG9CQUFvQjtBQUFBLElBRXBCLFNBQ0UsV0FDQSxJQUFJLFdBQ0YsYUFBYSxPQUFPLEdBQUcsTUFBTTtBQUFBLElBRWpDLGFBQ0UsV0FDQSxJQUFJLFdBQ0YsaUJBQWlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSXJDLGNBQWMsV0FBUztBQUNyQixrQ0FBNEIsT0FBTyxjQUFjO0FBRWpELGFBQU8sSUFBSSxXQUFXLGlCQUFpQixPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFBQSxJQUM1RDtBQUFBLElBRUEsaUJBQ0UsV0FDQSxJQUFJLFdBQ0YscUJBQXFCLE9BQU8sR0FBRyxNQUFNO0FBQUEsSUFFekMscUJBQ0UsV0FDQSxJQUFJLFdBQ0YseUJBQXlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSTdDLHNCQUFzQixXQUFTO0FBQzdCLGtDQUE0QixPQUFPLGNBQWM7QUFFakQsYUFBTyxJQUFJLFdBQVcseUJBQXlCLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUFBLElBQ3BFO0FBQUEsSUFFQSxVQUFVLElBQUksZ0JBQWdCO0FBQzVCLGdCQUFVLFNBQVM7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNubkJBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F2Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K
|