@jsii/kernel 1.58.0 → 1.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api.d.ts +1 -0
- package/lib/api.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +7 -3
- package/lib/kernel.d.ts +1 -0
- package/lib/kernel.js +26 -42
- package/lib/objects.d.ts +1 -0
- package/lib/objects.js +4 -7
- package/lib/on-exit.d.ts +1 -0
- package/lib/on-exit.js +1 -1
- package/{test → lib}/recording.d.ts +2 -1
- package/lib/recording.js +73 -0
- package/lib/serialization.d.ts +1 -0
- package/lib/serialization.js +56 -57
- package/package.json +8 -15
- package/test/kernel.test.d.ts +0 -1
- package/test/kernel.test.js +0 -1805
- package/test/objects.test.d.ts +0 -1
- package/test/objects.test.js +0 -20
- package/test/recording.js +0 -73
- package/test/serialization.test.d.ts +0 -1
- package/test/serialization.test.js +0 -93
package/lib/serialization.js
CHANGED
|
@@ -39,7 +39,7 @@ exports.EMPTY_OBJECT_FQN = 'Object';
|
|
|
39
39
|
exports.SYMBOL_WIRE_TYPE = Symbol.for('$jsii$wireType$');
|
|
40
40
|
exports.SERIALIZERS = {
|
|
41
41
|
// ----------------------------------------------------------------------
|
|
42
|
-
["Void" /* Void */]: {
|
|
42
|
+
["Void" /* SerializationClass.Void */]: {
|
|
43
43
|
serialize(value, _type, host) {
|
|
44
44
|
if (value != null) {
|
|
45
45
|
host.debug('Expected void, got', value);
|
|
@@ -54,7 +54,7 @@ exports.SERIALIZERS = {
|
|
|
54
54
|
},
|
|
55
55
|
},
|
|
56
56
|
// ----------------------------------------------------------------------
|
|
57
|
-
["Date" /* Date */]: {
|
|
57
|
+
["Date" /* SerializationClass.Date */]: {
|
|
58
58
|
serialize(value, optionalValue) {
|
|
59
59
|
if (nullAndOk(value, optionalValue)) {
|
|
60
60
|
return undefined;
|
|
@@ -71,14 +71,14 @@ exports.SERIALIZERS = {
|
|
|
71
71
|
if (nullAndOk(value, optionalValue)) {
|
|
72
72
|
return undefined;
|
|
73
73
|
}
|
|
74
|
-
if (!api_1.isWireDate(value)) {
|
|
74
|
+
if (!(0, api_1.isWireDate)(value)) {
|
|
75
75
|
throw new Error(`Expected Date, got ${JSON.stringify(value)}`);
|
|
76
76
|
}
|
|
77
77
|
return deserializeDate(value);
|
|
78
78
|
},
|
|
79
79
|
},
|
|
80
80
|
// ----------------------------------------------------------------------
|
|
81
|
-
["Scalar" /* Scalar */]: {
|
|
81
|
+
["Scalar" /* SerializationClass.Scalar */]: {
|
|
82
82
|
serialize(value, optionalValue) {
|
|
83
83
|
if (nullAndOk(value, optionalValue)) {
|
|
84
84
|
return undefined;
|
|
@@ -113,7 +113,7 @@ exports.SERIALIZERS = {
|
|
|
113
113
|
},
|
|
114
114
|
},
|
|
115
115
|
// ----------------------------------------------------------------------
|
|
116
|
-
["Json" /* Json */]: {
|
|
116
|
+
["Json" /* SerializationClass.Json */]: {
|
|
117
117
|
serialize(value) {
|
|
118
118
|
// Just whatever. Dates will automatically serialize themselves to strings.
|
|
119
119
|
return value;
|
|
@@ -127,8 +127,8 @@ exports.SERIALIZERS = {
|
|
|
127
127
|
// is passed into a JSON transfer point. Indeed, those are also valid JSON! For example, Python "dicts" will be
|
|
128
128
|
// serialized (by the Python runtime) as a $jsii.map (the mapping object). We need to de-serialize that as a
|
|
129
129
|
// Map<string, JSON> in order to obtain the correct output behavior here!
|
|
130
|
-
if (api_1.isWireMap(value)) {
|
|
131
|
-
return exports.SERIALIZERS["Map" /* Map */].deserialize(value, {
|
|
130
|
+
if ((0, api_1.isWireMap)(value)) {
|
|
131
|
+
return exports.SERIALIZERS["Map" /* SerializationClass.Map */].deserialize(value, {
|
|
132
132
|
optional: false,
|
|
133
133
|
type: {
|
|
134
134
|
collection: {
|
|
@@ -156,7 +156,7 @@ exports.SERIALIZERS = {
|
|
|
156
156
|
},
|
|
157
157
|
},
|
|
158
158
|
// ----------------------------------------------------------------------
|
|
159
|
-
["Enum" /* Enum */]: {
|
|
159
|
+
["Enum" /* SerializationClass.Enum */]: {
|
|
160
160
|
serialize(value, optionalValue, host) {
|
|
161
161
|
if (nullAndOk(value, optionalValue)) {
|
|
162
162
|
return undefined;
|
|
@@ -180,14 +180,14 @@ exports.SERIALIZERS = {
|
|
|
180
180
|
if (nullAndOk(value, optionalValue)) {
|
|
181
181
|
return undefined;
|
|
182
182
|
}
|
|
183
|
-
if (!api_1.isWireEnum(value)) {
|
|
183
|
+
if (!(0, api_1.isWireEnum)(value)) {
|
|
184
184
|
throw new Error(`Expected enum value, got ${JSON.stringify(value)}`);
|
|
185
185
|
}
|
|
186
186
|
return deserializeEnum(value, host.findSymbol);
|
|
187
187
|
},
|
|
188
188
|
},
|
|
189
189
|
// ----------------------------------------------------------------------
|
|
190
|
-
["Array" /* Array */]: {
|
|
190
|
+
["Array" /* SerializationClass.Array */]: {
|
|
191
191
|
serialize(value, optionalValue, host) {
|
|
192
192
|
if (nullAndOk(value, optionalValue)) {
|
|
193
193
|
return undefined;
|
|
@@ -216,7 +216,7 @@ exports.SERIALIZERS = {
|
|
|
216
216
|
},
|
|
217
217
|
},
|
|
218
218
|
// ----------------------------------------------------------------------
|
|
219
|
-
["Map" /* Map */]: {
|
|
219
|
+
["Map" /* SerializationClass.Map */]: {
|
|
220
220
|
serialize(value, optionalValue, host) {
|
|
221
221
|
if (nullAndOk(value, optionalValue)) {
|
|
222
222
|
return undefined;
|
|
@@ -237,7 +237,7 @@ exports.SERIALIZERS = {
|
|
|
237
237
|
throw new Error('Encountered unexpected `void` type');
|
|
238
238
|
}
|
|
239
239
|
const mapType = optionalValue.type;
|
|
240
|
-
if (!api_1.isWireMap(value)) {
|
|
240
|
+
if (!(0, api_1.isWireMap)(value)) {
|
|
241
241
|
// Compatibility mode with older versions that didn't wrap in [TOKEN_MAP]
|
|
242
242
|
return mapValues(value, (v) => host.recurse(v, { type: mapType.collection.elementtype }));
|
|
243
243
|
}
|
|
@@ -252,7 +252,7 @@ exports.SERIALIZERS = {
|
|
|
252
252
|
},
|
|
253
253
|
},
|
|
254
254
|
// ----------------------------------------------------------------------
|
|
255
|
-
["Struct" /* Struct */]: {
|
|
255
|
+
["Struct" /* SerializationClass.Struct */]: {
|
|
256
256
|
serialize(value, optionalValue, host) {
|
|
257
257
|
if (nullAndOk(value, optionalValue)) {
|
|
258
258
|
return undefined;
|
|
@@ -283,7 +283,7 @@ exports.SERIALIZERS = {
|
|
|
283
283
|
]);
|
|
284
284
|
},
|
|
285
285
|
deserialize(value, optionalValue, host) {
|
|
286
|
-
if (typeof value === 'object' && Object.keys(value
|
|
286
|
+
if (typeof value === 'object' && Object.keys(value ?? {}).length === 0) {
|
|
287
287
|
// Treat empty structs as `undefined` (see https://github.com/aws/jsii/issues/411)
|
|
288
288
|
value = undefined;
|
|
289
289
|
}
|
|
@@ -304,7 +304,7 @@ exports.SERIALIZERS = {
|
|
|
304
304
|
// Similarly to serialization, we might be getting a reference type where we're
|
|
305
305
|
// expecting a value type. Accept this for now (but also validate that object
|
|
306
306
|
// for presence of the right properties).
|
|
307
|
-
if (api_1.isObjRef(value)) {
|
|
307
|
+
if ((0, api_1.isObjRef)(value)) {
|
|
308
308
|
host.debug('Expected value type but got reference type, accepting for now (awslabs/jsii#400)');
|
|
309
309
|
// Return same INSTANCE (shouldn't matter but we don't know for sure that it doesn't)
|
|
310
310
|
return validateRequiredProps(host.objects.findObject(value).instance, namedType.fqn, props);
|
|
@@ -331,9 +331,8 @@ exports.SERIALIZERS = {
|
|
|
331
331
|
},
|
|
332
332
|
},
|
|
333
333
|
// ----------------------------------------------------------------------
|
|
334
|
-
["RefType" /* ReferenceType */]: {
|
|
334
|
+
["RefType" /* SerializationClass.ReferenceType */]: {
|
|
335
335
|
serialize(value, optionalValue, host) {
|
|
336
|
-
var _a;
|
|
337
336
|
if (nullAndOk(value, optionalValue)) {
|
|
338
337
|
return undefined;
|
|
339
338
|
}
|
|
@@ -347,7 +346,8 @@ exports.SERIALIZERS = {
|
|
|
347
346
|
const interfaces = spec.isInterfaceType(expectedType)
|
|
348
347
|
? [expectedType.fqn]
|
|
349
348
|
: undefined;
|
|
350
|
-
const jsiiType = (
|
|
349
|
+
const jsiiType = (0, objects_1.jsiiTypeFqn)(value) ??
|
|
350
|
+
(spec.isClassType(expectedType) ? expectedType.fqn : exports.EMPTY_OBJECT_FQN);
|
|
351
351
|
return host.objects.registerObject(value, jsiiType, interfaces);
|
|
352
352
|
},
|
|
353
353
|
deserialize(value, optionalValue, host) {
|
|
@@ -359,7 +359,7 @@ exports.SERIALIZERS = {
|
|
|
359
359
|
}
|
|
360
360
|
// The only way to pass a by-ref object is to have created it
|
|
361
361
|
// previously inside JSII kernel, so it must have an objref already.
|
|
362
|
-
if (!api_1.isObjRef(value)) {
|
|
362
|
+
if (!(0, api_1.isObjRef)(value)) {
|
|
363
363
|
throw new Error(`Expected object reference, got ${JSON.stringify(value)}`);
|
|
364
364
|
}
|
|
365
365
|
const { instance, fqn } = host.objects.findObject(value);
|
|
@@ -380,9 +380,8 @@ exports.SERIALIZERS = {
|
|
|
380
380
|
},
|
|
381
381
|
},
|
|
382
382
|
// ----------------------------------------------------------------------
|
|
383
|
-
["Any" /* Any */]: {
|
|
383
|
+
["Any" /* SerializationClass.Any */]: {
|
|
384
384
|
serialize(value, _type, host) {
|
|
385
|
-
var _a;
|
|
386
385
|
if (value == null) {
|
|
387
386
|
return undefined;
|
|
388
387
|
}
|
|
@@ -405,7 +404,7 @@ exports.SERIALIZERS = {
|
|
|
405
404
|
}
|
|
406
405
|
if (exports.SYMBOL_WIRE_TYPE in value &&
|
|
407
406
|
value[exports.SYMBOL_WIRE_TYPE] === api_1.TOKEN_MAP) {
|
|
408
|
-
return exports.SERIALIZERS["Map" /* Map */].serialize(value, {
|
|
407
|
+
return exports.SERIALIZERS["Map" /* SerializationClass.Map */].serialize(value, {
|
|
409
408
|
type: {
|
|
410
409
|
collection: {
|
|
411
410
|
kind: spec.CollectionKind.Map,
|
|
@@ -423,13 +422,14 @@ exports.SERIALIZERS = {
|
|
|
423
422
|
// Use a previous reference to maintain object identity. NOTE: this may cause us to return
|
|
424
423
|
// a different type than requested! This is just how it is right now.
|
|
425
424
|
// https://github.com/aws/jsii/issues/399
|
|
426
|
-
const prevRef = objects_1.objectReference(value);
|
|
425
|
+
const prevRef = (0, objects_1.objectReference)(value);
|
|
427
426
|
if (prevRef) {
|
|
428
427
|
return prevRef;
|
|
429
428
|
}
|
|
430
429
|
// If this is or should be a reference type, pass or make the reference
|
|
431
430
|
// (Like regular reftype serialization, but without the type derivation to an interface)
|
|
432
|
-
const jsiiType = (
|
|
431
|
+
const jsiiType = (0, objects_1.jsiiTypeFqn)(value) ??
|
|
432
|
+
(isByReferenceOnly(value) ? exports.EMPTY_OBJECT_FQN : undefined);
|
|
433
433
|
if (jsiiType) {
|
|
434
434
|
return host.objects.registerObject(value, jsiiType);
|
|
435
435
|
}
|
|
@@ -444,7 +444,7 @@ exports.SERIALIZERS = {
|
|
|
444
444
|
if (value == null) {
|
|
445
445
|
return undefined;
|
|
446
446
|
}
|
|
447
|
-
if (api_1.isWireDate(value)) {
|
|
447
|
+
if ((0, api_1.isWireDate)(value)) {
|
|
448
448
|
host.debug('ANY is a Date');
|
|
449
449
|
return deserializeDate(value);
|
|
450
450
|
}
|
|
@@ -456,11 +456,11 @@ exports.SERIALIZERS = {
|
|
|
456
456
|
host.debug('ANY is an Array');
|
|
457
457
|
return value.map((e) => host.recurse(e, { type: spec.CANONICAL_ANY }));
|
|
458
458
|
}
|
|
459
|
-
if (api_1.isWireEnum(value)) {
|
|
459
|
+
if ((0, api_1.isWireEnum)(value)) {
|
|
460
460
|
host.debug('ANY is an Enum');
|
|
461
461
|
return deserializeEnum(value, host.findSymbol);
|
|
462
462
|
}
|
|
463
|
-
if (api_1.isWireMap(value)) {
|
|
463
|
+
if ((0, api_1.isWireMap)(value)) {
|
|
464
464
|
host.debug('ANY is a Map');
|
|
465
465
|
const mapOfAny = {
|
|
466
466
|
collection: {
|
|
@@ -468,19 +468,19 @@ exports.SERIALIZERS = {
|
|
|
468
468
|
elementtype: spec.CANONICAL_ANY,
|
|
469
469
|
},
|
|
470
470
|
};
|
|
471
|
-
return exports.SERIALIZERS["Map" /* Map */].deserialize(value, { type: mapOfAny }, host);
|
|
471
|
+
return exports.SERIALIZERS["Map" /* SerializationClass.Map */].deserialize(value, { type: mapOfAny }, host);
|
|
472
472
|
}
|
|
473
|
-
if (api_1.isObjRef(value)) {
|
|
473
|
+
if ((0, api_1.isObjRef)(value)) {
|
|
474
474
|
host.debug('ANY is a Ref');
|
|
475
475
|
return host.objects.findObject(value).instance;
|
|
476
476
|
}
|
|
477
477
|
// if the value has a struct token, it was serialized by a typed jsii
|
|
478
478
|
// struct, but since the deserialization target is ANY, all we can do is
|
|
479
479
|
// strip the data from $jsii.struct and continue to deserialize as ANY.
|
|
480
|
-
if (api_1.isWireStruct(value)) {
|
|
480
|
+
if ((0, api_1.isWireStruct)(value)) {
|
|
481
481
|
const { fqn, data } = value[api_1.TOKEN_STRUCT];
|
|
482
482
|
host.debug(`ANY is a struct of type ${fqn}`);
|
|
483
|
-
return exports.SERIALIZERS["Struct" /* Struct */].deserialize(data, { type: { fqn } }, host);
|
|
483
|
+
return exports.SERIALIZERS["Struct" /* SerializationClass.Struct */].deserialize(data, { type: { fqn } }, host);
|
|
484
484
|
}
|
|
485
485
|
// At this point again, deserialize by-value.
|
|
486
486
|
host.debug('ANY is a Map');
|
|
@@ -518,20 +518,20 @@ function serializationType(typeRef, lookup) {
|
|
|
518
518
|
throw new Error("Kernel error: expected type information, got 'undefined'");
|
|
519
519
|
}
|
|
520
520
|
if (typeRef === 'void') {
|
|
521
|
-
return [{ serializationClass: "Void" /* Void */, typeRef }];
|
|
521
|
+
return [{ serializationClass: "Void" /* SerializationClass.Void */, typeRef }];
|
|
522
522
|
}
|
|
523
523
|
if (spec.isPrimitiveTypeReference(typeRef.type)) {
|
|
524
524
|
switch (typeRef.type.primitive) {
|
|
525
525
|
case spec.PrimitiveType.Any:
|
|
526
|
-
return [{ serializationClass: "Any" /* Any */, typeRef }];
|
|
526
|
+
return [{ serializationClass: "Any" /* SerializationClass.Any */, typeRef }];
|
|
527
527
|
case spec.PrimitiveType.Date:
|
|
528
|
-
return [{ serializationClass: "Date" /* Date */, typeRef }];
|
|
528
|
+
return [{ serializationClass: "Date" /* SerializationClass.Date */, typeRef }];
|
|
529
529
|
case spec.PrimitiveType.Json:
|
|
530
|
-
return [{ serializationClass: "Json" /* Json */, typeRef }];
|
|
530
|
+
return [{ serializationClass: "Json" /* SerializationClass.Json */, typeRef }];
|
|
531
531
|
case spec.PrimitiveType.Boolean:
|
|
532
532
|
case spec.PrimitiveType.Number:
|
|
533
533
|
case spec.PrimitiveType.String:
|
|
534
|
-
return [{ serializationClass: "Scalar" /* Scalar */, typeRef }];
|
|
534
|
+
return [{ serializationClass: "Scalar" /* SerializationClass.Scalar */, typeRef }];
|
|
535
535
|
}
|
|
536
536
|
throw new Error('Unknown primitive type');
|
|
537
537
|
}
|
|
@@ -539,8 +539,8 @@ function serializationType(typeRef, lookup) {
|
|
|
539
539
|
return [
|
|
540
540
|
{
|
|
541
541
|
serializationClass: typeRef.type.collection.kind === spec.CollectionKind.Array
|
|
542
|
-
? "Array" /* Array */
|
|
543
|
-
: "Map" /* Map */,
|
|
542
|
+
? "Array" /* SerializationClass.Array */
|
|
543
|
+
: "Map" /* SerializationClass.Map */,
|
|
544
544
|
typeRef,
|
|
545
545
|
},
|
|
546
546
|
];
|
|
@@ -558,12 +558,12 @@ function serializationType(typeRef, lookup) {
|
|
|
558
558
|
// The next part of the conversion is lookup-dependent
|
|
559
559
|
const type = lookup(typeRef.type.fqn);
|
|
560
560
|
if (spec.isEnumType(type)) {
|
|
561
|
-
return [{ serializationClass: "Enum" /* Enum */, typeRef }];
|
|
561
|
+
return [{ serializationClass: "Enum" /* SerializationClass.Enum */, typeRef }];
|
|
562
562
|
}
|
|
563
563
|
if (spec.isInterfaceType(type) && type.datatype) {
|
|
564
|
-
return [{ serializationClass: "Struct" /* Struct */, typeRef }];
|
|
564
|
+
return [{ serializationClass: "Struct" /* SerializationClass.Struct */, typeRef }];
|
|
565
565
|
}
|
|
566
|
-
return [{ serializationClass: "RefType" /* ReferenceType */, typeRef }];
|
|
566
|
+
return [{ serializationClass: "RefType" /* SerializationClass.ReferenceType */, typeRef }];
|
|
567
567
|
}
|
|
568
568
|
exports.serializationType = serializationType;
|
|
569
569
|
function nullAndOk(x, type) {
|
|
@@ -607,7 +607,6 @@ function mapValues(value, fn) {
|
|
|
607
607
|
return out;
|
|
608
608
|
}
|
|
609
609
|
function propertiesOf(t, lookup) {
|
|
610
|
-
var _a;
|
|
611
610
|
if (!spec.isClassOrInterfaceType(t)) {
|
|
612
611
|
return {};
|
|
613
612
|
}
|
|
@@ -620,7 +619,7 @@ function propertiesOf(t, lookup) {
|
|
|
620
619
|
if (spec.isClassType(t) && t.base) {
|
|
621
620
|
ret = { ...ret, ...propertiesOf(lookup(t.base), lookup) };
|
|
622
621
|
}
|
|
623
|
-
for (const prop of
|
|
622
|
+
for (const prop of t.properties ?? []) {
|
|
624
623
|
ret[prop.name] = prop;
|
|
625
624
|
}
|
|
626
625
|
return ret;
|
|
@@ -666,16 +665,16 @@ function validateRequiredProps(actualProps, typeName, specProps) {
|
|
|
666
665
|
}
|
|
667
666
|
function compareSerializationClasses(l, r) {
|
|
668
667
|
const order = [
|
|
669
|
-
"Void" /* Void */,
|
|
670
|
-
"Date" /* Date */,
|
|
671
|
-
"Scalar" /* Scalar */,
|
|
672
|
-
"Json" /* Json */,
|
|
673
|
-
"Enum" /* Enum */,
|
|
674
|
-
"Array" /* Array */,
|
|
675
|
-
"Map" /* Map */,
|
|
676
|
-
"Struct" /* Struct */,
|
|
677
|
-
"RefType" /* ReferenceType */,
|
|
678
|
-
"Any" /* Any */,
|
|
668
|
+
"Void" /* SerializationClass.Void */,
|
|
669
|
+
"Date" /* SerializationClass.Date */,
|
|
670
|
+
"Scalar" /* SerializationClass.Scalar */,
|
|
671
|
+
"Json" /* SerializationClass.Json */,
|
|
672
|
+
"Enum" /* SerializationClass.Enum */,
|
|
673
|
+
"Array" /* SerializationClass.Array */,
|
|
674
|
+
"Map" /* SerializationClass.Map */,
|
|
675
|
+
"Struct" /* SerializationClass.Struct */,
|
|
676
|
+
"RefType" /* SerializationClass.ReferenceType */,
|
|
677
|
+
"Any" /* SerializationClass.Any */,
|
|
679
678
|
];
|
|
680
679
|
return order.indexOf(l) - order.indexOf(r);
|
|
681
680
|
}
|
|
@@ -698,9 +697,9 @@ function isByReferenceOnly(obj) {
|
|
|
698
697
|
do {
|
|
699
698
|
for (const prop of Object.getOwnPropertyNames(curr)) {
|
|
700
699
|
const descr = Object.getOwnPropertyDescriptor(curr, prop);
|
|
701
|
-
if (
|
|
702
|
-
|
|
703
|
-
typeof
|
|
700
|
+
if (descr?.get != null ||
|
|
701
|
+
descr?.set != null ||
|
|
702
|
+
typeof descr?.value === 'function') {
|
|
704
703
|
// Property has a dynamic getter, setter or is a constructor/method, so by-ref required!
|
|
705
704
|
return true;
|
|
706
705
|
}
|
|
@@ -709,4 +708,4 @@ function isByReferenceOnly(obj) {
|
|
|
709
708
|
} while (Object.getPrototypeOf((curr = Object.getPrototypeOf(curr))) != null);
|
|
710
709
|
return false;
|
|
711
710
|
}
|
|
712
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlcmlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRzs7O0FBRUgsbUNBQW1DO0FBRW5DLCtCQWFlO0FBQ2YsdUNBQXNFO0FBRXRFLHdCQUF3QjtBQW9CeEI7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztBQUU1QixRQUFBLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQTBDakQsUUFBQSxXQUFXLEdBQWdDO0lBQ3RELHlFQUF5RTtJQUN6RSxtQkFBeUIsRUFBRTtRQUN6QixTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJO1lBQzFCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJO1lBQzVCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7S0FDRjtJQUVELHlFQUF5RTtJQUN6RSxtQkFBeUIsRUFBRTtRQUN6QixTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWE7WUFDNUIsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUNELElBQUksYUFBYSxLQUFLLE1BQU0sRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2FBQ3ZE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TUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFDRSxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxHQUFHLEtBQUksSUFBSTtnQkFDbEIsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsR0FBRyxLQUFJLElBQUk7Z0JBQ2xCLFFBQU8sS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssQ0FBQSxLQUFLLFVBQVUsRUFDbEM7Z0JBQ0Esd0ZBQXdGO2dCQUN4RixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCwyRUFBMkU7S0FDNUUsUUFBUSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtJQUU5RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhhbmRsaW5nIG9mIHR5cGVzIGluIEpTSUlcbiAqXG4gKiBUeXBlcyB3aWxsIGJlIHNlcmlhbGl6ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAg4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICDilIIgSkFWQVNDUklQVCBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUglxuICogICAgICAgICAgICAgICAgICAgICAgICAg4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICDilIIgdW5kZWZpbmVkL251bGwg4pSCICAgZGF0ZSAgICDilIIgc2NhbGFyICgqKSDilIIgICAgIGFycmF5ICAgICDilIIgSlNJSS1jbGFzcyBvYmplY3Qg4pSCIGxpdGVyYWwgb2JqZWN0ICDilIJcbiAqIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICog4pSCIERFQ0xBUkVEIOKUgiB2b2lkICAgICAgIOKUgiB1bmRlZmluZWQgICAgICDilIIgdW5kZWZpbmVkIOKUgiB1bmRlZmluZWQgIOKUgiB1bmRlZmluZWQgICAgIOKUgiB1bmRlZmluZWQgICAgICAgICDilIIgdW5kZWZpbmVkICAgICAgIOKUglxuICog4pSCIFRZUEUgICAgIOKUgiBkYXRlICAgICAgIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiB7IGRhdGUgfSAg4pSCIC0gICAgICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIHNjYWxhciAoKikg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgdmFsdWUgICAgICDilIIgLSAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICDilIJcbiAqIOKUgiAgICAgICAgICDilIIganNvbiAgICAgICDilIIgdW5kZWZpbmVkICAgICAg4pSCIHN0cmluZyAgICDilIIgdmFsdWUgICAgICDilIIgYXJyYXkvUihqc29uKSDilIIgLSAgICAgICAgICAgICAgICAg4pSCIGJ5dmFsdWUvUihqc29uKSDilIJcbiAqIOKUgiAgICAgICAgICDilIIgZW51bSAgICAgICDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgLSAgICAgICAgIOKUgiB7IGVudW0gfSAgIOKUgiAtICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgIOKUglxuICog4pSCICAgICAgICAgIOKUgiBhcnJheSBvZiBUIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIC0gICAgICAgICAg4pSCIGFycmF5L1IoVCkgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiAtICAgICAgICAgICAgICAg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIG1hcCBvZiBUICAg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgLSAgICAgICAgICDilIIgLSAgICAgICAgICAgICDilIIgLSAgICAgICAgICAgICAgICAg4pSCIGJ5dmFsdWUvUihUKSAgICDilIJcbiAqIOKUgiAgICAgICAgICDilIIgaW50ZXJmYWNlICDilIIgdW5kZWZpbmVkKOKAoCkgICDilIIgLSAgICAgICAgIOKUgiAtICAgICAgICAgIOKUgiAtICAgICAgICAgICAgIOKUgiB7IHJlZiB9ICAgICAgICAgICDilIIgeyByZWY6IHByb3h5IH0gIOKUglxuICog4pSCICAgICAgICAgIOKUgiBzdHJ1Y3QgICAgIOKUgiB1bmRlZmluZWQo4oCgKSAgIOKUgiAtICAgICAgICAg4pSCIC0gICAgICAgICAg4pSCIC0gICAgICAgICAgICAg4pSCIC0gICAgICAgICAgICAgICAgIOKUgiBieXZhbHVlL1IoVFtrXSkg4pSCXG4gKiDilIIgICAgICAgICAg4pSCIGNsYXNzICAgICAg4pSCIHVuZGVmaW5lZCjigKApICAg4pSCIC0gICAgICAgICDilIIgLSAgICAgICAgICDilIIgLSAgICAgICAgICAgICDilIIgeyByZWYgfSAgICAgICAgICAg4pSCIHsgcmVmOiBwcm94eSB9ICDilIJcbiAqIOKUgiAgICAgICAgICDilIIgYW55ICAgICAgICDilIIgdW5kZWZpbmVkICAgICAg4pSCIHsgZGF0ZSB9ICDilIIgdmFsdWUgICAgICDilIIgYXJyYXkvUihhbnkpICDilIIgeyByZWYgfSAgICAgICAgICAg4pSCIGJ5dmFsdWUvUihhbnkpICDilIJcbiAqIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICpcbiAqICAtICgqKSBzY2FsYXIgbWVhbnMgJ3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW4nXG4gKiAgLSAo4oCgKSB0aHJvdyBpZiBub3QgbnVsbGFibGVcbiAqICAtIC9SKHQpIHJlY3Vyc2Ugd2l0aCBkZWNsYXJlZCB0eXBlIHRcbiAqL1xuXG5pbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuXG5pbXBvcnQge1xuICBpc09ialJlZixcbiAgaXNXaXJlRGF0ZSxcbiAgaXNXaXJlRW51bSxcbiAgaXNXaXJlTWFwLFxuICBPYmpSZWYsXG4gIFRPS0VOX0RBVEUsXG4gIFRPS0VOX0VOVU0sXG4gIFRPS0VOX01BUCxcbiAgV2lyZURhdGUsXG4gIFdpcmVFbnVtLFxuICBpc1dpcmVTdHJ1Y3QsXG4gIFRPS0VOX1NUUlVDVCxcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsganNpaVR5cGVGcW4sIG9iamVjdFJlZmVyZW5jZSwgT2JqZWN0VGFibGUgfSBmcm9tICcuL29iamVjdHMnO1xuXG5pbXBvcnQgeyBhcGkgfSBmcm9tICcuJztcblxuLyoqXG4gKiBBIHNwZWNpZmljIHNpbmdsZXRvbiB0eXBlIHRvIGJlIGV4cGxpY2l0IGFib3V0IGEgVm9pZCB0eXBlXG4gKlxuICogSW4gdGhlIHNwZWMsICd2b2lkJyBpcyByZXByZXNlbnRlZCBhcyAndW5kZWZpbmVkJygqKSwgYnV0IGFsbG93aW5nIHRoZVxuICogdmFsdWUgJ3VuZGVmaW5lZCcgaW4gZnVuY3Rpb24gY2FsbHMgaGFzIGxlYWQgdG8gY29uc3VtZXJzIGZhaWxpbmcgdG8gcGFzc1xuICogdHlwZSBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgaGFkLCBqdXN0IGJlY2F1c2UgdGhleSBkaWRuJ3QgXCJoYXZlIHRvXCIgKHRoZVxuICogcGFyYW1ldGVyIHdhcyBvcHRpb25hbCkuXG4gKlxuICogKCopIEFzIGluLCBkZWNsYXJhdGlvbiBvZiBhIG1ldGhvZCBsb29rcyBsaWtlIHsgcmV0dXJucz86IFR5cGVSZWZlcmVuY2UgfVxuICogYW5kIHRoZSBhYnNlbmNlIG9mIGEgdHlwZSBtZWFucyBpdCByZXR1cm5zICd2b2lkJy5cbiAqL1xuZXhwb3J0IHR5cGUgVm9pZCA9ICd2b2lkJztcblxuLyoqXG4gKiBBIHR5cGUgaW5zdGFuY2UsIG9yIFZvaWRcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uYWxWYWx1ZU9yVm9pZCA9IHNwZWMuT3B0aW9uYWxWYWx1ZSB8IFZvaWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsIEZRTiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBlbXB0eSBqYXZhc2NyaXB0IG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBFTVBUWV9PQkpFQ1RfRlFOID0gJ09iamVjdCc7XG5cbmV4cG9ydCBjb25zdCBTWU1CT0xfV0lSRV9UWVBFID0gU3ltYm9sLmZvcignJGpzaWkkd2lyZVR5cGUkJyk7XG5cbi8qKlxuICogVGhlIHR5cGUga2luZCwgdGhhdCBjb250cm9scyBob3cgaXQgd2lsbCBiZSBzZXJpYWxpemVkIGFjY29yZGluZyB0byB0aGUgYWJvdmUgdGFibGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VyaWFsaXphdGlvbkNsYXNzIHtcbiAgVm9pZCA9ICdWb2lkJyxcbiAgRGF0ZSA9ICdEYXRlJyxcbiAgU2NhbGFyID0gJ1NjYWxhcicsXG4gIEpzb24gPSAnSnNvbicsXG4gIEVudW0gPSAnRW51bScsXG4gIEFycmF5ID0gJ0FycmF5JyxcbiAgTWFwID0gJ01hcCcsXG4gIFN0cnVjdCA9ICdTdHJ1Y3QnLFxuICBSZWZlcmVuY2VUeXBlID0gJ1JlZlR5cGUnLFxuICBBbnkgPSAnQW55Jyxcbn1cblxudHlwZSBUeXBlTG9va3VwID0gKGZxbjogc3BlYy5GUU4pID0+IHNwZWMuVHlwZTtcbnR5cGUgU3ltYm9sTG9va3VwID0gKGZxbjogc3BlYy5GUU4pID0+IGFueTtcblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVySG9zdCB7XG4gIHJlYWRvbmx5IG9iamVjdHM6IE9iamVjdFRhYmxlO1xuICBkZWJ1ZyguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gIGxvb2t1cFR5cGUoZnFuOiBzdHJpbmcpOiBzcGVjLlR5cGU7XG4gIHJlY3Vyc2UoeDogYW55LCB0eXBlOiBPcHRpb25hbFZhbHVlT3JWb2lkKTogYW55O1xuICBmaW5kU3ltYm9sKGZxbjogc3BlYy5GUU4pOiBhbnk7XG59XG5cbmludGVyZmFjZSBTZXJpYWxpemVyIHtcbiAgc2VyaWFsaXplKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHR5cGU6IE9wdGlvbmFsVmFsdWVPclZvaWQsXG4gICAgaG9zdDogU2VyaWFsaXplckhvc3QsXG4gICk6IGFueTtcbiAgZGVzZXJpYWxpemUoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdHlwZTogT3B0aW9uYWxWYWx1ZU9yVm9pZCxcbiAgICBob3N0OiBTZXJpYWxpemVySG9zdCxcbiAgKTogYW55O1xufVxuXG5leHBvcnQgY29uc3QgU0VSSUFMSVpFUlM6IHsgW2s6IHN0cmluZ106IFNlcmlhbGl6ZXIgfSA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLlZvaWRdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnRXhwZWN0ZWQgdm9pZCwgZ290JywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIF90eXBlLCBob3N0KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBob3N0LmRlYnVnKCdFeHBlY3RlZCB2b2lkLCBnb3QnLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLkRhdGVdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKTogV2lyZURhdGUgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIERhdGUsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICB9LFxuXG4gICAgZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbmFsVmFsdWUpIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNXaXJlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBEYXRlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVzZXJpYWxpemVEYXRlKHZhbHVlKTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5TY2FsYXJdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpbWl0aXZlVHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLlByaW1pdGl2ZVR5cGVSZWZlcmVuY2U7XG5cbiAgICAgIGlmICghaXNTY2FsYXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShcbiAgICAgICAgICAgIG9wdGlvbmFsVmFsdWUudHlwZSxcbiAgICAgICAgICApfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBwcmltaXRpdmVUeXBlLnByaW1pdGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIGEgJHtzcGVjLmRlc2NyaWJlVHlwZVJlZmVyZW5jZShcbiAgICAgICAgICAgIG9wdGlvbmFsVmFsdWUudHlwZSxcbiAgICAgICAgICApfSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSAoJHt0eXBlb2YgdmFsdWV9KWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlKSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJpbWl0aXZlVHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLlByaW1pdGl2ZVR5cGVSZWZlcmVuY2U7XG5cbiAgICAgIGlmICghaXNTY2FsYXIodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYSAke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKFxuICAgICAgICAgICAgb3B0aW9uYWxWYWx1ZS50eXBlLFxuICAgICAgICAgICl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHByaW1pdGl2ZVR5cGUucHJpbWl0aXZlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYSAke3NwZWMuZGVzY3JpYmVUeXBlUmVmZXJlbmNlKFxuICAgICAgICAgICAgb3B0aW9uYWxWYWx1ZS50eXBlLFxuICAgICAgICAgICl9LCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9ICgke3R5cGVvZiB2YWx1ZX0pYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLkpzb25dOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlKSB7XG4gICAgICAvLyBKdXN0IHdoYXRldmVyLiBEYXRlcyB3aWxsIGF1dG9tYXRpY2FsbHkgc2VyaWFsaXplIHRoZW1zZWx2ZXMgdG8gc3RyaW5ncy5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICAvLyAvIVxcIFRvcC1sZXZlbCBcIm51bGxcIiB3aWxsIHR1cm4gdG8gdW5kZWZpbmVkLCBidXQgYW55IG51bGwgbmVzdGVkIGluIHRoZSB2YWx1ZSBpcyB2YWxpZCBKU09OLCBzbyBpdCdsbCBzdGF5IVxuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQSBtYXBwaW5nIG9iamVjdCBjYW4gYXJyaXZlIHRob3VnaCBoZXJlLiBUaGlzIHdvdWxkIGJlIHRoZSBjYXNlIGlmIGFueXRoaW5nIHRoYXQgaXMgdmFsaWQgaW50byBhIE1hcDxzdHJpbmcsID8+XG4gICAgICAvLyBpcyBwYXNzZWQgaW50byBhIEpTT04gdHJhbnNmZXIgcG9pbnQuIEluZGVlZCwgdGhvc2UgYXJlIGFsc28gdmFsaWQgSlNPTiEgRm9yIGV4YW1wbGUsIFB5dGhvbiBcImRpY3RzXCIgd2lsbCBiZVxuICAgICAgLy8gc2VyaWFsaXplZCAoYnkgdGhlIFB5dGhvbiBydW50aW1lKSBhcyBhICRqc2lpLm1hcCAodGhlIG1hcHBpbmcgb2JqZWN0KS4gV2UgbmVlZCB0byBkZS1zZXJpYWxpemUgdGhhdCBhcyBhXG4gICAgICAvLyBNYXA8c3RyaW5nLCBKU09OPiBpbiBvcmRlciB0byBvYnRhaW4gdGhlIGNvcnJlY3Qgb3V0cHV0IGJlaGF2aW9yIGhlcmUhXG4gICAgICBpZiAoaXNXaXJlTWFwKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gU0VSSUFMSVpFUlNbU2VyaWFsaXphdGlvbkNsYXNzLk1hcF0uZGVzZXJpYWxpemUoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAga2luZDogc3BlYy5Db2xsZWN0aW9uS2luZC5NYXAsXG4gICAgICAgICAgICAgICAgZWxlbWVudHR5cGU6IHsgcHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbiB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvc3QsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAobWFwSnNvblZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWx1ZSwgbWFwSnNvblZhbHVlKTtcblxuICAgICAgZnVuY3Rpb24gbWFwSnNvblZhbHVlKHRvTWFwOiBhbnkpIHtcbiAgICAgICAgaWYgKHRvTWFwID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdG9NYXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhvc3QucmVjdXJzZSh0b01hcCwge1xuICAgICAgICAgIHR5cGU6IHsgcHJpbWl0aXZlOiBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5FbnVtXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCk6IFdpcmVFbnVtIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmIChudWxsQW5kT2sodmFsdWUsIG9wdGlvbmFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9uYWxWYWx1ZSA9PT0gJ3ZvaWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgdW5leHBlY3RlZCBgdm9pZGAgdHlwZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZW51bSB2YWx1ZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICBob3N0LmRlYnVnKCdTZXJpYWxpemluZyBlbnVtJyk7XG5cbiAgICAgIGNvbnN0IGVudW1UeXBlID0gb3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuICAgICAgY29uc3QgZW51bU1hcCA9IGhvc3QuZmluZFN5bWJvbChlbnVtVHlwZS5mcW4pO1xuICAgICAgY29uc3QgZW51bUVudHJ5ID0gT2JqZWN0LmVudHJpZXMoZW51bU1hcCkuZmluZCgoWywgdl0pID0+IHYgPT09IHZhbHVlKTtcbiAgICAgIGlmICghZW51bUVudHJ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZW50cnkgaW4gJHtlbnVtVHlwZS5mcW59IGhhcyB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgW1RPS0VOX0VOVU1dOiBgJHtlbnVtVHlwZS5mcW59LyR7ZW51bUVudHJ5WzBdfWAgfTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzV2lyZUVudW0odmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZW51bSB2YWx1ZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzZXJpYWxpemVFbnVtKHZhbHVlLCBob3N0LmZpbmRTeW1ib2wpO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBbU2VyaWFsaXphdGlvbkNsYXNzLkFycmF5XToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhcnJheSB0eXBlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFycmF5VHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlO1xuXG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh4KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UoeCwgeyB0eXBlOiBhcnJheVR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhcnJheSB0eXBlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFycmF5VHlwZSA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlO1xuXG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh4KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UoeCwgeyB0eXBlOiBhcnJheVR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIFtTZXJpYWxpemF0aW9uQ2xhc3MuTWFwXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcFR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtUT0tFTl9NQVBdOiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IG1hcFR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcFR5cGUgPSBvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5Db2xsZWN0aW9uVHlwZVJlZmVyZW5jZTtcbiAgICAgIGlmICghaXNXaXJlTWFwKHZhbHVlKSkge1xuICAgICAgICAvLyBDb21wYXRpYmlsaXR5IG1vZGUgd2l0aCBvbGRlciB2ZXJzaW9ucyB0aGF0IGRpZG4ndCB3cmFwIGluIFtUT0tFTl9NQVBdXG4gICAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IG1hcFR5cGUuY29sbGVjdGlvbi5lbGVtZW50dHlwZSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1hcFZhbHVlcyh2YWx1ZVtUT0tFTl9NQVBdLCAodikgPT5cbiAgICAgICAgaG9zdC5yZWN1cnNlKHYsIHsgdHlwZTogbWFwVHlwZS5jb2xsZWN0aW9uLmVsZW1lbnR0eXBlIH0pLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFNZTUJPTF9XSVJFX1RZUEUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBUT0tFTl9NQVAsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5TdHJ1Y3RdOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBUaGlzIGlzIHdoYXQgd2UnZCBsaWtlIHRvIGRvLCBidXQgd2UgY2FuJ3QgYmVjYXVzZSBhdCBsZWFzdCB0aGUgSmF2YSBjbGllbnRcbiAgICAgICAgZG9lcyBub3QgdW5kZXJzdGFuZCBieS12YWx1ZSBzZXJpYWxpemVkIGludGVyZmFjZSB0eXBlcywgc28gd2UnbGwgaGF2ZSB0b1xuICAgICAgICBzZXJpYWxpemUgYnktcmVmZXJlbmNlLiBBZGRpdGlvbmFsbHksIHNlcmlhbGl6aW5nIGtub3duIHByb3BlcnRpZXMgd291bGRcbiAgICAgICAgY2F1c2UgcHJvYmxlbXMgd2hlbiB0aGUgcmV0dXJuIHR5cGUgb2YgYSBtZXRob2QgaXMgYSBVTklPTiBvZiBzdHJ1Y3RzLlxuICAgICAgICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvNDAwXG5cbiAgICAgIGNvbnN0IHByb3BzID0gcHJvcGVydGllc09mKG5hbWVkVHlwZSk7XG5cbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2LCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFwcm9wc1trZXldKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gLy8gRG9uJ3QgbWFwIGlmIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgcmV0dXJuIGhvc3QucmVjdXJzZSh2LCBwcm9wc1trZXldLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICAqL1xuXG4gICAgICBob3N0LmRlYnVnKCdSZXR1cm5pbmcgdmFsdWUgdHlwZSBieSByZWZlcmVuY2UnKTtcbiAgICAgIHJldHVybiBob3N0Lm9iamVjdHMucmVnaXN0ZXJPYmplY3QodmFsdWUsIEVNUFRZX09CSkVDVF9GUU4sIFtcbiAgICAgICAgKG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSkuZnFuLFxuICAgICAgXSk7XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUgPz8ge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBUcmVhdCBlbXB0eSBzdHJ1Y3RzIGFzIGB1bmRlZmluZWRgIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy80MTEpXG4gICAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG51bGxBbmRPayh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25hbFZhbHVlID09PSAndm9pZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGB2b2lkYCB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBvYmplY3QgcmVmZXJlbmNlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZWRUeXBlID0gaG9zdC5sb29rdXBUeXBlKFxuICAgICAgICAob3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKS5mcW4sXG4gICAgICApO1xuICAgICAgY29uc3QgcHJvcHMgPSBwcm9wZXJ0aWVzT2YobmFtZWRUeXBlLCBob3N0Lmxvb2t1cFR5cGUpO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBHb3QgYW4gYXJyYXkgd2hlcmUgYSAke25hbWVkVHlwZS5mcW59IHdhcyBleHBlY3RlZC4gRGlkIHlvdSBtZWFuIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzP2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbWlsYXJseSB0byBzZXJpYWxpemF0aW9uLCB3ZSBtaWdodCBiZSBnZXR0aW5nIGEgcmVmZXJlbmNlIHR5cGUgd2hlcmUgd2UncmVcbiAgICAgIC8vIGV4cGVjdGluZyBhIHZhbHVlIHR5cGUuIEFjY2VwdCB0aGlzIGZvciBub3cgKGJ1dCBhbHNvIHZhbGlkYXRlIHRoYXQgb2JqZWN0XG4gICAgICAvLyBmb3IgcHJlc2VuY2Ugb2YgdGhlIHJpZ2h0IHByb3BlcnRpZXMpLlxuICAgICAgaWYgKGlzT2JqUmVmKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKFxuICAgICAgICAgICdFeHBlY3RlZCB2YWx1ZSB0eXBlIGJ1dCBnb3QgcmVmZXJlbmNlIHR5cGUsIGFjY2VwdGluZyBmb3Igbm93IChhd3NsYWJzL2pzaWkjNDAwKScsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHNhbWUgSU5TVEFOQ0UgKHNob3VsZG4ndCBtYXR0ZXIgYnV0IHdlIGRvbid0IGtub3cgZm9yIHN1cmUgdGhhdCBpdCBkb2Vzbid0KVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVSZXF1aXJlZFByb3BzKFxuICAgICAgICAgIGhvc3Qub2JqZWN0cy5maW5kT2JqZWN0KHZhbHVlKS5pbnN0YW5jZSxcbiAgICAgICAgICBuYW1lZFR5cGUuZnFuLFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXBpLmlzV2lyZVN0cnVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBmcW4sIGRhdGEgfSA9IHZhbHVlW2FwaS5UT0tFTl9TVFJVQ1RdO1xuICAgICAgICBpZiAoIWlzQXNzaWduYWJsZShmcW4sIG5hbWVkVHlwZSwgaG9zdC5sb29rdXBUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXaXJlIHN0cnVjdCB0eXBlICcke2Zxbn0nIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICcke25hbWVkVHlwZS5mcW59J2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIFB5dGhvbiwgZm9yIGV4YW1wbGUsIGFsbG93cyB1c2luZyBwbGFpbiBtYXBwaW5nIG9iamVjdHMgaW5zdGVhZCBvZiBTdHJ1Y3RzIChkeWFubWljIHR5cGluZywgWU9MTyEpXG4gICAgICBpZiAoYXBpLmlzV2lyZU1hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVthcGkuVE9LRU5fTUFQXTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWxpZGF0ZVJlcXVpcmVkUHJvcHModmFsdWUgYXMgYW55LCBuYW1lZFR5cGUuZnFuLCBwcm9wcyk7XG5cbiAgICAgIC8vIFJldHVybiBhIGRpY3QgQ09QWSwgd2UgaGF2ZSBieS12YWx1ZSBzZW1hbnRpY3MgYW55d2F5LlxuICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWx1ZSwgKHYsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIXByb3BzW2tleV0pIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IC8vIERvbid0IG1hcCBpZiB1bmtub3duIHByb3BlcnR5XG4gICAgICAgIHJldHVybiBob3N0LnJlY3Vyc2UodiwgcHJvcHNba2V5XSk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5SZWZlcmVuY2VUeXBlXToge1xuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9uYWxWYWx1ZSwgaG9zdCk6IE9ialJlZiB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIG9iamVjdCByZWZlcmVuY2UsIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBob3N0Lmxvb2t1cFR5cGUoXG4gICAgICAgIChvcHRpb25hbFZhbHVlLnR5cGUgYXMgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpLmZxbixcbiAgICAgICk7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzID0gc3BlYy5pc0ludGVyZmFjZVR5cGUoZXhwZWN0ZWRUeXBlKVxuICAgICAgICA/IFtleHBlY3RlZFR5cGUuZnFuXVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGpzaWlUeXBlID1cbiAgICAgICAganNpaVR5cGVGcW4odmFsdWUpID8/XG4gICAgICAgIChzcGVjLmlzQ2xhc3NUeXBlKGV4cGVjdGVkVHlwZSkgPyBleHBlY3RlZFR5cGUuZnFuIDogRU1QVFlfT0JKRUNUX0ZRTik7XG5cbiAgICAgIHJldHVybiBob3N0Lm9iamVjdHMucmVnaXN0ZXJPYmplY3QodmFsdWUsIGpzaWlUeXBlLCBpbnRlcmZhY2VzKTtcbiAgICB9LFxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25hbFZhbHVlLCBob3N0KSB7XG4gICAgICBpZiAobnVsbEFuZE9rKHZhbHVlLCBvcHRpb25hbFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbmFsVmFsdWUgPT09ICd2b2lkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY291bnRlcmVkIHVuZXhwZWN0ZWQgYHZvaWRgIHR5cGUnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHBhc3MgYSBieS1yZWYgb2JqZWN0IGlzIHRvIGhhdmUgY3JlYXRlZCBpdFxuICAgICAgLy8gcHJldmlvdXNseSBpbnNpZGUgSlNJSSBrZXJuZWwsIHNvIGl0IG11c3QgaGF2ZSBhbiBvYmpyZWYgYWxyZWFkeS5cblxuICAgICAgaWYgKCFpc09ialJlZih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCBvYmplY3QgcmVmZXJlbmNlLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBpbnN0YW5jZSwgZnFuIH0gPSBob3N0Lm9iamVjdHMuZmluZE9iamVjdCh2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IG5hbWVkVHlwZVJlZiA9IG9wdGlvbmFsVmFsdWUudHlwZSBhcyBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbiAgICAgIGlmIChuYW1lZFR5cGVSZWYuZnFuICE9PSBFTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgICAgIGNvbnN0IG5hbWVkVHlwZSA9IGhvc3QubG9va3VwVHlwZShuYW1lZFR5cGVSZWYuZnFuKTtcblxuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgd2UgZ290IGlzIG9mIHRoZSByaWdodCB0eXBlXG4gICAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBmb3IgY2xhc3Nlcywgbm90IGludGVyZmFjZXMsIHNpbmNlIEphdmEgbWlnaHQgcGFzcyB1cyBvYmplY3RzIHRoYXRcbiAgICAgICAgLy8gcHJpdmF0ZWx5IGltcGxlbWVudCBzb21lIGludGVyZmFjZSBhbmQgd2UgY2FuJ3QgcHJvdmUgdGhleSBkb24ndC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8zOTlcbiAgICAgICAgY29uc3QgZGVjbGFyZWRUeXBlID0gb3B0aW9uYWxWYWx1ZS50eXBlIGFzIHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0NsYXNzVHlwZShuYW1lZFR5cGUpICYmXG4gICAgICAgICAgIWlzQXNzaWduYWJsZShmcW4sIGRlY2xhcmVkVHlwZSwgaG9zdC5sb29rdXBUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgT2JqZWN0IG9mIHR5cGUgJHtmcW59IGlzIG5vdCBjb252ZXJ0aWJsZSB0byAke2RlY2xhcmVkVHlwZS5mcW59YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9LFxuICB9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgW1NlcmlhbGl6YXRpb25DbGFzcy5BbnldOiB7XG4gICAgc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2NhbGFyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoZSkgPT4gaG9zdC5yZWN1cnNlKGUsIHsgdHlwZTogc3BlYy5DQU5PTklDQUxfQU5ZIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm90ZTogbm8gY2FzZSBmb3IgXCJFTlVNXCIgaGVyZSwgd2l0aG91dCB0eXBlIGRlY2xhcmF0aW9uIHdlIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2VcbiAgICAgIC8vIGJldHdlZW4gYW4gZW51bSBtZW1iZXIgYW5kIGEgc2NhbGFyLlxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSlNJSSBLZXJuZWwgaXMgdW5hYmxlIHRvIHNlcmlhbGl6ZSBgZnVuY3Rpb25gLiBBbiBpbnN0YW5jZSB3aXRoIG1ldGhvZHMgbWlnaHQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGFuIGBhbnlgIG1ldGhvZD8nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSlNJSSBrZXJuZWwgYXNzdW1wdGlvbiB2aW9sYXRlZCwgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICl9IGlzIG5vdCBhbiBvYmplY3RgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIFNZTUJPTF9XSVJFX1RZUEUgaW4gdmFsdWUgJiZcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbU1lNQk9MX1dJUkVfVFlQRV0gPT09IFRPS0VOX01BUFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBTRVJJQUxJWkVSU1tTZXJpYWxpemF0aW9uQ2xhc3MuTWFwXS5zZXJpYWxpemUoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAga2luZDogc3BlYy5Db2xsZWN0aW9uS2luZC5NYXAsXG4gICAgICAgICAgICAgICAgZWxlbWVudHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBob3N0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUbyBtYWtlIHN1cmUgcGVvcGxlIGFyZW4ndCBnb2luZyB0byB0cnkgYW5kIHJldHVybiBNYXA8PiBvciBTZXQ8PiBvdXQsIHRlc3QgZm9yXG4gICAgICAvLyB0aG9zZSBhbmQgdGhyb3cgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLiBXZSBjYW4ndCBkZXRlY3QgdGhlc2UgY2FzZXMgYW55IG90aGVyXG4gICAgICAvLyB3YXksIGFuZCB0aGUgYnktdmFsdWUgc2VyaWFsaXplZCBvYmplY3Qgd2lsbCBiZSBxdWl0ZSB1c2VsZXNzLlxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJldHVybiBvYmplY3RzIG9mIHR5cGUgU2V0IG9yIE1hcFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGEgcHJldmlvdXMgcmVmZXJlbmNlIHRvIG1haW50YWluIG9iamVjdCBpZGVudGl0eS4gTk9URTogdGhpcyBtYXkgY2F1c2UgdXMgdG8gcmV0dXJuXG4gICAgICAvLyBhIGRpZmZlcmVudCB0eXBlIHRoYW4gcmVxdWVzdGVkISBUaGlzIGlzIGp1c3QgaG93IGl0IGlzIHJpZ2h0IG5vdy5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMzk5XG4gICAgICBjb25zdCBwcmV2UmVmID0gb2JqZWN0UmVmZXJlbmNlKHZhbHVlKTtcbiAgICAgIGlmIChwcmV2UmVmKSB7XG4gICAgICAgIHJldHVybiBwcmV2UmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGlzIGlzIG9yIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0eXBlLCBwYXNzIG9yIG1ha2UgdGhlIHJlZmVyZW5jZVxuICAgICAgLy8gKExpa2UgcmVndWxhciByZWZ0eXBlIHNlcmlhbGl6YXRpb24sIGJ1dCB3aXRob3V0IHRoZSB0eXBlIGRlcml2YXRpb24gdG8gYW4gaW50ZXJmYWNlKVxuICAgICAgY29uc3QganNpaVR5cGUgPVxuICAgICAgICBqc2lpVHlwZUZxbih2YWx1ZSkgPz9cbiAgICAgICAgKGlzQnlSZWZlcmVuY2VPbmx5KHZhbHVlKSA/IEVNUFRZX09CSkVDVF9GUU4gOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKGpzaWlUeXBlKSB7XG4gICAgICAgIHJldHVybiBob3N0Lm9iamVjdHMucmVnaXN0ZXJPYmplY3QodmFsdWUsIGpzaWlUeXBlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFuIG9iamVjdCB0aGF0IGlzIG5vdCBvZiBhbiBleHBvcnRlZCB0eXBlLiBFaXRoZXIgYW4gb2JqZWN0XG4gICAgICAvLyBsaXRlcmFsLCBvciBhbiBpbnN0YW5jZSBvZiBhIGZ1bGx5IHByaXZhdGUgY2xhc3MgKGNhbm5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcykuXG5cbiAgICAgIC8vIFdlIHdpbGwgc2VyaWFsaXplIGJ5LXZhbHVlLCBidXQgcmVjdXJzZSBmb3Igc2VyaWFsaXphdGlvbiBzbyB0aGF0IGlmXG4gICAgICAvLyB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZSBvYmplY3RzLCB0aGV5IHdpbGwgYmUgc2VyaWFsaXplZCBhcHByb3ByaWF0ZWx5LlxuICAgICAgLy8gKEJhc2ljYWxseSwgc2VyaWFsaXplIGFueXRoaW5nIGVsc2UgYXMgYSBtYXAgb2YgJ2FueScpLlxuICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWx1ZSwgKHYpID0+XG4gICAgICAgIGhvc3QucmVjdXJzZSh2LCB7IHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSB9KSxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBfdHlwZSwgaG9zdCkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzV2lyZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIERhdGUnKTtcbiAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTY2FsYXIodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIFNjYWxhcicpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnQU5ZIGlzIGFuIEFycmF5Jyk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGUpID0+IGhvc3QucmVjdXJzZShlLCB7IHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1dpcmVFbnVtKHZhbHVlKSkge1xuICAgICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYW4gRW51bScpO1xuICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVFbnVtKHZhbHVlLCBob3N0LmZpbmRTeW1ib2wpO1xuICAgICAgfVxuICAgICAgaWYgKGlzV2lyZU1hcCh2YWx1ZSkpIHtcbiAgICAgICAgaG9zdC5kZWJ1ZygnQU5ZIGlzIGEgTWFwJyk7XG4gICAgICAgIGNvbnN0IG1hcE9mQW55OiBzcGVjLkNvbGxlY3Rpb25UeXBlUmVmZXJlbmNlID0ge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgICAgIGtpbmQ6IHNwZWMuQ29sbGVjdGlvbktpbmQuTWFwLFxuICAgICAgICAgICAgZWxlbWVudHR5cGU6IHNwZWMuQ0FOT05JQ0FMX0FOWSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gU0VSSUFMSVpFUlNbU2VyaWFsaXphdGlvbkNsYXNzLk1hcF0uZGVzZXJpYWxpemUoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgeyB0eXBlOiBtYXBPZkFueSB9LFxuICAgICAgICAgIGhvc3QsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmpSZWYodmFsdWUpKSB7XG4gICAgICAgIGhvc3QuZGVidWcoJ0FOWSBpcyBhIFJlZicpO1xuICAgICAgICByZXR1cm4gaG9zdC5vYmplY3RzLmZpbmRPYmplY3QodmFsdWUpLmluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgaGFzIGEgc3RydWN0IHRva2VuLCBpdCB3YXMgc2VyaWFsaXplZCBieSBhIHR5cGVkIGpzaWlcbiAgICAgIC8vIHN0cnVjdCwgYnV0IHNpbmNlIHRoZSBkZXNlcmlhbGl6YXRpb24gdGFyZ2V0IGlzIEFOWSwgYWxsIHdlIGNhbiBkbyBpc1xuICAgICAgLy8gc3RyaXAgdGhlIGRhdGEgZnJvbSAkanNpaS5zdHJ1Y3QgYW5kIGNvbnRpbnVlIHRvIGRlc2VyaWFsaXplIGFzIEFOWS5cbiAgICAgIGlmIChpc1dpcmVTdHJ1Y3QodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgZnFuLCBkYXRhIH0gPSB2YWx1ZVtUT0tFTl9TVFJVQ1RdO1xuICAgICAgICBob3N0LmRlYnVnKGBBTlkgaXMgYSBzdHJ1Y3Qgb2YgdHlwZSAke2Zxbn1gKTtcbiAgICAgICAgcmV0dXJuIFNFUklBTElaRVJTW1NlcmlhbGl6YXRpb25DbGFzcy5TdHJ1Y3RdLmRlc2VyaWFsaXplKFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgeyB0eXBlOiB7IGZxbiB9IH0sXG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXQgdGhpcyBwb2ludCBhZ2FpbiwgZGVzZXJpYWxpemUgYnktdmFsdWUuXG4gICAgICBob3N0LmRlYnVnKCdBTlkgaXMgYSBNYXAnKTtcbiAgICAgIHJldHVybiBtYXBWYWx1ZXModmFsdWUsICh2KSA9PlxuICAgICAgICBob3N0LnJlY3Vyc2UodiwgeyB0eXBlOiBzcGVjLkNBTk9OSUNBTF9BTlkgfSksXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzZXJpYWxpemVEYXRlKHZhbHVlOiBEYXRlKTogV2lyZURhdGUge1xuICByZXR1cm4geyBbVE9LRU5fREFURV06IHZhbHVlLnRvSVNPU3RyaW5nKCkgfTtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVEYXRlKHZhbHVlOiBXaXJlRGF0ZSk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUodmFsdWVbVE9LRU5fREFURV0pO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUVudW0odmFsdWU6IFdpcmVFbnVtLCBsb29rdXA6IFN5bWJvbExvb2t1cCkge1xuICBjb25zdCBlbnVtTG9jYXRvciA9IHZhbHVlW1RPS0VOX0VOVU1dO1xuICBjb25zdCBzZXAgPSBlbnVtTG9jYXRvci5sYXN0SW5kZXhPZignLycpO1xuICBpZiAoc2VwID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWFsZm9ybWVkIGVudW0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICB9XG5cbiAgY29uc3QgdHlwZU5hbWUgPSBlbnVtTG9jYXRvci5zbGljZSgwLCBzZXApO1xuICBjb25zdCB2YWx1ZU5hbWUgPSBlbnVtTG9jYXRvci5zbGljZShzZXAgKyAxKTtcblxuICBjb25zdCBlbnVtVmFsdWUgPSBsb29rdXAodHlwZU5hbWUpW3ZhbHVlTmFtZV07XG4gIGlmIChlbnVtVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZW51bSBtZW1iZXIgbmFtZWQgJHt2YWx1ZU5hbWV9IGluICR7dHlwZU5hbWV9YCk7XG4gIH1cbiAgcmV0dXJuIGVudW1WYWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2VyaWFsaXphdGlvbiB7XG4gIHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzO1xuICB0eXBlUmVmOiBPcHRpb25hbFZhbHVlT3JWb2lkO1xufVxuXG4vKipcbiAqIEZyb20gYSB0eXBlIHJlZmVyZW5jZSwgcmV0dXJuIHRoZSBwb3NzaWJsZSBzZXJpYWxpemF0aW9uIHR5cGVzXG4gKlxuICogVGhlcmUgY2FuIGJlIG11bHRpcGxlLCBiZWNhdXNlIHRoZSB0eXBlIGNhbiBiZSBhIHR5cGUgdW5pb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemF0aW9uVHlwZShcbiAgdHlwZVJlZjogT3B0aW9uYWxWYWx1ZU9yVm9pZCxcbiAgbG9va3VwOiBUeXBlTG9va3VwLFxuKTogVHlwZVNlcmlhbGl6YXRpb25bXSB7XG4gIGlmICh0eXBlUmVmID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJLZXJuZWwgZXJyb3I6IGV4cGVjdGVkIHR5cGUgaW5mb3JtYXRpb24sIGdvdCAndW5kZWZpbmVkJ1wiKTtcbiAgfVxuICBpZiAodHlwZVJlZiA9PT0gJ3ZvaWQnKSB7XG4gICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLlZvaWQsIHR5cGVSZWYgfV07XG4gIH1cbiAgaWYgKHNwZWMuaXNQcmltaXRpdmVUeXBlUmVmZXJlbmNlKHR5cGVSZWYudHlwZSkpIHtcbiAgICBzd2l0Y2ggKHR5cGVSZWYudHlwZS5wcmltaXRpdmUpIHtcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkFueTpcbiAgICAgICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLkFueSwgdHlwZVJlZiB9XTtcbiAgICAgIGNhc2Ugc3BlYy5QcmltaXRpdmVUeXBlLkRhdGU6XG4gICAgICAgIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5EYXRlLCB0eXBlUmVmIH1dO1xuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuSnNvbjpcbiAgICAgICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLkpzb24sIHR5cGVSZWYgfV07XG4gICAgICBjYXNlIHNwZWMuUHJpbWl0aXZlVHlwZS5Cb29sZWFuOlxuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuTnVtYmVyOlxuICAgICAgY2FzZSBzcGVjLlByaW1pdGl2ZVR5cGUuU3RyaW5nOlxuICAgICAgICByZXR1cm4gW3sgc2VyaWFsaXphdGlvbkNsYXNzOiBTZXJpYWxpemF0aW9uQ2xhc3MuU2NhbGFyLCB0eXBlUmVmIH1dO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltaXRpdmUgdHlwZScpO1xuICB9XG4gIGlmIChzcGVjLmlzQ29sbGVjdGlvblR5cGVSZWZlcmVuY2UodHlwZVJlZi50eXBlKSkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHNlcmlhbGl6YXRpb25DbGFzczpcbiAgICAgICAgICB0eXBlUmVmLnR5cGUuY29sbGVjdGlvbi5raW5kID09PSBzcGVjLkNvbGxlY3Rpb25LaW5kLkFycmF5XG4gICAgICAgICAgICA/IFNlcmlhbGl6YXRpb25DbGFzcy5BcnJheVxuICAgICAgICAgICAgOiBTZXJpYWxpemF0aW9uQ2xhc3MuTWFwLFxuICAgICAgICB0eXBlUmVmLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGlmIChzcGVjLmlzVW5pb25UeXBlUmVmZXJlbmNlKHR5cGVSZWYudHlwZSkpIHtcbiAgICBjb25zdCBjb21wb3VuZFR5cGVzID0gZmxhdE1hcCh0eXBlUmVmLnR5cGUudW5pb24udHlwZXMsICh0KSA9PlxuICAgICAgc2VyaWFsaXphdGlvblR5cGUoeyB0eXBlOiB0IH0sIGxvb2t1cCksXG4gICAgKTtcbiAgICAvLyBQcm9wYWdhdGUgdGhlIHRvcC1sZXZlbCAnb3B0aW9uYWwnIGZpZWxkIHRvIGVhY2ggaW5kaXZpZHVhbCBzdWJ0eXBlXG4gICAgZm9yIChjb25zdCB0IG9mIGNvbXBvdW5kVHlwZXMpIHtcbiAgICAgIGlmICh0LnR5cGVSZWYgIT09ICd2b2lkJykge1xuICAgICAgICB0LnR5cGVSZWYub3B0aW9uYWwgPSB0eXBlUmVmLm9wdGlvbmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcG91bmRUeXBlcy5zb3J0KChsLCByKSA9PlxuICAgICAgY29tcGFyZVNlcmlhbGl6YXRpb25DbGFzc2VzKGwuc2VyaWFsaXphdGlvbkNsYXNzLCByLnNlcmlhbGl6YXRpb25DbGFzcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBuZXh0IHBhcnQgb2YgdGhlIGNvbnZlcnNpb24gaXMgbG9va3VwLWRlcGVuZGVudFxuICBjb25zdCB0eXBlID0gbG9va3VwKHR5cGVSZWYudHlwZS5mcW4pO1xuXG4gIGlmIChzcGVjLmlzRW51bVR5cGUodHlwZSkpIHtcbiAgICByZXR1cm4gW3sgc2VyaWFsaXphdGlvbkNsYXNzOiBTZXJpYWxpemF0aW9uQ2xhc3MuRW51bSwgdHlwZVJlZiB9XTtcbiAgfVxuXG4gIGlmIChzcGVjLmlzSW50ZXJmYWNlVHlwZSh0eXBlKSAmJiB0eXBlLmRhdGF0eXBlKSB7XG4gICAgcmV0dXJuIFt7IHNlcmlhbGl6YXRpb25DbGFzczogU2VyaWFsaXphdGlvbkNsYXNzLlN0cnVjdCwgdHlwZVJlZiB9XTtcbiAgfVxuXG4gIHJldHVybiBbeyBzZXJpYWxpemF0aW9uQ2xhc3M6IFNlcmlhbGl6YXRpb25DbGFzcy5SZWZlcmVuY2VUeXBlLCB0eXBlUmVmIH1dO1xufVxuXG5mdW5jdGlvbiBudWxsQW5kT2soeDogdW5rbm93biwgdHlwZTogT3B0aW9uYWxWYWx1ZU9yVm9pZCk6IGJvb2xlYW4ge1xuICBpZiAoeCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICd2b2lkJyAmJiAhdHlwZS5vcHRpb25hbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBHb3QgJ3VuZGVmaW5lZCcgZm9yIG5vbi1vcHRpb25hbCBpbnN0YW5jZSBvZiAke0pTT04uc3RyaW5naWZ5KHR5cGUpfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0RhdGUoeDogdW5rbm93bik6IHggaXMgRGF0ZSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHggPT09ICdvYmplY3QnICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBEYXRlXSdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNTY2FsYXIoeDogdW5rbm93bik6IHggaXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHggPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB4ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgeCA9PT0gJ2Jvb2xlYW4nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZsYXRNYXA8VCwgVT4oeHM6IFRbXSwgZm46ICh4OiBUKSA9PiBVW10pOiBVW10ge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8VT4oKTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgcmV0LnB1c2goLi4uZm4oeCkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogTWFwIGFuIG9iamVjdCdzIHZhbHVlcywgc2tpcHBpbmcgJ3VuZGVmaW5lZCcgdmFsdWVzJ1xuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBmbjogKHZhbHVlOiBhbnksIGZpZWxkOiBzdHJpbmcpID0+IGFueSxcbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgdHlwZSwgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICB9XG5cbiAgY29uc3Qgb3V0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGNvbnN0IHdpcmVWYWx1ZSA9IGZuKHYsIGspO1xuICAgIGlmICh3aXJlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG91dFtrXSA9IHdpcmVWYWx1ZTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0aWVzT2YoXG4gIHQ6IHNwZWMuVHlwZSxcbiAgbG9va3VwOiBUeXBlTG9va3VwLFxuKTogeyBbbmFtZTogc3RyaW5nXTogc3BlYy5Qcm9wZXJ0eSB9IHtcbiAgaWYgKCFzcGVjLmlzQ2xhc3NPckludGVyZmFjZVR5cGUodCkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBsZXQgcmV0OiB7IFtuYW1lOiBzdHJpbmddOiBzcGVjLlByb3BlcnR5IH0gPSB7fTtcblxuICBpZiAodC5pbnRlcmZhY2VzKSB7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0LmludGVyZmFjZXMpIHtcbiAgICAgIHJldCA9IHsgLi4ucmV0LCAuLi5wcm9wZXJ0aWVzT2YobG9va3VwKGlmYWNlKSwgbG9va3VwKSB9O1xuICAgIH1cbiAgfVxuICBpZiAoc3BlYy5pc0NsYXNzVHlwZSh0KSAmJiB0LmJhc2UpIHtcbiAgICByZXQgPSB7IC4uLnJldCwgLi4ucHJvcGVydGllc09mKGxvb2t1cCh0LmJhc2UpLCBsb29rdXApIH07XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2YgdC5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgcmV0W3Byb3AubmFtZV0gPSBwcm9wO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgZ2l2ZW4gdHlwZSAoYnkgaXQncyBGUU4pIGNhbiBiZSBhc3NpZ25lZCB0byBhIG5hbWVkIHR5cGUgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSBhY3R1YWxUeXBlRnFuIHRoZSBGUU4gb2YgdGhlIHR5cGUgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuXG4gKiBAcGFyYW0gcmVxdWlyZWRUeXBlICB0aGUgcmVxdWlyZWQgcmVmZXJlbmNlIHR5cGUuXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiBgYHJlcXVpcmVkVHlwZWBgIGlzIGEgc3VwZXItdHlwZSAoYmFzZSBjbGFzcyBvciBpbXBsZW1lbnRlZCBpbnRlcmZhY2UpIG9mIHRoZSB0eXBlIGRlc2lnbmF0ZWQgYnlcbiAqICAgICAgICAgIGBgYWN0dWFsVHlwZUZxbmBgLlxuICovXG5mdW5jdGlvbiBpc0Fzc2lnbmFibGUoXG4gIGFjdHVhbFR5cGVGcW46IHN0cmluZyxcbiAgcmVxdWlyZWRUeXBlOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgbG9va3VwOiBUeXBlTG9va3VwLFxuKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBlbXB0eSBvYmplY3QgaXMgYXNzaWduYWJsZSB0byBldmVyeXRoaW5nXG4gIGlmIChhY3R1YWxUeXBlRnFuID09PSBFTVBUWV9PQkpFQ1RfRlFOKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocmVxdWlyZWRUeXBlLmZxbiA9PT0gYWN0dWFsVHlwZUZxbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IGFjdHVhbFR5cGUgPSBsb29rdXAoYWN0dWFsVHlwZUZxbik7XG4gIGlmIChzcGVjLmlzQ2xhc3NUeXBlKGFjdHVhbFR5cGUpKSB7XG4gICAgaWYgKFxuICAgICAgYWN0dWFsVHlwZS5iYXNlICYmXG4gICAgICBpc0Fzc2lnbmFibGUoYWN0dWFsVHlwZS5iYXNlLCByZXF1aXJlZFR5cGUsIGxvb2t1cClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoc3BlYy5pc0NsYXNzT3JJbnRlcmZhY2VUeXBlKGFjdHVhbFR5cGUpICYmIGFjdHVhbFR5cGUuaW50ZXJmYWNlcykge1xuICAgIHJldHVybiAoXG4gICAgICBhY3R1YWxUeXBlLmludGVyZmFjZXMuZmluZCgoaWZhY2UpID0+XG4gICAgICAgIGlzQXNzaWduYWJsZShpZmFjZSwgcmVxdWlyZWRUeXBlLCBsb29rdXApLFxuICAgICAgKSAhPSBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRQcm9wcyhcbiAgYWN0dWFsUHJvcHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIHR5cGVOYW1lOiBzdHJpbmcsXG4gIHNwZWNQcm9wczogeyBba2V5OiBzdHJpbmddOiBzcGVjLlByb3BlcnR5IH0sXG4pIHtcbiAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAgY29uc3QgbWlzc2luZ1JlcXVpcmVkUHJvcHMgPSBPYmplY3Qua2V5cyhzcGVjUHJvcHMpXG4gICAgLmZpbHRlcigobmFtZSkgPT4gIXNwZWNQcm9wc1tuYW1lXS5vcHRpb25hbClcbiAgICAuZmlsdGVyKChuYW1lKSA9PiAhKG5hbWUgaW4gYWN0dWFsUHJvcHMpKTtcblxuICBpZiAobWlzc2luZ1JlcXVpcmVkUHJvcHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnRpZXMgZm9yICR7dHlwZU5hbWV9OiAke21pc3NpbmdSZXF1aXJlZFByb3BzLmpvaW4oXG4gICAgICAgICcsICcsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhY3R1YWxQcm9wcztcbn1cblxuZnVuY3Rpb24gY29tcGFyZVNlcmlhbGl6YXRpb25DbGFzc2VzKFxuICBsOiBTZXJpYWxpemF0aW9uQ2xhc3MsXG4gIHI6IFNlcmlhbGl6YXRpb25DbGFzcyxcbik6IG51bWJlciB7XG4gIGNvbnN0IG9yZGVyID0gW1xuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5Wb2lkLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5EYXRlLFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5TY2FsYXIsXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkpzb24sXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkVudW0sXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLkFycmF5LFxuICAgIFNlcmlhbGl6YXRpb25DbGFzcy5NYXAsXG4gICAgU2VyaWFsaXphdGlvbkNsYXNzLlN0cnVjdCxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuUmVmZXJlbmNlVHlwZSxcbiAgICBTZXJpYWxpemF0aW9uQ2xhc3MuQW55LFxuICBdO1xuICByZXR1cm4gb3JkZXIuaW5kZXhPZihsKSAtIG9yZGVyLmluZGV4T2Yocik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGBvYmpgIG11c3QgYmUgcGFzc2VkIGJ5LXJlZmVyZW5jZSBvciBpZiBieS12YWx1ZSBpcyBhY2NlcHRhYmxlLiBGb3IgZXhhbXBsZSxcbiAqIG9iamVjdHMgd2l0aCBtZXRob2RzLCBvciBkeW5hbWljIGdldHRlcnMgKG9yIHNldHRlcnMpIHNob3VsZCBiZSBwYXNzZWQgYnktcmVmZXJlbmNlIGFzIGEgbWF0dGVyXG4gKiBvZiBzZWN1cml0eS4gVGhlIGJlaGF2aW9yIGluIG5vbi1KUyBydW50aW1lcyBjb3VsZCBvdGhlcndpc2UgZGlmZmVyIGZyb20gdGhhdCBpbiBwdXJlIEpTIChpZlxuICogZ2V0dGVycyBhcmUgbm90IHN0YWJsZSwgZXRjLi4uKS5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgdGVzdGVkLlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgYG9iamAgbXVzdCBiZSBwYXNzZWQgYnktcmVmZXJlbmNlLlxuICovXG5mdW5jdGlvbiBpc0J5UmVmZXJlbmNlT25seShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGN1cnIgPSBvYmo7XG4gIC8vIENyYXdsIHVwIHRoZSBwcm90b3R5cGUgY2hhaW4gdG8gbG9vayBmb3IgZHluYW1pYyBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMuXG4gIGRvIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycikpIHtcbiAgICAgIGNvbnN0IGRlc2NyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdXJyLCBwcm9wKTtcbiAgICAgIGlmIChcbiAgICAgICAgZGVzY3I/LmdldCAhPSBudWxsIHx8XG4gICAgICAgIGRlc2NyPy5zZXQgIT0gbnVsbCB8fFxuICAgICAgICB0eXBlb2YgZGVzY3I/LnZhbHVlID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgLy8gUHJvcGVydHkgaGFzIGEgZHluYW1pYyBnZXR0ZXIsIHNldHRlciBvciBpcyBhIGNvbnN0cnVjdG9yL21ldGhvZCwgc28gYnktcmVmIHJlcXVpcmVkIVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRW5kIHdoZW4gdGhlIHBhcmVudCBwcm90byBpcyBgT2JqZWN0YCwgd2hpY2ggaGFzIG5vIHBhcmVudCBwcm90byBpdHNlbGYuXG4gIH0gd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZigoY3VyciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyKSkpICE9IG51bGwpO1xuXG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
711
|
+
//# sourceMappingURL=serialization.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsii/kernel",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.60.1",
|
|
4
4
|
"description": "kernel for jsii execution environment",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"directory": "packages/@jsii/kernel"
|
|
18
18
|
},
|
|
19
19
|
"engines": {
|
|
20
|
-
"node": ">=
|
|
20
|
+
"node": ">= 14.5.0"
|
|
21
21
|
},
|
|
22
22
|
"main": "lib/index.js",
|
|
23
23
|
"types": "lib/index.d.ts",
|
|
@@ -31,24 +31,17 @@
|
|
|
31
31
|
"package": "package-js"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@jsii/spec": "^1.
|
|
35
|
-
"fs-extra": "^
|
|
34
|
+
"@jsii/spec": "^1.60.1",
|
|
35
|
+
"fs-extra": "^10.1.0",
|
|
36
36
|
"tar": "^6.1.11"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@scope/jsii-calc-base": "^1.
|
|
40
|
-
"@scope/jsii-calc-lib": "^1.
|
|
39
|
+
"@scope/jsii-calc-base": "^1.60.1",
|
|
40
|
+
"@scope/jsii-calc-lib": "^1.60.1",
|
|
41
41
|
"@types/fs-extra": "^9.0.13",
|
|
42
|
-
"@types/jest": "^27.4.1",
|
|
43
|
-
"@types/node": "^12.20.48",
|
|
44
42
|
"@types/tar": "^6.1.1",
|
|
45
|
-
"eslint": "^8.13.0",
|
|
46
|
-
"jest": "^27.5.1",
|
|
47
43
|
"jest-expect-message": "^1.0.2",
|
|
48
|
-
"jsii-build-tools": "^1.
|
|
49
|
-
"jsii-calc": "^3.20.120"
|
|
50
|
-
"prettier": "^2.6.2",
|
|
51
|
-
"ts-jest": "^27.1.4",
|
|
52
|
-
"typescript": "~3.9.10"
|
|
44
|
+
"jsii-build-tools": "^1.60.1",
|
|
45
|
+
"jsii-calc": "^3.20.120"
|
|
53
46
|
}
|
|
54
47
|
}
|
package/test/kernel.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function deepEqualWithRegex(lvalue: any, rvalue: any): boolean;
|