jsii-pacmak 1.59.0 → 1.61.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/bin/jsii-pacmak.js +17 -10
- package/bin/jsii-pacmak.js.map +1 -0
- package/lib/builder.js +2 -2
- package/lib/builder.js.map +1 -0
- package/lib/dependency-graph.js +7 -11
- package/lib/dependency-graph.js.map +1 -0
- package/lib/generator.js +4 -6
- package/lib/generator.js.map +1 -0
- package/lib/index.js +7 -7
- package/lib/index.js.map +1 -0
- package/lib/logging.js +1 -1
- package/lib/logging.js.map +1 -0
- package/lib/markdown.js +5 -9
- package/lib/markdown.js.map +1 -0
- package/lib/naming-util.js +1 -1
- package/lib/naming-util.js.map +1 -0
- package/lib/npm-modules.js +8 -9
- package/lib/npm-modules.js.map +1 -0
- package/lib/packaging.js +3 -4
- package/lib/packaging.js.map +1 -0
- package/lib/target.js +5 -7
- package/lib/target.js.map +1 -0
- package/lib/targets/_utils.js +4 -5
- package/lib/targets/_utils.js.map +1 -0
- package/lib/targets/dotnet/dotnetdocgenerator.js +8 -10
- package/lib/targets/dotnet/dotnetdocgenerator.js.map +1 -0
- package/lib/targets/dotnet/dotnetgenerator.js +11 -19
- package/lib/targets/dotnet/dotnetgenerator.js.map +1 -0
- package/lib/targets/dotnet/dotnetruntimegenerator.js +2 -3
- package/lib/targets/dotnet/dotnetruntimegenerator.js.map +1 -0
- package/lib/targets/dotnet/dotnettyperesolver.js +10 -14
- package/lib/targets/dotnet/dotnettyperesolver.js.map +1 -0
- package/lib/targets/dotnet/filegenerator.js +5 -5
- package/lib/targets/dotnet/filegenerator.js.map +1 -0
- package/lib/targets/dotnet/nameutils.js +3 -3
- package/lib/targets/dotnet/nameutils.js.map +1 -0
- package/lib/targets/dotnet.js +8 -8
- package/lib/targets/dotnet.js.map +1 -0
- package/lib/targets/go/comparators.js +1 -1
- package/lib/targets/go/comparators.js.map +1 -0
- package/lib/targets/go/dependencies.js +1 -1
- package/lib/targets/go/dependencies.js.map +1 -0
- package/lib/targets/go/documentation.js +1 -1
- package/lib/targets/go/documentation.js.map +1 -0
- package/lib/targets/go/emit-context.js +1 -1
- package/lib/targets/go/emit-context.js.map +1 -0
- package/lib/targets/go/package.js +18 -20
- package/lib/targets/go/package.js.map +1 -0
- package/lib/targets/go/readme-file.js +1 -1
- package/lib/targets/go/readme-file.js.map +1 -0
- package/lib/targets/go/runtime/class-constructor.js +6 -6
- package/lib/targets/go/runtime/class-constructor.js.map +1 -0
- package/lib/targets/go/runtime/constants.js +1 -1
- package/lib/targets/go/runtime/constants.js.map +1 -0
- package/lib/targets/go/runtime/emit-arguments.js +3 -3
- package/lib/targets/go/runtime/emit-arguments.js.map +1 -0
- package/lib/targets/go/runtime/function-call.js +2 -3
- package/lib/targets/go/runtime/function-call.js.map +1 -0
- package/lib/targets/go/runtime/index.js +7 -3
- package/lib/targets/go/runtime/index.js.map +1 -0
- package/lib/targets/go/runtime/method-call.js +5 -5
- package/lib/targets/go/runtime/method-call.js.map +1 -0
- package/lib/targets/go/runtime/property-access.js +5 -5
- package/lib/targets/go/runtime/property-access.js.map +1 -0
- package/lib/targets/go/runtime/util.js +1 -1
- package/lib/targets/go/runtime/util.js.map +1 -0
- package/lib/targets/go/types/class.js +11 -17
- package/lib/targets/go/types/class.js.map +1 -0
- package/lib/targets/go/types/enum.js +1 -1
- package/lib/targets/go/types/enum.js.map +1 -0
- package/lib/targets/go/types/go-type-reference.js +10 -14
- package/lib/targets/go/types/go-type-reference.js.map +1 -0
- package/lib/targets/go/types/go-type.js +1 -1
- package/lib/targets/go/types/go-type.js.map +1 -0
- package/lib/targets/go/types/index.js +7 -3
- package/lib/targets/go/types/index.js.map +1 -0
- package/lib/targets/go/types/interface.js +8 -11
- package/lib/targets/go/types/interface.js.map +1 -0
- package/lib/targets/go/types/struct.js +2 -2
- package/lib/targets/go/types/struct.js.map +1 -0
- package/lib/targets/go/types/type-member.js +11 -14
- package/lib/targets/go/types/type-member.js.map +1 -0
- package/lib/targets/go/util.js +5 -8
- package/lib/targets/go/util.js.map +1 -0
- package/lib/targets/go/version-file.js +1 -1
- package/lib/targets/go/version-file.js.map +1 -0
- package/lib/targets/go.js +4 -4
- package/lib/targets/go.js.map +1 -0
- package/lib/targets/index.js +3 -3
- package/lib/targets/index.js.map +1 -0
- package/lib/targets/java.d.ts.map +1 -1
- package/lib/targets/java.js +75 -86
- package/lib/targets/java.js.map +1 -0
- package/lib/targets/js.js +2 -2
- package/lib/targets/js.js.map +1 -0
- package/lib/targets/python/requirements-dev.txt +1 -1
- package/lib/targets/python/type-name.js +63 -62
- package/lib/targets/python/type-name.js.map +1 -0
- package/lib/targets/python/util.js +1 -1
- package/lib/targets/python/util.js.map +1 -0
- package/lib/targets/python.js +81 -91
- package/lib/targets/python.js.map +1 -0
- package/lib/targets/version-utils.js +6 -7
- package/lib/targets/version-utils.js.map +1 -0
- package/lib/timer.js +1 -1
- package/lib/timer.js.map +1 -0
- package/lib/toposort.js +1 -1
- package/lib/toposort.js.map +1 -0
- package/lib/util.js +15 -18
- package/lib/util.js.map +1 -0
- package/lib/version.d.ts +2 -2
- package/lib/version.js +4 -4
- package/lib/version.js.map +1 -0
- package/package.json +16 -23
package/lib/targets/python.js
CHANGED
|
@@ -39,7 +39,7 @@ class Python extends target_1.Target {
|
|
|
39
39
|
// shim, but using this actually results in a WinError with Python 3.7 and 3.8 where venv will
|
|
40
40
|
// fail to copy the python binary if it's not invoked as python.exe). More on this particular
|
|
41
41
|
// issue can be read here: https://bugs.python.org/issue43749
|
|
42
|
-
await util_1.shell(process.platform === 'win32' ? 'python' : 'python3', [
|
|
42
|
+
await (0, util_1.shell)(process.platform === 'win32' ? 'python' : 'python3', [
|
|
43
43
|
'-m',
|
|
44
44
|
'venv',
|
|
45
45
|
'--system-site-packages',
|
|
@@ -52,22 +52,22 @@ class Python extends target_1.Target {
|
|
|
52
52
|
};
|
|
53
53
|
const python = path.join(venvBin, 'python');
|
|
54
54
|
// Install the necessary things
|
|
55
|
-
await util_1.shell(python, ['-m', 'pip', 'install', '--no-input', '-r', requirementsFile], {
|
|
55
|
+
await (0, util_1.shell)(python, ['-m', 'pip', 'install', '--no-input', '-r', requirementsFile], {
|
|
56
56
|
cwd: sourceDir,
|
|
57
57
|
env,
|
|
58
58
|
retry: { maxAttempts: 5 },
|
|
59
59
|
});
|
|
60
60
|
// Actually package up our code, both as a sdist and a wheel for publishing.
|
|
61
|
-
await util_1.shell(python, ['setup.py', 'sdist', '--dist-dir', outDir], {
|
|
61
|
+
await (0, util_1.shell)(python, ['setup.py', 'sdist', '--dist-dir', outDir], {
|
|
62
62
|
cwd: sourceDir,
|
|
63
63
|
env,
|
|
64
64
|
});
|
|
65
|
-
await util_1.shell(python, ['-m', 'pip', 'wheel', '--no-deps', '--wheel-dir', outDir, sourceDir], {
|
|
65
|
+
await (0, util_1.shell)(python, ['-m', 'pip', 'wheel', '--no-deps', '--wheel-dir', outDir, sourceDir], {
|
|
66
66
|
cwd: sourceDir,
|
|
67
67
|
env,
|
|
68
68
|
retry: { maxAttempts: 5 },
|
|
69
69
|
});
|
|
70
|
-
await util_1.shell(python, ['-m', 'twine', 'check', path.join(outDir, '*')], {
|
|
70
|
+
await (0, util_1.shell)(python, ['-m', 'twine', 'check', path.join(outDir, '*')], {
|
|
71
71
|
cwd: sourceDir,
|
|
72
72
|
env,
|
|
73
73
|
});
|
|
@@ -78,14 +78,14 @@ const pythonModuleNameToFilename = (name) => {
|
|
|
78
78
|
return path.join(...name.split('.'));
|
|
79
79
|
};
|
|
80
80
|
const toPythonMethodName = (name, protectedItem = false) => {
|
|
81
|
-
let value = util_2.toPythonIdentifier(codemaker_1.toSnakeCase(name));
|
|
81
|
+
let value = (0, util_2.toPythonIdentifier)((0, codemaker_1.toSnakeCase)(name));
|
|
82
82
|
if (protectedItem) {
|
|
83
83
|
value = `_${value}`;
|
|
84
84
|
}
|
|
85
85
|
return value;
|
|
86
86
|
};
|
|
87
87
|
const toPythonPropertyName = (name, constant = false, protectedItem = false) => {
|
|
88
|
-
let value = util_2.toPythonIdentifier(codemaker_1.toSnakeCase(name));
|
|
88
|
+
let value = (0, util_2.toPythonIdentifier)((0, codemaker_1.toSnakeCase)(name));
|
|
89
89
|
if (constant) {
|
|
90
90
|
value = value.toUpperCase();
|
|
91
91
|
}
|
|
@@ -106,7 +106,7 @@ const toPythonPropertyName = (name, constant = false, protectedItem = false) =>
|
|
|
106
106
|
* omitted when generating a name for a parameter that **is** lifted.
|
|
107
107
|
*/
|
|
108
108
|
function toPythonParameterName(name, liftedParamNames = new Set()) {
|
|
109
|
-
let result = util_2.toPythonIdentifier(codemaker_1.toSnakeCase(name));
|
|
109
|
+
let result = (0, util_2.toPythonIdentifier)((0, codemaker_1.toSnakeCase)(name));
|
|
110
110
|
while (liftedParamNames.has(result)) {
|
|
111
111
|
result += '_';
|
|
112
112
|
}
|
|
@@ -249,7 +249,7 @@ class BasePythonClassType {
|
|
|
249
249
|
return dependencies;
|
|
250
250
|
}
|
|
251
251
|
requiredImports(context) {
|
|
252
|
-
return type_name_1.mergePythonImports(...this.bases.map((base) => type_name_1.toTypeName(base).requiredImports(context)), ...this.members.map((mem) => mem.requiredImports(context)));
|
|
252
|
+
return (0, type_name_1.mergePythonImports)(...this.bases.map((base) => (0, type_name_1.toTypeName)(base).requiredImports(context)), ...this.members.map((mem) => mem.requiredImports(context)));
|
|
253
253
|
}
|
|
254
254
|
addMember(member) {
|
|
255
255
|
this.members.push(member);
|
|
@@ -311,24 +311,22 @@ class BaseMethod {
|
|
|
311
311
|
this.parent = opts.parent;
|
|
312
312
|
}
|
|
313
313
|
get apiLocation() {
|
|
314
|
-
var _a;
|
|
315
314
|
return {
|
|
316
315
|
api: 'member',
|
|
317
316
|
fqn: this.parent.fqn,
|
|
318
|
-
memberName:
|
|
317
|
+
memberName: this.jsName ?? '',
|
|
319
318
|
};
|
|
320
319
|
}
|
|
321
320
|
requiredImports(context) {
|
|
322
|
-
return type_name_1.mergePythonImports(type_name_1.toTypeName(this.returns).requiredImports(context), ...this.parameters.map((param) => type_name_1.toTypeName(param).requiredImports(context)), ...liftedProperties(this.liftedProp));
|
|
321
|
+
return (0, type_name_1.mergePythonImports)((0, type_name_1.toTypeName)(this.returns).requiredImports(context), ...this.parameters.map((param) => (0, type_name_1.toTypeName)(param).requiredImports(context)), ...liftedProperties(this.liftedProp));
|
|
323
322
|
function* liftedProperties(struct) {
|
|
324
|
-
var _a, _b;
|
|
325
323
|
if (struct == null) {
|
|
326
324
|
return;
|
|
327
325
|
}
|
|
328
|
-
for (const prop of
|
|
329
|
-
yield type_name_1.toTypeName(prop.type).requiredImports(context);
|
|
326
|
+
for (const prop of struct.properties ?? []) {
|
|
327
|
+
yield (0, type_name_1.toTypeName)(prop.type).requiredImports(context);
|
|
330
328
|
}
|
|
331
|
-
for (const base of
|
|
329
|
+
for (const base of struct.interfaces ?? []) {
|
|
332
330
|
const iface = context.resolver.dereference(base);
|
|
333
331
|
for (const imports of liftedProperties(iface)) {
|
|
334
332
|
yield imports;
|
|
@@ -337,16 +335,15 @@ class BaseMethod {
|
|
|
337
335
|
}
|
|
338
336
|
}
|
|
339
337
|
emit(code, context, opts) {
|
|
340
|
-
|
|
341
|
-
const
|
|
342
|
-
const returnType = type_name_1.toTypeName(this.returns).pythonType(context);
|
|
338
|
+
const { renderAbstract = true, forceEmitBody = false } = opts ?? {};
|
|
339
|
+
const returnType = (0, type_name_1.toTypeName)(this.returns).pythonType(context);
|
|
343
340
|
// We cannot (currently?) blindly use the names given to us by the JSII for
|
|
344
341
|
// initializers, because our keyword lifting will allow two names to clash.
|
|
345
342
|
// This can hopefully be removed once we get https://github.com/aws/jsii/issues/288
|
|
346
343
|
// resolved, so build up a list of all of the prop names so we can check against
|
|
347
344
|
// them later.
|
|
348
345
|
const liftedPropNames = new Set();
|
|
349
|
-
if (
|
|
346
|
+
if (this.liftedProp?.properties != null) {
|
|
350
347
|
for (const prop of this.liftedProp.properties) {
|
|
351
348
|
liftedPropNames.add(toPythonParameterName(prop.name));
|
|
352
349
|
}
|
|
@@ -361,7 +358,7 @@ class BaseMethod {
|
|
|
361
358
|
// This can hopefully be removed once we get https://github.com/aws/jsii/issues/288
|
|
362
359
|
// resolved.
|
|
363
360
|
const paramName = toPythonParameterName(param.name, liftedPropNames);
|
|
364
|
-
const paramType = type_name_1.toTypeName(param).pythonType({
|
|
361
|
+
const paramType = (0, type_name_1.toTypeName)(param).pythonType({
|
|
365
362
|
...context,
|
|
366
363
|
parameterType: true,
|
|
367
364
|
});
|
|
@@ -394,7 +391,7 @@ class BaseMethod {
|
|
|
394
391
|
// Iterate over all of our props, and reflect them into our params.
|
|
395
392
|
for (const prop of liftedProperties) {
|
|
396
393
|
const paramName = toPythonParameterName(prop.prop.name);
|
|
397
|
-
const paramType = type_name_1.toTypeName(prop.prop).pythonType({
|
|
394
|
+
const paramType = (0, type_name_1.toTypeName)(prop.prop).pythonType({
|
|
398
395
|
...context,
|
|
399
396
|
parameterType: true,
|
|
400
397
|
});
|
|
@@ -417,7 +414,7 @@ class BaseMethod {
|
|
|
417
414
|
pythonParams.pop();
|
|
418
415
|
const lastParameter = this.parameters.slice(-1)[0];
|
|
419
416
|
const paramName = toPythonParameterName(lastParameter.name);
|
|
420
|
-
const paramType = type_name_1.toTypeName(lastParameter.type).pythonType(context);
|
|
417
|
+
const paramType = (0, type_name_1.toTypeName)(lastParameter.type).pythonType(context);
|
|
421
418
|
pythonParams.push(`*${paramName}: ${paramType}`);
|
|
422
419
|
}
|
|
423
420
|
const decorators = new Array();
|
|
@@ -463,7 +460,7 @@ class BaseMethod {
|
|
|
463
460
|
emitAutoProps(code, context, liftedPropNames) {
|
|
464
461
|
const lastParameter = this.parameters.slice(-1)[0];
|
|
465
462
|
const argName = toPythonParameterName(lastParameter.name, liftedPropNames);
|
|
466
|
-
const typeName = type_name_1.toTypeName(lastParameter.type).pythonType({
|
|
463
|
+
const typeName = (0, type_name_1.toTypeName)(lastParameter.type).pythonType({
|
|
467
464
|
...context,
|
|
468
465
|
typeAnnotation: false,
|
|
469
466
|
});
|
|
@@ -484,7 +481,7 @@ class BaseMethod {
|
|
|
484
481
|
throw new Error('Parent not known.');
|
|
485
482
|
}
|
|
486
483
|
if (this.isStatic) {
|
|
487
|
-
jsiiMethodParams.push(type_name_1.toTypeName(this.parent).pythonType({
|
|
484
|
+
jsiiMethodParams.push((0, type_name_1.toTypeName)(this.parent).pythonType({
|
|
488
485
|
...context,
|
|
489
486
|
typeAnnotation: false,
|
|
490
487
|
}));
|
|
@@ -561,11 +558,11 @@ class BaseProperty {
|
|
|
561
558
|
return { api: 'member', fqn: this.parent.fqn, memberName: this.jsName };
|
|
562
559
|
}
|
|
563
560
|
requiredImports(context) {
|
|
564
|
-
return type_name_1.toTypeName(this.type).requiredImports(context);
|
|
561
|
+
return (0, type_name_1.toTypeName)(this.type).requiredImports(context);
|
|
565
562
|
}
|
|
566
563
|
emit(code, context, opts) {
|
|
567
|
-
const { renderAbstract = true, forceEmitBody = false } = opts
|
|
568
|
-
const pythonType = type_name_1.toTypeName(this.type).pythonType(context);
|
|
564
|
+
const { renderAbstract = true, forceEmitBody = false } = opts ?? {};
|
|
565
|
+
const pythonType = (0, type_name_1.toTypeName)(this.type).pythonType(context);
|
|
569
566
|
// "# type: ignore[misc]" is needed because mypy cannot check decorated things
|
|
570
567
|
code.line(`@${this.decorator} # type: ignore[misc]`);
|
|
571
568
|
code.line(`@jsii.member(jsii_name="${this.jsName}")`);
|
|
@@ -613,7 +610,7 @@ class Interface extends BasePythonClassType {
|
|
|
613
610
|
// Then, we have to emit a Proxy class which implements our proxy interface.
|
|
614
611
|
const proxyBases = this.bases.map((b) =>
|
|
615
612
|
// "# type: ignore[misc]" because MyPy cannot check dynamic base classes (naturally)
|
|
616
|
-
`jsii.proxy_for(${type_name_1.toTypeName(b).pythonType({
|
|
613
|
+
`jsii.proxy_for(${(0, type_name_1.toTypeName)(b).pythonType({
|
|
617
614
|
...context,
|
|
618
615
|
typeAnnotation: false,
|
|
619
616
|
})}) # type: ignore[misc]`);
|
|
@@ -643,7 +640,7 @@ class Interface extends BasePythonClassType {
|
|
|
643
640
|
}
|
|
644
641
|
}
|
|
645
642
|
getClassParams(context) {
|
|
646
|
-
const params = this.bases.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
643
|
+
const params = this.bases.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
647
644
|
params.push('typing_extensions.Protocol');
|
|
648
645
|
return params;
|
|
649
646
|
}
|
|
@@ -701,10 +698,10 @@ class Struct extends BasePythonClassType {
|
|
|
701
698
|
}
|
|
702
699
|
}
|
|
703
700
|
requiredImports(context) {
|
|
704
|
-
return type_name_1.mergePythonImports(super.requiredImports(context), ...this.allMembers.map((mem) => mem.requiredImports(context)));
|
|
701
|
+
return (0, type_name_1.mergePythonImports)(super.requiredImports(context), ...this.allMembers.map((mem) => mem.requiredImports(context)));
|
|
705
702
|
}
|
|
706
703
|
getClassParams(context) {
|
|
707
|
-
return this.bases.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
704
|
+
return this.bases.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
708
705
|
}
|
|
709
706
|
/**
|
|
710
707
|
* Find all fields (inherited as well)
|
|
@@ -730,7 +727,7 @@ class Struct extends BasePythonClassType {
|
|
|
730
727
|
// Re-type struct arguments that were passed as "dict"
|
|
731
728
|
for (const member of members.filter((m) => m.isStruct(this.generator))) {
|
|
732
729
|
// Note that "None" is NOT an instance of dict (that's convenient!)
|
|
733
|
-
const typeName = type_name_1.toTypeName(member.type.type).pythonType({
|
|
730
|
+
const typeName = (0, type_name_1.toTypeName)(member.type.type).pythonType({
|
|
734
731
|
...context,
|
|
735
732
|
typeAnnotation: false,
|
|
736
733
|
});
|
|
@@ -819,7 +816,7 @@ class StructField {
|
|
|
819
816
|
return !!this.type.optional;
|
|
820
817
|
}
|
|
821
818
|
requiredImports(context) {
|
|
822
|
-
return type_name_1.toTypeName(this.type).requiredImports(context);
|
|
819
|
+
return (0, type_name_1.toTypeName)(this.type).requiredImports(context);
|
|
823
820
|
}
|
|
824
821
|
isStruct(generator) {
|
|
825
822
|
return isStruct(generator.reflectAssembly.system, this.type.type);
|
|
@@ -835,7 +832,7 @@ class StructField {
|
|
|
835
832
|
* Return the Python type annotation for this type
|
|
836
833
|
*/
|
|
837
834
|
typeAnnotation(context) {
|
|
838
|
-
return type_name_1.toTypeName(this.type).pythonType(context);
|
|
835
|
+
return (0, type_name_1.toTypeName)(this.type).pythonType(context);
|
|
839
836
|
}
|
|
840
837
|
emitDocString(code) {
|
|
841
838
|
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
@@ -884,13 +881,13 @@ class Class extends BasePythonClassType {
|
|
|
884
881
|
return dependencies;
|
|
885
882
|
}
|
|
886
883
|
requiredImports(context) {
|
|
887
|
-
return type_name_1.mergePythonImports(super.requiredImports(context), // Takes care of base & members
|
|
888
|
-
...this.interfaces.map((base) => type_name_1.toTypeName(base).requiredImports(context)));
|
|
884
|
+
return (0, type_name_1.mergePythonImports)(super.requiredImports(context), // Takes care of base & members
|
|
885
|
+
...this.interfaces.map((base) => (0, type_name_1.toTypeName)(base).requiredImports(context)));
|
|
889
886
|
}
|
|
890
887
|
emit(code, context) {
|
|
891
888
|
// First we emit our implments decorator
|
|
892
889
|
if (this.interfaces.length > 0) {
|
|
893
|
-
const interfaces = this.interfaces.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
890
|
+
const interfaces = this.interfaces.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
894
891
|
code.line(`@jsii.implements(${interfaces.join(', ')})`);
|
|
895
892
|
}
|
|
896
893
|
// Then we do our normal class logic for emitting our members.
|
|
@@ -903,7 +900,7 @@ class Class extends BasePythonClassType {
|
|
|
903
900
|
const proxyBases = [this.pythonName];
|
|
904
901
|
for (const base of this.abstractBases) {
|
|
905
902
|
// "# type: ignore[misc]" because MyPy cannot check dynamic base classes (naturally)
|
|
906
|
-
proxyBases.push(`jsii.proxy_for(${type_name_1.toTypeName(base).pythonType({
|
|
903
|
+
proxyBases.push(`jsii.proxy_for(${(0, type_name_1.toTypeName)(base).pythonType({
|
|
907
904
|
...context,
|
|
908
905
|
typeAnnotation: false,
|
|
909
906
|
})}) # type: ignore[misc]`);
|
|
@@ -938,7 +935,7 @@ class Class extends BasePythonClassType {
|
|
|
938
935
|
}
|
|
939
936
|
}
|
|
940
937
|
getClassParams(context) {
|
|
941
|
-
const params = this.bases.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
938
|
+
const params = this.bases.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
942
939
|
const metaclass = this.abstract ? 'JSIIAbstractClass' : 'JSIIMeta';
|
|
943
940
|
params.push(`metaclass=jsii.${metaclass}`);
|
|
944
941
|
params.push(`jsii_type="${this.fqn}"`);
|
|
@@ -1079,17 +1076,16 @@ class PythonModule {
|
|
|
1079
1076
|
}
|
|
1080
1077
|
}
|
|
1081
1078
|
requiredImports(context) {
|
|
1082
|
-
return type_name_1.mergePythonImports(...this.members.map((mem) => mem.requiredImports(context)));
|
|
1079
|
+
return (0, type_name_1.mergePythonImports)(...this.members.map((mem) => mem.requiredImports(context)));
|
|
1083
1080
|
}
|
|
1084
1081
|
emit(code, context) {
|
|
1085
|
-
var _a;
|
|
1086
1082
|
this.emitModuleDocumentation(code);
|
|
1087
1083
|
const resolver = this.fqn
|
|
1088
1084
|
? context.resolver.bind(this.fqn, this.pythonName)
|
|
1089
1085
|
: context.resolver;
|
|
1090
1086
|
context = {
|
|
1091
1087
|
...context,
|
|
1092
|
-
submodule:
|
|
1088
|
+
submodule: this.fqn ?? context.submodule,
|
|
1093
1089
|
resolver,
|
|
1094
1090
|
};
|
|
1095
1091
|
// Before we write anything else, we need to write out our module headers, this
|
|
@@ -1238,10 +1234,10 @@ class PythonModule {
|
|
|
1238
1234
|
}
|
|
1239
1235
|
}
|
|
1240
1236
|
emitDependencyImports(code) {
|
|
1241
|
-
var _a;
|
|
1242
1237
|
// Collect all the (direct) dependencies' ._jsii packages.
|
|
1243
|
-
const deps = Object.keys(
|
|
1244
|
-
.map((dep) =>
|
|
1238
|
+
const deps = Object.keys(this.assembly.dependencies ?? {})
|
|
1239
|
+
.map((dep) => this.assembly.dependencyClosure?.[dep]?.targets?.python?.module ??
|
|
1240
|
+
(0, util_2.die)(`No Python target was configrued for the dependency "${dep}".`))
|
|
1245
1241
|
.map((mod) => `${mod}._jsii`)
|
|
1246
1242
|
.sort();
|
|
1247
1243
|
// Now actually write the import statements...
|
|
@@ -1319,7 +1315,6 @@ class Package {
|
|
|
1319
1315
|
this.data.get(module.pythonName).push({ filename, data });
|
|
1320
1316
|
}
|
|
1321
1317
|
write(code, context) {
|
|
1322
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
1323
1318
|
const modules = [...this.modules.values()].sort((a, b) => a.pythonName.localeCompare(b.pythonName));
|
|
1324
1319
|
const scripts = new Array();
|
|
1325
1320
|
// Iterate over all of our modules, and write them out to disk.
|
|
@@ -1345,14 +1340,15 @@ class Package {
|
|
|
1345
1340
|
}
|
|
1346
1341
|
// Compute our list of dependencies
|
|
1347
1342
|
const dependencies = [];
|
|
1348
|
-
for (const [depName, version] of Object.entries(
|
|
1343
|
+
for (const [depName, version] of Object.entries(this.metadata.dependencies ?? {})) {
|
|
1349
1344
|
const depInfo = this.metadata.dependencyClosure[depName];
|
|
1350
|
-
dependencies.push(`${depInfo.targets.python.distName}${version_utils_1.toPythonVersionRange(version)}`);
|
|
1345
|
+
dependencies.push(`${depInfo.targets.python.distName}${(0, version_utils_1.toPythonVersionRange)(version)}`);
|
|
1351
1346
|
}
|
|
1352
1347
|
// Need to always write this file as the build process depends on it.
|
|
1353
1348
|
// Make up some contents if we don't have anything useful to say.
|
|
1354
1349
|
code.openFile('README.md');
|
|
1355
|
-
code.line(
|
|
1350
|
+
code.line(this.rootModule?.moduleDocumentation ??
|
|
1351
|
+
`${this.name}\n${'='.repeat(this.name.length)}`);
|
|
1356
1352
|
code.closeFile('README.md');
|
|
1357
1353
|
// Strip " (build abcdef)" from the jsii version
|
|
1358
1354
|
const jsiiVersionSimple = this.metadata.jsiiVersion.replace(/ .*$/, '');
|
|
@@ -1378,7 +1374,7 @@ class Package {
|
|
|
1378
1374
|
package_data: packageData,
|
|
1379
1375
|
python_requires: '~=3.7',
|
|
1380
1376
|
install_requires: [
|
|
1381
|
-
`jsii${version_utils_1.toPythonVersionRange(`^${jsiiVersionSimple}`)}`,
|
|
1377
|
+
`jsii${(0, version_utils_1.toPythonVersionRange)(`^${jsiiVersionSimple}`)}`,
|
|
1382
1378
|
'publication>=0.0.3',
|
|
1383
1379
|
]
|
|
1384
1380
|
.concat(dependencies)
|
|
@@ -1396,7 +1392,7 @@ class Package {
|
|
|
1396
1392
|
],
|
|
1397
1393
|
scripts,
|
|
1398
1394
|
};
|
|
1399
|
-
switch (
|
|
1395
|
+
switch (this.metadata.docs?.stability) {
|
|
1400
1396
|
case spec.Stability.Experimental:
|
|
1401
1397
|
setupKwargs.classifiers.push('Development Status :: 4 - Beta');
|
|
1402
1398
|
break;
|
|
@@ -1409,10 +1405,10 @@ class Package {
|
|
|
1409
1405
|
default:
|
|
1410
1406
|
// No 'Development Status' trove classifier for you!
|
|
1411
1407
|
}
|
|
1412
|
-
if (
|
|
1408
|
+
if (spdxLicenseList[this.metadata.license]?.osiApproved) {
|
|
1413
1409
|
setupKwargs.classifiers.push('License :: OSI Approved');
|
|
1414
1410
|
}
|
|
1415
|
-
const additionalClassifiers =
|
|
1411
|
+
const additionalClassifiers = this.metadata.targets?.python?.classifiers;
|
|
1416
1412
|
if (additionalClassifiers != null) {
|
|
1417
1413
|
if (!Array.isArray(additionalClassifiers)) {
|
|
1418
1414
|
throw new Error(`The "jsii.targets.python.classifiers" value must be an array of strings if provided, but found ${JSON.stringify(additionalClassifiers, null, 2)}`);
|
|
@@ -1431,7 +1427,7 @@ class Package {
|
|
|
1431
1427
|
'Typing',
|
|
1432
1428
|
];
|
|
1433
1429
|
if (reservedClassifiers.includes(parts[0])) {
|
|
1434
|
-
logging_1.warn(`Classifiers starting with ${reservedClassifiers
|
|
1430
|
+
(0, logging_1.warn)(`Classifiers starting with ${reservedClassifiers
|
|
1435
1431
|
.map((x) => `"${x} ::"`)
|
|
1436
1432
|
.join(', ')} are automatically set and should not be manually configured`);
|
|
1437
1433
|
}
|
|
@@ -1468,7 +1464,7 @@ class Package {
|
|
|
1468
1464
|
const buildTools = fs
|
|
1469
1465
|
.readFileSync(requirementsFile, { encoding: 'utf-8' })
|
|
1470
1466
|
.split('\n')
|
|
1471
|
-
.map((line) =>
|
|
1467
|
+
.map((line) => /^\s*(.+)\s*#\s*build-system\s*$/.exec(line)?.[1]?.trim())
|
|
1472
1468
|
.reduce((buildTools, entry) => (entry ? [...buildTools, entry] : buildTools), new Array());
|
|
1473
1469
|
code.line(`requires = [${buildTools.map((x) => `"${x}"`).join(', ')}]`);
|
|
1474
1470
|
code.line('build-backend = "setuptools.build_meta"');
|
|
@@ -1558,7 +1554,7 @@ class TypeResolver {
|
|
|
1558
1554
|
this.findModule(assemblyName).targets.python.module,
|
|
1559
1555
|
];
|
|
1560
1556
|
for (const part of qualifiedIdentifiers) {
|
|
1561
|
-
fqnParts.push(util_2.toPythonIdentifier(part));
|
|
1557
|
+
fqnParts.push((0, util_2.toPythonIdentifier)(part));
|
|
1562
1558
|
}
|
|
1563
1559
|
return fqnParts.join('.');
|
|
1564
1560
|
}
|
|
@@ -1573,7 +1569,6 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1573
1569
|
}
|
|
1574
1570
|
// eslint-disable-next-line complexity
|
|
1575
1571
|
emitDocString(code, apiLocation, docs, options = {}) {
|
|
1576
|
-
var _a, _b, _c, _d;
|
|
1577
1572
|
if ((!docs || Object.keys(docs).length === 0) && !options.arguments) {
|
|
1578
1573
|
return;
|
|
1579
1574
|
}
|
|
@@ -1582,7 +1577,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1582
1577
|
}
|
|
1583
1578
|
const lines = new Array();
|
|
1584
1579
|
if (docs.summary) {
|
|
1585
|
-
lines.push(markdown_1.md2rst(_utils_1.renderSummary(docs)));
|
|
1580
|
+
lines.push((0, markdown_1.md2rst)((0, _utils_1.renderSummary)(docs)));
|
|
1586
1581
|
brk();
|
|
1587
1582
|
}
|
|
1588
1583
|
else {
|
|
@@ -1597,7 +1592,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1597
1592
|
if (doBrk) {
|
|
1598
1593
|
brk();
|
|
1599
1594
|
}
|
|
1600
|
-
const contentLines = markdown_1.md2rst(content).split('\n');
|
|
1595
|
+
const contentLines = (0, markdown_1.md2rst)(content).split('\n');
|
|
1601
1596
|
if (contentLines.length <= 1) {
|
|
1602
1597
|
lines.push(`:${heading}: ${contentLines.join('')}`.trim());
|
|
1603
1598
|
}
|
|
@@ -1614,10 +1609,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1614
1609
|
}
|
|
1615
1610
|
if (docs.remarks) {
|
|
1616
1611
|
brk();
|
|
1617
|
-
lines.push(...markdown_1.md2rst(this.convertMarkdown(
|
|
1612
|
+
lines.push(...(0, markdown_1.md2rst)(this.convertMarkdown(docs.remarks ?? '', apiLocation)).split('\n'));
|
|
1618
1613
|
brk();
|
|
1619
1614
|
}
|
|
1620
|
-
if (
|
|
1615
|
+
if (options.arguments?.length ?? 0 > 0) {
|
|
1621
1616
|
brk();
|
|
1622
1617
|
for (const param of options.arguments) {
|
|
1623
1618
|
// Add a line for every argument. Even if there is no description, we need
|
|
@@ -1644,7 +1639,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1644
1639
|
if (docs.subclassable) {
|
|
1645
1640
|
block('subclassable', 'Yes');
|
|
1646
1641
|
}
|
|
1647
|
-
for (const [k, v] of Object.entries(
|
|
1642
|
+
for (const [k, v] of Object.entries(docs.custom ?? {})) {
|
|
1648
1643
|
block(k, v, false);
|
|
1649
1644
|
}
|
|
1650
1645
|
if (docs.example) {
|
|
@@ -1679,11 +1674,11 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1679
1674
|
}
|
|
1680
1675
|
}
|
|
1681
1676
|
convertExample(example, apiLoc) {
|
|
1682
|
-
const translated = this.rosetta.translateExample(apiLoc, example, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly));
|
|
1677
|
+
const translated = this.rosetta.translateExample(apiLoc, example, jsii_rosetta_1.TargetLanguage.PYTHON, (0, jsii_rosetta_1.enforcesStrictMode)(this.assembly));
|
|
1683
1678
|
return translated.source;
|
|
1684
1679
|
}
|
|
1685
1680
|
convertMarkdown(markdown, apiLoc) {
|
|
1686
|
-
return this.rosetta.translateSnippetsInMarkdown(apiLoc, markdown, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly));
|
|
1681
|
+
return this.rosetta.translateSnippetsInMarkdown(apiLoc, markdown, jsii_rosetta_1.TargetLanguage.PYTHON, (0, jsii_rosetta_1.enforcesStrictMode)(this.assembly));
|
|
1687
1682
|
}
|
|
1688
1683
|
getPythonType(fqn) {
|
|
1689
1684
|
const type = this.types.get(fqn);
|
|
@@ -1696,7 +1691,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1696
1691
|
return path.join('src', pythonModuleNameToFilename(this.getAssemblyModuleName(assm)));
|
|
1697
1692
|
}
|
|
1698
1693
|
onBeginAssembly(assm, _fingerprint) {
|
|
1699
|
-
this.package = new Package(assm.targets.python.distName, version_utils_1.toReleaseVersion(assm.version, index_1.TargetName.PYTHON), assm);
|
|
1694
|
+
this.package = new Package(assm.targets.python.distName, (0, version_utils_1.toReleaseVersion)(assm.version, index_1.TargetName.PYTHON), assm);
|
|
1700
1695
|
// This is the '<packagename>._jsii' module for this assembly
|
|
1701
1696
|
const assemblyModule = new PythonModule(this.getAssemblyModuleName(assm), undefined, {
|
|
1702
1697
|
assembly: assm,
|
|
@@ -1720,17 +1715,17 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1720
1715
|
* Will be called for assembly root, namespaces and submodules (anything that contains other types, based on its FQN)
|
|
1721
1716
|
*/
|
|
1722
1717
|
onBeginNamespace(ns) {
|
|
1723
|
-
var _a, _b;
|
|
1724
1718
|
// 'ns' contains something like '@scope/jsii-calc-base-of-base'
|
|
1725
1719
|
const submoduleLike = ns === this.assembly.name
|
|
1726
1720
|
? this.assembly
|
|
1727
|
-
:
|
|
1721
|
+
: this.assembly.submodules?.[ns];
|
|
1728
1722
|
const readmeLocation = { api: 'moduleReadme', moduleFqn: ns };
|
|
1729
|
-
const module = new PythonModule(type_name_1.toPackageName(ns, this.assembly), ns, {
|
|
1723
|
+
const module = new PythonModule((0, type_name_1.toPackageName)(ns, this.assembly), ns, {
|
|
1730
1724
|
assembly: this.assembly,
|
|
1731
1725
|
assemblyFilename: this.getAssemblyFileName(),
|
|
1732
1726
|
package: this.package,
|
|
1733
|
-
moduleDocumentation:
|
|
1727
|
+
moduleDocumentation: submoduleLike?.readme
|
|
1728
|
+
? this.convertMarkdown(submoduleLike.readme?.markdown, readmeLocation).trim()
|
|
1734
1729
|
: undefined,
|
|
1735
1730
|
});
|
|
1736
1731
|
this.package.addModule(module);
|
|
@@ -1752,11 +1747,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1752
1747
|
}
|
|
1753
1748
|
}
|
|
1754
1749
|
onBeginClass(cls, abstract) {
|
|
1755
|
-
|
|
1756
|
-
const klass = new Class(this, util_2.toPythonIdentifier(cls.name), cls, cls.fqn, {
|
|
1750
|
+
const klass = new Class(this, (0, util_2.toPythonIdentifier)(cls.name), cls, cls.fqn, {
|
|
1757
1751
|
abstract,
|
|
1758
1752
|
bases: cls.base ? [this.findType(cls.base)] : undefined,
|
|
1759
|
-
interfaces:
|
|
1753
|
+
interfaces: cls.interfaces?.map((base) => this.findType(base)),
|
|
1760
1754
|
abstractBases: abstract ? this.getAbstractBases(cls) : [],
|
|
1761
1755
|
}, cls.docs);
|
|
1762
1756
|
if (cls.initializer !== undefined) {
|
|
@@ -1812,13 +1806,12 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1812
1806
|
this.onProperty(cls, prop);
|
|
1813
1807
|
}
|
|
1814
1808
|
onBeginInterface(ifc) {
|
|
1815
|
-
var _a, _b;
|
|
1816
1809
|
let iface;
|
|
1817
1810
|
if (ifc.datatype) {
|
|
1818
|
-
iface = new Struct(this, util_2.toPythonIdentifier(ifc.name), ifc, ifc.fqn, { bases:
|
|
1811
|
+
iface = new Struct(this, (0, util_2.toPythonIdentifier)(ifc.name), ifc, ifc.fqn, { bases: ifc.interfaces?.map((base) => this.findType(base)) }, ifc.docs);
|
|
1819
1812
|
}
|
|
1820
1813
|
else {
|
|
1821
|
-
iface = new Interface(this, util_2.toPythonIdentifier(ifc.name), ifc, ifc.fqn, { bases:
|
|
1814
|
+
iface = new Interface(this, (0, util_2.toPythonIdentifier)(ifc.name), ifc, ifc.fqn, { bases: ifc.interfaces?.map((base) => this.findType(base)) }, ifc.docs);
|
|
1822
1815
|
}
|
|
1823
1816
|
this.addPythonType(iface);
|
|
1824
1817
|
}
|
|
@@ -1840,10 +1833,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1840
1833
|
this.getPythonType(ifc.fqn).addMember(ifaceProperty);
|
|
1841
1834
|
}
|
|
1842
1835
|
onBeginEnum(enm) {
|
|
1843
|
-
this.addPythonType(new Enum(this, util_2.toPythonIdentifier(enm.name), enm, enm.fqn, {}, enm.docs));
|
|
1836
|
+
this.addPythonType(new Enum(this, (0, util_2.toPythonIdentifier)(enm.name), enm, enm.fqn, {}, enm.docs));
|
|
1844
1837
|
}
|
|
1845
1838
|
onEnumMember(enm, member) {
|
|
1846
|
-
this.getPythonType(enm.fqn).addMember(new EnumMember(this, util_2.toPythonIdentifier(member.name), member.name, member.docs, enm));
|
|
1839
|
+
this.getPythonType(enm.fqn).addMember(new EnumMember(this, (0, util_2.toPythonIdentifier)(member.name), member.name, member.docs, enm));
|
|
1847
1840
|
}
|
|
1848
1841
|
onInterfaceMethodOverload(_ifc, _overload, _originalMethod) {
|
|
1849
1842
|
throw new Error('Unhandled Type: InterfaceMethodOverload');
|
|
@@ -1875,11 +1868,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1875
1868
|
this.types.set(type.fqn, type);
|
|
1876
1869
|
}
|
|
1877
1870
|
getliftedProp(method) {
|
|
1878
|
-
var _a, _b;
|
|
1879
1871
|
// If there are parameters to this method, and if the last parameter's type is
|
|
1880
1872
|
// a datatype interface, then we want to lift the members of that last paramter
|
|
1881
1873
|
// as keyword arguments to this function.
|
|
1882
|
-
if (
|
|
1874
|
+
if (method.parameters?.length ?? 0 >= 1) {
|
|
1883
1875
|
const lastParameter = method.parameters.slice(-1)[0];
|
|
1884
1876
|
if (!lastParameter.variadic &&
|
|
1885
1877
|
spec.isNamedTypeReference(lastParameter.type)) {
|
|
@@ -1916,13 +1908,13 @@ function onelineDescription(docs) {
|
|
|
1916
1908
|
}
|
|
1917
1909
|
const parts = [];
|
|
1918
1910
|
if (docs.summary) {
|
|
1919
|
-
parts.push(markdown_1.md2rst(_utils_1.renderSummary(docs)));
|
|
1911
|
+
parts.push((0, markdown_1.md2rst)((0, _utils_1.renderSummary)(docs)));
|
|
1920
1912
|
}
|
|
1921
1913
|
if (docs.remarks) {
|
|
1922
|
-
parts.push(markdown_1.md2rst(docs.remarks));
|
|
1914
|
+
parts.push((0, markdown_1.md2rst)(docs.remarks));
|
|
1923
1915
|
}
|
|
1924
1916
|
if (docs.default) {
|
|
1925
|
-
parts.push(`Default: ${markdown_1.md2rst(docs.default)}`);
|
|
1917
|
+
parts.push(`Default: ${(0, markdown_1.md2rst)(docs.default)}`);
|
|
1926
1918
|
}
|
|
1927
1919
|
return parts.join(' ').replace(/\s+/g, ' ');
|
|
1928
1920
|
}
|
|
@@ -1935,7 +1927,7 @@ function isStruct(typeSystem, ref) {
|
|
|
1935
1927
|
return false;
|
|
1936
1928
|
}
|
|
1937
1929
|
const type = typeSystem.tryFindFqn(ref.fqn);
|
|
1938
|
-
return !!(
|
|
1930
|
+
return !!(type?.isInterfaceType() && type?.isDataType());
|
|
1939
1931
|
}
|
|
1940
1932
|
/**
|
|
1941
1933
|
* Appends `_` at the end of `name` until it no longer conflicts with any of the
|
|
@@ -2028,7 +2020,7 @@ function assignCallResult(code, variable, funct, params) {
|
|
|
2028
2020
|
function assignDictionary(code, variable, elements, trailing, compact = false) {
|
|
2029
2021
|
const space = compact ? '' : ' ';
|
|
2030
2022
|
const prefix = `${variable}${space}=${space}{`;
|
|
2031
|
-
const suffix = `}${trailing
|
|
2023
|
+
const suffix = `}${trailing ?? ''}`;
|
|
2032
2024
|
if (elements.length === 0) {
|
|
2033
2025
|
code.line(`${prefix}${suffix}`);
|
|
2034
2026
|
return;
|
|
@@ -2053,7 +2045,6 @@ function assignDictionary(code, variable, elements, trailing, compact = false) {
|
|
|
2053
2045
|
code.unindent(suffix);
|
|
2054
2046
|
}
|
|
2055
2047
|
function emitList(code, prefix, elements, suffix, opts) {
|
|
2056
|
-
var _a;
|
|
2057
2048
|
if (elements.length === 0) {
|
|
2058
2049
|
code.line(`${prefix}${suffix}`);
|
|
2059
2050
|
return;
|
|
@@ -2069,7 +2060,7 @@ function emitList(code, prefix, elements, suffix, opts) {
|
|
|
2069
2060
|
code.line(`${prefix}${elements.join(join)}${suffix}`);
|
|
2070
2061
|
return;
|
|
2071
2062
|
}
|
|
2072
|
-
const [before, after] =
|
|
2063
|
+
const [before, after] = opts?.ifMulti ?? ['', ''];
|
|
2073
2064
|
code.indent(`${prefix}${before}`);
|
|
2074
2065
|
if (elements.length === 1) {
|
|
2075
2066
|
code.line(elements[0]);
|
|
@@ -2096,15 +2087,14 @@ function totalSizeOf(strings, join) {
|
|
|
2096
2087
|
};
|
|
2097
2088
|
}
|
|
2098
2089
|
function nestedContext(context, fqn) {
|
|
2099
|
-
var _a;
|
|
2100
2090
|
return {
|
|
2101
2091
|
...context,
|
|
2102
2092
|
surroundingTypeFqns: fqn != null
|
|
2103
|
-
? [...(
|
|
2093
|
+
? [...(context.surroundingTypeFqns ?? []), fqn]
|
|
2104
2094
|
: context.surroundingTypeFqns,
|
|
2105
2095
|
};
|
|
2106
2096
|
}
|
|
2107
|
-
const isDeprecated = (x) =>
|
|
2097
|
+
const isDeprecated = (x) => x.docs?.deprecated !== undefined;
|
|
2108
2098
|
/**
|
|
2109
2099
|
* Last component of a .-separated name
|
|
2110
2100
|
*/
|
|
@@ -2112,4 +2102,4 @@ function lastComponent(n) {
|
|
|
2112
2102
|
const parts = n.split('.');
|
|
2113
2103
|
return parts[parts.length - 1];
|
|
2114
2104
|
}
|
|
2115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FLc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLG1DQUFxQztBQUVyQyxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNuQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsMkVBQTJFO0FBQzNFLCtGQUErRjtBQUMvRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFxQixNQUFPLFNBQVEsZUFBTTtJQUd4QyxZQUFtQixPQUFzQjtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN2RCxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNsRCw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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Q0FBQyxDQUFDO0tBQ3RFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLE9BQW9CLEVBQ3BCLEdBQXVCOztJQUV2QixPQUFPO1FBQ0wsR0FBRyxPQUFPO1FBQ1YsbUJBQW1CLEVBQ2pCLEdBQUcsSUFBSSxJQUFJO1lBQ1QsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFDLE9BQU8sQ0FBQyxtQkFBbUIsbUNBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CO0tBQ2xDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFhLEVBQUUsRUFBRSxXQUFDLE9BQUEsT0FBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxVQUFVLE1BQUssU0FBUyxDQUFBLEVBQUEsQ0FBQztBQUV6RTs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLENBQVM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDb2RlTWFrZXIsIHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyJztcbmltcG9ydCAqIGFzIGVzY2FwZVN0cmluZ1JlZ2V4cCBmcm9tICdlc2NhcGUtc3RyaW5nLXJlZ2V4cCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQge1xuICBUYXJnZXRMYW5ndWFnZSxcbiAgUm9zZXR0YSxcbiAgZW5mb3JjZXNTdHJpY3RNb2RlLFxuICBBcGlMb2NhdGlvbixcbn0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgR2VuZXJhdG9yT3B0aW9ucyB9IGZyb20gJy4uL2dlbmVyYXRvcic7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBtZDJyc3QgfSBmcm9tICcuLi9tYXJrZG93bic7XG5pbXBvcnQgeyBUYXJnZXQsIFRhcmdldE9wdGlvbnMgfSBmcm9tICcuLi90YXJnZXQnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IHJlbmRlclN1bW1hcnksIFByb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4vX3V0aWxzJztcbmltcG9ydCB7XG4gIE5hbWluZ0NvbnRleHQsXG4gIHRvVHlwZU5hbWUsXG4gIFB5dGhvbkltcG9ydHMsXG4gIG1lcmdlUHl0aG9uSW1wb3J0cyxcbiAgdG9QYWNrYWdlTmFtZSxcbn0gZnJvbSAnLi9weXRob24vdHlwZS1uYW1lJztcbmltcG9ydCB7IGRpZSwgdG9QeXRob25JZGVudGlmaWVyIH0gZnJvbSAnLi9weXRob24vdXRpbCc7XG5pbXBvcnQgeyB0b1B5dGhvblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IFRhcmdldE5hbWUgfSBmcm9tICcuL2luZGV4JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICAvLyBPbiBXaW5kb3dzLCB0aGVyZSBpcyB1c3VhbGx5IG5vIHB5dGhvbjMuZXhlICh0aGUgR2l0SHViIGFjdGlvbiB3b3JrZXJzIHdpbGwgaGF2ZSBhIHB5dGhvbjNcbiAgICAvLyBzaGltLCBidXQgdXNpbmcgdGhpcyBhY3R1YWxseSByZXN1bHRzIGluIGEgV2luRXJyb3Igd2l0aCBQeXRob24gMy43IGFuZCAzLjggd2hlcmUgdmVudiB3aWxsXG4gICAgLy8gZmFpbCB0byBjb3B5IHRoZSBweXRob24gYmluYXJ5IGlmIGl0J3Mgbm90IGludm9rZWQgYXMgcHl0aG9uLmV4ZSkuIE1vcmUgb24gdGhpcyBwYXJ0aWN1bGFyXG4gICAgLy8gaXNzdWUgY2FuIGJlIHJlYWQgaGVyZTogaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0Mzc0OVxuICAgIGF3YWl0IHNoZWxsKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAncHl0aG9uJyA6ICdweXRob24zJywgW1xuICAgICAgJy1tJyxcbiAgICAgICd2ZW52JyxcbiAgICAgICctLXN5c3RlbS1zaXRlLXBhY2thZ2VzJywgLy8gQWxsb3cgdXNpbmcgZ2xvYmFsbHkgaW5zdGFsbGVkIHBhY2thZ2VzIChzYXZlcyB0aW1lICYgZGlzayBzcGFjZSlcbiAgICAgIHZlbnYsXG4gICAgXSk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBQQVRIOiBgJHt2ZW52QmlufToke3Byb2Nlc3MuZW52LlBBVEh9YCxcbiAgICAgIFZJUlRVQUxfRU5WOiB2ZW52LFxuICAgIH07XG4gICAgY29uc3QgcHl0aG9uID0gcGF0aC5qb2luKHZlbnZCaW4sICdweXRob24nKTtcblxuICAgIC8vIEluc3RhbGwgdGhlIG5lY2Vzc2FyeSB0aGluZ3NcbiAgICBhd2FpdCBzaGVsbChcbiAgICAgIHB5dGhvbixcbiAgICAgIFsnLW0nLCAncGlwJywgJ2luc3RhbGwnLCAnLS1uby1pbnB1dCcsICctcicsIHJlcXVpcmVtZW50c0ZpbGVdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQWN0dWFsbHkgcGFja2FnZSB1cCBvdXIgY29kZSwgYm90aCBhcyBhIHNkaXN0IGFuZCBhIHdoZWVsIGZvciBwdWJsaXNoaW5nLlxuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWydzZXR1cC5weScsICdzZGlzdCcsICctLWRpc3QtZGlyJywgb3V0RGlyXSwge1xuICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICd3aGVlbCcsICctLW5vLWRlcHMnLCAnLS13aGVlbC1kaXInLCBvdXREaXIsIHNvdXJjZURpcl0sXG4gICAgICB7XG4gICAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgICBlbnYsXG4gICAgICAgIHJldHJ5OiB7IG1heEF0dGVtcHRzOiA1IH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgYXdhaXQgc2hlbGwocHl0aG9uLCBbJy1tJywgJ3R3aW5lJywgJ2NoZWNrJywgcGF0aC5qb2luKG91dERpciwgJyonKV0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICB9XG59XG5cbi8vICMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gIyBDT0RFIEdFTkVSQVRPUiAjXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcblxuaW50ZXJmYWNlIEVtaXRDb250ZXh0IGV4dGVuZHMgTmFtaW5nQ29udGV4dCB7XG4gIC8qKiBAZGVwcmVjYXRlZCBUaGUgVHlwZVJlc29sdmVyICovXG4gIHJlYWRvbmx5IHJlc29sdmVyOiBUeXBlUmVzb2x2ZXI7XG59XG5cbmNvbnN0IHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBwYXRoLmpvaW4oLi4ubmFtZS5zcGxpdCgnLicpKTtcbn07XG5cbmNvbnN0IHRvUHl0aG9uTWV0aG9kTmFtZSA9IChuYW1lOiBzdHJpbmcsIHByb3RlY3RlZEl0ZW0gPSBmYWxzZSk6IHN0cmluZyA9PiB7XG4gIGxldCB2YWx1ZSA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG4gIGlmIChwcm90ZWN0ZWRJdGVtKSB7XG4gICAgdmFsdWUgPSBgXyR7dmFsdWV9YDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCB0b1B5dGhvblByb3BlcnR5TmFtZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBjb25zdGFudCA9IGZhbHNlLFxuICBwcm90ZWN0ZWRJdGVtID0gZmFsc2UsXG4pOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuXG4gIGlmIChjb25zdGFudCkge1xuICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGlmIChwcm90ZWN0ZWRJdGVtKSB7XG4gICAgdmFsdWUgPSBgXyR7dmFsdWV9YDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiBzaWduYXR1cmUncyBwYXJhbWV0ZXIgbmFtZSB0byB3aGF0IHNob3VsZCBiZSBlbWl0dGVkIGluIFB5dGhvbi4gSXQgc2x1Z2lmaWVzIHRoZVxuICogcG9zaXRpb25hbCBwYXJhbWV0ZXIgbmFtZXMgdGhhdCBjb2xsaWRlIHdpdGggYSBsaWZ0ZWQgcHJvcCBieSBhcHBlbmRpbmcgdHJhaWxpbmcgYF9gLiBUaGVyZSBpcyBub1xuICogcmlzayBvZiBjb25mbGljdGluZyB3aXRoIGFuIG90aGVyIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHRoYXQgZW5kcyB3aXRoIGEgYF9gIGNoYXJhY3RlciBiZWNhdXNlXG4gKiB0aGlzIGlzIHByb2hpYml0ZWQgYnkgdGhlIGBqc2lpYCBjb21waWxlciAocGFyYW1ldGVyIG5hbWVzIE1VU1QgYmUgY2FtZWxDYXNlLCBhbmQgb25seSBhIHNpbmdsZVxuICogYF9gIGlzIHBlcm1pdHRlZCB3aGVuIGl0IGlzIG9uICoqbGVhZGluZyoqIHBvc2l0aW9uKVxuICpcbiAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgbmVlZHMgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBsaWZ0ZWRQYXJhbU5hbWVzICB0aGUgbGlzdCBvZiBcImxpZnRlZFwiIGtleXdvcmQgcGFyYW1ldGVycyBpbiB0aGlzIHNpZ25hdHVyZS4gVGhpcyBtdXN0IGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZCB3aGVuIGdlbmVyYXRpbmcgYSBuYW1lIGZvciBhIHBhcmFtZXRlciB0aGF0ICoqaXMqKiBsaWZ0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgbmFtZTogc3RyaW5nLFxuICBsaWZ0ZWRQYXJhbU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCksXG4pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICB3aGlsZSAobGlmdGVkUGFyYW1OYW1lcy5oYXMocmVzdWx0KSkge1xuICAgIHJlc3VsdCArPSAnXyc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBzZXREaWZmZXJlbmNlID0gPFQ+KHNldEE6IFNldDxUPiwgc2V0QjogU2V0PFQ+KTogU2V0PFQ+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxUPigpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2V0QSkge1xuICAgIGlmICghc2V0Qi5oYXMoaXRlbSkpIHtcbiAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByZXBhcmUgcHl0aG9uIG1lbWJlcnMgZm9yIGVtaXNzaW9uLlxuICpcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZW1iZXJzIG9mIHRoZSBzYW1lIG5hbWUsIHRoZXkgd2lsbCBhbGwgbWFwIHRvIHRoZSBzYW1lIHB5dGhvblxuICogbmFtZSwgc28gd2Ugd2lsbCBmaWx0ZXIgYWxsIGRlcHJlY2F0ZWQgbWVtYmVycyBhbmQgZXhwZWN0IHRoYXQgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZVxuICogbGVmdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBtZW1iZXJzIGluIGEgc29ydGVkIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVNZW1iZXJzKG1lbWJlcnM6IFB5dGhvbkJhc2VbXSwgcmVzb2x2ZXI6IFR5cGVSZXNvbHZlcikge1xuICAvLyBjcmVhdGUgYSBtYXAgZnJvbSBweXRob24gbmFtZSB0byBsaXN0IG9mIG1lbWJlcnNcbiAgY29uc3QgbWFwOiB7IFtweXRob25OYW1lOiBzdHJpbmddOiBQeXRob25CYXNlW10gfSA9IHt9O1xuICBmb3IgKGNvbnN0IG0gb2YgbWVtYmVycykge1xuICAgIGxldCBsaXN0ID0gbWFwW20ucHl0aG9uTmFtZV07XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gbWFwW20ucHl0aG9uTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBsaXN0LnB1c2gobSk7XG4gIH1cblxuICAvLyBub3cgcmV0dXJuIGFsbCB0aGUgbWVtYmVyc1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBsaXN0XSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgbGV0IG1lbWJlcjtcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gaWYgd2UgaGF2ZSBhIHNpbmdsZSBtZW1iZXIgZm9yIHRoaXMgbm9ybWFsaXplZCBuYW1lLCB0aGVuIHVzZSBpdFxuICAgICAgbWVtYmVyID0gbGlzdFswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2UgZm91bmQgbW9yZSB0aGFuIG9uZSBtZW1iZXIgd2l0aCB0aGUgc2FtZSBweXRob24gbmFtZSwgZmlsdGVyIGFsbFxuICAgICAgLy8gZGVwcmVjYXRlZCB2ZXJzaW9ucyBhbmQgY2hlY2sgdGhhdCB3ZSBhcmUgbGVmdCB3aXRoIGV4YWN0bHkgb25lLlxuICAgICAgLy8gb3RoZXJ3aXNlLCB0aGV5IHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXJcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI1MDhcbiAgICAgIGNvbnN0IG5vbkRlcHJlY2F0ZWQgPSBsaXN0LmZpbHRlcigoeCkgPT4gIWlzRGVwcmVjYXRlZCh4KSk7XG4gICAgICBpZiAobm9uRGVwcmVjYXRlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgbm9uLWRlcHJlY2F0ZWQgbWVtYmVycyB3aGljaCBtYXAgdG8gdGhlIFB5dGhvbiBuYW1lIFwiJHtuYW1lfVwiYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgbWVtYmVycyB3aGljaCBtYXAgdG8gdGhlIFB5dGhvbiBuYW1lIFwiJHtuYW1lfVwiLCBidXQgYWxsIG9mIHRoZW0gYXJlIGRlcHJlY2F0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBtZW1iZXIgPSBub25EZXByZWNhdGVkWzBdO1xuICAgIH1cblxuICAgIHJldC5wdXNoKG1lbWJlcik7XG4gIH1cblxuICByZXR1cm4gc29ydE1lbWJlcnMocmV0LCByZXNvbHZlcik7XG59XG5cbmNvbnN0IHNvcnRNZW1iZXJzID0gKFxuICBtZW1iZXJzOiBQeXRob25CYXNlW10sXG4gIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIsXG4pOiBQeXRob25CYXNlW10gPT4ge1xuICBsZXQgc29ydGFibGUgPSBuZXcgQXJyYXk8e1xuICAgIG1lbWJlcjogUHl0aG9uQmFzZSAmIElTb3J0YWJsZVR5cGU7XG4gICAgZGVwZW5kc09uOiBTZXQ8UHl0aG9uVHlwZT47XG4gIH0+KCk7XG4gIGNvbnN0IHNvcnRlZCA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxQeXRob25CYXNlPigpO1xuXG4gIC8vIFRoZSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvLCBpcyBwdXNoIGFueSBpdGVtIHdoaWNoIGlzIG5vdCBzb3J0YWJsZSB0byB0aGUgdmVyeVxuICAvLyBmcm9udCBvZiB0aGUgbGlzdC4gVGhpcyB3aWxsIGJlIHRoaW5ncyBsaWtlIG1ldGhvZHMsIHByb3BlcnRpZXMsIGV0Yy5cbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgIGlmICghaXNTb3J0YWJsZVR5cGUobWVtYmVyKSkge1xuICAgICAgc29ydGVkLnB1c2gobWVtYmVyKTtcbiAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlLnB1c2goeyBtZW1iZXIsIGRlcGVuZHNPbjogbmV3IFNldChtZW1iZXIuZGVwZW5kc09uKHJlc29sdmVyKSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IHRoYXQgd2UndmUgcHVsbGVkIG91dCBldmVyeXRoaW5nIHRoYXQgY291bGRuJ3QgcG9zc2libHkgaGF2ZSBkZXBlbmRlbmNpZXMsXG4gIC8vIHdlIHdpbGwgZ28gdGhyb3VnaCB0aGUgcmVtYWluaW5nIGl0ZW1zLCBhbmQgcHVsbCBvZmYgYW55IGl0ZW1zIHdoaWNoIGhhdmUgbm9cbiAgLy8gZGVwZW5kZW5jaWVzIHRoYXQgd2UgaGF2ZW4ndCBhbHJlYWR5IHNvcnRlZC5cbiAgd2hpbGUgKHNvcnRhYmxlLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHsgbWVtYmVyLCBkZXBlbmRzT24gfSBvZiBzb3J0YWJsZSkge1xuICAgICAgY29uc3QgZGlmZiA9IHNldERpZmZlcmVuY2UoZGVwZW5kc09uLCBzZWVuKTtcbiAgICAgIGlmIChbLi4uZGlmZl0uZmluZCgoZGVwKSA9PiAhKGRlcCBpbnN0YW5jZW9mIFB5dGhvbk1vZHVsZSkpID09IG51bGwpIHtcbiAgICAgICAgc29ydGVkLnB1c2gobWVtYmVyKTtcbiAgICAgICAgc2Vlbi5hZGQobWVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsZWZ0b3ZlciA9IHNvcnRhYmxlLmZpbHRlcigoeyBtZW1iZXIgfSkgPT4gIXNlZW4uaGFzKG1lbWJlcikpO1xuICAgIGlmIChsZWZ0b3Zlci5sZW5ndGggPT09IHNvcnRhYmxlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHNvcnQgbWVtYmVycyAoY2lyY3VsYXIgZGVwZW5kZW5jeT8pLiBMZWZ0b3ZlcjogJHtsZWZ0b3ZlclxuICAgICAgICAgIC5tYXAoKGxvKSA9PiBsby5tZW1iZXIucHl0aG9uTmFtZSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGFibGUgPSBsZWZ0b3ZlcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc29ydGVkO1xufTtcblxuaW50ZXJmYWNlIFB5dGhvbkJhc2Uge1xuICByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG5cbiAgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0LCBvcHRzPzogYW55KTogdm9pZDtcblxuICByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzO1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uVHlwZSBleHRlbmRzIFB5dGhvbkJhc2Uge1xuICAvLyBUaGUgSlNJSSBGUU4gZm9yIHRoaXMgaXRlbSwgaWYgdGhpcyBpdGVtIGRvZXNuJ3QgZXhpc3QgYXMgYSBKU0lJIHR5cGUsIHRoZW4gaXRcbiAgLy8gZG9lc24ndCBoYXZlIGEgRlFOIGFuZCBpdCBzaG91bGQgYmUgbnVsbDtcbiAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVNvcnRhYmxlVHlwZSB7XG4gIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdO1xufVxuXG5mdW5jdGlvbiBpc1NvcnRhYmxlVHlwZShhcmc6IHVua25vd24pOiBhcmcgaXMgSVNvcnRhYmxlVHlwZSB7XG4gIHJldHVybiAoYXJnIGFzIFBhcnRpYWw8SVNvcnRhYmxlVHlwZT4pLmRlcGVuZHNPbiAhPT0gdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uVHlwZU9wdHMge1xuICBiYXNlcz86IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIGltcGxlbWVudHMgUHl0aG9uVHlwZSwgSVNvcnRhYmxlVHlwZSB7XG4gIHByb3RlY3RlZCBiYXNlczogc3BlYy5UeXBlUmVmZXJlbmNlW107XG4gIHByb3RlY3RlZCBtZW1iZXJzOiBQeXRob25CYXNlW107XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXBhcmF0ZU1lbWJlcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3BlYzogc3BlYy5UeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBQeXRob25UeXBlT3B0cyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBjb25zdCB7IGJhc2VzID0gW10gfSA9IG9wdHM7XG5cbiAgICB0aGlzLmJhc2VzID0gYmFzZXM7XG4gICAgdGhpcy5tZW1iZXJzID0gW107XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheTxQeXRob25UeXBlPigpO1xuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudCh0aGlzLmZxbiEpO1xuXG4gICAgLy8gV2UgbmVlZCB0byByZXR1cm4gYW55IGJhc2VzIHRoYXQgYXJlIGluIHRoZSBzYW1lIG1vZHVsZSBhdCB0aGUgc2FtZSBsZXZlbCBvZlxuICAgIC8vIG5lc3RpbmcuXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmJhc2VzKSB7XG4gICAgICBpZiAoc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShiYXNlKSkge1xuICAgICAgICBpZiAocmVzb2x2ZXIuaXNJbk1vZHVsZShiYXNlKSkge1xuICAgICAgICAgIC8vIEdpdmVuIGEgYmFzZSwgd2UgbmVlZCB0byBsb2NhdGUgdGhlIGJhc2UncyBwYXJlbnQgdGhhdCBpcyB0aGUgc2FtZSBhc1xuICAgICAgICAgIC8vIG91ciBwYXJlbnQsIGJlY2F1c2Ugd2Ugb25seSBjYXJlIGFib3V0IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhdCB0aGVcbiAgICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgICAgLy8gVE9ETzogV2UgbWlnaHQgbmVlZCB0byByZWN1cnNlIGludG8gb3VyIG1lbWJlcnMgdG8gYWxzbyBmaW5kIHRoZWlyXG4gICAgICAgICAgLy8gICAgICAgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgIGxldCBiYXNlSXRlbSA9IHJlc29sdmVyLmdldFR5cGUoYmFzZSk7XG4gICAgICAgICAgbGV0IGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZSk7XG4gICAgICAgICAgd2hpbGUgKGJhc2VQYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgICAgICAgYmFzZUl0ZW0gPSBiYXNlUGFyZW50O1xuICAgICAgICAgICAgYmFzZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChiYXNlSXRlbS5mcW4hKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXNlZW4uaGFzKGJhc2VJdGVtLmZxbiEpKSB7XG4gICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChiYXNlSXRlbSk7XG4gICAgICAgICAgICBzZWVuLmFkZChiYXNlSXRlbS5mcW4hKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICAuLi50aGlzLmJhc2VzLm1hcCgoYmFzZSkgPT4gdG9UeXBlTmFtZShiYXNlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICAgLi4udGhpcy5tZW1iZXJzLm1hcCgobWVtKSA9PiBtZW0ucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpIHtcbiAgICB0aGlzLm1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgaWYgKCF0aGlzLmZxbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IG1ha2UgYXBpTG9jYXRpb24gZm9yICR7dGhpcy5weXRob25OYW1lfSwgZG9lcyBub3QgaGF2ZSBGUU5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXBpOiAndHlwZScsIGZxbjogdGhpcy5mcW4gfTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICBjb25zdCBjbGFzc1BhcmFtcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnB5dGhvbk5hbWUsIGNsYXNzUGFyYW1zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICAgIHRyYWlsaW5nTmV3TGluZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmJvdW5kUmVzb2x2ZXIoY29udGV4dC5yZXNvbHZlcik7XG4gICAgICBsZXQgc2hvdWxkU2VwYXJhdGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHByZXBhcmVNZW1iZXJzKHRoaXMubWVtYmVycywgcmVzb2x2ZXIpKSB7XG4gICAgICAgIGlmIChzaG91bGRTZXBhcmF0ZSkge1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZFNlcGFyYXRlID0gdGhpcy5zZXBhcmF0ZU1lbWJlcnM7XG4gICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIHsgLi4uY29udGV4dCwgcmVzb2x2ZXIgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgIH1cblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKHRoaXMuZnFuICE9IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZW1pdHRlZFR5cGVzLmFkZCh0aGlzLmZxbik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJvdW5kUmVzb2x2ZXIocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFR5cGVSZXNvbHZlciB7XG4gICAgaWYgKHRoaXMuZnFuID09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVyLmJpbmQodGhpcy5mcW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgbGlmdGVkUHJvcD86IHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbn1cblxuaW50ZXJmYWNlIEJhc2VNZXRob2RFbWl0T3B0cyB7XG4gIHJlbmRlckFic3RyYWN0PzogYm9vbGVhbjtcbiAgZm9yY2VFbWl0Qm9keT86IGJvb2xlYW47XG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VNZXRob2QgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzQXNGaXJzdFBhcmFtZXRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlmdGVkUHJvcD86IHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczogc3BlYy5QYXJhbWV0ZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJldHVybnM6IHNwZWMuT3B0aW9uYWxWYWx1ZSB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBpc1N0YXRpYzogYm9vbGVhbixcbiAgICBvcHRzOiBCYXNlTWV0aG9kT3B0cyxcbiAgKSB7XG4gICAgdGhpcy5hYnN0cmFjdCA9ICEhb3B0cy5hYnN0cmFjdDtcbiAgICB0aGlzLmxpZnRlZFByb3AgPSBvcHRzLmxpZnRlZFByb3A7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiB0aGlzLnBhcmVudC5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiB0aGlzLmpzTmFtZSA/PyAnJyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICB0b1R5cGVOYW1lKHRoaXMucmV0dXJucykucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgLi4udGhpcy5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+XG4gICAgICAgIHRvVHlwZU5hbWUocGFyYW0pLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgICAuLi5saWZ0ZWRQcm9wZXJ0aWVzKHRoaXMubGlmdGVkUHJvcCksXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uKiBsaWZ0ZWRQcm9wZXJ0aWVzKFxuICAgICAgc3RydWN0OiBzcGVjLkludGVyZmFjZVR5cGUgfCB1bmRlZmluZWQsXG4gICAgKTogSXRlcmFibGVJdGVyYXRvcjxQeXRob25JbXBvcnRzPiB7XG4gICAgICBpZiAoc3RydWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHN0cnVjdC5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIHlpZWxkIHRvVHlwZU5hbWUocHJvcC50eXBlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2Ygc3RydWN0LmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgY29uc3QgaWZhY2UgPSBjb250ZXh0LnJlc29sdmVyLmRlcmVmZXJlbmNlKGJhc2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRzIG9mIGxpZnRlZFByb3BlcnRpZXMoaWZhY2UpKSB7XG4gICAgICAgICAgeWllbGQgaW1wb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbWl0KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBvcHRzPzogQmFzZU1ldGhvZEVtaXRPcHRzLFxuICApIHtcbiAgICBjb25zdCB7IHJlbmRlckFic3RyYWN0ID0gdHJ1ZSwgZm9yY2VFbWl0Qm9keSA9IGZhbHNlIH0gPSBvcHRzID8/IHt9O1xuXG4gICAgY29uc3QgcmV0dXJuVHlwZTogc3RyaW5nID0gdG9UeXBlTmFtZSh0aGlzLnJldHVybnMpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBXZSBjYW5ub3QgKGN1cnJlbnRseT8pIGJsaW5kbHkgdXNlIHRoZSBuYW1lcyBnaXZlbiB0byB1cyBieSB0aGUgSlNJSSBmb3JcbiAgICAvLyBpbml0aWFsaXplcnMsIGJlY2F1c2Ugb3VyIGtleXdvcmQgbGlmdGluZyB3aWxsIGFsbG93IHR3byBuYW1lcyB0byBjbGFzaC5cbiAgICAvLyBUaGlzIGNhbiBob3BlZnVsbHkgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI4OFxuICAgIC8vIHJlc29sdmVkLCBzbyBidWlsZCB1cCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBwcm9wIG5hbWVzIHNvIHdlIGNhbiBjaGVjayBhZ2FpbnN0XG4gICAgLy8gdGhlbSBsYXRlci5cbiAgICBjb25zdCBsaWZ0ZWRQcm9wTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5saWZ0ZWRQcm9wPy5wcm9wZXJ0aWVzICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLmxpZnRlZFByb3AucHJvcGVydGllcykge1xuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMuYWRkKHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHR1cm4gYSBsaXN0IG9mIEpTSUkgcGFyYW1ldGVycywgaW50byBQeXRob24gc3R5bGUgYXJndW1lbnRzIHdpdGhcbiAgICAvLyBncmFkdWFsIHR5cGluZywgc28gd2UnbGwgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycywgYW5kXG4gICAgLy8gYnVpbGQgdGhlIGxpc3QsIGNvbnZlcnRpbmcgYXMgd2UgZ28uXG4gICAgY29uc3QgcHl0aG9uUGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICAvLyBXZSBjYW5ub3QgKGN1cnJlbnRseT8pIGJsaW5kbHkgdXNlIHRoZSBuYW1lcyBnaXZlbiB0byB1cyBieSB0aGUgSlNJSSBmb3JcbiAgICAgIC8vIGluaXRpYWxpemVycywgYmVjYXVzZSBvdXIga2V5d29yZCBsaWZ0aW5nIHdpbGwgYWxsb3cgdHdvIG5hbWVzIHRvIGNsYXNoLlxuICAgICAgLy8gVGhpcyBjYW4gaG9wZWZ1bGx5IGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yODhcbiAgICAgIC8vIHJlc29sdmVkLlxuICAgICAgY29uc3QgcGFyYW1OYW1lOiBzdHJpbmcgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gICAgICAgIHBhcmFtLm5hbWUsXG4gICAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocGFyYW0pLnB5dGhvblR5cGUoe1xuICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXJhbURlZmF1bHQgPSBwYXJhbS5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuXG4gICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2N1bWVudGFibGVBcmdzOiBEb2N1bWVudGFibGVBcmd1bWVudFtdID0gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICAubWFwKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAoe1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgZG9jczogcC5kb2NzLFxuICAgICAgICAgICAgZGVmaW5pbmdUeXBlOiB0aGlzLnBhcmVudCxcbiAgICAgICAgICB9IGFzIERvY3VtZW50YWJsZUFyZ3VtZW50KSxcbiAgICAgIClcbiAgICAgIC8vIElmIHRoZXJlJ3MgbGlmdGVkUHJvcHMsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBzdHJ1Y3QgYW5kIGl0IHdvbid0IGJlIF9hY3R1YWxseV8gZW1pdHRlZC5cbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmxpZnRlZFByb3AgIT0gbnVsbCA/IGluZGV4IDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDEgOiB0cnVlLFxuICAgICAgKVxuICAgICAgLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKSxcbiAgICAgIH0pKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBsaWZ0ZWQgcGFyYW1ldGVyLCB0aGVuIHdlJ2xsIGRyb3AgdGhlIGxhc3QgYXJndW1lbnQgdG8gb3VyIHBhcmFtc1xuICAgIC8vIGFuZCB0aGVuIHdlJ2xsIGxpZnQgYWxsIG9mIHRoZSBwYXJhbXMgb2YgdGhlIGxpZnRlZCB0eXBlIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgLy8gdG8gdGhlIGZ1bmN0aW9uLlxuICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVtb3ZlIG91ciBsYXN0IGl0ZW0uXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG4gICAgICBjb25zdCBsaWZ0ZWRQcm9wZXJ0aWVzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpO1xuXG4gICAgICBpZiAobGlmdGVkUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuICAgICAgICAvLyBBbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUga2V5d29yZCBvbmx5IGFyZ3VtZW50cywgc28gd2UnbGwgbWFyayB0aGVtXG4gICAgICAgIC8vIGFzIHN1Y2guXG4gICAgICAgIHB5dGhvblBhcmFtcy5wdXNoKCcqJyk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgcHJvcHMsIGFuZCByZWZsZWN0IHRoZW0gaW50byBvdXIgcGFyYW1zLlxuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgbGlmdGVkUHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLnByb3AubmFtZSk7XG4gICAgICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShwcm9wLnByb3ApLnB5dGhvblR5cGUoe1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcGFyYW1EZWZhdWx0ID0gcHJvcC5wcm9wLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb2N1bWVudCB0aGVtIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgICBkb2N1bWVudGFibGVBcmdzLnB1c2goXG4gICAgICAgIC4uLmxpZnRlZFByb3BlcnRpZXMubWFwKFxuICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgbmFtZTogcC5wcm9wLm5hbWUsXG4gICAgICAgICAgICAgIGRvY3M6IHAucHJvcC5kb2NzLFxuICAgICAgICAgICAgICBkZWZpbmluZ1R5cGU6IHAuZGVmaW5pbmdUeXBlLFxuICAgICAgICAgICAgfSBhcyBEb2N1bWVudGFibGVBcmd1bWVudCksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoID49IDEgJiZcbiAgICAgIHRoaXMucGFyYW1ldGVyc1t0aGlzLnBhcmFtZXRlcnMubGVuZ3RoIC0gMV0udmFyaWFkaWNcbiAgICApIHtcbiAgICAgIC8vIEFub3RoZXIgc2l0dWF0aW9uIHdlIGNvdWxkIGJlIGluLCBpcyB0aGF0IGluc3RlYWQgb2YgaGF2aW5nIGEgcGxhaW4gcGFyYW1ldGVyXG4gICAgICAvLyB3ZSBoYXZlIGEgdmFyaWFkaWMgcGFyYW1ldGVyIHdoZXJlIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBsYXN0IHBhcmFtZXRlciBhcyBhXG4gICAgICAvLyAqYXJncy5cbiAgICAgIHB5dGhvblBhcmFtcy5wb3AoKTtcblxuICAgICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVycy5zbGljZSgtMSlbMF07XG4gICAgICBjb25zdCBwYXJhbU5hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUobGFzdFBhcmFtZXRlci5uYW1lKTtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUobGFzdFBhcmFtZXRlci50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgICBweXRob25QYXJhbXMucHVzaChgKiR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAodGhpcy5qc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIG5lZWRlZCBiZWNhdXNlIG15cHkgZG9lcyBub3Qga25vdyBob3cgdG8gY2hlY2sgZGVjb3JhdGVkIGRlY2xhcmF0aW9uc1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZWNvcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKGBAJHt0aGlzLmRlY29yYXRvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIG5lZWRlZCBiZWNhdXNlIG15cHkgZG9lcyBub3Qga25vdyBob3cgdG8gY2hlY2sgZGVjb3JhdGVkIGRlY2xhcmF0aW9uc1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9yc1xuICAgICAgICAuam9pbignICMgdHlwZTogaWdub3JlW21pc2NdXFxuJylcbiAgICAgICAgLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBjb2RlLmxpbmUoZGVjb3JhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBweXRob25QYXJhbXMudW5zaGlmdChcbiAgICAgIHNsdWdpZnlBc05lZWRlZChcbiAgICAgICAgdGhpcy5pbXBsaWNpdFBhcmFtZXRlcixcbiAgICAgICAgcHl0aG9uUGFyYW1zLm1hcCgocGFyYW0pID0+IHBhcmFtLnNwbGl0KCc6JylbMF0udHJpbSgpKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBweXRob25QYXJhbXMsXG4gICAgICBmYWxzZSxcbiAgICAgIHJldHVyblR5cGUsXG4gICAgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgYXJndW1lbnRzOiBkb2N1bWVudGFibGVBcmdzLFxuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYG1ldGhvZC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdEJvZHkoXG4gICAgICBjb2RlLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJlbmRlckFic3RyYWN0LFxuICAgICAgZm9yY2VFbWl0Qm9keSxcbiAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgIHB5dGhvblBhcmFtc1swXSxcbiAgICAgIHJldHVyblR5cGUsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEJvZHkoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIHJlbmRlckFic3RyYWN0OiBib29sZWFuLFxuICAgIGZvcmNlRW1pdEJvZHk6IGJvb2xlYW4sXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgICBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nLFxuICAgIHJldHVyblR5cGU6IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLnNob3VsZEVtaXRCb2R5ICYmICFmb3JjZUVtaXRCb2R5KSB8fFxuICAgICAgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoJy4uLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5saWZ0ZWRQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbWl0QXV0b1Byb3BzKGNvZGUsIGNvbnRleHQsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdEpzaWlNZXRob2RDYWxsKFxuICAgICAgICBjb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICAgIGltcGxpY2l0UGFyYW1ldGVyLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBdXRvUHJvcHMoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICkge1xuICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuc2xpY2UoLTEpWzBdO1xuICAgIGNvbnN0IGFyZ05hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUobGFzdFBhcmFtZXRlci5uYW1lLCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgIGNvbnN0IHR5cGVOYW1lID0gdG9UeXBlTmFtZShsYXN0UGFyYW1ldGVyLnR5cGUpLnB5dGhvblR5cGUoe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIHByb3BlcnRpZXMsIHdoaWNoIGFyZSBtYW5kYXRvcnksIHRoZXNlIGFyZSB0aGVcbiAgICAvLyBvbmVzIHdlIHdpbGwgc3BlY2lmaXkgdG8gc3RhcnQgd2l0aCBpbiBvdXIgZGljdGlvbmFyeSBsaXRlcmFsLlxuICAgIGNvbnN0IGxpZnRlZFByb3BzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpLm1hcChcbiAgICAgIChwKSA9PiBuZXcgU3RydWN0RmllbGQodGhpcy5nZW5lcmF0b3IsIHAucHJvcCwgcC5kZWZpbmluZ1R5cGUpLFxuICAgICk7XG4gICAgY29uc3QgYXNzaWdubWVudHMgPSBsaWZ0ZWRQcm9wc1xuICAgICAgLm1hcCgocCkgPT4gcC5weXRob25OYW1lKVxuICAgICAgLm1hcCgodikgPT4gYCR7dn09JHt2fWApO1xuXG4gICAgYXNzaWduQ2FsbFJlc3VsdChjb2RlLCBhcmdOYW1lLCB0eXBlTmFtZSwgYXNzaWdubWVudHMpO1xuICAgIGNvZGUubGluZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IG1ldGhvZFByZWZpeDogc3RyaW5nID0gdGhpcy5yZXR1cm5Gcm9tSlNJSU1ldGhvZCA/ICdyZXR1cm4gJyA6ICcnO1xuXG4gICAgY29uc3QganNpaU1ldGhvZFBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5jbGFzc0FzRmlyc3RQYXJhbWV0ZXIpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IG5vdCBrbm93bi4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzU3RhdGljKSB7XG4gICAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChcbiAgICAgICAgICB0b1R5cGVOYW1lKHRoaXMucGFyZW50KS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2luZyB0aGUgZHluYW1pYyBjbGFzcyBvZiBgc2VsZmAuXG4gICAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX19jbGFzc19fYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChpbXBsaWNpdFBhcmFtZXRlcik7XG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChgXCIke3RoaXMuanNOYW1lfVwiYCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxhc3QgYXJnIGlzIHZhcmlhZGljLCBleHBhbmQgdGhlIHR1cGxlXG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICBsZXQgZXhwciA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lLCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgaWYgKHBhcmFtLnZhcmlhZGljKSB7XG4gICAgICAgIGV4cHIgPSBgKiR7ZXhwcn1gO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2goZXhwcik7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBganNpaS4ke3RoaXMuanNpaU1ldGhvZH0oJHtqc2lpTWV0aG9kUGFyYW1zLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9LCBbJHtwYXJhbXMuam9pbignLCAnKX1dKWA7XG4gICAgY29kZS5saW5lKFxuICAgICAgYCR7bWV0aG9kUHJlZml4fSR7XG4gICAgICAgIHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgJiYgcmV0dXJuVHlwZVxuICAgICAgICAgID8gYHR5cGluZy5jYXN0KCR7cmV0dXJuVHlwZX0sICR7dmFsdWV9KWBcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICB9YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMaWZ0ZWRQcm9wZXJ0aWVzKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQcm9wZXJ0eURlZmluaXRpb25bXSB7XG4gICAgY29uc3QgbGlmdGVkUHJvcGVydGllczogUHJvcGVydHlEZWZpbml0aW9uW10gPSBbXTtcblxuICAgIGNvbnN0IHN0YWNrID0gW3RoaXMubGlmdGVkUHJvcF07XG4gICAgY29uc3Qga25vd25JZmFjZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBrbm93blByb3BzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChcbiAgICAgIGxldCBjdXJyZW50ID0gc3RhY2suc2hpZnQoKTtcbiAgICAgIGN1cnJlbnQgIT0gbnVsbDtcbiAgICAgIGN1cnJlbnQgPSBzdGFjay5zaGlmdCgpXG4gICAgKSB7XG4gICAgICBrbm93bklmYWNlcy5hZGQoY3VycmVudC5mcW4pO1xuXG4gICAgICAvLyBBZGQgYW55IGludGVyZmFjZXMgdGhhdCB0aGlzIGludGVyZmFjZSBkZXBlbmRzIG9uLCB0byB0aGUgbGlzdC5cbiAgICAgIGlmIChjdXJyZW50LmludGVyZmFjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIGN1cnJlbnQuaW50ZXJmYWNlcykge1xuICAgICAgICAgIGlmIChrbm93bklmYWNlcy5oYXMoaWZhY2UpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhY2sucHVzaChyZXNvbHZlci5kZXJlZmVyZW5jZShpZmFjZSkgYXMgc3BlYy5JbnRlcmZhY2VUeXBlKTtcbiAgICAgICAgICBrbm93bklmYWNlcy5hZGQoaWZhY2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnRlcmZhY2UgdG8gb3VyIGxpc3Qgb2YgcHJvcGVydGllcy5cbiAgICAgIGlmIChjdXJyZW50LnByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY3VycmVudC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgaWYgKGtub3duUHJvcHMuaGFzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaWZ0ZWRQcm9wZXJ0aWVzLnB1c2goeyBwcm9wLCBkZWZpbmluZ1R5cGU6IGN1cnJlbnQgfSk7XG4gICAgICAgICAga25vd25Qcm9wcy5hZGQocHJvcC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaWZ0ZWRQcm9wZXJ0aWVzO1xuICB9XG59XG5cbmludGVyZmFjZSBCYXNlUHJvcGVydHlPcHRzIHtcbiAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICBpbW11dGFibGU/OiBib29sZWFuO1xuICBpc1N0YXRpYz86IGJvb2xlYW47XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlUHJvcGVydHlFbWl0T3B0cyB7XG4gIHJlbmRlckFic3RyYWN0PzogYm9vbGVhbjtcbiAgZm9yY2VFbWl0Qm9keT86IGJvb2xlYW47XG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VQcm9wZXJ0eSBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYWJzdHJhY3Q6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBpc1N0YXRpYzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbW11dGFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkganNOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBCYXNlUHJvcGVydHlPcHRzLFxuICApIHtcbiAgICBjb25zdCB7IGFic3RyYWN0ID0gZmFsc2UsIGltbXV0YWJsZSA9IGZhbHNlLCBpc1N0YXRpYyA9IGZhbHNlIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5hYnN0cmFjdCA9IGFic3RyYWN0O1xuICAgIHRoaXMuaW1tdXRhYmxlID0gaW1tdXRhYmxlO1xuICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYztcbiAgICB0aGlzLnBhcmVudCA9IG9wdHMucGFyZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHsgYXBpOiAnbWVtYmVyJywgZnFuOiB0aGlzLnBhcmVudC5mcW4sIG1lbWJlck5hbWU6IHRoaXMuanNOYW1lIH07XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgb3B0cz86IEJhc2VQcm9wZXJ0eUVtaXRPcHRzLFxuICApIHtcbiAgICBjb25zdCB7IHJlbmRlckFic3RyYWN0ID0gdHJ1ZSwgZm9yY2VFbWl0Qm9keSA9IGZhbHNlIH0gPSBvcHRzID8/IHt9O1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPSB0b1R5cGVOYW1lKHRoaXMudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBpcyBuZWVkZWQgYmVjYXVzZSBteXB5IGNhbm5vdCBjaGVjayBkZWNvcmF0ZWQgdGhpbmdzXG4gICAgY29kZS5saW5lKGBAJHt0aGlzLmRlY29yYXRvcn0gIyB0eXBlOiBpZ25vcmVbbWlzY11gKTtcbiAgICBjb2RlLmxpbmUoYEBqc2lpLm1lbWJlcihqc2lpX25hbWU9XCIke3RoaXMuanNOYW1lfVwiKWApO1xuICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb2RlLmxpbmUoJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICB9XG4gICAgb3BlblNpZ25hdHVyZShcbiAgICAgIGNvZGUsXG4gICAgICAnZGVmJyxcbiAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgIFt0aGlzLmltcGxpY2l0UGFyYW1ldGVyXSxcbiAgICAgIHRydWUsXG4gICAgICBweXRob25UeXBlLFxuICAgICk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICghcmVuZGVyQWJzdHJhY3QgfHwgIXRoaXMuYWJzdHJhY3QpXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGByZXR1cm4gdHlwaW5nLmNhc3QoJHtweXRob25UeXBlfSwganNpaS4ke3RoaXMuanNpaUdldE1ldGhvZH0oJHt0aGlzLmltcGxpY2l0UGFyYW1ldGVyfSwgXCIke3RoaXMuanNOYW1lfVwiKSlgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICB9XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAoIXRoaXMuaW1tdXRhYmxlKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYEAke3RoaXMucHl0aG9uTmFtZX0uc2V0dGVyJHtcbiAgICAgICAgICB0aGlzLmlzU3RhdGljID8gJyAjIHR5cGU6IGlnbm9yZVtuby1yZWRlZl0nIDogJydcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgICB9XG4gICAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgICBjb2RlLFxuICAgICAgICAnZGVmJyxcbiAgICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlciwgYHZhbHVlOiAke3B5dGhvblR5cGV9YF0sXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAnTm9uZScsXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5zaG91bGRFbWl0Qm9keSB8fCBmb3JjZUVtaXRCb2R5KSAmJlxuICAgICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICAgKSB7XG4gICAgICAgIGNvZGUubGluZShcbiAgICAgICAgICBganNpaS4ke3RoaXMuanNpaVNldE1ldGhvZH0oJHt0aGlzLmltcGxpY2l0UGFyYW1ldGVyfSwgXCIke3RoaXMuanNOYW1lfVwiLCB2YWx1ZSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICAgIH1cbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2UgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnQGpzaWkuaW50ZXJmYWNlKCcsIFtganNpaV90eXBlPVwiJHt0aGlzLmZxbn1cImBdLCAnKScpO1xuXG4gICAgLy8gRmlyc3Qgd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgpO1xuXG4gICAgLy8gVGhlbiwgd2UgaGF2ZSB0byBlbWl0IGEgUHJveHkgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBvdXIgcHJveHkgaW50ZXJmYWNlLlxuICAgIGNvbnN0IHByb3h5QmFzZXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoXG4gICAgICAoYikgPT5cbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgYGpzaWkucHJveHlfZm9yKCR7dG9UeXBlTmFtZShiKS5weXRob25UeXBlKHtcbiAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgfSl9KSAjIHR5cGU6IGlnbm9yZVttaXNjXWAsXG4gICAgKTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHJveHlDbGFzc05hbWUsIHByb3h5QmFzZXMpO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICAgIHRyYWlsaW5nTmV3TGluZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb2RlLmxpbmUoYF9fanNpaV90eXBlX186IHR5cGluZy5DbGFzc1ZhcltzdHJdID0gXCIke3RoaXMuZnFufVwiYCk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHRoaXMubWVtYmVycykge1xuICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCBjb250ZXh0LCB7IGZvcmNlRW1pdEJvZHk6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgIH1cblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZShcbiAgICAgICcjIEFkZGluZyBhIFwiX19qc2lpX3Byb3h5X2NsYXNzX18oKTogdHlwaW5nLlR5cGVcIiBmdW5jdGlvbiB0byB0aGUgaW50ZXJmYWNlJyxcbiAgICApO1xuICAgIGNvZGUubGluZShcbiAgICAgIGB0eXBpbmcuY2FzdCh0eXBpbmcuQW55LCAke3RoaXMucHl0aG9uTmFtZX0pLl9fanNpaV9wcm94eV9jbGFzc19fID0gbGFtYmRhIDogJHt0aGlzLnByb3h5Q2xhc3NOYW1lfWAsXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcblxuICAgIHBhcmFtcy5wdXNoKCd0eXBpbmdfZXh0ZW5zaW9ucy5Qcm90b2NvbCcpO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3h5Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBfJHt0aGlzLnB5dGhvbk5hbWV9UHJveHlgO1xuICB9XG59XG5cbmNsYXNzIEludGVyZmFjZU1ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdpbnZva2UnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgSW50ZXJmYWNlUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBTdHJ1Y3QgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIGRpcmVjdE1lbWJlcnMgPSBuZXcgQXJyYXk8U3RydWN0RmllbGQ+KCk7XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpOiB2b2lkIHtcbiAgICBpZiAoIShtZW1iZXIgaW5zdGFuY2VvZiBTdHJ1Y3RGaWVsZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBhZGQgU3RydWN0RmllbGQgdG8gU3RydWN0Jyk7XG4gICAgfVxuICAgIHRoaXMuZGlyZWN0TWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuICAgIGNvbnN0IGJhc2VJbnRlcmZhY2VzID0gdGhpcy5nZXRDbGFzc1BhcmFtcyhjb250ZXh0KTtcblxuICAgIGNvZGUuaW5kZW50KCdAanNpaS5kYXRhX3R5cGUoJyk7XG4gICAgY29kZS5saW5lKGBqc2lpX3R5cGU9JHtKU09OLnN0cmluZ2lmeSh0aGlzLmZxbil9LGApO1xuICAgIGVtaXRMaXN0KGNvZGUsICdqc2lpX3N0cnVjdF9iYXNlcz1bJywgYmFzZUludGVyZmFjZXMsICddLCcpO1xuICAgIGFzc2lnbkRpY3Rpb25hcnkoY29kZSwgJ25hbWVfbWFwcGluZycsIHRoaXMucHJvcGVydHlNYXAoKSwgJywnLCB0cnVlKTtcbiAgICBjb2RlLnVuaW5kZW50KCcpJyk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnB5dGhvbk5hbWUsIGJhc2VJbnRlcmZhY2VzKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3Rvcihjb2RlLCBjb250ZXh0KTtcblxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHRoaXMuYWxsTWVtYmVycykge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmVtaXRHZXR0ZXIobWVtYmVyLCBjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRNYWdpY01ldGhvZHMoY29kZSk7XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgLi4udGhpcy5hbGxNZW1iZXJzLm1hcCgobWVtKSA9PiBtZW0ucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmJhc2VzLm1hcCgoYikgPT5cbiAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYWxsIGZpZWxkcyAoaW5oZXJpdGVkIGFzIHdlbGwpXG4gICAqL1xuICBwcml2YXRlIGdldCBhbGxNZW1iZXJzKCk6IFN0cnVjdEZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLnRoaXNJbnRlcmZhY2UuYWxsUHJvcGVydGllcy5tYXAoXG4gICAgICAoeCkgPT4gbmV3IFN0cnVjdEZpZWxkKHRoaXMuZ2VuZXJhdG9yLCB4LnNwZWMsIHguZGVmaW5pbmdUeXBlLnNwZWMpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCB0aGlzSW50ZXJmYWNlKCkge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZRTiBub3Qgc2V0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLmZpbmRJbnRlcmZhY2UodGhpcy5mcW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uc3RydWN0b3IoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1lbWJlcnMgPSB0aGlzLmFsbE1lbWJlcnM7XG5cbiAgICBjb25zdCBrd2FyZ3MgPSBtZW1iZXJzLm1hcCgobSkgPT4gbS5jb25zdHJ1Y3RvckRlY2woY29udGV4dCkpO1xuXG4gICAgY29uc3QgaW1wbGljaXRQYXJhbWV0ZXIgPSBzbHVnaWZ5QXNOZWVkZWQoXG4gICAgICAnc2VsZicsXG4gICAgICBtZW1iZXJzLm1hcCgobSkgPT4gbS5weXRob25OYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yQXJndW1lbnRzID1cbiAgICAgIGt3YXJncy5sZW5ndGggPiAwXG4gICAgICAgID8gW2ltcGxpY2l0UGFyYW1ldGVyLCAnKicsIC4uLmt3YXJnc11cbiAgICAgICAgOiBbaW1wbGljaXRQYXJhbWV0ZXJdO1xuXG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnZGVmJywgJ19faW5pdF9fJywgY29uc3RydWN0b3JBcmd1bWVudHMsIGZhbHNlLCAnTm9uZScpO1xuICAgIHRoaXMuZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGUpO1xuXG4gICAgLy8gUmUtdHlwZSBzdHJ1Y3QgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgYXMgXCJkaWN0XCJcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzLmZpbHRlcigobSkgPT4gbS5pc1N0cnVjdCh0aGlzLmdlbmVyYXRvcikpKSB7XG4gICAgICAvLyBOb3RlIHRoYXQgXCJOb25lXCIgaXMgTk9UIGFuIGluc3RhbmNlIG9mIGRpY3QgKHRoYXQncyBjb252ZW5pZW50ISlcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gdG9UeXBlTmFtZShtZW1iZXIudHlwZS50eXBlKS5weXRob25UeXBlKHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgaXNpbnN0YW5jZSgke21lbWJlci5weXRob25OYW1lfSwgZGljdClgKTtcbiAgICAgIGNvZGUubGluZShgJHttZW1iZXIucHl0aG9uTmFtZX0gPSAke3R5cGVOYW1lfSgqKiR7bWVtYmVyLnB5dGhvbk5hbWV9KWApO1xuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZWQgcHJvcGVydGllcywgdGhvc2Ugd2lsbCBhbHdheXMgYmUgcHV0IGludG8gdGhlIGRpY3RcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KFxuICAgICAgY29kZSxcbiAgICAgIGAke2ltcGxpY2l0UGFyYW1ldGVyfS5fdmFsdWVzOiB0eXBpbmcuRGljdFtzdHIsIHR5cGluZy5BbnldYCxcbiAgICAgIG1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gIW0ub3B0aW9uYWwpXG4gICAgICAgIC5tYXAoXG4gICAgICAgICAgKG1lbWJlcikgPT5cbiAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX06ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gT3B0aW9uYWwgcHJvcGVydGllcywgd2lsbCBvbmx5IGJlIHB1dCBpbnRvIHRoZSBkaWN0IGlmIHRoZXkncmUgbm90IE5vbmVcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzLmZpbHRlcigobSkgPT4gbS5vcHRpb25hbCkpIHtcbiAgICAgIGNvZGUub3BlbkJsb2NrKGBpZiAke21lbWJlci5weXRob25OYW1lfSBpcyBub3QgTm9uZWApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlc1tcIiR7bWVtYmVyLnB5dGhvbk5hbWV9XCJdID0gJHttZW1iZXIucHl0aG9uTmFtZX1gLFxuICAgICAgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uc3RydWN0b3JEb2NzdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgY29uc3QgYXJnczogRG9jdW1lbnRhYmxlQXJndW1lbnRbXSA9IHRoaXMuYWxsTWVtYmVycy5tYXAoKG0pID0+ICh7XG4gICAgICBuYW1lOiBtLnB5dGhvbk5hbWUsXG4gICAgICBkb2NzOiBtLmRvY3MsXG4gICAgICBkZWZpbmluZ1R5cGU6IHRoaXMuc3BlYyxcbiAgICB9KSk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBjbGFzcy0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0R2V0dGVyKFxuICAgIG1lbWJlcjogU3RydWN0RmllbGQsXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICApIHtcbiAgICBjb25zdCBweXRob25UeXBlID0gbWVtYmVyLnR5cGVBbm5vdGF0aW9uKGNvbnRleHQpO1xuXG4gICAgY29kZS5saW5lKCdAYnVpbHRpbnMucHJvcGVydHknKTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdkZWYnLCBtZW1iZXIucHl0aG9uTmFtZSwgWydzZWxmJ10sIHRydWUsIHB5dGhvblR5cGUpO1xuICAgIG1lbWJlci5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICAgIGNvZGUubGluZShcbiAgICAgIGByZXN1bHQgPSBzZWxmLl92YWx1ZXMuZ2V0KCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfSlgLFxuICAgICk7XG4gICAgaWYgKCFtZW1iZXIub3B0aW9uYWwpIHtcbiAgICAgIC8vIEFkZCBhbiBhc3NlcnRpb24gdG8gbWF5ZSBNeVBZIGhhcHB5IVxuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgYXNzZXJ0IHJlc3VsdCBpcyBub3QgTm9uZSwgXCJSZXF1aXJlZCBwcm9wZXJ0eSAnJHttZW1iZXIucHl0aG9uTmFtZX0nIGlzIG1pc3NpbmdcImAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoYHJldHVybiB0eXBpbmcuY2FzdCgke3B5dGhvblR5cGV9LCByZXN1bHQpYCk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNYWdpY01ldGhvZHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX2VxX18oc2VsZiwgcmhzOiB0eXBpbmcuQW55KSAtPiBidWlsdGlucy5ib29sJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgJ3JldHVybiBpc2luc3RhbmNlKHJocywgc2VsZi5fX2NsYXNzX18pIGFuZCByaHMuX3ZhbHVlcyA9PSBzZWxmLl92YWx1ZXMnLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fbmVfXyhzZWxmLCByaHM6IHR5cGluZy5BbnkpIC0+IGJ1aWx0aW5zLmJvb2wnKTtcbiAgICBjb2RlLmxpbmUoJ3JldHVybiBub3QgKHJocyA9PSBzZWxmKScpO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX3JlcHJfXyhzZWxmKSAtPiBzdHInKTtcbiAgICBjb2RlLmluZGVudChgcmV0dXJuIFwiJHt0aGlzLnB5dGhvbk5hbWV9KCVzKVwiICUgXCIsIFwiLmpvaW4oYCk7XG4gICAgY29kZS5saW5lKCdrICsgXCI9XCIgKyByZXByKHYpIGZvciBrLCB2IGluIHNlbGYuX3ZhbHVlcy5pdGVtcygpJyk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9wZXJ0eU1hcCgpIHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHRoaXMuYWxsTWVtYmVycykge1xuICAgICAgcmV0LnB1c2goXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX06ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbWVtYmVyLmpzaWlOYW1lLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbmNsYXNzIFN0cnVjdEZpZWxkIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBqc2lpTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jcz86IHNwZWMuRG9jcztcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHNwZWMuT3B0aW9uYWxWYWx1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuICAgIHRoaXMuanNpaU5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdGhpcy50eXBlID0gcHJvcDtcbiAgICB0aGlzLmRvY3MgPSBwcm9wLmRvY3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogdGhpcy5kZWZpbmluZ1R5cGUuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogdGhpcy5qc2lpTmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBvcHRpb25hbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGUub3B0aW9uYWw7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgaXNTdHJ1Y3QoZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNTdHJ1Y3QoZ2VuZXJhdG9yLnJlZmxlY3RBc3NlbWJseS5zeXN0ZW0sIHRoaXMudHlwZS50eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvckRlY2woY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBvcHQgPSB0aGlzLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG4gICAgcmV0dXJuIGAke3RoaXMucHl0aG9uTmFtZX06ICR7dGhpcy50eXBlQW5ub3RhdGlvbih7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICB9KX0ke29wdH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgUHl0aG9uIHR5cGUgYW5ub3RhdGlvbiBmb3IgdGhpcyB0eXBlXG4gICAqL1xuICBwdWJsaWMgdHlwZUFubm90YXRpb24oY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYHByb3AtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXNvbHZlZFR5cGUgPSB0aGlzLnR5cGVBbm5vdGF0aW9uKGNvbnRleHQpO1xuICAgIGNvZGUubGluZShgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3Jlc29sdmVkVHlwZX1gKTtcbiAgICB0aGlzLmVtaXREb2NTdHJpbmcoY29kZSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENsYXNzT3B0cyBleHRlbmRzIFB5dGhvblR5cGVPcHRzIHtcbiAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICBpbnRlcmZhY2VzPzogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2VbXTtcbiAgYWJzdHJhY3RCYXNlcz86IHNwZWMuQ2xhc3NUeXBlW107XG59XG5cbmNsYXNzIENsYXNzIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIElTb3J0YWJsZVR5cGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGFic3RyYWN0QmFzZXM6IHNwZWMuQ2xhc3NUeXBlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJmYWNlczogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2VbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHNwZWM6IHNwZWMuVHlwZSxcbiAgICBmcW46IHN0cmluZyxcbiAgICBvcHRzOiBDbGFzc09wdHMsXG4gICAgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBzdXBlcihnZW5lcmF0b3IsIG5hbWUsIHNwZWMsIGZxbiwgb3B0cywgZG9jcyk7XG5cbiAgICBjb25zdCB7IGFic3RyYWN0ID0gZmFsc2UsIGludGVyZmFjZXMgPSBbXSwgYWJzdHJhY3RCYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5hYnN0cmFjdCA9IGFic3RyYWN0O1xuICAgIHRoaXMuaW50ZXJmYWNlcyA9IGludGVyZmFjZXM7XG4gICAgdGhpcy5hYnN0cmFjdEJhc2VzID0gYWJzdHJhY3RCYXNlcztcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBQeXRob25UeXBlW10gPSBzdXBlci5kZXBlbmRzT24ocmVzb2x2ZXIpO1xuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudCh0aGlzLmZxbiEpO1xuXG4gICAgLy8gV2UgbmVlZCB0byByZXR1cm4gYW55IGlmYWNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIHRoaXMuaW50ZXJmYWNlcykge1xuICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoaWZhY2UpKSB7XG4gICAgICAgIC8vIEdpdmVuIGEgaWZhY2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBpZmFjZXMncyBwYXJlbnQgdGhhdCBpcyB0aGUgc2FtZVxuICAgICAgICAvLyBhcyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgIC8vIHNhbWUgbGV2ZWwgb2Ygb3VyIG93bi5cbiAgICAgICAgLy8gVE9ETzogV2UgbWlnaHQgbmVlZCB0byByZWN1cnNlIGludG8gb3VyIG1lbWJlcnMgdG8gYWxzbyBmaW5kIHRoZWlyXG4gICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgbGV0IGlmYWNlSXRlbSA9IHJlc29sdmVyLmdldFR5cGUoaWZhY2UpO1xuICAgICAgICBsZXQgaWZhY2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoaWZhY2UpO1xuICAgICAgICB3aGlsZSAoaWZhY2VQYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgICAgIGlmYWNlSXRlbSA9IGlmYWNlUGFyZW50O1xuICAgICAgICAgIGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlSXRlbS5mcW4hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2Vlbi5oYXMoaWZhY2VJdGVtLmZxbiEpKSB7XG4gICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goaWZhY2VJdGVtKTtcbiAgICAgICAgICBzZWVuLmFkZChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksIC8vIFRha2VzIGNhcmUgb2YgYmFzZSAmIG1lbWJlcnNcbiAgICAgIC4uLnRoaXMuaW50ZXJmYWNlcy5tYXAoKGJhc2UpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIC8vIEZpcnN0IHdlIGVtaXQgb3VyIGltcGxtZW50cyBkZWNvcmF0b3JcbiAgICBpZiAodGhpcy5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGludGVyZmFjZXM6IHN0cmluZ1tdID0gdGhpcy5pbnRlcmZhY2VzLm1hcCgoYikgPT5cbiAgICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICAgKTtcbiAgICAgIGNvZGUubGluZShgQGpzaWkuaW1wbGVtZW50cygke2ludGVyZmFjZXMuam9pbignLCAnKX0pYCk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiB3ZSBkbyBvdXIgbm9ybWFsIGNsYXNzIGxvZ2ljIGZvciBlbWl0dGluZyBvdXIgbWVtYmVycy5cbiAgICBzdXBlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuXG4gICAgLy8gVGhlbiwgaWYgb3VyIGNsYXNzIGlzIEFic3RyYWN0LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYW5kIHJlZG8gYWxsIG9mXG4gICAgLy8gdGhpcyBsb2dpYywgZXhjZXB0IG9ubHkgZW1pdGluZyBhYnN0cmFjdCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFzIG5vblxuICAgIC8vIGFic3RyYWN0LCBhbmQgc3ViY2xhc3Npbmcgb3VyIGluaXRpYWwgY2xhc3MuXG4gICAgaWYgKHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcblxuICAgICAgY29uc3QgcHJveHlCYXNlcyA9IFt0aGlzLnB5dGhvbk5hbWVdO1xuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHRoaXMuYWJzdHJhY3RCYXNlcykge1xuICAgICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgYmVjYXVzZSBNeVB5IGNhbm5vdCBjaGVjayBkeW5hbWljIGJhc2UgY2xhc3NlcyAobmF0dXJhbGx5KVxuICAgICAgICBwcm94eUJhc2VzLnB1c2goXG4gICAgICAgICAgYGpzaWkucHJveHlfZm9yKCR7dG9UeXBlTmFtZShiYXNlKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfSl9KSAjIHR5cGU6IGlnbm9yZVttaXNjXWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHJveHlDbGFzc05hbWUsIHByb3h5QmFzZXMpO1xuXG4gICAgICAvLyBGaWx0ZXIgb3VyIGxpc3Qgb2YgbWVtYmVycyB0byAqb25seSogYmUgYWJzdHJhY3QgbWVtYmVycywgYW5kIG5vdCBhbnlcbiAgICAgIC8vIG90aGVyIHR5cGVzLlxuICAgICAgY29uc3QgYWJzdHJhY3RNZW1iZXJzID0gdGhpcy5tZW1iZXJzLmZpbHRlcihcbiAgICAgICAgKG0pID0+XG4gICAgICAgICAgKG0gaW5zdGFuY2VvZiBCYXNlTWV0aG9kIHx8IG0gaW5zdGFuY2VvZiBCYXNlUHJvcGVydHkpICYmIG0uYWJzdHJhY3QsXG4gICAgICApO1xuICAgICAgaWYgKGFic3RyYWN0TWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGFic3RyYWN0TWVtYmVycykge1xuICAgICAgICAgIGlmICh0aGlzLnNlcGFyYXRlTWVtYmVycykge1xuICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyByZW5kZXJBYnN0cmFjdDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGFic3RyYWN0IGNsYXNzJyxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGB0eXBpbmcuY2FzdCh0eXBpbmcuQW55LCAke3RoaXMucHl0aG9uTmFtZX0pLl9fanNpaV9wcm94eV9jbGFzc19fID0gbGFtYmRhIDogJHt0aGlzLnByb3h5Q2xhc3NOYW1lfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgICBjb25zdCBtZXRhY2xhc3M6IHN0cmluZyA9IHRoaXMuYWJzdHJhY3QgPyAnSlNJSUFic3RyYWN0Q2xhc3MnIDogJ0pTSUlNZXRhJztcblxuICAgIHBhcmFtcy5wdXNoKGBtZXRhY2xhc3M9anNpaS4ke21ldGFjbGFzc31gKTtcbiAgICBwYXJhbXMucHVzaChganNpaV90eXBlPVwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3h5Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBfJHt0aGlzLnB5dGhvbk5hbWV9UHJveHlgO1xuICB9XG59XG5cbmNsYXNzIFN0YXRpY01ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yPzogc3RyaW5nID0gJ2J1aWx0aW5zLmNsYXNzbWV0aG9kJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdzaW52b2tlJztcbn1cblxuY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnY3JlYXRlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzQXNGaXJzdFBhcmFtZXRlcjogYm9vbGVhbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSByZXR1cm5Gcm9tSlNJSU1ldGhvZDogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbn1cblxuY2xhc3MgQXN5bmNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnYWludm9rZSc7XG59XG5cbmNsYXNzIFN0YXRpY1Byb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2pzaWkucHl0aG9uLmNsYXNzcHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdjbHMnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ3NnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NzZXQnO1xufVxuXG5jbGFzcyBQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdidWlsdGlucy5wcm9wZXJ0eSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ2dldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kOiBzdHJpbmcgPSAnc2V0Jztcbn1cblxuY2xhc3MgRW51bSBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzID0gZmFsc2U7XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnQGpzaWkuZW51bSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcbiAgICByZXR1cm4gc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhfY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZW51bS5FbnVtJ107XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxufVxuXG5jbGFzcyBFbnVtTWVtYmVyIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSBweXRob25OYW1lO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLnZhbHVlIH07XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uTW9kdWxlcygpIHtcbiAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIF9jb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvZGUubGluZShgJHt0aGlzLnB5dGhvbk5hbWV9ID0gXCIke3RoaXMudmFsdWV9XCJgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGVudW0tJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmludGVyZmFjZSBNb2R1bGVPcHRzIHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHk7XG4gIHJlYWRvbmx5IGFzc2VtYmx5RmlsZW5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9hZEFzc2VtYmx5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGFja2FnZT86IFBhY2thZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NzdHJpbmcgdG8gZW1pdCBhdCB0aGUgdG9wIG9mIHRoaXMgbW9kdWxlLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB5dGhvbiBtb2R1bGVcbiAqXG4gKiBXaWxsIGJlIGNhbGxlZCBmb3IganNpaSBzdWJtb2R1bGVzIGFuZCBuYW1lc3BhY2VzLlxuICovXG5jbGFzcyBQeXRob25Nb2R1bGUgaW1wbGVtZW50cyBQeXRob25UeXBlIHtcbiAgLyoqXG4gICAqIENvbnZlcnRlZCB0byBwdXQgb24gdGhlIG1vZHVsZVxuICAgKlxuICAgKiBUaGUgZm9ybWF0IGlzIGluIG1hcmtkb3duLCB3aXRoIGNvZGUgc2FtcGxlcyBjb252ZXJ0ZWQgZnJvbSBUUyB0byBQeXRob24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5RmlsZW5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkQXNzZW1ibHk6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtYmVycyA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBBcnJheTxQeXRob25Nb2R1bGU+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IE1vZHVsZU9wdHMsXG4gICkge1xuICAgIHRoaXMuYXNzZW1ibHkgPSBvcHRzLmFzc2VtYmx5O1xuICAgIHRoaXMuYXNzZW1ibHlGaWxlbmFtZSA9IG9wdHMuYXNzZW1ibHlGaWxlbmFtZTtcbiAgICB0aGlzLmxvYWRBc3NlbWJseSA9ICEhb3B0cy5sb2FkQXNzZW1ibHk7XG4gICAgdGhpcy5tb2R1bGVEb2N1bWVudGF0aW9uID0gb3B0cy5tb2R1bGVEb2N1bWVudGF0aW9uO1xuICB9XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpIHtcbiAgICB0aGlzLm1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGFkZFB5dGhvbk1vZHVsZShweU1vZDogUHl0aG9uTW9kdWxlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMubG9hZEFzc2VtYmx5LFxuICAgICAgJ1B5dGhvbk1vZHVsZS5hZGRQeXRob25Nb2R1bGUgQ0FOTk9UIGJlIGNhbGxlZCBvbiBhc3NlbWJseS1sb2FkaW5nIG1vZHVsZXMgKGl0IHdvdWxkIGNhdXNlIGEgbG9hZCBjeWNsZSkhJyxcbiAgICApO1xuXG4gICAgYXNzZXJ0KFxuICAgICAgcHlNb2QucHl0aG9uTmFtZS5zdGFydHNXaXRoKGAke3RoaXMucHl0aG9uTmFtZX0uYCksXG4gICAgICBgQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyICR7cHlNb2QucHl0aG9uTmFtZX0gYXMgYSBjaGlsZCBtb2R1bGUgb2YgJHt0aGlzLnB5dGhvbk5hbWV9LCBidXQgdGhlIG5hbWVzIGRvbid0IG1hdGNoIWAsXG4gICAgKTtcblxuICAgIGNvbnN0IFtmaXJzdExldmVsLCAuLi5yZXN0XSA9IHB5TW9kLnB5dGhvbk5hbWVcbiAgICAgIC5zdWJzdHJpbmcodGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEpXG4gICAgICAuc3BsaXQoJy4nKTtcbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgY2hpbGQgbW9kdWxlLi4uXG4gICAgICB0aGlzLm1vZHVsZXMucHVzaChweU1vZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBuZXN0ZWQgY2hpbGQgbW9kdWxlLCBzbyB3ZSBkZWxlZ2F0ZSB0byB0aGUgZGlyZWN0bHkgbmVzdGVkIG1vZHVsZS4uLlxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5tb2R1bGVzLmZpbmQoXG4gICAgICAgIChtKSA9PiBtLnB5dGhvbk5hbWUgPT09IGAke3RoaXMucHl0aG9uTmFtZX0uJHtmaXJzdExldmVsfWAsXG4gICAgICApO1xuICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgJHtweU1vZC5weXRob25OYW1lfSB3aXRoaW4gJHt0aGlzLnB5dGhvbk5hbWV9LCBidXQgJHt0aGlzLnB5dGhvbk5hbWV9LiR7Zmlyc3RMZXZlbH0gd2Fzbid0IHJlZ2lzdGVyZWQgeWV0IWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJlbnQuYWRkUHl0aG9uTW9kdWxlKHB5TW9kKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICB0aGlzLmVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmZxblxuICAgICAgPyBjb250ZXh0LnJlc29sdmVyLmJpbmQodGhpcy5mcW4sIHRoaXMucHl0aG9uTmFtZSlcbiAgICAgIDogY29udGV4dC5yZXNvbHZlcjtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHN1Ym1vZHVsZTogdGhpcy5mcW4gPz8gY29udGV4dC5zdWJtb2R1bGUsXG4gICAgICByZXNvbHZlcixcbiAgICB9O1xuXG4gICAgLy8gQmVmb3JlIHdlIHdyaXRlIGFueXRoaW5nIGVsc2UsIHdlIG5lZWQgdG8gd3JpdGUgb3V0IG91ciBtb2R1bGUgaGVhZGVycywgdGhpc1xuICAgIC8vIGlzIHdoZXJlIHdlIGhhbmRsZSBzdHVmZiBsaWtlIGltcG9ydHMsIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiwgZXRjLlxuICAgIGNvZGUubGluZSgnaW1wb3J0IGFiYycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGJ1aWx0aW5zJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZGF0ZXRpbWUnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBlbnVtJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHB1YmxpY2F0aW9uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nX2V4dGVuc2lvbnMnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIG91dCB0aGUga2VybmVsIGxvYWQgbGluZS5cbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIHRoaXMuZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGUpO1xuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGVtaXRMaXN0KFxuICAgICAgICBjb2RlLFxuICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgIFtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgJ19fbmFtZV9fWzA6LTZdJyxcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgIF0sXG4gICAgICAgICcpJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gd2UgbXVzdCBpbXBvcnQgdGhlIC5fanNpaSBzdWJwYWNrYWdlLlxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBsZXQgZGlzdGFuY2VGcm9tUm9vdCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZnFuITtcbiAgICAgICAgY3VyciAhPT0gdGhpcy5hc3NlbWJseS5uYW1lO1xuICAgICAgICBjdXJyID0gY3Vyci5zdWJzdHJpbmcoMCwgY3Vyci5sYXN0SW5kZXhPZignLicpKVxuICAgICAgKSB7XG4gICAgICAgIGRpc3RhbmNlRnJvbVJvb3QrKztcbiAgICAgIH1cbiAgICAgIGNvZGUubGluZShgZnJvbSAkeycuJy5yZXBlYXQoZGlzdGFuY2VGcm9tUm9vdCArIDEpfV9qc2lpIGltcG9ydCAqYCk7XG5cbiAgICAgIHRoaXMuZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGFsbCBvZiBvdXIgbWVtYmVycy5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIG5hbWVzIHdlJ3ZlIGV4cG9ydGVkLCB3ZSdsbCB3cml0ZSBvdXQgb3VyIF9fYWxsX18gdGhhdCBsaXN0cyB0aGVtLlxuICAgIC8vXG4gICAgLy8gX19hbGxfXyBpcyBub3JtYWxseSB1c2VkIGZvciB3aGVuIHVzZXJzIHdyaXRlIGBmcm9tIGxpYnJhcnkgaW1wb3J0ICpgLCBidXQgd2UgYWxzb1xuICAgIC8vIHVzZSBpdCB3aXRoIHRoZSBgcHVibGljYXRpb25gIG1vZHVsZSB0byBoaWRlIGV2ZXJ5dGhpbmcgdGhhdCdzIE5PVCBpbiB0aGUgbGlzdC5cbiAgICAvL1xuICAgIC8vIE5vcm1hbGx5IGFkZGluZyBzdWJtb2R1bGVzIHRvIGBfX2FsbF9fYCBoYXMgdGhlIChuZWdhdGl2ZT8pIHNpZGUtZWZmZWN0XG4gICAgLy8gdGhhdCBhbGwgc3VibW9kdWxlcyBnZXQgbG9hZGVkIHdoZW4gdGhlIHVzZXIgZG9lcyBgaW1wb3J0ICpgLCBidXQgd2VcbiAgICAvLyBhbHJlYWR5IGxvYWQgc3VibW9kdWxlcyBhbnl3YXkgc28gaXQgZG9lc24ndCBtYWtlIGEgZGlmZmVyZW5jZSwgYW5kIGluIGNvbWJpbmF0aW9uXG4gICAgLy8gd2l0aCB0aGUgYHB1YmxpY2F0aW9uYCBtb2R1bGUgTk9UIGhhdmluZyB0aGVtIGluIHRoaXMgbGlzdCBoaWRlcyBhbnkgc3VibW9kdWxlc1xuICAgIC8vIHdlIGltcG9ydCBhcyBwYXJ0IG9mIHR5cGVjaGVja2luZy5cbiAgICBjb25zdCBleHBvcnRlZE1lbWJlcnMgPSBbXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtKSA9PiBgXCIke20ucHl0aG9uTmFtZX1cImApLFxuICAgICAgLi4udGhpcy5tb2R1bGVzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IHRoaXMuaXNEaXJlY3RDaGlsZChtKSlcbiAgICAgICAgLm1hcCgobSkgPT4gYFwiJHtsYXN0Q29tcG9uZW50KG0ucHl0aG9uTmFtZSl9XCJgKSxcbiAgICBdO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgZXhwb3J0ZWRNZW1iZXJzLnB1c2goJ1wiX19qc2lpX2Fzc2VtYmx5X19cIicpO1xuICAgIH1cblxuICAgIC8vIERlY2xhcmUgdGhlIGxpc3Qgb2YgXCJwdWJsaWNcIiBtZW1iZXJzIHRoaXMgbW9kdWxlIGV4cG9ydHNcbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIGlmIChleHBvcnRlZE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5pbmRlbnQoJ19fYWxsX18gPSBbJyk7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBleHBvcnRlZE1lbWJlcnMuc29ydCgpKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgb25lIGJ5IGxpbmUgbWlnaHQgYmUgX2EgbG90XyBvZiBsaW5lcywgYnV0IGl0J2xsIG1ha2UgcmV2aWV3aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3QgZWFzaWVyLiBUcnVzdCBtZS5cbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlcn0sYCk7XG4gICAgICB9XG4gICAgICBjb2RlLnVuaW5kZW50KCddJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnX19hbGxfXzogdHlwaW5nLkxpc3RbdHlwaW5nLkFueV0gPSBbXScpO1xuICAgIH1cblxuICAgIC8vIE5leHQgdXAsIHdlJ2xsIHVzZSBwdWJsaWNhdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIG5vbi1wdWJsaWMgbmFtZXNcbiAgICAvLyBnZXQgaGlkZGVuIGZyb20gZGlyKCksIHRhYi1jb21wbGV0ZSwgZXRjLlxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgncHVibGljYXRpb24ucHVibGlzaCgpJyk7XG5cbiAgICAvLyBGaW5hbGx5LCB3ZSdsbCBsb2FkIGFsbCByZWdpc3RlcmVkIHB5dGhvbiBtb2R1bGVzXG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgTG9hZGluZyBtb2R1bGVzIHRvIGVuc3VyZSB0aGVpciB0eXBlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBqc2lpIHJ1bnRpbWUgbGlicmFyeScsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzLnNvcnQoKGwsIHIpID0+XG4gICAgICAgIGwucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKHIucHl0aG9uTmFtZSksXG4gICAgICApKSB7XG4gICAgICAgIC8vIFJhdGhlciB0aGFuIGdlbmVyYXRpbmcgYW4gYWJzb2x1dGUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJpbXBvcnQganNpaV9jYWxjLnN1Ym1vZHVsZVwiIHRoaXMgYnVpbGRzIGEgcmVsYXRpdmUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJmcm9tIC4gaW1wb3J0IHN1Ym1vZHVsZVwiLiBUaGlzIGVuYWJsZXMgZGlzdHJpYnV0aW5nIHB5dGhvbiBwYWNrYWdlc1xuICAgICAgICAvLyBhbmQgdXNpbmcgdGhlIGdlbmVyYXRlZCBtb2R1bGVzIGluIHRoZSBzYW1lIGNvZGViYXNlLlxuICAgICAgICBjb25zdCBzdWJtb2R1bGUgPSBtb2R1bGUucHl0aG9uTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgdGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEsXG4gICAgICAgICk7XG4gICAgICAgIGNvZGUubGluZShgZnJvbSAuIGltcG9ydCAke3N1Ym1vZHVsZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgYmluIHNjcmlwdHMgaWYgYmluIHNlY3Rpb24gZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBlbWl0QmluU2NyaXB0cyhjb2RlOiBDb2RlTWFrZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBpZiAodGhpcy5hc3NlbWJseS5iaW4gIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5iaW4pKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0X2ZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMucHl0aG9uTmFtZSksXG4gICAgICAgICAgICAnYmluJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJyMhL3Vzci9iaW4vZW52IHB5dGhvbicpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzeXMnKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucHl0aG9uTmFtZS5yZXBsYWNlKCcuX2pzaWknLCAnJykpLFxuICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fLmludm9rZUJpblNjcmlwdCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgICAgJ3N5cy5hcmd2WzE6XScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5jbG9zZUZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIHNjcmlwdHMucHVzaChzY3JpcHRfZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RpcmVjdENoaWxkKHB5TW9kOiBQeXRob25Nb2R1bGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnB5dGhvbk5hbWUgPT09IHB5TW9kLnB5dGhvbk5hbWUgfHxcbiAgICAgICFweU1vZC5weXRob25OYW1lLnN0YXJ0c1dpdGgoYCR7dGhpcy5weXRob25OYW1lfS5gKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBNdXN0IGluY2x1ZGUgb25seSBvbmUgbW9yZSBjb21wb25lbnRcbiAgICByZXR1cm4gIXB5TW9kLnB5dGhvbk5hbWVcbiAgICAgIC5zdWJzdHJpbmcodGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEpXG4gICAgICAuaW5jbHVkZXMoJy4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBSRUFETUUgYXMgbW9kdWxlIGRvY3N0cmluZyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBtb2R1bGUgKGl0IGxvYWRzIHRoZSBhc3NlbWJseSlcbiAgICovXG4gIHByaXZhdGUgZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZTogQ29kZU1ha2VyKSB7XG4gICAgaWYgKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbikge1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgICAgY29kZS5saW5lKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbik7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIChkaXJlY3QpIGRlcGVuZGVuY2llcycgLl9qc2lpIHBhY2thZ2VzLlxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgIC5tYXAoXG4gICAgICAgIChkZXApID0+XG4gICAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcF0/LnRhcmdldHM/LnB5dGhvbj8ubW9kdWxlID8/XG4gICAgICAgICAgZGllKGBObyBQeXRob24gdGFyZ2V0IHdhcyBjb25maWdydWVkIGZvciB0aGUgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiLmApLFxuICAgICAgKVxuICAgICAgLm1hcCgobW9kKSA9PiBgJHttb2R9Ll9qc2lpYClcbiAgICAgIC5zb3J0KCk7XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgd3JpdGUgdGhlIGltcG9ydCBzdGF0ZW1lbnRzLi4uXG4gICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgZGVwcykge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXF1aXJlZEltcG9ydHMgPSB0aGlzLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRJbXBvcnRzKVxuICAgICAgLm1hcCgoW3NvdXJjZVBhY2thZ2UsIGl0ZW1zXSkgPT4gdG9JbXBvcnRTdGF0ZW1lbnRzKHNvdXJjZVBhY2thZ2UsIGl0ZW1zKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGVsdCkgPT4gWy4uLmFjYywgLi4uZWx0XSxcbiAgICAgICAgbmV3IEFycmF5PHsgZW1pdDogKCkgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PigpLFxuICAgICAgKVxuICAgICAgLnNvcnQoaW1wb3J0Q29tcGFyYXRvcik7XG5cbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgc3RhdGVtZW50LmVtaXQoY29kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbXBvcnRTdGF0ZW1lbnRzKFxuICAgICAgc291cmNlUGtnOiBzdHJpbmcsXG4gICAgICBpdGVtczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgICApOiBBcnJheTx7IGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHtcbiAgICAgICAgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDtcbiAgICAgICAgY29tcGFyaXNvbkJhc2U6IHN0cmluZztcbiAgICAgIH0+KCk7XG4gICAgICBpZiAoaXRlbXMuaGFzKCcnKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBpbXBvcnQgJHtzb3VyY2VQa2d9YCxcbiAgICAgICAgICBlbWl0KGNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUubGluZSh0aGlzLmNvbXBhcmlzb25CYXNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBpZWNlTWVhbCA9IEFycmF5LmZyb20oaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgIT09ICcnKVxuICAgICAgICAuc29ydCgpO1xuICAgICAgaWYgKHBpZWNlTWVhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydGAsXG4gICAgICAgICAgZW1pdDogKGNvZGUpID0+XG4gICAgICAgICAgICBlbWl0TGlzdChjb2RlLCBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0IGAsIHBpZWNlTWVhbCwgJycsIHtcbiAgICAgICAgICAgICAgaWZNdWx0aTogWycoJywgJyknXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW1wb3J0Q29tcGFyYXRvcihcbiAgICAgIGxlZnQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICAgcmlnaHQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWZ0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpID09PVxuICAgICAgICByaWdodC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUocmlnaHQuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2FudCBcImZyb20gLmZvbyBpbXBvcnQgKC4uLilcIiB0byBiZSAqYWZ0ZXIqIFwiaW1wb3J0IGJhclwiXG4gICAgICByZXR1cm4gcmlnaHQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShsZWZ0LmNvbXBhcmlzb25CYXNlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VEYXRhIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob25Nb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG1vZHVsZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBQeXRob25Nb2R1bGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlRGF0YVtdPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZHVsZShtb2R1bGU6IFB5dGhvbk1vZHVsZSkge1xuICAgIHRoaXMubW9kdWxlcy5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIG1vZHVsZSk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSBhc3NlbWJseVxuICAgIGlmIChtb2R1bGUuZnFuID09PSB0aGlzLm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRGF0YShcbiAgICBtb2R1bGU6IFB5dGhvbk1vZHVsZSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzKG1vZHVsZS5weXRob25OYW1lKSkge1xuICAgICAgdGhpcy5kYXRhLnNldChtb2R1bGUucHl0aG9uTmFtZSwgW10pO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5nZXQobW9kdWxlLnB5dGhvbk5hbWUpIS5wdXNoKHsgZmlsZW5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5tb2R1bGVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoYi5weXRob25OYW1lKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBtb2R1bGVzLCBhbmQgd3JpdGUgdGhlbSBvdXQgdG8gZGlzay5cbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZC5weXRob25OYW1lKSxcbiAgICAgICAgJ19faW5pdF9fLnB5JyxcbiAgICAgICk7XG5cbiAgICAgIGNvZGUub3BlbkZpbGUoZmlsZW5hbWUpO1xuICAgICAgbW9kLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgICBjb2RlLmNsb3NlRmlsZShmaWxlbmFtZSk7XG5cbiAgICAgIHNjcmlwdHMucHVzaCguLi5tb2QuZW1pdEJpblNjcmlwdHMoY29kZSkpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdXIgcGFja2FnZSBkYXRhLlxuICAgIGNvbnN0IHBhY2thZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFttb2QsIHBkYXRhXSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBwZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kKSxcbiAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvZGUub3BlbkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICAgIGNvZGUubGluZShkYXRhLmRhdGEpO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWNrYWdlRGF0YVttb2RdID0gcGRhdGEubWFwKChwZCkgPT4gcGQuZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgb3VyIGxpc3Qgb2YgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgKSkge1xuICAgICAgY29uc3QgZGVwSW5mbyA9IHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jeUNsb3N1cmUhW2RlcE5hbWVdO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGAke2RlcEluZm8udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZX0ke3RvUHl0aG9uVmVyc2lvblJhbmdlKHZlcnNpb24pfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5lZWQgdG8gYWx3YXlzIHdyaXRlIHRoaXMgZmlsZSBhcyB0aGUgYnVpbGQgcHJvY2VzcyBkZXBlbmRzIG9uIGl0LlxuICAgIC8vIE1ha2UgdXAgc29tZSBjb250ZW50cyBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHVzZWZ1bCB0byBzYXkuXG4gICAgY29kZS5vcGVuRmlsZSgnUkVBRE1FLm1kJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgdGhpcy5yb290TW9kdWxlPy5tb2R1bGVEb2N1bWVudGF0aW9uID8/XG4gICAgICAgIGAke3RoaXMubmFtZX1cXG4keyc9Jy5yZXBlYXQodGhpcy5uYW1lLmxlbmd0aCl9YCxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdSRUFETUUubWQnKTtcblxuICAgIC8vIFN0cmlwIFwiIChidWlsZCBhYmNkZWYpXCIgZnJvbSB0aGUganNpaSB2ZXJzaW9uXG4gICAgY29uc3QganNpaVZlcnNpb25TaW1wbGUgPSB0aGlzLm1ldGFkYXRhLmpzaWlWZXJzaW9uLnJlcGxhY2UoLyAuKiQvLCAnJyk7XG5cbiAgICBjb25zdCBzZXR1cEt3YXJncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgbGljZW5zZTogdGhpcy5tZXRhZGF0YS5saWNlbnNlLFxuICAgICAgdXJsOiB0aGlzLm1ldGFkYXRhLmhvbWVwYWdlLFxuICAgICAgbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6ICd0ZXh0L21hcmtkb3duJyxcbiAgICAgIGF1dGhvcjpcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5hdXRob3IubmFtZSArXG4gICAgICAgICh0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgPCR7dGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWx9PmBcbiAgICAgICAgICA6ICcnKSxcbiAgICAgIGJkaXN0X3doZWVsOiB7XG4gICAgICAgIHVuaXZlcnNhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0X3VybHM6IHtcbiAgICAgICAgU291cmNlOiB0aGlzLm1ldGFkYXRhLnJlcG9zaXRvcnkudXJsLFxuICAgICAgfSxcbiAgICAgIHBhY2thZ2VfZGlyOiB7ICcnOiAnc3JjJyB9LFxuICAgICAgcGFja2FnZXM6IG1vZHVsZXMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICAgcGFja2FnZV9kYXRhOiBwYWNrYWdlRGF0YSxcbiAgICAgIHB5dGhvbl9yZXF1aXJlczogJ349My43JyxcbiAgICAgIGluc3RhbGxfcmVxdWlyZXM6IFtcbiAgICAgICAgYGpzaWkke3RvUHl0aG9uVmVyc2lvblJhbmdlKGBeJHtqc2lpVmVyc2lvblNpbXBsZX1gKX1gLFxuICAgICAgICAncHVibGljYXRpb24+PTAuMC4zJyxcbiAgICAgIF1cbiAgICAgICAgLmNvbmNhdChkZXBlbmRlbmNpZXMpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICBjbGFzc2lmaWVyczogW1xuICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsXG4gICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IEphdmFTY3JpcHQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjgnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4xMCcsXG4gICAgICAgICdUeXBpbmcgOjogVHlwZWQnLFxuICAgICAgXSxcbiAgICAgIHNjcmlwdHMsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5tZXRhZGF0YS5kb2NzPy5zdGFiaWxpdHkpIHtcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vICdEZXZlbG9wbWVudCBTdGF0dXMnIHRyb3ZlIGNsYXNzaWZpZXIgZm9yIHlvdSFcbiAgICB9XG5cbiAgICBpZiAoc3BkeExpY2Vuc2VMaXN0W3RoaXMubWV0YWRhdGEubGljZW5zZV0/Lm9zaUFwcHJvdmVkKSB7XG4gICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxDbGFzc2lmaWVycyA9IHRoaXMubWV0YWRhdGEudGFyZ2V0cz8ucHl0aG9uPy5jbGFzc2lmaWVycztcbiAgICBpZiAoYWRkaXRpb25hbENsYXNzaWZpZXJzICE9IG51bGwpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ2xhc3NpZmllcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBwcm92aWRlZCwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ2xhc3NpZmllcnMsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBXZSBkaXNjb3VyYWdlIHVzaW5nIHRob3NlIHNpbmNlIHdlIGF1dG9tYXRpY2FsbHkgc2V0IGEgdmFsdWUgZm9yIHRoZW1cbiAgICAgIGZvciAobGV0IGNsYXNzaWZpZXIgb2YgYWRkaXRpb25hbENsYXNzaWZpZXJzLnNvcnQoKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXNzaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBcImpzaWkudGFyZ2V0cy5weXRob24uY2xhc3NpZmllcnNcIiB2YWx1ZSBjYW4gb25seSBjb250YWluIHN0cmluZ3MsIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBjbGFzc2lmaWVyLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UnbGwgc3BsaXQgb24gYDo6YCBhbmQgcmUtam9pbiBsYXRlciBzbyBjbGFzc2lmaWVycyBhcmUgXCJub3JtYWxpemVkXCIgdG8gYSBzdGFuZGFyZCBzcGFjaW5nXG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2xhc3NpZmllci5zcGxpdCgnOjonKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRDbGFzc2lmaWVycyA9IFtcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzJyxcbiAgICAgICAgICAnTGljZW5zZScsXG4gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0nLFxuICAgICAgICAgICdUeXBpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVzZXJ2ZWRDbGFzc2lmaWVycy5pbmNsdWRlcyhwYXJ0c1swXSkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYENsYXNzaWZpZXJzIHN0YXJ0aW5nIHdpdGggJHtyZXNlcnZlZENsYXNzaWZpZXJzXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IGBcIiR7eH0gOjpcImApXG4gICAgICAgICAgICAgIC5qb2luKFxuICAgICAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgICAgICl9IGFyZSBhdXRvbWF0aWNhbGx5IHNldCBhbmQgc2hvdWxkIG5vdCBiZSBtYW51YWxseSBjb25maWd1cmVkYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzaWZpZXIgPSBwYXJ0cy5qb2luKCcgOjogJyk7XG4gICAgICAgIGlmIChzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5pbmNsdWRlcyhjbGFzc2lmaWVyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goY2xhc3NpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgTmVlZCBhIHNldHVwLnB5IHRvIG1ha2UgdGhpcyBQYWNrYWdlLCBhY3R1YWxseSBhIFBhY2thZ2UuXG4gICAgY29kZS5vcGVuRmlsZSgnc2V0dXAucHknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc29uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgc2V0dXB0b29scycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgna3dhcmdzID0ganNvbi5sb2FkcygnKTtcbiAgICBjb2RlLmxpbmUoJyAgICBcIlwiXCInKTtcbiAgICBjb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoc2V0dXBLd2FyZ3MsIG51bGwsIDQpKTtcbiAgICBjb2RlLmxpbmUoJ1wiXCJcIicpO1xuICAgIGNvZGUubGluZSgnKScpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCd3aXRoIG9wZW4oXCJSRUFETUUubWRcIiwgZW5jb2Rpbmc9XCJ1dGY4XCIpIGFzIGZwJyk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3NbXCJsb25nX2Rlc2NyaXB0aW9uXCJdID0gZnAucmVhZCgpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdzZXR1cHRvb2xzLnNldHVwKCoqa3dhcmdzKScpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdzZXR1cC5weScpO1xuXG4gICAgLy8gQmVjYXVzZSB3ZSdyZSBnb29kIGNpdGl6ZW5zLCB3ZSdyZSBnb2luZyB0byBnbyBhaGVhZCBhbmQgc3VwcG9ydCBweXByb2plY3QudG9tbFxuICAgIC8vIGFzIHdlbGwuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdXNlIGEgVE9NTCBsaWJyYXJ5IHRvIHdyaXRlIHRoaXMgb3V0LlxuICAgIGNvZGUub3BlbkZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG4gICAgY29kZS5saW5lKCdbYnVpbGQtc3lzdGVtXScpO1xuICAgIGNvbnN0IGJ1aWxkVG9vbHMgPSBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhyZXF1aXJlbWVudHNGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiAvXlxccyooLispXFxzKiNcXHMqYnVpbGQtc3lzdGVtXFxzKiQvLmV4ZWMobGluZSk/LlsxXT8udHJpbSgpKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGJ1aWxkVG9vbHMsIGVudHJ5KSA9PiAoZW50cnkgPyBbLi4uYnVpbGRUb29scywgZW50cnldIDogYnVpbGRUb29scyksXG4gICAgICAgIG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgICApO1xuICAgIGNvZGUubGluZShgcmVxdWlyZXMgPSBbJHtidWlsZFRvb2xzLm1hcCgoeCkgPT4gYFwiJHt4fVwiYCkuam9pbignLCAnKX1dYCk7XG4gICAgY29kZS5saW5lKCdidWlsZC1iYWNrZW5kID0gXCJzZXR1cHRvb2xzLmJ1aWxkX21ldGFcIicpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdweXByb2plY3QudG9tbCcpO1xuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdyaXRlIG91dCBhIE1BTklGRVNULmluIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgcmVxdWlyZWRcbiAgICAvLyBmaWxlcyBhcmUgaW5jbHVkZWQuXG4gICAgY29kZS5vcGVuRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgICBjb2RlLmxpbmUoJ2luY2x1ZGUgcHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgfVxufVxuXG50eXBlIEZpbmRNb2R1bGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb247XG50eXBlIEZpbmRUeXBlQ2FsbGJhY2sgPSAoZnFuOiBzdHJpbmcpID0+IHNwZWMuVHlwZTtcblxuY2xhc3MgVHlwZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRUbz86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFJlITogUmVnRXhwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT4sXG4gICAgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrLFxuICAgIGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrLFxuICAgIGJvdW5kVG8/OiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMuZmluZE1vZHVsZSA9IGZpbmRNb2R1bGU7XG4gICAgdGhpcy5maW5kVHlwZSA9IGZpbmRUeXBlO1xuICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7XG4gICAgdGhpcy5ib3VuZFRvID0gYm91bmRUbyAhPT0gdW5kZWZpbmVkID8gdGhpcy50b1B5dGhvbkZRTihib3VuZFRvKSA6IGJvdW5kVG87XG5cbiAgICBpZiAodGhpcy5tb2R1bGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubW9kdWxlUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLm1vZHVsZU5hbWUpfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYm91bmRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJvdW5kUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLmJvdW5kVG8pfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJpbmQoZnFuOiBzdHJpbmcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBUeXBlUmVzb2x2ZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIHRoaXMuZmluZE1vZHVsZSxcbiAgICAgIHRoaXMuZmluZFR5cGUsXG4gICAgICBmcW4sXG4gICAgICBtb2R1bGVOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgICAgID8gYCR7dGhpcy5tb2R1bGVOYW1lfSR7bW9kdWxlTmFtZX1gXG4gICAgICAgICAgOiBtb2R1bGVOYW1lXG4gICAgICAgIDogdGhpcy5tb2R1bGVOYW1lLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk1vZHVsZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLm1vZHVsZVJlLnRlc3QocHl0aG9uVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk5hbWVzcGFjZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLmJvdW5kUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJlbnQodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKC4rKVxcLlteLl0rJC8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBwYXJlbnRGUU5dID0gbWF0Y2hlcztcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnR5cGVzLmdldChwYXJlbnRGUU4pO1xuXG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhcmVudDogICR7cGFyZW50RlFOfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmaW5pbmdQeXRob25Nb2R1bGUoXG4gICAgdHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdHlwZVJlZi5mcW4gOiB0eXBlUmVmO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBsZXQgbW9kID0gcGFyZW50O1xuICAgICAgd2hpbGUgKCEobW9kIGluc3RhbmNlb2YgUHl0aG9uTW9kdWxlKSkge1xuICAgICAgICBtb2QgPSB0aGlzLmdldFBhcmVudChtb2QuZnFuISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbW9kLnB5dGhvbk5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKFteLl0rKVxcLi8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBhc3NtXSA9IG1hdGNoZXM7XG4gICAgcmV0dXJuIHRoaXMuZmluZE1vZHVsZShhc3NtKS50YXJnZXRzIS5weXRob24hLm1vZHVsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KHR5cGVSZWYuZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7dHlwZVJlZi5mcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZmVyZW5jZSh0eXBlUmVmOiBzdHJpbmcgfCBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSk6IHNwZWMuVHlwZSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgdHlwZVJlZiA9IHR5cGVSZWYuZnFuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5kVHlwZSh0eXBlUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QeXRob25GUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFthc3NlbWJseU5hbWUsIC4uLnF1YWxpZmllZElkZW50aWZpZXJzXSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGZxblBhcnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIHRoaXMuZmluZE1vZHVsZShhc3NlbWJseU5hbWUpLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcXVhbGlmaWVkSWRlbnRpZmllcnMpIHtcbiAgICAgIGZxblBhcnRzLnB1c2godG9QeXRob25JZGVudGlmaWVyKHBhcnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnFuUGFydHMuam9pbignLicpO1xuICB9XG59XG5cbmNsYXNzIFB5dGhvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIHByaXZhdGUgcGFja2FnZSE6IFBhY2thZ2U7XG4gIHByaXZhdGUgcm9vdE1vZHVsZT86IFB5dGhvbk1vZHVsZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgICBvcHRpb25zOiBHZW5lcmF0b3JPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9ja0Zvcm1hdHRlciA9IChzKSA9PiBgJHtzfTpgO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrRm9ybWF0dGVyID0gKF9zKSA9PiBmYWxzZTtcblxuICAgIHRoaXMudHlwZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhcmd1bWVudHM/OiBEb2N1bWVudGFibGVBcmd1bWVudFtdO1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbT86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nTmV3TGluZT86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBpZiAoKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkgJiYgIW9wdGlvbnMuYXJndW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZG9jcykge1xuICAgICAgZG9jcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgICAgIGJyaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBicmsoKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJsb2NrKGhlYWRpbmc6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBkb0JyayA9IHRydWUpIHtcbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnRMaW5lcyA9IG1kMnJzdChjb250ZW50KS5zcGxpdCgnXFxuJyk7XG4gICAgICBpZiAoY29udGVudExpbmVzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OiAke2NvbnRlbnRMaW5lcy5qb2luKCcnKX1gLnRyaW0oKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTpgKTtcbiAgICAgICAgYnJrKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50TGluZXMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgLi4ubWQycnN0KHRoaXMuY29udmVydE1hcmtkb3duKGRvY3MucmVtYXJrcyA/PyAnJywgYXBpTG9jYXRpb24pKS5zcGxpdChcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwID4gMCkge1xuICAgICAgYnJrKCk7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG9wdGlvbnMuYXJndW1lbnRzISkge1xuICAgICAgICAvLyBBZGQgYSBsaW5lIGZvciBldmVyeSBhcmd1bWVudC4gRXZlbiBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiwgd2UgbmVlZFxuICAgICAgICAvLyB0aGUgZG9jc3RyaW5nIHNvIHRoYXQgdGhlIFNwaGlueCBleHRlbnNpb24gY2FuIGFkZCB0aGUgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgOnBhcmFtICR7dG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUpfTogJHtvbmVsaW5lRGVzY3JpcHRpb24oXG4gICAgICAgICAgICBwYXJhbS5kb2NzLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIGJsb2NrKCdkZWZhdWx0JywgZG9jcy5kZWZhdWx0KTtcbiAgICB9XG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgYmxvY2soJ3JldHVybicsIGRvY3MucmV0dXJucyk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGJsb2NrKCdkZXByZWNhdGVkJywgZG9jcy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICBibG9jaygnc2VlJywgZG9jcy5zZWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3RhYmlsaXR5ICYmIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoZG9jcy5zdGFiaWxpdHkpKSB7XG4gICAgICBibG9jaygnc3RhYmlsaXR5JywgZG9jcy5zdGFiaWxpdHksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3ViY2xhc3NhYmxlKSB7XG4gICAgICBibG9jaygnc3ViY2xhc3NhYmxlJywgJ1llcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3MuY3VzdG9tID8/IHt9KSkge1xuICAgICAgYmxvY2soaywgdiwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmV4YW1wbGUpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaCgnRXhhbXBsZTo6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVUZXh0ID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvY2F0aW9uKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZUV4YW1wbGUoXG4gICAgICBhcGlMb2MsXG4gICAgICBleGFtcGxlLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIGFwaUxvYyxcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHl0aG9uVHlwZShmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzLmdldChmcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHtmcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihhc3NtOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMucGFja2FnZSA9IG5ldyBQYWNrYWdlKFxuICAgICAgYXNzbS50YXJnZXRzIS5weXRob24hLmRpc3ROYW1lLFxuICAgICAgdG9SZWxlYXNlVmVyc2lvbihhc3NtLnZlcnNpb24sIFRhcmdldE5hbWUuUFlUSE9OKSxcbiAgICAgIGFzc20sXG4gICAgKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlICc8cGFja2FnZW5hbWU+Ll9qc2lpJyBtb2R1bGUgZm9yIHRoaXMgYXNzZW1ibHlcbiAgICBjb25zdCBhc3NlbWJseU1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUoXG4gICAgICB0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgICBsb2FkQXNzZW1ibHk6IHRydWUsXG4gICAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUoYXNzZW1ibHlNb2R1bGUpO1xuICAgIHRoaXMucGFja2FnZS5hZGREYXRhKGFzc2VtYmx5TW9kdWxlLCB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMudHlwZXMsXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZE1vZHVsZShmcW4pLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRUeXBlKGZxbiksXG4gICAgKTtcbiAgICB0aGlzLnBhY2thZ2Uud3JpdGUodGhpcy5jb2RlLCB7XG4gICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgIGVtaXR0ZWRUeXBlczogbmV3IFNldCgpLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgICBzdWJtb2R1bGU6IGFzc20ubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGJlIGNhbGxlZCBmb3IgYXNzZW1ibHkgcm9vdCwgbmFtZXNwYWNlcyBhbmQgc3VibW9kdWxlcyAoYW55dGhpbmcgdGhhdCBjb250YWlucyBvdGhlciB0eXBlcywgYmFzZWQgb24gaXRzIEZRTilcbiAgICovXG4gIHByb3RlY3RlZCBvbkJlZ2luTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICAvLyAnbnMnIGNvbnRhaW5zIHNvbWV0aGluZyBsaWtlICdAc2NvcGUvanNpaS1jYWxjLWJhc2Utb2YtYmFzZSdcbiAgICBjb25zdCBzdWJtb2R1bGVMaWtlID1cbiAgICAgIG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWVcbiAgICAgICAgPyB0aGlzLmFzc2VtYmx5XG4gICAgICAgIDogdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuXG4gICAgY29uc3QgcmVhZG1lTG9jYXRpb246IEFwaUxvY2F0aW9uID0geyBhcGk6ICdtb2R1bGVSZWFkbWUnLCBtb2R1bGVGcW46IG5zIH07XG5cbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKHRvUGFja2FnZU5hbWUobnMsIHRoaXMuYXNzZW1ibHkpLCBucywge1xuICAgICAgYXNzZW1ibHk6IHRoaXMuYXNzZW1ibHksXG4gICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIG1vZHVsZURvY3VtZW50YXRpb246IHN1Ym1vZHVsZUxpa2U/LnJlYWRtZVxuICAgICAgICA/IHRoaXMuY29udmVydE1hcmtkb3duKFxuICAgICAgICAgICAgc3VibW9kdWxlTGlrZS5yZWFkbWU/Lm1hcmtkb3duLFxuICAgICAgICAgICAgcmVhZG1lTG9jYXRpb24sXG4gICAgICAgICAgKS50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKG1vZHVsZSk7XG4gICAgdGhpcy50eXBlcy5zZXQobnMsIG1vZHVsZSk7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIC8vIFRoaXMgYXBwbGllcyByZWN1cnNpdmVseSB0byBzdWJtb2R1bGVzLCBzbyBubyBuZWVkIHRvIGR1cGxpY2F0ZSFcbiAgICAgIHRoaXMucGFja2FnZS5hZGREYXRhKG1vZHVsZSwgJ3B5LnR5cGVkJywgJycpO1xuICAgIH1cblxuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSEuYWRkUHl0aG9uTW9kdWxlKG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdE1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2xhc3MgPSBuZXcgQ2xhc3MoXG4gICAgICB0aGlzLFxuICAgICAgdG9QeXRob25JZGVudGlmaWVyKGNscy5uYW1lKSxcbiAgICAgIGNscyxcbiAgICAgIGNscy5mcW4sXG4gICAgICB7XG4gICAgICAgIGFic3RyYWN0LFxuICAgICAgICBiYXNlczogY2xzLmJhc2UgPyBbdGhpcy5maW5kVHlwZShjbHMuYmFzZSldIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcmZhY2VzOiBjbHMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSxcbiAgICAgICAgYWJzdHJhY3RCYXNlczogYWJzdHJhY3QgPyB0aGlzLmdldEFic3RyYWN0QmFzZXMoY2xzKSA6IFtdLFxuICAgICAgfSxcbiAgICAgIGNscy5kb2NzLFxuICAgICk7XG5cbiAgICBpZiAoY2xzLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBjbHMuaW5pdGlhbGl6ZXI7XG5cbiAgICAgIGtsYXNzLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEluaXRpYWxpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ19faW5pdF9fJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY2xzLmluaXRpYWxpemVyLmRvY3MsXG4gICAgICAgICAgZmFsc2UsIC8vIE5ldmVyIHN0YXRpY1xuICAgICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKGNscy5pbml0aWFsaXplciksIHBhcmVudDogY2xzIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShrbGFzcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY01ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgdHJ1ZSwgLy8gQWx3YXlzIHN0YXRpY1xuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY1Byb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZC5hc3luYykge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEFzeW5jTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5vblByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGxldCBpZmFjZTogSW50ZXJmYWNlIHwgU3RydWN0O1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2UgPSBuZXcgU3RydWN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2UgPSBuZXcgSW50ZXJmYWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoaWZhY2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoaWZjLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEludGVyZmFjZU1ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICB7IGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLCBwYXJlbnQ6IGlmYyB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBsZXQgaWZhY2VQcm9wZXJ0eTogSW50ZXJmYWNlUHJvcGVydHkgfCBTdHJ1Y3RGaWVsZDtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIGlmYWNlUHJvcGVydHkgPSBuZXcgU3RydWN0RmllbGQodGhpcywgcHJvcCwgaWZjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBJbnRlcmZhY2VQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7IGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsIGlzU3RhdGljOiBwcm9wLnN0YXRpYywgcGFyZW50OiBpZmMgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihpZmFjZVByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoXG4gICAgICBuZXcgRW51bSh0aGlzLCB0b1B5dGhvbklkZW50aWZpZXIoZW5tLm5hbWUpLCBlbm0sIGVubS5mcW4sIHt9LCBlbm0uZG9jcyksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShlbm0uZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgRW51bU1lbWJlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKG1lbWJlci5uYW1lKSxcbiAgICAgICAgbWVtYmVyLm5hbWUsXG4gICAgICAgIG1lbWJlci5kb2NzLFxuICAgICAgICBlbm0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2RPdmVybG9hZChcbiAgICBfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBJbnRlcmZhY2VNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBTdGF0aWNNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Fzc20udGFyZ2V0cyEucHl0aG9uIS5tb2R1bGV9Ll9qc2lpYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50RlFOKGZxbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG5cbiAgICBpZiAobSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcGFyZW50IEZRTiBvZjogJHtmcW59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1bMV07XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmVudChmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIHJldHVybiB0aGlzLmdldFB5dGhvblR5cGUodGhpcy5nZXRQYXJlbnRGUU4oZnFuKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFB5dGhvblR5cGUodHlwZTogUHl0aG9uVHlwZSkge1xuICAgIGlmICh0eXBlLmZxbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgYSBQeXRob24gdHlwZSB3aXRob3V0IGEgRlFOLicpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UGFyZW50KHR5cGUuZnFuKS5hZGRNZW1iZXIodHlwZSk7XG4gICAgdGhpcy50eXBlcy5zZXQodHlwZS5mcW4sIHR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRsaWZ0ZWRQcm9wKFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QgfCBzcGVjLkluaXRpYWxpemVyLFxuICApOiBzcGVjLkludGVyZmFjZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIHRoZXJlIGFyZSBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kLCBhbmQgaWYgdGhlIGxhc3QgcGFyYW1ldGVyJ3MgdHlwZSBpc1xuICAgIC8vIGEgZGF0YXR5cGUgaW50ZXJmYWNlLCB0aGVuIHdlIHdhbnQgdG8gbGlmdCB0aGUgbWVtYmVycyBvZiB0aGF0IGxhc3QgcGFyYW10ZXJcbiAgICAvLyBhcyBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgIGlmIChtZXRob2QucGFyYW1ldGVycz8ubGVuZ3RoID8/IDAgPj0gMSkge1xuICAgICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IG1ldGhvZC5wYXJhbWV0ZXJzIS5zbGljZSgtMSlbMF07XG4gICAgICBpZiAoXG4gICAgICAgICFsYXN0UGFyYW1ldGVyLnZhcmlhZGljICYmXG4gICAgICAgIHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UobGFzdFBhcmFtZXRlci50eXBlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXJUeXBlID0gdGhpcy5maW5kVHlwZShsYXN0UGFyYW1ldGVyLnR5cGUuZnFuKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWMuaXNJbnRlcmZhY2VUeXBlKGxhc3RQYXJhbWV0ZXJUeXBlKSAmJlxuICAgICAgICAgIGxhc3RQYXJhbWV0ZXJUeXBlLmRhdGF0eXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBsYXN0UGFyYW1ldGVyVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEFic3RyYWN0QmFzZXMoY2xzOiBzcGVjLkNsYXNzVHlwZSk6IHNwZWMuQ2xhc3NUeXBlW10ge1xuICAgIGNvbnN0IGFic3RyYWN0QmFzZXM6IHNwZWMuQ2xhc3NUeXBlW10gPSBbXTtcblxuICAgIGlmIChjbHMuYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5maW5kVHlwZShjbHMuYmFzZSk7XG5cbiAgICAgIGlmICghc3BlYy5pc0NsYXNzVHlwZShiYXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbGFzcyBpbmhlcml0ZW5jZSB0aGF0IGlzbid0IGEgY2xhc3M/XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmFzZS5hYnN0cmFjdCkge1xuICAgICAgICBhYnN0cmFjdEJhc2VzLnB1c2goYmFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFic3RyYWN0QmFzZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3NpdGlvbmFsIGFyZ3VtZW50IG9yIGtleXdvcmQgcGFyYW1ldGVyXG4gKi9cbmludGVyZmFjZSBEb2N1bWVudGFibGVBcmd1bWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGU7XG4gIGRvY3M/OiBzcGVjLkRvY3M7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIGRvY3MsIHVzZWQgZm9yIG1ldGhvZCBhcmd1bWVudHMgYW5kIGlubGluZWQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBvbmVsaW5lRGVzY3JpcHRpb24oZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkKSB7XG4gIC8vIE9ubHkgY29uc2lkZXIgYSBzdWJzZXQgb2YgZmllbGRzIGhlcmUsIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgZm9ybWF0dGluZyBzcGFjZVxuICBpZiAoIWRvY3MgfHwgT2JqZWN0LmtleXMoZG9jcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gW107XG4gIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gIH1cbiAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgIHBhcnRzLnB1c2gobWQycnN0KGRvY3MucmVtYXJrcykpO1xuICB9XG4gIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICBwYXJ0cy5wdXNoKGBEZWZhdWx0OiAke21kMnJzdChkb2NzLmRlZmF1bHQpfWApO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KHM6IHNwZWMuU3RhYmlsaXR5KSB7XG4gIC8vIERvbid0IHJlbmRlciBcInN0YWJsZVwiIG9yIFwiZXh0ZXJuYWxcIiwgdGhvc2UgYXJlIGJvdGggc3RhYmxlIGJ5IGltcGxpY2F0aW9uLlxuICByZXR1cm4gcyA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fCBzID09PSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw7XG59XG5cbmZ1bmN0aW9uIGlzU3RydWN0KFxuICB0eXBlU3lzdGVtOiByZWZsZWN0LlR5cGVTeXN0ZW0sXG4gIHJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShyZWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlU3lzdGVtLnRyeUZpbmRGcW4ocmVmLmZxbik7XG4gIHJldHVybiAhISh0eXBlPy5pc0ludGVyZmFjZVR5cGUoKSAmJiB0eXBlPy5pc0RhdGFUeXBlKCkpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYF9gIGF0IHRoZSBlbmQgb2YgYG5hbWVgIHVudGlsIGl0IG5vIGxvbmdlciBjb25mbGljdHMgd2l0aCBhbnkgb2YgdGhlXG4gKiBlbnRyaWVzIGluIGBpblVzZWAuXG4gKlxuICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIHRvIGJlIHNsdWdpZmllZC5cbiAqIEBwYXJhbSBpblVzZSB0aGUgbmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBiZWluZyB1c2VkLlxuICpcbiAqIEByZXR1cm5zIHRoZSBzbHVnaWZpZWQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gc2x1Z2lmeUFzTmVlZGVkKG5hbWU6IHN0cmluZywgaW5Vc2U6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaW5Vc2VTZXQgPSBuZXcgU2V0KGluVXNlKTtcbiAgd2hpbGUgKGluVXNlU2V0LmhhcyhuYW1lKSkge1xuICAgIG5hbWUgPSBgJHtuYW1lfV9gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQkVIT0xEOiBIZWxwZXJzIHRvIG91dHB1dCBjb2RlIHRoYXQgbG9va3MgbGlrZSB3aGF0IEJsYWNrIHdvdWxkIGZvcm1hdCBpbnRvLi4uXG4vL1xuLy8gQHNlZSBodHRwczovL2JsYWNrLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS90aGVfYmxhY2tfY29kZV9zdHlsZS5odG1sXG5cbmNvbnN0IFRBUkdFVF9MSU5FX0xFTkdUSCA9IDg4O1xuXG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdkZWYnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nQ29tbWE6IGJvb2xlYW4sXG4gIHJldHVyblR5cGU6IHN0cmluZyxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycgfCAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hID0gZmFsc2UsXG4gIHJldHVyblR5cGU/OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7a2V5d29yZH0gJHtuYW1lfWA7XG4gIGNvbnN0IHN1ZmZpeCA9IHJldHVyblR5cGUgPyBgIC0+ICR7cmV0dXJuVHlwZX1gIDogJyc7XG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5vcGVuQmxvY2soYCR7cHJlZml4fSR7cmV0dXJuVHlwZSA/ICcoKScgOiAnJ30ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGNvbnN0IGhhc0NvbW1lbnRzID0gIXBhcmFtcy5zb21lKChwYXJhbSkgPT4gLyMgLiskLy5leGVjKHBhcmFtKSk7XG5cbiAgaWYgKFxuICAgIGhhc0NvbW1lbnRzICYmXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGggK1xuICAgICAgICAyXG4gICkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0oJHtwYXJhbXMuam9pbihqb2luKX0pJHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fShgKTtcbiAgaWYgKFxuICAgICFoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgICh0cmFpbGluZ0NvbW1hID8gMSA6IDApXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwYXJhbXMuam9pbihqb2luKX0ke3RyYWlsaW5nQ29tbWEgPyAnLCcgOiAnJ31gKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKHBhcmFtLnJlcGxhY2UoLyhcXHMqIyAuKyk/JC8sICcsJDEnKSk7XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoZmFsc2UpO1xuICBjb2RlLm9wZW5CbG9jayhgKSR7c3VmZml4fWApO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DYWxsUmVzdWx0KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGZ1bmN0OiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7dmFyaWFibGV9ID0gJHtmdW5jdH0oYDtcbiAgY29uc3Qgc3VmZml4ID0gJyknO1xuXG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtwYXJhbXMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBpZiAoVEFSR0VUX0xJTkVfTEVOR1RIID4gY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemUpIHtcbiAgICBjb2RlLmxpbmUocGFyYW1zLmpvaW4oam9pbikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cGFyYW19LGApO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkRpY3Rpb25hcnkoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgdmFyaWFibGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZz86IHN0cmluZyxcbiAgY29tcGFjdCA9IGZhbHNlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNwYWNlID0gY29tcGFjdCA/ICcnIDogJyAnO1xuXG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSR7c3BhY2V9PSR7c3BhY2V9e2A7XG4gIGNvbnN0IHN1ZmZpeCA9IGB9JHt0cmFpbGluZyA/PyAnJ31gO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjb21wYWN0KSB7XG4gICAgY29uc3Qgam9pbiA9ICcsICc7XG4gICAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gICAgaWYgKFxuICAgICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvZGUuaW5kZW50KHByZWZpeCk7XG4gIGZvciAoY29uc3QgZWx0IG9mIGVsZW1lbnRzKSB7XG4gICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBlbWl0TGlzdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWZmaXg6IHN0cmluZyxcbiAgb3B0cz86IHsgaWZNdWx0aTogW3N0cmluZywgc3RyaW5nXSB9LFxuKSB7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKGVsZW1lbnRzLCBqb2luKTtcbiAgaWYgKFxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgIGpvaW5TaXplICtcbiAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke2VsZW1lbnRzLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW2JlZm9yZSwgYWZ0ZXJdID0gb3B0cz8uaWZNdWx0aSA/PyBbJycsICcnXTtcblxuICBjb2RlLmluZGVudChgJHtwcmVmaXh9JHtiZWZvcmV9YCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb2RlLmxpbmUoZWxlbWVudHNbMF0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggKyBlbGVtZW50c1NpemUgKyBqb2luU2l6ZVxuICAgICkge1xuICAgICAgY29kZS5saW5lKGVsZW1lbnRzLmpvaW4oam9pbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgICAgICBjb2RlLmxpbmUoYCR7ZWx0fSxgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChgJHthZnRlcn0ke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gdG90YWxTaXplT2Yoc3RyaW5nczogcmVhZG9ubHkgc3RyaW5nW10sIGpvaW46IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzU2l6ZTogc3RyaW5nc1xuICAgICAgLm1hcCgoc3RyKSA9PiBzdHIubGVuZ3RoKVxuICAgICAgLnJlZHVjZSgoYWNjLCBlbHQpID0+IGFjYyArIGVsdCwgMCksXG4gICAgam9pblNpemU6IHN0cmluZ3MubGVuZ3RoID4gMSA/IGpvaW4ubGVuZ3RoICogKHN0cmluZ3MubGVuZ3RoIC0gMSkgOiAwLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXN0ZWRDb250ZXh0KFxuICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBFbWl0Q29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgLi4uY29udGV4dCxcbiAgICBzdXJyb3VuZGluZ1R5cGVGcW5zOlxuICAgICAgZnFuICE9IG51bGxcbiAgICAgICAgPyBbLi4uKGNvbnRleHQuc3Vycm91bmRpbmdUeXBlRnFucyA/PyBbXSksIGZxbl1cbiAgICAgICAgOiBjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMsXG4gIH07XG59XG5cbmNvbnN0IGlzRGVwcmVjYXRlZCA9ICh4OiBQeXRob25CYXNlKSA9PiB4LmRvY3M/LmRlcHJlY2F0ZWQgIT09IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBMYXN0IGNvbXBvbmVudCBvZiBhIC4tc2VwYXJhdGVkIG5hbWVcbiAqL1xuZnVuY3Rpb24gbGFzdENvbXBvbmVudChuOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBuLnNwbGl0KCcuJyk7XG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbn1cbiJdfQ==
|
|
2105
|
+
//# sourceMappingURL=python.js.map
|