semantifold 0.11.0 → 0.13.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/README.md +2 -1
- package/build/src/backends/c.d.ts +2 -1
- package/build/src/backends/c.d.ts.map +1 -1
- package/build/src/backends/c.js +26 -5
- package/build/src/backends/cpp.js +3 -1
- package/build/src/backends/effects.js +3 -2
- package/build/src/backends/java.js +33 -14
- package/build/src/backends/javascript.js +83 -18
- package/build/src/backends/ordered-expressions.d.ts +19 -7
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +46 -11
- package/build/src/backends/php.js +33 -14
- package/build/src/backends/ruby.js +37 -12
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +92 -37
- package/build/src/backends/typescript.js +83 -18
- package/build/src/frontends/c.d.ts +34 -1
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +128 -21
- package/build/src/frontends/java.d.ts +8 -0
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +77 -33
- package/build/src/frontends/javascript-typescript.d.ts +2 -0
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +118 -37
- package/build/src/frontends/php.d.ts +8 -0
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +68 -29
- package/build/src/frontends/ruby.d.ts +3 -0
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +103 -30
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +16 -1
- package/build/src/semantic/effects.d.ts.map +1 -1
- package/build/src/semantic/effects.js +18 -6
- package/build/src/semantic/lifetime.js +28 -4
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +26 -7
- package/build/src/semantic/types.d.ts +76 -16
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +23 -7
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +106 -35
- package/docs/adr/20261026-typed-error-handling-extension.md +55 -0
- package/docs/adr-numeric-tower.md +156 -0
- package/docs/architecture.md +1 -1
- package/docs/c.md +1 -1
- package/docs/language-support.md +10 -9
- package/docs/testing.md +8 -5
- package/package.json +1 -1
- package/src/backends/c.js +23 -4
- package/src/backends/cpp.js +1 -0
- package/src/backends/effects.js +2 -1
- package/src/backends/java.js +33 -14
- package/src/backends/javascript.js +83 -18
- package/src/backends/ordered-expressions.js +46 -10
- package/src/backends/php.js +33 -14
- package/src/backends/ruby.js +36 -12
- package/src/backends/shared.js +89 -42
- package/src/backends/typescript.js +83 -18
- package/src/frontends/c.js +135 -19
- package/src/frontends/java.js +82 -33
- package/src/frontends/javascript-typescript.js +130 -38
- package/src/frontends/php.js +68 -27
- package/src/frontends/ruby.js +107 -28
- package/src/language-registry.js +15 -0
- package/src/semantic/effects.js +17 -5
- package/src/semantic/lifetime.js +29 -3
- package/src/semantic/provenance.js +27 -12
- package/src/semantic/types.js +24 -6
- package/src/semantic/validate.js +105 -36
|
@@ -373,9 +373,17 @@ function escapingBlockFailures(block, functionSummaries, methodSummaries, capabi
|
|
|
373
373
|
const result = new Set();
|
|
374
374
|
for (const statement of block.statements) {
|
|
375
375
|
if (statement.kind == "TryStatement") {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
376
|
+
let body = escapingBlockFailures(statement.body, functionSummaries, methodSummaries, capabilityFailureIds);
|
|
377
|
+
for (const handler of statement.handlers ?? []) {
|
|
378
|
+
const caughtId = handler.catchType?.declarationId;
|
|
379
|
+
if (typeof caughtId == "string" && body.delete(caughtId)) {
|
|
380
|
+
addFailures(body, escapingBlockFailures(handler.catchBody, functionSummaries, methodSummaries, capabilityFailureIds));
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (statement.finallyBody) {
|
|
384
|
+
// A completion block that can raise replaces the pending completion on the paths where it does,
|
|
385
|
+
// but pending failures still escape on the paths where it completes normally, so both are reachable.
|
|
386
|
+
addFailures(body, escapingBlockFailures(statement.finallyBody, functionSummaries, methodSummaries, capabilityFailureIds));
|
|
379
387
|
}
|
|
380
388
|
addFailures(result, body);
|
|
381
389
|
continue;
|
|
@@ -650,7 +658,10 @@ function forEachBlockExpression(block, visitor, postorder) {
|
|
|
650
658
|
visit(statement.error.message);
|
|
651
659
|
else if (statement.kind == "TryStatement") {
|
|
652
660
|
forEachBlockExpression(statement.body, visitor, postorder);
|
|
653
|
-
|
|
661
|
+
for (const handler of statement.handlers)
|
|
662
|
+
forEachBlockExpression(handler.catchBody, visitor, postorder);
|
|
663
|
+
if (statement.finallyBody)
|
|
664
|
+
forEachBlockExpression(statement.finallyBody, visitor, postorder);
|
|
654
665
|
}
|
|
655
666
|
}
|
|
656
667
|
/**
|
|
@@ -705,7 +716,8 @@ function statementReferencesProtectedEntry(statement) {
|
|
|
705
716
|
case "RaiseStatement":
|
|
706
717
|
return expressionReferencesProtectedEntry(statement.error.message);
|
|
707
718
|
case "TryStatement":
|
|
708
|
-
return blockReferencesProtectedEntry(statement.body) || blockReferencesProtectedEntry(
|
|
719
|
+
return blockReferencesProtectedEntry(statement.body) || statement.handlers.some((handler) => blockReferencesProtectedEntry(handler.catchBody)) ||
|
|
720
|
+
(statement.finallyBody ? blockReferencesProtectedEntry(statement.finallyBody) : false);
|
|
709
721
|
default:
|
|
710
722
|
return false;
|
|
711
723
|
}
|
|
@@ -763,4 +775,4 @@ function expressionChildren(expression) {
|
|
|
763
775
|
return [expression.receiver];
|
|
764
776
|
return [];
|
|
765
777
|
}
|
|
766
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZW1hbnRpYy9lZmZlY3RzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFbkQsd0VBQXdFO0FBQ3hFLHlGQUF5RjtBQUV6Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzFHLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFBO0lBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDNUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUVoQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFBRSxJQUFJLENBQUMsOEJBQThCLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pJLEtBQUssTUFBTSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxjQUFjLGVBQWUsRUFBRSxDQUFBO1FBRWhELElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLElBQUks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Q0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlGLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxxQkFBcUI7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDNUYsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLDBCQUEwQjtRQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDakYsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFlBQVk7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pFLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0I7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZFLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0I7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZFLE9BQU8sRUFBRSxDQUFBO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2F1dGhvcml6ZWRPcGVyYXRpb24sIGlzVGFzazAzNE9wZXJhdGlvbk5hbWV9IGZyb20gXCIuL2NhcGFiaWxpdGllcy5qc1wiXG5pbXBvcnQge3BhcnNlUHJvdGVjdGVkRW50cnlOYW1lfSBmcm9tIFwiLi9zdGRsaWIuanNcIlxuXG4vKiogQHR5cGVkZWYge3tmYWlsdXJlSWRzOiBTZXQ8c3RyaW5nPiwgaG9zdDogYm9vbGVhbn19IEVmZmVjdFN1bW1hcnkgKi9cbi8qKiBAdHlwZWRlZiB7KGV4cHJlc3Npb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbikgPT4gdm9pZH0gRXhwcmVzc2lvblZpc2l0b3IgKi9cblxuLyoqXG4gKiBSZXNvbHZlcyBjb21waWxlci1hdXRob3JpemVkIGNhbGxzIGJlZm9yZSBvcmRpbmFyeSBzZW1hbnRpYyB0eXBlIHZhbGlkYXRpb24uXG4gKiBTb3VyY2UgZnVuY3Rpb25zIGFsd2F5cyB3aW47IGF1dGhvcml0eSBpcyBuZXZlciBpbmZlcnJlZCBmcm9tIHNwZWxsaW5nIGFsb25lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBQYXJzZXItYXV0aG9yZWQgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gU291cmNlIGxhbmd1YWdlIGlkZW50aXR5IGZvciBwcm90ZWN0ZWQgZW50cnkgdGFyZ2V0cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gVmlzaWJsZSBvcmRpbmFyeSBmdW5jdGlvbnMuXG4gKiBAcGFyYW0geyhjb2RlOiBzdHJpbmcsIGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZSAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIG9wZXJhdGlvbiBpbnRlbnQgbWF5IGJlIG5vcm1hbGl6ZWQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IFt2aXNpYmxlQ2xhc3Nlc10gLSBSZXNvbHZlZCByZWZlcmVuY2UgY2xhc3Nlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVFZmZlY3RHcmFwaChtb2R1bGUsIGxhbmd1YWdlLCBmdW5jdGlvbnMsIGZhaWwsIG5vcm1hbGl6ZSwgdmlzaWJsZUNsYXNzZXMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXVxuICBjb25zdCBjYXBhYmlsaXR5SWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IG9wZXJhdGlvbklkcyA9IG5ldyBTZXQoKVxuICBjb25zdCByZXNvdXJjZUlkcyA9IG5ldyBTZXQoKVxuICBjb25zdCBmYWlsdXJlSWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IFNldCgpXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIGZhaWwoXCJJTlZBTElEX0NBUEFCSUxJVFlfQVVUSE9SSVRZXCIsIFwiQ2FwYWJpbGl0aWVzIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgbW9kdWxlLmxvY2F0aW9uKVxuICBmb3IgKGNvbnN0IFtjYXBhYmlsaXR5SW5kZXgsIGNhcGFiaWxpdHldIG9mIGNhcGFiaWxpdGllcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBsZWdhY3lJZCA9IGBjYXBhYmlsaXR5OiR7Y2FwYWJpbGl0eUluZGV4fWBcblxuICAgIGlmICghY2FwYWJpbGl0eSB8fCBjYXBhYmlsaXR5LmtpbmQgIT0gXCJFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25cIiB8fFxuICAgICAgY2FwYWJpbGl0eS5pZCAhPSBsZWdhY3lJZCAmJiAhL15tb2R1bGU6XFxkK1xcL2NhcGFiaWxpdHk6XFxkKyQvdS50ZXN0KGNhcGFiaWxpdHkuaWQpIHx8IGNhcGFiaWxpdHlJZHMuaGFzKGNhcGFiaWxpdHkuaWQpIHx8XG4gICAgICB0eXBlb2YgY2FwYWJpbGl0eS5hdXRob3JpdHlJZCAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBjYXBhYmlsaXR5Lm5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhQXJyYXkuaXNBcnJheShjYXBhYmlsaXR5LnJlc291cmNlcykgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkuZmFpbHVyZXMpIHx8ICFBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkub3BlcmF0aW9ucykpIHtcbiAgICAgIGZhaWwoXCJJTlZBTElEX0NBUEFCSUxJVFlfQVVUSE9SSVRZXCIsIFwiTWFsZm9ybWVkIGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gZ3JhcGguXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgY2FwYWJpbGl0eUlkcy5hZGQoY2FwYWJpbGl0eS5pZClcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb3VyY2VdIG9mIGNhcGFiaWxpdHkucmVzb3VyY2VzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHJlc291cmNlLmtpbmQgIT0gXCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCIgfHwgcmVzb3VyY2UuaWQgIT0gYCR7Y2FwYWJpbGl0eS5pZH0vcmVzb3VyY2U6JHtpbmRleH1gIHx8XG4gICAgICAgIHJlc291cmNlSWRzLmhhcyhyZXNvdXJjZS5pZCkpIGZhaWwoXCJJTlZBTElEX0NBUEFCSUxJVFlfQVVUSE9SSVRZXCIsIFwiTWFsZm9ybWVkIGNhcGFiaWxpdHkgcmVzb3VyY2UgaWRlbnRpdHkuXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIHJlc291cmNlSWRzLmFkZChyZXNvdXJjZS5pZClcbiAgICB9XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGZhaWx1cmVdIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZmFpbHVyZS5raW5kICE9IFwiRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uXCIgfHwgZmFpbHVyZS5pZCAhPSBgJHtjYXBhYmlsaXR5LmlkfS9mYWlsdXJlOiR7aW5kZXh9YCB8fFxuICAgICAgICBmYWlsdXJlSWRzLmhhcyhmYWlsdXJlLmlkKSkgZmFpbChcIklOVkFMSURfQ0FQQUJJTElUWV9BVVRIT1JJVFlcIiwgXCJNYWxmb3JtZWQgY2FwYWJpbGl0eSBmYWlsdXJlIGlkZW50aXR5LlwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICBmYWlsdXJlSWRzLmFkZChmYWlsdXJlLmlkKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2FwYWJpbGl0aWVzKSB7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIG9wZXJhdGlvbl0gb2YgY2FwYWJpbGl0eS5vcGVyYXRpb25zLmVudHJpZXMoKSkge1xuICAgICAgaWYgKG9wZXJhdGlvbi5raW5kICE9IFwiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIiB8fCBvcGVyYXRpb24uaWQgIT0gYCR7Y2FwYWJpbGl0eS5pZH0vb3BlcmF0aW9uOiR7aW5kZXh9YCB8fFxuICAgICAgICBvcGVyYXRpb25JZHMuaGFzKG9wZXJhdGlvbi5pZCkgfHwgb3BlcmF0aW9uTmFtZXMuaGFzKG9wZXJhdGlvbi5uYW1lKSB8fCAhQXJyYXkuaXNBcnJheShvcGVyYXRpb24ucGFyYW1ldGVycykgfHxcbiAgICAgICAgIUFycmF5LmlzQXJyYXkob3BlcmF0aW9uLmZhaWx1cmVJZHMpIHx8IG9wZXJhdGlvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBvcGVyYXRpb24uZWZmZWN0c1swXSAhPSBcImhvc3RcIiB8fFxuICAgICAgICBvcGVyYXRpb24uZmFpbHVyZUlkcy5zb21lKChpZCkgPT4gIWZhaWx1cmVJZHMuaGFzKGlkKSkpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfQ0FQQUJJTElUWV9BVVRIT1JJVFlcIiwgXCJNYWxmb3JtZWQgb3IgYW1iaWd1b3VzIGNhcGFiaWxpdHkgb3BlcmF0aW9uIGdyYXBoLlwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBvcGVyYXRpb25JZHMuYWRkKG9wZXJhdGlvbi5pZClcbiAgICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb24ubmFtZSlcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFtcbiAgICAuLi5tb2R1bGUuZnVuY3Rpb25zLFxuICAgIC4uLihtb2R1bGUucmVjb3JkcyA/PyBbXSksXG4gICAgLi4uKG1vZHVsZS5jbGFzc2VzID8/IFtdKSxcbiAgICAuLi4obW9kdWxlLmVycm9ycyA/PyBbXSlcbiAgXSkge1xuICAgIGlmIChwYXJzZVByb3RlY3RlZEVudHJ5TmFtZShkZWNsYXJhdGlvbi5uYW1lKSAhPT0gbnVsbCkge1xuICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgYFNvdXJjZSBkZWNsYXJhdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScgY2FwdHVyZXMgYSByZXNlcnZlZCBwcm90ZWN0ZWQgcHJvdmlkZXIgYmluZGluZy5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoRXhwcmVzc2lvbihtb2R1bGUsIChleHByZXNzaW9uKSA9PiB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZmluZCgoe2lkfSkgPT4gaWQgPT0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5jYXBhYmlsaXR5SWQpXG4gICAgICBjb25zdCBvcGVyYXRpb24gPSBjYXBhYmlsaXR5Py5vcGVyYXRpb25zLmZpbmQoKHtpZH0pID0+IGlkID09IGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAob3BlcmF0aW9uICYmIGV4cHJlc3Npb24ucmVzb2x1dGlvbi5vcGVyYXRpb25JZCA9PSBvcGVyYXRpb24uaWQgJiZcbiAgICAgICAgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24ucmVzb2x1dGlvbi5mYWlsdXJlSWRzKSB8fFxuICAgICAgICAgIGV4cHJlc3Npb24ucmVzb2x1dGlvbi5mYWlsdXJlSWRzLmpvaW4oXCIsXCIpICE9IG9wZXJhdGlvbi5mYWlsdXJlSWRzLmpvaW4oXCIsXCIpKSkge1xuICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9GQUlMVVJFXCIsIFwiVU5ERUNMQVJFRF9GQUlMVVJFOiBFZmZlY3QgY2FsbCBmYWlsdXJlIGJvdW5kYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyBjb21waWxlciBhdXRob3JpdHkuXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghb3BlcmF0aW9uIHx8IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5vcGVyYXRpb25JZCAhPSBvcGVyYXRpb24uaWQgfHxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXhwcmVzc2lvbi5yZXNvbHV0aW9uKSAhPSBKU09OLnN0cmluZ2lmeShzaWduYXR1cmUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbn0gKi8gKGNhcGFiaWxpdHkpLCBvcGVyYXRpb24pKSkge1xuICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9FRkZFQ1RcIiwgXCJFZmZlY3QgY2FsbCByZXNvbHV0aW9uIGRvZXMgbm90IG1hdGNoIGl0cyBjb21waWxlciBhdXRob3JpdHkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIgJiYgcGFyc2VQcm90ZWN0ZWRFbnRyeU5hbWUoZXhwcmVzc2lvbi5uYW1lKSAhPT0gbnVsbCkge1xuICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgYFJlZmVyZW5jZSB0byBwcm90ZWN0ZWQgcHJvdmlkZXIgZW50cnkgJyR7ZXhwcmVzc2lvbi5uYW1lfScgaXMgbm90IHBvcnRhYmxlIGNvZGUuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIkNhbGxFeHByZXNzaW9uXCIpIHJldHVyblxuICAgIGlmIChmdW5jdGlvbnMuaGFzKGV4cHJlc3Npb24uY2FsbGVlKSkgcmV0dXJuXG4gICAgbGV0IG9wZXJhdGlvbk5hbWUgPSBleHByZXNzaW9uLmNhbGxlZVxuICAgIGNvbnN0IHByb3RlY3RlZEVudHJ5ID0gcGFyc2VQcm90ZWN0ZWRFbnRyeU5hbWUoZXhwcmVzc2lvbi5jYWxsZWUpXG5cbiAgICBpZiAocHJvdGVjdGVkRW50cnkgIT09IG51bGwpIHtcbiAgICAgIGlmIChjYXBhYmlsaXRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgICBgUHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5ICcke2V4cHJlc3Npb24uY2FsbGVlfScgcmVxdWlyZXMgYW4gZXhwbGljaXQgY2FwYWJpbGl0eSBhdXRob3JpdHkuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChwcm90ZWN0ZWRFbnRyeS50YXJnZXQgIT0gbGFuZ3VhZ2UpIHtcbiAgICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgICBgUHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5IHRhcmdldCAnJHtwcm90ZWN0ZWRFbnRyeS50YXJnZXR9JyBkb2VzIG5vdCBtYXRjaCBzb3VyY2UgbGFuZ3VhZ2UgJyR7bGFuZ3VhZ2V9Jy5gLFxuICAgICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBvcGVyYXRpb25OYW1lID0gcHJvdGVjdGVkRW50cnkub3BlcmF0aW9uXG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gYXV0aG9yaXplZE9wZXJhdGlvbihjYXBhYmlsaXRpZXMsIG9wZXJhdGlvbk5hbWUpXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBpZiAocHJvdGVjdGVkRW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgICBgUHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5IGZvciB1bmRlY2xhcmVkIG9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgaGFzIG5vIGF1dGhvcml6ZWQgY2FwYWJpbGl0eSBvcGVyYXRpb24uYCxcbiAgICAgICAgICBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGlzVGFzazAzNE9wZXJhdGlvbk5hbWUob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgZmFpbChcIk1JU1NJTkdfQ0FQQUJJTElUWV9BVVRIT1JJVFlcIiwgYE9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgcmVxdWlyZXMgZXhwbGljaXQgY29tcGlsZXIgYXV0aG9yaXR5LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFub3JtYWxpemUpIHtcbiAgICAgIGZhaWwoXCJVTkRFQ0xBUkVEX0VGRkVDVFwiLCBgQ2FsbGVyLWF1dGhvcmVkIG9yZGluYXJ5IGNhbGwgJyR7ZXhwcmVzc2lvbi5jYWxsZWV9JyBjYW5ub3QgZm9yZ2UgYSBjYXBhYmlsaXR5IG9wZXJhdGlvbi5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCB7Y2FwYWJpbGl0eSwgb3BlcmF0aW9ufSA9IG1hdGNoXG4gICAgY29uc3QgZmxvdyA9IG9wZXJhdGlvbi5yZXNvdXJjZUZsb3dcblxuICAgIGlmICgoZmxvdy5raW5kID09IFwiYm9ycm93XCIgfHwgZmxvdy5raW5kID09IFwiY2xvc2VcIikgJiYgZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF0pIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF1cbiAgICAgIGlmIChhcmd1bWVudC5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiAmJiBhcmd1bWVudC5raW5kICE9IFwiUHJpdmF0ZUZpZWxkUmVhZFwiICYmIGFyZ3VtZW50LmtpbmQgIT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIikge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgXCJBbiBvd25lZCBib3Jyb3cgbXVzdCBuYW1lIG9uZSBpbW1lZGlhdGUgcmVzb3VyY2UgcGxhY2UuXCIsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF0gPSB7XG4gICAgICAgIGV4cHJlc3Npb246IGFyZ3VtZW50LFxuICAgICAgICBraW5kOiBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiLFxuICAgICAgICBsb2NhdGlvbjogYXJndW1lbnQubG9jYXRpb24sXG4gICAgICAgIG1vZGU6IGZsb3cua2luZCA9PSBcImNsb3NlXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIixcbiAgICAgICAgc291cmNlUHJvdmVuYW5jZTogYXJndW1lbnQuc291cmNlUHJvdmVuYW5jZSxcbiAgICAgICAgdHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Pd25lZFJlZmVyZW5jZVR5cGV9ICovIChcbiAgICAgICAgICBvcGVyYXRpb24ucGFyYW1ldGVyc1tmbG93LnBhcmFtZXRlckluZGV4XS50eXBlXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FsbEV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChleHByZXNzaW9uKSlcbiAgICBkZWxldGUgLyoqIEB0eXBlIHt7Y2FsbGVlPzogc3RyaW5nfX0gKi8gKHJlcGxhY2VtZW50KS5jYWxsZWVcbiAgICByZXBsYWNlbWVudC5raW5kID0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiXG4gICAgcmVwbGFjZW1lbnQub3BlcmF0aW9uID0gb3BlcmF0aW9uLmlkXG4gICAgcmVwbGFjZW1lbnQucmVzb2x1dGlvbiA9IHNpZ25hdHVyZShjYXBhYmlsaXR5LCBvcGVyYXRpb24pXG4gIH0pXG5cbiAgY29uc3QgY29tcGxldGUgPSBjb21wbGV0ZUVmZmVjdFN1bW1hcmllcyhtb2R1bGUsIGZhaWx1cmVJZHMsIHZpc2libGVDbGFzc2VzKVxuICBjb25zdCBzdW1tYXJpZXMgPSBjb21wbGV0ZS5mdW5jdGlvbnNcbiAgY29uc3QgbWV0aG9kU3VtbWFyaWVzID0gY29tcGxldGUubWV0aG9kc1xuICBjb25zdCBjb25zdHJ1Y3RvclN1bW1hcmllcyA9IGNvbXBsZXRlLmNvbnN0cnVjdG9yc1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICBhcHBseURlY2xhcmF0aW9uU3VtbWFyeShkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvcixcbiAgICAgIGNvbnN0cnVjdG9yU3VtbWFyaWVzLmdldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkKSksIG5vcm1hbGl6ZSwgZmFpbClcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSB7XG4gICAgICBhcHBseURlY2xhcmF0aW9uU3VtbWFyeShtZXRob2QsIG1ldGhvZFN1bW1hcmllcy5nZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZXRob2QuaWQpKSwgbm9ybWFsaXplLCBmYWlsKVxuICAgIH1cbiAgfVxuICBsZXQgc2l0ZSA9IDBcblxuICBmb3JFYWNoRXhwcmVzc2lvbihtb2R1bGUsIChleHByZXNzaW9uKSA9PiB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGlmIChub3JtYWxpemUpIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkID0gYGVmZmVjdDoke3NpdGV9YFxuICAgICAgZWxzZSB2YWxpZGF0ZVNpdGUoZXhwcmVzc2lvbiwgc2l0ZSwgZmFpbClcbiAgICAgIHNpdGUgKz0gMVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gc3VtbWFyaWVzLmdldChleHByZXNzaW9uLmNhbGxlZSlcbiAgICAgIGlmICghc3VtbWFyeT8uaG9zdCkge1xuICAgICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkXG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0c1xuICAgICAgICAgIGRlbGV0ZSBleHByZXNzaW9uLmZhaWx1cmVJZHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vcm1hbGl6ZSAmJiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZmFpbHVyZUlkcykgJiYgZXhwcmVzc2lvbi5mYWlsdXJlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9GQUlMVVJFXCIsIFwiVU5ERUNMQVJFRF9GQUlMVVJFOiBQdXJlIGNhbGwgY2FycmllcyBhIGZvcmdlZCB0eXBlZCBmYWlsdXJlIGJvdW5kYXJ5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGlmICghbm9ybWFsaXplICYmIChleHByZXNzaW9uLmVmZmVjdFNpdGVJZCAhPT0gdW5kZWZpbmVkIHx8IGV4cHJlc3Npb24uZWZmZWN0cyAhPT0gdW5kZWZpbmVkIHx8IGV4cHJlc3Npb24uZmFpbHVyZUlkcyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIGZhaWwoXCJVTkRFQ0xBUkVEX0VGRkVDVFwiLCBcIlB1cmUgY2FsbCBjYXJyaWVzIGZvcmdlZCBlZmZlY3QgbWV0YWRhdGEuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkID0gYGVmZmVjdDoke3NpdGV9YFxuICAgICAgICBleHByZXNzaW9uLmVmZmVjdHMgPSBbXCJob3N0XCJdXG4gICAgICAgIGV4cHJlc3Npb24uZmFpbHVyZUlkcyA9IFsuLi5zdW1tYXJ5LmZhaWx1cmVJZHNdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZVNpdGUoZXhwcmVzc2lvbiwgc2l0ZSwgZmFpbClcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZmFpbHVyZUlkcykgfHwgZXhwcmVzc2lvbi5mYWlsdXJlSWRzLmpvaW4oXCIsXCIpICE9IFsuLi5zdW1tYXJ5LmZhaWx1cmVJZHNdLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgZmFpbChcIlVOREVDTEFSRURfRkFJTFVSRVwiLCBcIlVOREVDTEFSRURfRkFJTFVSRTogQ2FsbCBmYWlsdXJlIGJvdW5kYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyByZXNvbHZlZCBmdW5jdGlvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBleHByZXNzaW9uLmVmZmVjdHNbMF0gIT0gXCJob3N0XCIpIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9FRkZFQ1RcIiwgXCJDYWxsIGVmZmVjdCBzdW1tYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyByZXNvbHZlZCBmdW5jdGlvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2l0ZSArPSAxXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiXG4gICAgICAgID8gbWV0aG9kU3VtbWFyaWVzLmdldChleHByZXNzaW9uLm1ldGhvZClcbiAgICAgICAgOiBjb25zdHJ1Y3RvclN1bW1hcmllcy5nZXQoZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5kZWNsYXJhdGlvbklkID8/IGAke2V4cHJlc3Npb24ucmVmZXJlbmNlLmRlY2xhcmF0aW9uSWR9OmNvbnN0cnVjdG9yYClcbiAgICAgIGNvbnN0IGxhYmVsID0gZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiA/IFwibWV0aG9kIGNhbGxcIiA6IFwiY29uc3RydWN0aW9uXCJcbiAgICAgIGlmICghc3VtbWFyeT8uaG9zdCkge1xuICAgICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkXG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0c1xuICAgICAgICAgIGRlbGV0ZSBleHByZXNzaW9uLmZhaWx1cmVJZHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vcm1hbGl6ZSAmJiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZmFpbHVyZUlkcykgJiYgZXhwcmVzc2lvbi5mYWlsdXJlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9GQUlMVVJFXCIsIGBVTkRFQ0xBUkVEX0ZBSUxVUkU6IFB1cmUgJHtsYWJlbH0gY2FycmllcyBhIGZvcmdlZCB0eXBlZCBmYWlsdXJlIGJvdW5kYXJ5LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub3JtYWxpemUgJiYgKGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkICE9PSB1bmRlZmluZWQgfHwgZXhwcmVzc2lvbi5lZmZlY3RzICE9PSB1bmRlZmluZWQgfHwgZXhwcmVzc2lvbi5mYWlsdXJlSWRzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgZmFpbChcIlVOREVDTEFSRURfRUZGRUNUXCIsIGBQdXJlICR7bGFiZWx9IGNhcnJpZXMgZm9yZ2VkIGVmZmVjdCBtZXRhZGF0YS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICBleHByZXNzaW9uLmVmZmVjdFNpdGVJZCA9IGBlZmZlY3Q6JHtzaXRlfWBcbiAgICAgICAgZXhwcmVzc2lvbi5lZmZlY3RzID0gW1wiaG9zdFwiXVxuICAgICAgICBleHByZXNzaW9uLmZhaWx1cmVJZHMgPSBbLi4uc3VtbWFyeS5mYWlsdXJlSWRzXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdGVTaXRlKGV4cHJlc3Npb24sIHNpdGUsIGZhaWwpXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmZhaWx1cmVJZHMpIHx8IGV4cHJlc3Npb24uZmFpbHVyZUlkcy5qb2luKFwiLFwiKSAhPSBbLi4uc3VtbWFyeS5mYWlsdXJlSWRzXS5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIGZhaWwoXCJVTkRFQ0xBUkVEX0ZBSUxVUkVcIiwgYFVOREVDTEFSRURfRkFJTFVSRTogJHtsYWJlbH0gZmFpbHVyZSBib3VuZGFyeSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVzb2x2ZWQgZGVjbGFyYXRpb24uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBleHByZXNzaW9uLmVmZmVjdHNbMF0gIT0gXCJob3N0XCIpIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9FRkZFQ1RcIiwgYCR7bGFiZWx9IGVmZmVjdCBzdW1tYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyByZXNvbHZlZCBkZWNsYXJhdGlvbi5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzaXRlICs9IDFcbiAgICB9XG4gIH0sIHRydWUpXG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGpvaW50IGZpbml0ZSBmaXhlZCBwb2ludCBhY3Jvc3MgZnVuY3Rpb25zIGFuZCByZXNvbHZlZCByZWNlaXZlciBtZXRob2RzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBSZXNvbHZlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBjYXBhYmlsaXR5RmFpbHVyZUlkcyAtIERlY2xhcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IHZpc2libGVDbGFzc2VzIC0gUmVzb2x2ZWQgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcmV0dXJucyB7e2NvbnN0cnVjdG9yczogTWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT4sIGZ1bmN0aW9uczogTWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT4sIG1ldGhvZHM6IE1hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fX0gQ29tcGxldGUgc3VtbWFyaWVzLlxuICovXG5mdW5jdGlvbiBjb21wbGV0ZUVmZmVjdFN1bW1hcmllcyhtb2R1bGUsIGNhcGFiaWxpdHlGYWlsdXJlSWRzLCB2aXNpYmxlQ2xhc3Nlcykge1xuICBjb25zdCBpbXBvcnRlZE1ldGhvZHMgPSBkZWNsYXJlZENsYXNzU3VtbWFyaWVzKHZpc2libGVDbGFzc2VzLCBcIm1ldGhvZHNcIilcbiAgbGV0IGZ1bmN0aW9ucyA9IGVmZmVjdFN1bW1hcmllcyhtb2R1bGUuZnVuY3Rpb25zLCBuZXcgTWFwKCksIGNhcGFiaWxpdHlGYWlsdXJlSWRzKVxuICBsZXQgbWV0aG9kcyA9IGRpcmVjdE1ldGhvZFN1bW1hcmllcyhtb2R1bGUsIGZ1bmN0aW9ucywgaW1wb3J0ZWRNZXRob2RzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcywgaW1wb3J0ZWRNZXRob2RzKVxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbmV4dEZ1bmN0aW9ucyA9IGVmZmVjdFN1bW1hcmllcyhtb2R1bGUuZnVuY3Rpb25zLCBtZXRob2RzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcylcbiAgICBjb25zdCBuZXh0TWV0aG9kcyA9IGRpcmVjdE1ldGhvZFN1bW1hcmllcyhtb2R1bGUsIG5leHRGdW5jdGlvbnMsIG1ldGhvZHMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzLCBpbXBvcnRlZE1ldGhvZHMpXG5cbiAgICBpZiAoc2FtZVN1bW1hcmllcyhmdW5jdGlvbnMsIG5leHRGdW5jdGlvbnMpICYmIHNhbWVTdW1tYXJpZXMobWV0aG9kcywgbmV4dE1ldGhvZHMpKSB7XG4gICAgICByZXR1cm4ge2NvbnN0cnVjdG9yczogZGlyZWN0Q29uc3RydWN0b3JTdW1tYXJpZXMobW9kdWxlLCBuZXh0RnVuY3Rpb25zLCBuZXh0TWV0aG9kcywgY2FwYWJpbGl0eUZhaWx1cmVJZHMsXG4gICAgICAgIGRlY2xhcmVkQ2xhc3NTdW1tYXJpZXModmlzaWJsZUNsYXNzZXMsIFwiY29uc3RydWN0b3JzXCIpKSwgZnVuY3Rpb25zOiBuZXh0RnVuY3Rpb25zLCBtZXRob2RzOiBuZXh0TWV0aG9kc31cbiAgICB9XG4gICAgZnVuY3Rpb25zID0gbmV4dEZ1bmN0aW9uc1xuICAgIG1ldGhvZHMgPSBuZXh0TWV0aG9kc1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgc3RhYmxlIGhvc3QvZmFpbHVyZSBzdW1tYXJ5IG1hcHMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBsZWZ0IC0gUHJldmlvdXMgc3VtbWFyaWVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gcmlnaHQgLSBOZXh0IHN1bW1hcmllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBzdW1tYXJpZXMgYXJlIGlkZW50aWNhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZVN1bW1hcmllcyhsZWZ0LCByaWdodCkge1xuICBpZiAobGVmdC5zaXplICE9IHJpZ2h0LnNpemUpIHJldHVybiBmYWxzZVxuICBmb3IgKGNvbnN0IFtuYW1lLCBzdW1tYXJ5XSBvZiBsZWZ0KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcmlnaHQuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWNhbmRpZGF0ZSB8fCBzdW1tYXJ5Lmhvc3QgIT0gY2FuZGlkYXRlLmhvc3QgfHwgc3VtbWFyeS5mYWlsdXJlSWRzLnNpemUgIT0gY2FuZGlkYXRlLmZhaWx1cmVJZHMuc2l6ZSB8fFxuICAgICAgWy4uLnN1bW1hcnkuZmFpbHVyZUlkc10uc29tZSgoaWQpID0+ICFjYW5kaWRhdGUuZmFpbHVyZUlkcy5oYXMoaWQpKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbXBsZXRlIGltbXV0YWJsZSByZXNvbHV0aW9uIHJlY29yZGVkIGF0IGFuIGVmZmVjdCBjYWxsIHNpdGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9ufSBjYXBhYmlsaXR5IC0gRGVjbGFyaW5nIGNhcGFiaWxpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb259IG9wZXJhdGlvbiAtIFJlc29sdmVkIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlfSBDb21wbGV0ZSByZXNvbHV0aW9uLlxuICovXG5mdW5jdGlvbiBzaWduYXR1cmUoY2FwYWJpbGl0eSwgb3BlcmF0aW9uKSB7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0eUlkOiBjYXBhYmlsaXR5LmlkLFxuICAgIGVmZmVjdHM6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbXCJob3N0XCJdKSxcbiAgICBmYWlsdXJlSWRzOiBbLi4ub3BlcmF0aW9uLmZhaWx1cmVJZHNdLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlXCIpLFxuICAgIG9wZXJhdGlvbklkOiBvcGVyYXRpb24uaWQsXG4gICAgcGFyYW1ldGVyVHlwZXM6IG9wZXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgoe3R5cGV9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZSkpKSxcbiAgICByZXNvdXJjZUZsb3c6IHN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24ucmVzb3VyY2VGbG93KSxcbiAgICByZXR1cm5UeXBlOiB0eXBlSWRlbnRpdHkob3BlcmF0aW9uLnJldHVyblR5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGxvY2F0aW9ucyBhbmQgcHJvdmVuYW5jZSBmcm9tIG9uZSByZXNvbHZlZCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSBTdGFibGUgdHlwZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdHlwZUlkZW50aXR5KHR5cGUpIHtcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikgcmV0dXJuIHR5cGUubmFtZVxuICBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIHtraW5kOiB0eXBlLmtpbmQsIHJlc291cmNlSWQ6IHR5cGUucmVzb3VyY2VJZH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCwga2luZDogdHlwZS5raW5kfVxuICBpZiAodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiB7a2luZDogdHlwZS5raW5kLFxuICAgIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUudmFsdWVUeXBlKSl9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4ge1xuICAgIGVsZW1lbnRUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5lbGVtZW50VHlwZSkpLCBraW5kOiB0eXBlLmtpbmR9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgdHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgIGNvbnN0IGtleVR5cGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5rZXlUeXBlKSlcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuXG4gICAgcmV0dXJuIHR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyB7a2V5VHlwZSwga2luZDogdHlwZS5raW5kLCBvcmRlcjogXCJpbnNlcnRpb25cIiwgdmFsdWVUeXBlfSA6XG4gICAgICB7a2V5VHlwZSwga2luZDogdHlwZS5raW5kLCB2YWx1ZVR5cGV9XG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHthcmd1bWVudHM6IHR5cGUuYXJndW1lbnRzPy5tYXAoKGFyZ3VtZW50KSA9PlxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eShhcmd1bWVudCkpKSwgZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLCBraW5kOiB0eXBlLmtpbmR9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB7ZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLCBraW5kOiB0eXBlLmtpbmR9XG4gIHJldHVybiB7a2luZDogdHlwZS5raW5kLCBwYXJhbWV0ZXJJZDogdHlwZS5wYXJhbWV0ZXJJZH1cbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZml4ZWQtcG9pbnQgaG9zdC1lZmZlY3Qgc3VtbWFyeSBmb3Igb3JkaW5hcnkgZnVuY3Rpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IFttZXRob2RTdW1tYXJpZXNdIC0gUmVjZWl2ZXItY2FsbCBzdW1tYXJpZXMgZnJvbSB0aGUgY3VycmVudCBmaXhlZC1wb2ludCByb3VuZC5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFtjYXBhYmlsaXR5RmFpbHVyZUlkc10gLSBDYXBhYmlsaXR5IGZhaWx1cmVzIGVsaWdpYmxlIGZvciBjYWxsLXNpdGUgcHJvcGFnYXRpb24uXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IFN1bW1hcmllcyBieSBzb3VyY2UgZnVuY3Rpb24gbmFtZS5cbiAqL1xuZnVuY3Rpb24gZWZmZWN0U3VtbWFyaWVzKGZ1bmN0aW9ucywgbWV0aG9kU3VtbWFyaWVzID0gbmV3IE1hcCgpLCBjYXBhYmlsaXR5RmFpbHVyZUlkcyA9IG5ldyBTZXQoKSkge1xuICBjb25zdCBzdW1tYXJpZXMgPSBuZXcgTWFwKGZ1bmN0aW9ucy5tYXAoKHtuYW1lfSkgPT4gLyoqIEB0eXBlIHtbc3RyaW5nLCBFZmZlY3RTdW1tYXJ5XX0gKi8gKFxuICAgIFtuYW1lLCB7ZmFpbHVyZUlkczogbmV3IFNldCgpLCBob3N0OiBmYWxzZX1dXG4gICkpKVxuICBsZXQgY2hhbmdlZCA9IHRydWVcblxuICB3aGlsZSAoY2hhbmdlZCkge1xuICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zKSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gc3VtbWFyaWVzLmdldChkZWNsYXJhdGlvbi5uYW1lKVxuICAgICAgaWYgKCFzdW1tYXJ5KSBjb250aW51ZVxuICAgICAgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5ib2R5LCAoZXhwcmVzc2lvbikgPT4ge1xuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgICAgIGlmICghc3VtbWFyeS5ob3N0KSB7IHN1bW1hcnkuaG9zdCA9IHRydWU7IGNoYW5nZWQgPSB0cnVlIH1cbiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGVkID0gc3VtbWFyaWVzLmdldChleHByZXNzaW9uLmNhbGxlZSlcbiAgICAgICAgICBpZiAoY2FsbGVkPy5ob3N0ICYmICFzdW1tYXJ5Lmhvc3QpIHsgc3VtbWFyeS5ob3N0ID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWUgfVxuICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBjYWxsZWQgPSBtZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKVxuICAgICAgICAgIGlmIChjYWxsZWQ/Lmhvc3QgJiYgIXN1bW1hcnkuaG9zdCkgeyBzdW1tYXJ5Lmhvc3QgPSB0cnVlOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgIH0sIGZhbHNlKVxuICAgICAgY29uc3QgZXNjYXBpbmcgPSBlc2NhcGluZ0Jsb2NrRmFpbHVyZXMoZGVjbGFyYXRpb24uYm9keSwgc3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKVxuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGVzY2FwaW5nKSBpZiAoIXN1bW1hcnkuZmFpbHVyZUlkcy5oYXMoaWQpKSB7IHN1bW1hcnkuZmFpbHVyZUlkcy5hZGQoaWQpOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW1tYXJpZXNcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY2FwYWJpbGl0eSBmYWlsdXJlcyBlc2NhcGluZyBvbmUgc3RydWN0dXJlZCBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBGdW5jdGlvbiBib2R5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gZnVuY3Rpb25TdW1tYXJpZXMgLSBDdXJyZW50IGZ1bmN0aW9uIGZpeGVkIHBvaW50LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gbWV0aG9kU3VtbWFyaWVzIC0gUmVzb2x2ZWQgbWV0aG9kIHN1bW1hcmllcy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IGNhcGFiaWxpdHlGYWlsdXJlSWRzIC0gRGVjbGFyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcy5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gRXNjYXBpbmcgZmFpbHVyZSBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBlc2NhcGluZ0Jsb2NrRmFpbHVyZXMoYmxvY2ssIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgYm9keSA9IGVzY2FwaW5nQmxvY2tGYWlsdXJlcyhzdGF0ZW1lbnQuYm9keSwgZnVuY3Rpb25TdW1tYXJpZXMsIG1ldGhvZFN1bW1hcmllcywgY2FwYWJpbGl0eUZhaWx1cmVJZHMpXG5cbiAgICAgIGlmIChib2R5LmRlbGV0ZShzdGF0ZW1lbnQuY2F0Y2hUeXBlLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICAgIGFkZEZhaWx1cmVzKHJlc3VsdCwgZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKHN0YXRlbWVudC5jYXRjaEJvZHksIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSlcbiAgICAgIH1cbiAgICAgIGFkZEZhaWx1cmVzKHJlc3VsdCwgYm9keSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBzdGF0ZW1lbnRFeHByZXNzaW9ucyhzdGF0ZW1lbnQpKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRmFpbHVyZXMocmVzdWx0LCBleHByZXNzaW9uLCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzKVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiICYmIGNhcGFiaWxpdHlGYWlsdXJlSWRzLmhhcyhzdGF0ZW1lbnQuZXJyb3IuZXJyb3IuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50LmVycm9yLmVycm9yLmRlY2xhcmF0aW9uSWQpXG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdGVtZW50QmxvY2tzKHN0YXRlbWVudCkpIHtcbiAgICAgIGFkZEZhaWx1cmVzKHJlc3VsdCwgZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKGNoaWxkLCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcykpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBZGRzIGZhaWx1cmVzIGV2YWx1YXRlZCBieSBvbmUgZXhwcmVzc2lvbiBzdWJ0cmVlLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdGFyZ2V0IC0gRGVzdGluYXRpb24gaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbiByb290LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gZnVuY3Rpb25TdW1tYXJpZXMgLSBGdW5jdGlvbiBzdW1tYXJpZXMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBtZXRob2RTdW1tYXJpZXMgLSBNZXRob2Qgc3VtbWFyaWVzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEV4cHJlc3Npb25GYWlsdXJlcyh0YXJnZXQsIGV4cHJlc3Npb24sIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMpIHtcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIGFkZEZhaWx1cmVzKHRhcmdldCwgZXhwcmVzc2lvbi5yZXNvbHV0aW9uLmZhaWx1cmVJZHMpXG4gIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIGFkZEZhaWx1cmVzKHRhcmdldCwgZnVuY3Rpb25TdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKT8uZmFpbHVyZUlkcyA/PyBbXSlcbiAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikgYWRkRmFpbHVyZXModGFyZ2V0LCBtZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKT8uZmFpbHVyZUlkcyA/PyBbXSlcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikpIGFkZEV4cHJlc3Npb25GYWlsdXJlcyh0YXJnZXQsIGNoaWxkLCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzKVxufVxuXG4vKipcbiAqIFJldHVybnMgZGlyZWN0bHkgZXZhbHVhdGVkIGV4cHJlc3Npb25zIGZvciBvbmUgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlN0YXRlbWVudH0gc3RhdGVtZW50IC0gU3RhdGVtZW50LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBFeHByZXNzaW9uIHJvb3RzLlxuICovXG5mdW5jdGlvbiBzdGF0ZW1lbnRFeHByZXNzaW9ucyhzdGF0ZW1lbnQpIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSByZXR1cm4gW3N0YXRlbWVudC5pbml0aWFsaXplcl1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIiB8fFxuICAgIHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgcmV0dXJuIFtzdGF0ZW1lbnQuZXhwcmVzc2lvbl1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA/IFtzdGF0ZW1lbnQuZXhwcmVzc2lvbl0gOiBbXVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSByZXR1cm4gW3N0YXRlbWVudC5lcnJvci5tZXNzYWdlXVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikgcmV0dXJuIFtzdGF0ZW1lbnQuY29uZGl0aW9uXVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIpIHJldHVybiBbc3RhdGVtZW50Lmxpc3RdXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikgcmV0dXJuIFtzdGF0ZW1lbnQubWFwXVxuICByZXR1cm4gW11cbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5lc3RlZCBibG9ja3Mgd2hvc2UgZmFpbHVyZXMgcHJvcGFnYXRlIHRocm91Z2ggb25lIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFN0YXRlbWVudC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrW119IENoaWxkIGJsb2Nrcy5cbiAqL1xuZnVuY3Rpb24gc3RhdGVtZW50QmxvY2tzKHN0YXRlbWVudCkge1xuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSByZXR1cm4gW3N0YXRlbWVudC5jb25zZXF1ZW50LCAuLi4oc3RhdGVtZW50LmFsdGVybmF0ZSA/IFtzdGF0ZW1lbnQuYWx0ZXJuYXRlXSA6IFtdKV1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgIHJldHVybiBbc3RhdGVtZW50LmJvZHldXG4gIH1cbiAgcmV0dXJuIFtdXG59XG5cbi8qKlxuICogQWRkcyBhbiBpdGVyYWJsZSBvZiBmYWlsdXJlIGlkZW50aXRpZXMgdG8gYSBzZXQuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB0YXJnZXQgLSBEZXN0aW5hdGlvbi5cbiAqIEBwYXJhbSB7SXRlcmFibGU8c3RyaW5nPn0gc291cmNlIC0gU291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkRmFpbHVyZXModGFyZ2V0LCBzb3VyY2UpIHtcbiAgZm9yIChjb25zdCBpZCBvZiBzb3VyY2UpIHRhcmdldC5hZGQoaWQpXG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYm91bmRlZCBkaXJlY3Qgc3VtbWFyaWVzIGZvciBjbGFzcyBtZXRob2RzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBSZXNvbHZlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBmdW5jdGlvblN1bW1hcmllcyAtIE9yZGluYXJ5IGZ1bmN0aW9uIHN1bW1hcmllcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IHByaW9yTWV0aG9kU3VtbWFyaWVzIC0gUmVjZWl2ZXIgc3VtbWFyaWVzIGZyb20gdGhlIHByZXZpb3VzIGZpeGVkLXBvaW50IHJvdW5kLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gY2FwYWJpbGl0eUZhaWx1cmVJZHMgLSBEZWNsYXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gYmFzZVN1bW1hcmllcyAtIEltcG9ydGVkIHJlY2VpdmVyIHN1bW1hcmllcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gU3VtbWFyaWVzIGJ5IHJlc29sdmVkIG1ldGhvZCBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gZGlyZWN0TWV0aG9kU3VtbWFyaWVzKG1vZHVsZSwgZnVuY3Rpb25TdW1tYXJpZXMsIHByaW9yTWV0aG9kU3VtbWFyaWVzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcywgYmFzZVN1bW1hcmllcyA9IG5ldyBNYXAoKSkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSAqL1xuICBjb25zdCBzdW1tYXJpZXMgPSBuZXcgTWFwKGJhc2VTdW1tYXJpZXMpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICAgIC8qKiBAdHlwZSB7RWZmZWN0U3VtbWFyeX0gKi9cbiAgICAgIGNvbnN0IHN1bW1hcnkgPSB7ZmFpbHVyZUlkczogZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKG1ldGhvZC5ib2R5LCBmdW5jdGlvblN1bW1hcmllcywgcHJpb3JNZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSwgaG9zdDogZmFsc2V9XG5cbiAgICAgIGZvckVhY2hCbG9ja0V4cHJlc3Npb24obWV0aG9kLmJvZHksIChleHByZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgc3VtbWFyeS5ob3N0ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGZsb3cgPSBleHByZXNzaW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93XG4gICAgICAgICAgY29uc3QgYXJndW1lbnQgPSBmbG93LmtpbmQgPT0gXCJib3Jyb3dcIiB8fCBmbG93LmtpbmQgPT0gXCJjbG9zZVwiID8gZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF0gOiB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBib3Jyb3dlZFBhcmFtZXRlck5hbWUgPSBhcmd1bWVudD8ua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiICYmIGFyZ3VtZW50LmV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCJcbiAgICAgICAgICAgID8gYXJndW1lbnQuZXhwcmVzc2lvbi5uYW1lIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3Qga25vd25PcGVuQm9ycm93ID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiICYmIGFyZ3VtZW50Py5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgJiYgKFxuICAgICAgICAgICAgYXJndW1lbnQuZXhwcmVzc2lvbi5raW5kID09IFwiUHJpdmF0ZUZpZWxkUmVhZFwiICYmIGFyZ3VtZW50LmV4cHJlc3Npb24uZmllbGQgPT0gZGVjbGFyYXRpb24ub3duZXJzaGlwLmZpZWxkSWQgfHxcbiAgICAgICAgICAgIGJvcnJvd2VkUGFyYW1ldGVyTmFtZSAhPT0gdW5kZWZpbmVkICYmIG1ldGhvZC5wYXJhbWV0ZXJzLnNvbWUoKHBhcmFtZXRlcikgPT5cbiAgICAgICAgICAgICAgcGFyYW1ldGVyLm5hbWUgPT0gYm9ycm93ZWRQYXJhbWV0ZXJOYW1lICYmXG4gICAgICAgICAgICAgIChwYXJhbWV0ZXIudHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBwYXJhbWV0ZXIudHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpKVxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCB0ZXJtaW5hbEZhaWx1cmVJZCA9IGtub3duT3BlbkJvcnJvd1xuICAgICAgICAgICAgPyBmbG93LmtpbmQgPT0gXCJib3Jyb3dcIiB8fCBmbG93LmtpbmQgPT0gXCJjbG9zZVwiID8gZmxvdy50ZXJtaW5hbEZhaWx1cmVJZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICAgIGlmICh0ZXJtaW5hbEZhaWx1cmVJZCkgc3VtbWFyeS5mYWlsdXJlSWRzLmRlbGV0ZSh0ZXJtaW5hbEZhaWx1cmVJZClcbiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGVkID0gZnVuY3Rpb25TdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKVxuICAgICAgICAgIGlmIChjYWxsZWQ/Lmhvc3QpIHN1bW1hcnkuaG9zdCA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGVkID0gcHJpb3JNZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKVxuICAgICAgICAgIGlmIChjYWxsZWQ/Lmhvc3QpIHN1bW1hcnkuaG9zdCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSwgZmFsc2UpXG4gICAgICBzdW1tYXJpZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSwgc3VtbWFyeSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1bW1hcmllc1xufVxuXG4vKipcbiAqIFJlYWRzIGNoZWNrZWQgc3VtbWFyaWVzIGFscmVhZHkgcHJvdmVkIG9uIGltcG9ydGVkIGNsYXNzIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gY2xhc3NlcyAtIFZpc2libGUgY2xhc3Nlcy5cbiAqIEBwYXJhbSB7XCJjb25zdHJ1Y3RvcnNcIiB8IFwibWV0aG9kc1wifSBraW5kIC0gRGVjbGFyYXRpb24gY29ob3J0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBJbXBvcnRlZCBzdW1tYXJpZXMgYnkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkQ2xhc3NTdW1tYXJpZXMoY2xhc3Nlcywga2luZCkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSAqL1xuICBjb25zdCBzdW1tYXJpZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGNsYXNzZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBtZW1iZXJzID0ga2luZCA9PSBcImNvbnN0cnVjdG9yc1wiID8gW2RlY2xhcmF0aW9uLmNvbnN0cnVjdG9yXSA6IGRlY2xhcmF0aW9uLm1ldGhvZHNcblxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICAgIGlmIChtZW1iZXIuZWZmZWN0cz8ubGVuZ3RoID09IDEgJiYgbWVtYmVyLmVmZmVjdHNbMF0gPT0gXCJob3N0XCIgJiYgQXJyYXkuaXNBcnJheShtZW1iZXIuZmFpbHVyZUlkcykpIHtcbiAgICAgICAgc3VtbWFyaWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKG1lbWJlci5pZCksIHtmYWlsdXJlSWRzOiBuZXcgU2V0KG1lbWJlci5mYWlsdXJlSWRzKSwgaG9zdDogdHJ1ZX0pXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW1tYXJpZXNcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBkaXJlY3QgY29uc3RydWN0b3IgZWZmZWN0cyBhZnRlciBmdW5jdGlvbiBhbmQgbWV0aG9kIGZpeGVkIHBvaW50cyBzdGFiaWxpemUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFJlc29sdmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IGZ1bmN0aW9uU3VtbWFyaWVzIC0gU3RhYmxlIGZ1bmN0aW9uIHN1bW1hcmllcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IG1ldGhvZFN1bW1hcmllcyAtIFN0YWJsZSBtZXRob2Qgc3VtbWFyaWVzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gY2FwYWJpbGl0eUZhaWx1cmVJZHMgLSBEZWNsYXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gYmFzZVN1bW1hcmllcyAtIEltcG9ydGVkIGNvbnN0cnVjdG9yIHN1bW1hcmllcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gQ29uc3RydWN0b3Igc3VtbWFyaWVzIGJ5IGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBkaXJlY3RDb25zdHJ1Y3RvclN1bW1hcmllcyhtb2R1bGUsIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzLCBiYXNlU3VtbWFyaWVzKSB7XG4gIGNvbnN0IHN1bW1hcmllcyA9IG5ldyBNYXAoYmFzZVN1bW1hcmllcylcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvclxuICAgIC8qKiBAdHlwZSB7RWZmZWN0U3VtbWFyeX0gKi9cbiAgICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgICAgZmFpbHVyZUlkczogZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKGNvbnN0cnVjdG9yLmJvZHksIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSxcbiAgICAgIGhvc3Q6IGZhbHNlXG4gICAgfVxuXG4gICAgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihjb25zdHJ1Y3Rvci5ib2R5LCAoZXhwcmVzc2lvbikgPT4ge1xuICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHN1bW1hcnkuaG9zdCA9IHRydWVcbiAgICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgZnVuY3Rpb25TdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKT8uaG9zdCkgc3VtbWFyeS5ob3N0ID0gdHJ1ZVxuICAgICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiAmJiBtZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKT8uaG9zdCkgc3VtbWFyeS5ob3N0ID0gdHJ1ZVxuICAgIH0sIGZhbHNlKVxuICAgIHN1bW1hcmllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjb25zdHJ1Y3Rvci5pZCksIHN1bW1hcnkpXG4gIH1cbiAgcmV0dXJuIHN1bW1hcmllc1xufVxuXG4vKipcbiAqIFJlY29yZHMgb3IgdmVyaWZpZXMgb25lIGNoZWNrZWQgY2xhc3MtbWVtYmVyIHN1bW1hcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuTWV0aG9kRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ2xhc3MgbWVtYmVyLlxuICogQHBhcmFtIHtFZmZlY3RTdW1tYXJ5IHwgdW5kZWZpbmVkfSBzdW1tYXJ5IC0gQ29tcHV0ZWQgc3VtbWFyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplIC0gV2hldGhlciBtZXRhZGF0YSBtYXkgYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7KGNvZGU6IHN0cmluZywgZGV0YWlsOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uKSA9PiBuZXZlcn0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhcHBseURlY2xhcmF0aW9uU3VtbWFyeShkZWNsYXJhdGlvbiwgc3VtbWFyeSwgbm9ybWFsaXplLCBmYWlsKSB7XG4gIGlmICghc3VtbWFyeT8uaG9zdCkge1xuICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgIGRlbGV0ZSBkZWNsYXJhdGlvbi5lZmZlY3RzXG4gICAgICBkZWxldGUgZGVjbGFyYXRpb24uZmFpbHVyZUlkc1xuICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uZWZmZWN0cyAhPT0gdW5kZWZpbmVkIHx8IGRlY2xhcmF0aW9uLmZhaWx1cmVJZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFpbChcIlVOREVDTEFSRURfRUZGRUNUXCIsIFwiUHVyZSBjbGFzcyBtZW1iZXIgY2FycmllcyBmb3JnZWQgZWZmZWN0IG1ldGFkYXRhLlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgZmFpbHVyZUlkcyA9IFsuLi5zdW1tYXJ5LmZhaWx1cmVJZHNdXG5cbiAgaWYgKG5vcm1hbGl6ZSkge1xuICAgIGRlY2xhcmF0aW9uLmVmZmVjdHMgPSBbXCJob3N0XCJdXG4gICAgZGVjbGFyYXRpb24uZmFpbHVyZUlkcyA9IGZhaWx1cmVJZHNcbiAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBkZWNsYXJhdGlvbi5lZmZlY3RzWzBdICE9IFwiaG9zdFwiIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uZmFpbHVyZUlkcykgfHwgZGVjbGFyYXRpb24uZmFpbHVyZUlkcy5qb2luKFwiLFwiKSAhPSBmYWlsdXJlSWRzLmpvaW4oXCIsXCIpKSB7XG4gICAgZmFpbChcIlVOREVDTEFSRURfRUZGRUNUXCIsIFwiQ2xhc3MgbWVtYmVyIGVmZmVjdCBzdW1tYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyBib2R5LlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgZGV0ZXJtaW5pc3RpYyBlZmZlY3Qtc2l0ZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FsbEV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1ldGhvZENhbGxFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWZlcmVuY2VDb25zdHJ1Y3Rpb259IGV4cHJlc3Npb24gLSBFZmZlY3RmdWwgY2FsbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXRlIC0gRXhwZWN0ZWQgdHJhdmVyc2FsIGluZGV4LlxuICogQHBhcmFtIHsoY29kZTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU2l0ZShleHByZXNzaW9uLCBzaXRlLCBmYWlsKSB7XG4gIGlmIChleHByZXNzaW9uLmVmZmVjdFNpdGVJZCAhPSBgZWZmZWN0OiR7c2l0ZX1gKSB7XG4gICAgZmFpbChcIklOVkFMSURfRUZGRUNUX09SREVSXCIsIGBFZmZlY3Qgc2l0ZSAnJHtTdHJpbmcoZXhwcmVzc2lvbi5lZmZlY3RTaXRlSWQpfScgaXMgbm90IGV4cGVjdGVkIHNpdGUgJ2VmZmVjdDoke3NpdGV9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogVmlzaXRzIGV2ZXJ5IGV4cHJlc3Npb24gaW4gZGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgZXZhbHVhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gTW9kdWxlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtFeHByZXNzaW9uVmlzaXRvcn0gdmlzaXRvciAtIEV4cHJlc3Npb24gdmlzaXRvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bvc3RvcmRlcl0gLSBWaXNpdCBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBmb3JFYWNoRXhwcmVzc2lvbihtb2R1bGUsIHZpc2l0b3IsIHBvc3RvcmRlciA9IGZhbHNlKSB7XG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcilcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKG1ldGhvZC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gIH1cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcilcbiAgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihtb2R1bGUuZW50cnlQb2ludC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG59XG5cbi8qKlxuICogVmlzaXRzIGV4cHJlc3Npb25zIGluIG9uZSBzdHJ1Y3R1cmVkIGJsb2NrLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIEJsb2NrIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtFeHByZXNzaW9uVmlzaXRvcn0gdmlzaXRvciAtIEV4cHJlc3Npb24gdmlzaXRvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcG9zdG9yZGVyIC0gVmlzaXQgY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihibG9jaywgdmlzaXRvciwgcG9zdG9yZGVyKSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHZpc2l0KHN0YXRlbWVudC5pbml0aWFsaXplcilcbiAgICBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHZpc2l0KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgJiYgc3RhdGVtZW50LmV4cHJlc3Npb24pIHZpc2l0KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgdmlzaXQoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB2aXNpdChzdGF0ZW1lbnQuY29uZGl0aW9uKTsgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihzdGF0ZW1lbnQuY29uc2VxdWVudCwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIGZvckVhY2hCbG9ja0V4cHJlc3Npb24oc3RhdGVtZW50LmFsdGVybmF0ZSwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KHN0YXRlbWVudC5saXN0KTsgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihzdGF0ZW1lbnQuYm9keSwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KHN0YXRlbWVudC5tYXApOyBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKHN0YXRlbWVudC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KHN0YXRlbWVudC5jb25kaXRpb24pOyBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKHN0YXRlbWVudC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJhaXNlU3RhdGVtZW50XCIpIHZpc2l0KHN0YXRlbWVudC5lcnJvci5tZXNzYWdlKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIGZvckVhY2hCbG9ja0V4cHJlc3Npb24oc3RhdGVtZW50LmJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcik7IGZvckVhY2hCbG9ja0V4cHJlc3Npb24oc3RhdGVtZW50LmNhdGNoQm9keSwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGV4cHJlc3Npb24gc3VidHJlZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBFeHByZXNzaW9uIHJvb3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQoZXhwcmVzc2lvbikge1xuICAgIGlmICghcG9zdG9yZGVyKSB2aXNpdG9yKGV4cHJlc3Npb24pXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikpIHZpc2l0KGNoaWxkKVxuICAgIGlmIChwb3N0b3JkZXIpIHZpc2l0b3IoZXhwcmVzc2lvbilcbiAgfVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBvbmUgc2VtYW50aWMgYmxvY2sgcmVmZXJlbmNlcyBhIHJlc2VydmVkIHByb3RlY3RlZCBwcm92aWRlciBlbnRyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGEgcHJvdGVjdGVkIGVudHJ5IG5hbWUgaXMgcmVmZXJlbmNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KGJsb2NrKSB7XG4gIHJldHVybiBibG9jay5zdGF0ZW1lbnRzLnNvbWUoc3RhdGVtZW50UmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBvbmUgc2VtYW50aWMgc3RhdGVtZW50IHJlZmVyZW5jZXMgYSByZXNlcnZlZCBwcm90ZWN0ZWQgcHJvdmlkZXIgZW50cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBhIHByb3RlY3RlZCBlbnRyeSBuYW1lIGlzIHJlZmVyZW5jZWQuXG4gKi9cbmZ1bmN0aW9uIHN0YXRlbWVudFJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQpIHtcbiAgc3dpdGNoIChzdGF0ZW1lbnQua2luZCkge1xuICAgIGNhc2UgXCJMb2NhbERlY2xhcmF0aW9uXCI6XG4gICAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIpXG4gICAgY2FzZSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIjpcbiAgICBjYXNlIFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIGNhc2UgXCJSZXR1cm5TdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA/IGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmV4cHJlc3Npb24pIDogZmFsc2VcbiAgICBjYXNlIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJQcmludFN0YXRlbWVudFwiOlxuICAgICAgcmV0dXJuIGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gICAgY2FzZSBcIklmU3RhdGVtZW50XCI6XG4gICAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuY29uZGl0aW9uKSB8fFxuICAgICAgICBibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuY29uc2VxdWVudCkgfHxcbiAgICAgICAgKHN0YXRlbWVudC5hbHRlcm5hdGUgPyBibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuYWx0ZXJuYXRlKSA6IGZhbHNlKVxuICAgIGNhc2UgXCJGb3JFYWNoU3RhdGVtZW50XCI6XG4gICAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQubGlzdCkgfHwgYmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmJvZHkpXG4gICAgY2FzZSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5tYXApIHx8IGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5ib2R5KVxuICAgIGNhc2UgXCJXaGlsZVN0YXRlbWVudFwiOlxuICAgICAgcmV0dXJuIGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmNvbmRpdGlvbikgfHwgYmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmJvZHkpXG4gICAgY2FzZSBcIlJhaXNlU3RhdGVtZW50XCI6XG4gICAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZSlcbiAgICBjYXNlIFwiVHJ5U3RhdGVtZW50XCI6XG4gICAgICByZXR1cm4gYmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmJvZHkpIHx8IGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5jYXRjaEJvZHkpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIG9uZSBzZW1hbnRpYyBleHByZXNzaW9uIHJlZmVyZW5jZXMgYSByZXNlcnZlZCBwcm90ZWN0ZWQgcHJvdmlkZXIgZW50cnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFNlbWFudGljIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBhIHByb3RlY3RlZCBlbnRyeSBuYW1lIGlzIHJlZmVyZW5jZWQuXG4gKi9cbmZ1bmN0aW9uIGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoZXhwcmVzc2lvbikge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiAmJiBwYXJzZVByb3RlY3RlZEVudHJ5TmFtZShleHByZXNzaW9uLm5hbWUpICE9PSBudWxsKSByZXR1cm4gdHJ1ZVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJiBwYXJzZVByb3RlY3RlZEVudHJ5TmFtZShleHByZXNzaW9uLmNhbGxlZSkgIT09IG51bGwpIHJldHVybiB0cnVlXG4gIHJldHVybiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikuc29tZShleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KVxufVxuXG4vKipcbiAqIFJldHVybnMgc2VtYW50aWMgY2hpbGQgZXhwcmVzc2lvbnMgaW4gZXZhbHVhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUGFyZW50IGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uW119IENoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIlJlZmVyZW5jZUNvbnN0cnVjdGlvblwiIHx8XG4gICAgZXhwcmVzc2lvbi5raW5kID09IFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpIHJldHVybiBleHByZXNzaW9uLmFyZ3VtZW50c1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLnJlY2VpdmVyLCAuLi5leHByZXNzaW9uLmFyZ3VtZW50c11cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmV4cHJlc3Npb25dXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5sZWZ0LCBleHByZXNzaW9uLnJpZ2h0XVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5jb25kaXRpb24sIGV4cHJlc3Npb24uY29uc2VxdWVudCwgZXhwcmVzc2lvbi5hbHRlcm5hdGVdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLm9wZXJhbmRdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFNvbWVcIikgcmV0dXJuIFtleHByZXNzaW9uLnZhbHVlXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxJc1ByZXNlbnRcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFVud3JhcFwiKSByZXR1cm4gW2V4cHJlc3Npb24ub3BlcmFuZF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkxpc3RMaXRlcmFsXCIpIHJldHVybiBleHByZXNzaW9uLmVsZW1lbnRzXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIikgcmV0dXJuIGV4cHJlc3Npb24uZW50cmllcy5tYXAoKHt2YWx1ZX0pID0+IHZhbHVlKVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdEluZGV4RXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5pbmRleF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExvb2t1cEV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24ua2V5XVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5jb2xsZWN0aW9uXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWVtYmVyUmVhZFwiKSByZXR1cm4gW2V4cHJlc3Npb24ucmVjZWl2ZXJdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJQcml2YXRlRmllbGRSZWFkXCIpIHJldHVybiBbZXhwcmVzc2lvbi5yZWNlaXZlcl1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVycm9yTWVzc2FnZVJlYWRcIikgcmV0dXJuIFtleHByZXNzaW9uLnJlY2VpdmVyXVxuICByZXR1cm4gW11cbn1cbiJdfQ==
|
|
778
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZW1hbnRpYy9lZmZlY3RzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFbkQsd0VBQXdFO0FBQ3hFLHlGQUF5RjtBQUV6Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzFHLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFBO0lBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDNUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUVoQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFBRSxJQUFJLENBQUMsOEJBQThCLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pJLEtBQUssTUFBTSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxjQUFjLGVBQWUsRUFBRSxDQUFBO1FBRWhELElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLElBQUks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VUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0I7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZFLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0I7UUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZFLE9BQU8sRUFBRSxDQUFBO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2F1dGhvcml6ZWRPcGVyYXRpb24sIGlzVGFzazAzNE9wZXJhdGlvbk5hbWV9IGZyb20gXCIuL2NhcGFiaWxpdGllcy5qc1wiXG5pbXBvcnQge3BhcnNlUHJvdGVjdGVkRW50cnlOYW1lfSBmcm9tIFwiLi9zdGRsaWIuanNcIlxuXG4vKiogQHR5cGVkZWYge3tmYWlsdXJlSWRzOiBTZXQ8c3RyaW5nPiwgaG9zdDogYm9vbGVhbn19IEVmZmVjdFN1bW1hcnkgKi9cbi8qKiBAdHlwZWRlZiB7KGV4cHJlc3Npb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbikgPT4gdm9pZH0gRXhwcmVzc2lvblZpc2l0b3IgKi9cblxuLyoqXG4gKiBSZXNvbHZlcyBjb21waWxlci1hdXRob3JpemVkIGNhbGxzIGJlZm9yZSBvcmRpbmFyeSBzZW1hbnRpYyB0eXBlIHZhbGlkYXRpb24uXG4gKiBTb3VyY2UgZnVuY3Rpb25zIGFsd2F5cyB3aW47IGF1dGhvcml0eSBpcyBuZXZlciBpbmZlcnJlZCBmcm9tIHNwZWxsaW5nIGFsb25lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBQYXJzZXItYXV0aG9yZWQgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gU291cmNlIGxhbmd1YWdlIGlkZW50aXR5IGZvciBwcm90ZWN0ZWQgZW50cnkgdGFyZ2V0cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gVmlzaWJsZSBvcmRpbmFyeSBmdW5jdGlvbnMuXG4gKiBAcGFyYW0geyhjb2RlOiBzdHJpbmcsIGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZSAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIG9wZXJhdGlvbiBpbnRlbnQgbWF5IGJlIG5vcm1hbGl6ZWQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IFt2aXNpYmxlQ2xhc3Nlc10gLSBSZXNvbHZlZCByZWZlcmVuY2UgY2xhc3Nlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVFZmZlY3RHcmFwaChtb2R1bGUsIGxhbmd1YWdlLCBmdW5jdGlvbnMsIGZhaWwsIG5vcm1hbGl6ZSwgdmlzaWJsZUNsYXNzZXMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXVxuICBjb25zdCBjYXBhYmlsaXR5SWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IG9wZXJhdGlvbklkcyA9IG5ldyBTZXQoKVxuICBjb25zdCByZXNvdXJjZUlkcyA9IG5ldyBTZXQoKVxuICBjb25zdCBmYWlsdXJlSWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IFNldCgpXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIGZhaWwoXCJJTlZBTElEX0NBUEFCSUxJVFlfQVVUSE9SSVRZXCIsIFwiQ2FwYWJpbGl0aWVzIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgbW9kdWxlLmxvY2F0aW9uKVxuICBmb3IgKGNvbnN0IFtjYXBhYmlsaXR5SW5kZXgsIGNhcGFiaWxpdHldIG9mIGNhcGFiaWxpdGllcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBsZWdhY3lJZCA9IGBjYXBhYmlsaXR5OiR7Y2FwYWJpbGl0eUluZGV4fWBcblxuICAgIGlmICghY2FwYWJpbGl0eSB8fCBjYXBhYmlsaXR5LmtpbmQgIT0gXCJFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25cIiB8fFxuICAgICAgY2FwYWJpbGl0eS5pZCAhPSBsZWdhY3lJZCAmJiAhL15tb2R1bGU6XFxkK1xcL2NhcGFiaWxpdHk6XFxkKyQvdS50ZXN0KGNhcGFiaWxpdHkuaWQpIHx8IGNhcGFiaWxpdHlJZHMuaGFzKGNhcGFiaWxpdHkuaWQpIHx8XG4gICAgICB0eXBlb2YgY2FwYWJpbGl0eS5hdXRob3JpdHlJZCAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBjYXBhYmlsaXR5Lm5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhQXJyYXkuaXNBcnJheShjYXBhYmlsaXR5LnJlc291cmNlcykgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkuZmFpbHVyZXMpIHx8ICFBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkub3BlcmF0aW9ucykpIHtcbiAgICAgIGZhaWwoXCJJTlZBTElEX0NBUEFCSUxJVFlfQVVUSE9SSVRZXCIsIFwiTWFsZm9ybWVkIGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gZ3JhcGguXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgY2FwYWJpbGl0eUlkcy5hZGQoY2FwYWJpbGl0eS5pZClcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb3VyY2VdIG9mIGNhcGFiaWxpdHkucmVzb3VyY2VzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHJlc291cmNlLmtpbmQgIT0gXCJFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXCIgfHwgcmVzb3VyY2UuaWQgIT0gYCR7Y2FwYWJpbGl0eS5pZH0vcmVzb3VyY2U6JHtpbmRleH1gIHx8XG4gICAgICAgIHJlc291cmNlSWRzLmhhcyhyZXNvdXJjZS5pZCkpIGZhaWwoXCJJTlZBTElEX0NBUEFCSUxJVFlfQVVUSE9SSVRZXCIsIFwiTWFsZm9ybWVkIGNhcGFiaWxpdHkgcmVzb3VyY2UgaWRlbnRpdHkuXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIHJlc291cmNlSWRzLmFkZChyZXNvdXJjZS5pZClcbiAgICB9XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGZhaWx1cmVdIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZmFpbHVyZS5raW5kICE9IFwiRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uXCIgfHwgZmFpbHVyZS5pZCAhPSBgJHtjYXBhYmlsaXR5LmlkfS9mYWlsdXJlOiR7aW5kZXh9YCB8fFxuICAgICAgICBmYWlsdXJlSWRzLmhhcyhmYWlsdXJlLmlkKSkgZmFpbChcIklOVkFMSURfQ0FQQUJJTElUWV9BVVRIT1JJVFlcIiwgXCJNYWxmb3JtZWQgY2FwYWJpbGl0eSBmYWlsdXJlIGlkZW50aXR5LlwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICBmYWlsdXJlSWRzLmFkZChmYWlsdXJlLmlkKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2FwYWJpbGl0aWVzKSB7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIG9wZXJhdGlvbl0gb2YgY2FwYWJpbGl0eS5vcGVyYXRpb25zLmVudHJpZXMoKSkge1xuICAgICAgaWYgKG9wZXJhdGlvbi5raW5kICE9IFwiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIiB8fCBvcGVyYXRpb24uaWQgIT0gYCR7Y2FwYWJpbGl0eS5pZH0vb3BlcmF0aW9uOiR7aW5kZXh9YCB8fFxuICAgICAgICBvcGVyYXRpb25JZHMuaGFzKG9wZXJhdGlvbi5pZCkgfHwgb3BlcmF0aW9uTmFtZXMuaGFzKG9wZXJhdGlvbi5uYW1lKSB8fCAhQXJyYXkuaXNBcnJheShvcGVyYXRpb24ucGFyYW1ldGVycykgfHxcbiAgICAgICAgIUFycmF5LmlzQXJyYXkob3BlcmF0aW9uLmZhaWx1cmVJZHMpIHx8IG9wZXJhdGlvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBvcGVyYXRpb24uZWZmZWN0c1swXSAhPSBcImhvc3RcIiB8fFxuICAgICAgICBvcGVyYXRpb24uZmFpbHVyZUlkcy5zb21lKChpZCkgPT4gIWZhaWx1cmVJZHMuaGFzKGlkKSkpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfQ0FQQUJJTElUWV9BVVRIT1JJVFlcIiwgXCJNYWxmb3JtZWQgb3IgYW1iaWd1b3VzIGNhcGFiaWxpdHkgb3BlcmF0aW9uIGdyYXBoLlwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBvcGVyYXRpb25JZHMuYWRkKG9wZXJhdGlvbi5pZClcbiAgICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb24ubmFtZSlcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFtcbiAgICAuLi5tb2R1bGUuZnVuY3Rpb25zLFxuICAgIC4uLihtb2R1bGUucmVjb3JkcyA/PyBbXSksXG4gICAgLi4uKG1vZHVsZS5jbGFzc2VzID8/IFtdKSxcbiAgICAuLi4obW9kdWxlLmVycm9ycyA/PyBbXSlcbiAgXSkge1xuICAgIGlmIChwYXJzZVByb3RlY3RlZEVudHJ5TmFtZShkZWNsYXJhdGlvbi5uYW1lKSAhPT0gbnVsbCkge1xuICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgYFNvdXJjZSBkZWNsYXJhdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScgY2FwdHVyZXMgYSByZXNlcnZlZCBwcm90ZWN0ZWQgcHJvdmlkZXIgYmluZGluZy5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoRXhwcmVzc2lvbihtb2R1bGUsIChleHByZXNzaW9uKSA9PiB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXBhYmlsaXRpZXMuZmluZCgoe2lkfSkgPT4gaWQgPT0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5jYXBhYmlsaXR5SWQpXG4gICAgICBjb25zdCBvcGVyYXRpb24gPSBjYXBhYmlsaXR5Py5vcGVyYXRpb25zLmZpbmQoKHtpZH0pID0+IGlkID09IGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAob3BlcmF0aW9uICYmIGV4cHJlc3Npb24ucmVzb2x1dGlvbi5vcGVyYXRpb25JZCA9PSBvcGVyYXRpb24uaWQgJiZcbiAgICAgICAgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24ucmVzb2x1dGlvbi5mYWlsdXJlSWRzKSB8fFxuICAgICAgICAgIGV4cHJlc3Npb24ucmVzb2x1dGlvbi5mYWlsdXJlSWRzLmpvaW4oXCIsXCIpICE9IG9wZXJhdGlvbi5mYWlsdXJlSWRzLmpvaW4oXCIsXCIpKSkge1xuICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9GQUlMVVJFXCIsIFwiVU5ERUNMQVJFRF9GQUlMVVJFOiBFZmZlY3QgY2FsbCBmYWlsdXJlIGJvdW5kYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyBjb21waWxlciBhdXRob3JpdHkuXCIsXG4gICAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghb3BlcmF0aW9uIHx8IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5vcGVyYXRpb25JZCAhPSBvcGVyYXRpb24uaWQgfHxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXhwcmVzc2lvbi5yZXNvbHV0aW9uKSAhPSBKU09OLnN0cmluZ2lmeShzaWduYXR1cmUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbn0gKi8gKGNhcGFiaWxpdHkpLCBvcGVyYXRpb24pKSkge1xuICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9FRkZFQ1RcIiwgXCJFZmZlY3QgY2FsbCByZXNvbHV0aW9uIGRvZXMgbm90IG1hdGNoIGl0cyBjb21waWxlciBhdXRob3JpdHkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIgJiYgcGFyc2VQcm90ZWN0ZWRFbnRyeU5hbWUoZXhwcmVzc2lvbi5uYW1lKSAhPT0gbnVsbCkge1xuICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgYFJlZmVyZW5jZSB0byBwcm90ZWN0ZWQgcHJvdmlkZXIgZW50cnkgJyR7ZXhwcmVzc2lvbi5uYW1lfScgaXMgbm90IHBvcnRhYmxlIGNvZGUuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIkNhbGxFeHByZXNzaW9uXCIpIHJldHVyblxuICAgIGlmIChmdW5jdGlvbnMuaGFzKGV4cHJlc3Npb24uY2FsbGVlKSkgcmV0dXJuXG4gICAgbGV0IG9wZXJhdGlvbk5hbWUgPSBleHByZXNzaW9uLmNhbGxlZVxuICAgIGNvbnN0IHByb3RlY3RlZEVudHJ5ID0gcGFyc2VQcm90ZWN0ZWRFbnRyeU5hbWUoZXhwcmVzc2lvbi5jYWxsZWUpXG5cbiAgICBpZiAocHJvdGVjdGVkRW50cnkgIT09IG51bGwpIHtcbiAgICAgIGlmIChjYXBhYmlsaXRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgICBgUHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5ICcke2V4cHJlc3Npb24uY2FsbGVlfScgcmVxdWlyZXMgYW4gZXhwbGljaXQgY2FwYWJpbGl0eSBhdXRob3JpdHkuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChwcm90ZWN0ZWRFbnRyeS50YXJnZXQgIT0gbGFuZ3VhZ2UpIHtcbiAgICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgICBgUHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5IHRhcmdldCAnJHtwcm90ZWN0ZWRFbnRyeS50YXJnZXR9JyBkb2VzIG5vdCBtYXRjaCBzb3VyY2UgbGFuZ3VhZ2UgJyR7bGFuZ3VhZ2V9Jy5gLFxuICAgICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBvcGVyYXRpb25OYW1lID0gcHJvdGVjdGVkRW50cnkub3BlcmF0aW9uXG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gYXV0aG9yaXplZE9wZXJhdGlvbihjYXBhYmlsaXRpZXMsIG9wZXJhdGlvbk5hbWUpXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBpZiAocHJvdGVjdGVkRW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgZmFpbChcIlNURExJQl9QUk9URUNURURfQklORElOR19BQ0NFU1NcIixcbiAgICAgICAgICBgUHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5IGZvciB1bmRlY2xhcmVkIG9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgaGFzIG5vIGF1dGhvcml6ZWQgY2FwYWJpbGl0eSBvcGVyYXRpb24uYCxcbiAgICAgICAgICBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGlzVGFzazAzNE9wZXJhdGlvbk5hbWUob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgZmFpbChcIk1JU1NJTkdfQ0FQQUJJTElUWV9BVVRIT1JJVFlcIiwgYE9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgcmVxdWlyZXMgZXhwbGljaXQgY29tcGlsZXIgYXV0aG9yaXR5LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFub3JtYWxpemUpIHtcbiAgICAgIGZhaWwoXCJVTkRFQ0xBUkVEX0VGRkVDVFwiLCBgQ2FsbGVyLWF1dGhvcmVkIG9yZGluYXJ5IGNhbGwgJyR7ZXhwcmVzc2lvbi5jYWxsZWV9JyBjYW5ub3QgZm9yZ2UgYSBjYXBhYmlsaXR5IG9wZXJhdGlvbi5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCB7Y2FwYWJpbGl0eSwgb3BlcmF0aW9ufSA9IG1hdGNoXG4gICAgY29uc3QgZmxvdyA9IG9wZXJhdGlvbi5yZXNvdXJjZUZsb3dcblxuICAgIGlmICgoZmxvdy5raW5kID09IFwiYm9ycm93XCIgfHwgZmxvdy5raW5kID09IFwiY2xvc2VcIikgJiYgZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF0pIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF1cbiAgICAgIGlmIChhcmd1bWVudC5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiAmJiBhcmd1bWVudC5raW5kICE9IFwiUHJpdmF0ZUZpZWxkUmVhZFwiICYmIGFyZ3VtZW50LmtpbmQgIT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIikge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgXCJBbiBvd25lZCBib3Jyb3cgbXVzdCBuYW1lIG9uZSBpbW1lZGlhdGUgcmVzb3VyY2UgcGxhY2UuXCIsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF0gPSB7XG4gICAgICAgIGV4cHJlc3Npb246IGFyZ3VtZW50LFxuICAgICAgICBraW5kOiBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiLFxuICAgICAgICBsb2NhdGlvbjogYXJndW1lbnQubG9jYXRpb24sXG4gICAgICAgIG1vZGU6IGZsb3cua2luZCA9PSBcImNsb3NlXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIixcbiAgICAgICAgc291cmNlUHJvdmVuYW5jZTogYXJndW1lbnQuc291cmNlUHJvdmVuYW5jZSxcbiAgICAgICAgdHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Pd25lZFJlZmVyZW5jZVR5cGV9ICovIChcbiAgICAgICAgICBvcGVyYXRpb24ucGFyYW1ldGVyc1tmbG93LnBhcmFtZXRlckluZGV4XS50eXBlXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FsbEV4cHJlc3Npb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChleHByZXNzaW9uKSlcbiAgICBkZWxldGUgLyoqIEB0eXBlIHt7Y2FsbGVlPzogc3RyaW5nfX0gKi8gKHJlcGxhY2VtZW50KS5jYWxsZWVcbiAgICByZXBsYWNlbWVudC5raW5kID0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiXG4gICAgcmVwbGFjZW1lbnQub3BlcmF0aW9uID0gb3BlcmF0aW9uLmlkXG4gICAgcmVwbGFjZW1lbnQucmVzb2x1dGlvbiA9IHNpZ25hdHVyZShjYXBhYmlsaXR5LCBvcGVyYXRpb24pXG4gIH0pXG5cbiAgY29uc3QgY29tcGxldGUgPSBjb21wbGV0ZUVmZmVjdFN1bW1hcmllcyhtb2R1bGUsIGZhaWx1cmVJZHMsIHZpc2libGVDbGFzc2VzKVxuICBjb25zdCBzdW1tYXJpZXMgPSBjb21wbGV0ZS5mdW5jdGlvbnNcbiAgY29uc3QgbWV0aG9kU3VtbWFyaWVzID0gY29tcGxldGUubWV0aG9kc1xuICBjb25zdCBjb25zdHJ1Y3RvclN1bW1hcmllcyA9IGNvbXBsZXRlLmNvbnN0cnVjdG9yc1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICBhcHBseURlY2xhcmF0aW9uU3VtbWFyeShkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvcixcbiAgICAgIGNvbnN0cnVjdG9yU3VtbWFyaWVzLmdldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkKSksIG5vcm1hbGl6ZSwgZmFpbClcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSB7XG4gICAgICBhcHBseURlY2xhcmF0aW9uU3VtbWFyeShtZXRob2QsIG1ldGhvZFN1bW1hcmllcy5nZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZXRob2QuaWQpKSwgbm9ybWFsaXplLCBmYWlsKVxuICAgIH1cbiAgfVxuICBsZXQgc2l0ZSA9IDBcblxuICBmb3JFYWNoRXhwcmVzc2lvbihtb2R1bGUsIChleHByZXNzaW9uKSA9PiB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGlmIChub3JtYWxpemUpIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkID0gYGVmZmVjdDoke3NpdGV9YFxuICAgICAgZWxzZSB2YWxpZGF0ZVNpdGUoZXhwcmVzc2lvbiwgc2l0ZSwgZmFpbClcbiAgICAgIHNpdGUgKz0gMVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gc3VtbWFyaWVzLmdldChleHByZXNzaW9uLmNhbGxlZSlcbiAgICAgIGlmICghc3VtbWFyeT8uaG9zdCkge1xuICAgICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkXG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0c1xuICAgICAgICAgIGRlbGV0ZSBleHByZXNzaW9uLmZhaWx1cmVJZHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vcm1hbGl6ZSAmJiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZmFpbHVyZUlkcykgJiYgZXhwcmVzc2lvbi5mYWlsdXJlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9GQUlMVVJFXCIsIFwiVU5ERUNMQVJFRF9GQUlMVVJFOiBQdXJlIGNhbGwgY2FycmllcyBhIGZvcmdlZCB0eXBlZCBmYWlsdXJlIGJvdW5kYXJ5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGlmICghbm9ybWFsaXplICYmIChleHByZXNzaW9uLmVmZmVjdFNpdGVJZCAhPT0gdW5kZWZpbmVkIHx8IGV4cHJlc3Npb24uZWZmZWN0cyAhPT0gdW5kZWZpbmVkIHx8IGV4cHJlc3Npb24uZmFpbHVyZUlkcyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIGZhaWwoXCJVTkRFQ0xBUkVEX0VGRkVDVFwiLCBcIlB1cmUgY2FsbCBjYXJyaWVzIGZvcmdlZCBlZmZlY3QgbWV0YWRhdGEuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkID0gYGVmZmVjdDoke3NpdGV9YFxuICAgICAgICBleHByZXNzaW9uLmVmZmVjdHMgPSBbXCJob3N0XCJdXG4gICAgICAgIGV4cHJlc3Npb24uZmFpbHVyZUlkcyA9IFsuLi5zdW1tYXJ5LmZhaWx1cmVJZHNdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZVNpdGUoZXhwcmVzc2lvbiwgc2l0ZSwgZmFpbClcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZmFpbHVyZUlkcykgfHwgZXhwcmVzc2lvbi5mYWlsdXJlSWRzLmpvaW4oXCIsXCIpICE9IFsuLi5zdW1tYXJ5LmZhaWx1cmVJZHNdLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgZmFpbChcIlVOREVDTEFSRURfRkFJTFVSRVwiLCBcIlVOREVDTEFSRURfRkFJTFVSRTogQ2FsbCBmYWlsdXJlIGJvdW5kYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyByZXNvbHZlZCBmdW5jdGlvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBleHByZXNzaW9uLmVmZmVjdHNbMF0gIT0gXCJob3N0XCIpIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9FRkZFQ1RcIiwgXCJDYWxsIGVmZmVjdCBzdW1tYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyByZXNvbHZlZCBmdW5jdGlvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2l0ZSArPSAxXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiXG4gICAgICAgID8gbWV0aG9kU3VtbWFyaWVzLmdldChleHByZXNzaW9uLm1ldGhvZClcbiAgICAgICAgOiBjb25zdHJ1Y3RvclN1bW1hcmllcy5nZXQoZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5kZWNsYXJhdGlvbklkID8/IGAke2V4cHJlc3Npb24ucmVmZXJlbmNlLmRlY2xhcmF0aW9uSWR9OmNvbnN0cnVjdG9yYClcbiAgICAgIGNvbnN0IGxhYmVsID0gZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiA/IFwibWV0aG9kIGNhbGxcIiA6IFwiY29uc3RydWN0aW9uXCJcbiAgICAgIGlmICghc3VtbWFyeT8uaG9zdCkge1xuICAgICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkXG4gICAgICAgICAgZGVsZXRlIGV4cHJlc3Npb24uZWZmZWN0c1xuICAgICAgICAgIGRlbGV0ZSBleHByZXNzaW9uLmZhaWx1cmVJZHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vcm1hbGl6ZSAmJiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZmFpbHVyZUlkcykgJiYgZXhwcmVzc2lvbi5mYWlsdXJlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9GQUlMVVJFXCIsIGBVTkRFQ0xBUkVEX0ZBSUxVUkU6IFB1cmUgJHtsYWJlbH0gY2FycmllcyBhIGZvcmdlZCB0eXBlZCBmYWlsdXJlIGJvdW5kYXJ5LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub3JtYWxpemUgJiYgKGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkICE9PSB1bmRlZmluZWQgfHwgZXhwcmVzc2lvbi5lZmZlY3RzICE9PSB1bmRlZmluZWQgfHwgZXhwcmVzc2lvbi5mYWlsdXJlSWRzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgZmFpbChcIlVOREVDTEFSRURfRUZGRUNUXCIsIGBQdXJlICR7bGFiZWx9IGNhcnJpZXMgZm9yZ2VkIGVmZmVjdCBtZXRhZGF0YS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgICBleHByZXNzaW9uLmVmZmVjdFNpdGVJZCA9IGBlZmZlY3Q6JHtzaXRlfWBcbiAgICAgICAgZXhwcmVzc2lvbi5lZmZlY3RzID0gW1wiaG9zdFwiXVxuICAgICAgICBleHByZXNzaW9uLmZhaWx1cmVJZHMgPSBbLi4uc3VtbWFyeS5mYWlsdXJlSWRzXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdGVTaXRlKGV4cHJlc3Npb24sIHNpdGUsIGZhaWwpXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmZhaWx1cmVJZHMpIHx8IGV4cHJlc3Npb24uZmFpbHVyZUlkcy5qb2luKFwiLFwiKSAhPSBbLi4uc3VtbWFyeS5mYWlsdXJlSWRzXS5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIGZhaWwoXCJVTkRFQ0xBUkVEX0ZBSUxVUkVcIiwgYFVOREVDTEFSRURfRkFJTFVSRTogJHtsYWJlbH0gZmFpbHVyZSBib3VuZGFyeSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVzb2x2ZWQgZGVjbGFyYXRpb24uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBleHByZXNzaW9uLmVmZmVjdHNbMF0gIT0gXCJob3N0XCIpIHtcbiAgICAgICAgICBmYWlsKFwiVU5ERUNMQVJFRF9FRkZFQ1RcIiwgYCR7bGFiZWx9IGVmZmVjdCBzdW1tYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyByZXNvbHZlZCBkZWNsYXJhdGlvbi5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzaXRlICs9IDFcbiAgICB9XG4gIH0sIHRydWUpXG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGpvaW50IGZpbml0ZSBmaXhlZCBwb2ludCBhY3Jvc3MgZnVuY3Rpb25zIGFuZCByZXNvbHZlZCByZWNlaXZlciBtZXRob2RzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBSZXNvbHZlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBjYXBhYmlsaXR5RmFpbHVyZUlkcyAtIERlY2xhcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IHZpc2libGVDbGFzc2VzIC0gUmVzb2x2ZWQgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcmV0dXJucyB7e2NvbnN0cnVjdG9yczogTWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT4sIGZ1bmN0aW9uczogTWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT4sIG1ldGhvZHM6IE1hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fX0gQ29tcGxldGUgc3VtbWFyaWVzLlxuICovXG5mdW5jdGlvbiBjb21wbGV0ZUVmZmVjdFN1bW1hcmllcyhtb2R1bGUsIGNhcGFiaWxpdHlGYWlsdXJlSWRzLCB2aXNpYmxlQ2xhc3Nlcykge1xuICBjb25zdCBpbXBvcnRlZE1ldGhvZHMgPSBkZWNsYXJlZENsYXNzU3VtbWFyaWVzKHZpc2libGVDbGFzc2VzLCBcIm1ldGhvZHNcIilcbiAgbGV0IGZ1bmN0aW9ucyA9IGVmZmVjdFN1bW1hcmllcyhtb2R1bGUuZnVuY3Rpb25zLCBuZXcgTWFwKCksIGNhcGFiaWxpdHlGYWlsdXJlSWRzKVxuICBsZXQgbWV0aG9kcyA9IGRpcmVjdE1ldGhvZFN1bW1hcmllcyhtb2R1bGUsIGZ1bmN0aW9ucywgaW1wb3J0ZWRNZXRob2RzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcywgaW1wb3J0ZWRNZXRob2RzKVxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbmV4dEZ1bmN0aW9ucyA9IGVmZmVjdFN1bW1hcmllcyhtb2R1bGUuZnVuY3Rpb25zLCBtZXRob2RzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcylcbiAgICBjb25zdCBuZXh0TWV0aG9kcyA9IGRpcmVjdE1ldGhvZFN1bW1hcmllcyhtb2R1bGUsIG5leHRGdW5jdGlvbnMsIG1ldGhvZHMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzLCBpbXBvcnRlZE1ldGhvZHMpXG5cbiAgICBpZiAoc2FtZVN1bW1hcmllcyhmdW5jdGlvbnMsIG5leHRGdW5jdGlvbnMpICYmIHNhbWVTdW1tYXJpZXMobWV0aG9kcywgbmV4dE1ldGhvZHMpKSB7XG4gICAgICByZXR1cm4ge2NvbnN0cnVjdG9yczogZGlyZWN0Q29uc3RydWN0b3JTdW1tYXJpZXMobW9kdWxlLCBuZXh0RnVuY3Rpb25zLCBuZXh0TWV0aG9kcywgY2FwYWJpbGl0eUZhaWx1cmVJZHMsXG4gICAgICAgIGRlY2xhcmVkQ2xhc3NTdW1tYXJpZXModmlzaWJsZUNsYXNzZXMsIFwiY29uc3RydWN0b3JzXCIpKSwgZnVuY3Rpb25zOiBuZXh0RnVuY3Rpb25zLCBtZXRob2RzOiBuZXh0TWV0aG9kc31cbiAgICB9XG4gICAgZnVuY3Rpb25zID0gbmV4dEZ1bmN0aW9uc1xuICAgIG1ldGhvZHMgPSBuZXh0TWV0aG9kc1xuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgc3RhYmxlIGhvc3QvZmFpbHVyZSBzdW1tYXJ5IG1hcHMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBsZWZ0IC0gUHJldmlvdXMgc3VtbWFyaWVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gcmlnaHQgLSBOZXh0IHN1bW1hcmllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBzdW1tYXJpZXMgYXJlIGlkZW50aWNhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZVN1bW1hcmllcyhsZWZ0LCByaWdodCkge1xuICBpZiAobGVmdC5zaXplICE9IHJpZ2h0LnNpemUpIHJldHVybiBmYWxzZVxuICBmb3IgKGNvbnN0IFtuYW1lLCBzdW1tYXJ5XSBvZiBsZWZ0KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcmlnaHQuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWNhbmRpZGF0ZSB8fCBzdW1tYXJ5Lmhvc3QgIT0gY2FuZGlkYXRlLmhvc3QgfHwgc3VtbWFyeS5mYWlsdXJlSWRzLnNpemUgIT0gY2FuZGlkYXRlLmZhaWx1cmVJZHMuc2l6ZSB8fFxuICAgICAgWy4uLnN1bW1hcnkuZmFpbHVyZUlkc10uc29tZSgoaWQpID0+ICFjYW5kaWRhdGUuZmFpbHVyZUlkcy5oYXMoaWQpKSkgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbXBsZXRlIGltbXV0YWJsZSByZXNvbHV0aW9uIHJlY29yZGVkIGF0IGFuIGVmZmVjdCBjYWxsIHNpdGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9ufSBjYXBhYmlsaXR5IC0gRGVjbGFyaW5nIGNhcGFiaWxpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb259IG9wZXJhdGlvbiAtIFJlc29sdmVkIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlfSBDb21wbGV0ZSByZXNvbHV0aW9uLlxuICovXG5mdW5jdGlvbiBzaWduYXR1cmUoY2FwYWJpbGl0eSwgb3BlcmF0aW9uKSB7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0eUlkOiBjYXBhYmlsaXR5LmlkLFxuICAgIGVmZmVjdHM6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbXCJob3N0XCJdKSxcbiAgICBmYWlsdXJlSWRzOiBbLi4ub3BlcmF0aW9uLmZhaWx1cmVJZHNdLFxuICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlc29sdmVkRWZmZWN0T3BlcmF0aW9uU2lnbmF0dXJlXCIpLFxuICAgIG9wZXJhdGlvbklkOiBvcGVyYXRpb24uaWQsXG4gICAgcGFyYW1ldGVyVHlwZXM6IG9wZXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgoe3R5cGV9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZSkpKSxcbiAgICByZXNvdXJjZUZsb3c6IHN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24ucmVzb3VyY2VGbG93KSxcbiAgICByZXR1cm5UeXBlOiB0eXBlSWRlbnRpdHkob3BlcmF0aW9uLnJldHVyblR5cGUpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIGxvY2F0aW9ucyBhbmQgcHJvdmVuYW5jZSBmcm9tIG9uZSByZXNvbHZlZCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSBTdGFibGUgdHlwZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdHlwZUlkZW50aXR5KHR5cGUpIHtcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikgcmV0dXJuIHR5cGUubmFtZVxuICBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIHtraW5kOiB0eXBlLmtpbmQsIHJlc291cmNlSWQ6IHR5cGUucmVzb3VyY2VJZH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCwga2luZDogdHlwZS5raW5kfVxuICBpZiAodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiB7a2luZDogdHlwZS5raW5kLFxuICAgIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUudmFsdWVUeXBlKSl9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4ge1xuICAgIGVsZW1lbnRUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5lbGVtZW50VHlwZSkpLCBraW5kOiB0eXBlLmtpbmR9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgdHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgIGNvbnN0IGtleVR5cGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5rZXlUeXBlKSlcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuXG4gICAgcmV0dXJuIHR5cGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyB7a2V5VHlwZSwga2luZDogdHlwZS5raW5kLCBvcmRlcjogXCJpbnNlcnRpb25cIiwgdmFsdWVUeXBlfSA6XG4gICAgICB7a2V5VHlwZSwga2luZDogdHlwZS5raW5kLCB2YWx1ZVR5cGV9XG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHthcmd1bWVudHM6IHR5cGUuYXJndW1lbnRzPy5tYXAoKGFyZ3VtZW50KSA9PlxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eShhcmd1bWVudCkpKSwgZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLCBraW5kOiB0eXBlLmtpbmR9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB7ZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLCBraW5kOiB0eXBlLmtpbmR9XG4gIHJldHVybiB7a2luZDogdHlwZS5raW5kLCBwYXJhbWV0ZXJJZDogdHlwZS5wYXJhbWV0ZXJJZH1cbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZml4ZWQtcG9pbnQgaG9zdC1lZmZlY3Qgc3VtbWFyeSBmb3Igb3JkaW5hcnkgZnVuY3Rpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IFttZXRob2RTdW1tYXJpZXNdIC0gUmVjZWl2ZXItY2FsbCBzdW1tYXJpZXMgZnJvbSB0aGUgY3VycmVudCBmaXhlZC1wb2ludCByb3VuZC5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFtjYXBhYmlsaXR5RmFpbHVyZUlkc10gLSBDYXBhYmlsaXR5IGZhaWx1cmVzIGVsaWdpYmxlIGZvciBjYWxsLXNpdGUgcHJvcGFnYXRpb24uXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IFN1bW1hcmllcyBieSBzb3VyY2UgZnVuY3Rpb24gbmFtZS5cbiAqL1xuZnVuY3Rpb24gZWZmZWN0U3VtbWFyaWVzKGZ1bmN0aW9ucywgbWV0aG9kU3VtbWFyaWVzID0gbmV3IE1hcCgpLCBjYXBhYmlsaXR5RmFpbHVyZUlkcyA9IG5ldyBTZXQoKSkge1xuICBjb25zdCBzdW1tYXJpZXMgPSBuZXcgTWFwKGZ1bmN0aW9ucy5tYXAoKHtuYW1lfSkgPT4gLyoqIEB0eXBlIHtbc3RyaW5nLCBFZmZlY3RTdW1tYXJ5XX0gKi8gKFxuICAgIFtuYW1lLCB7ZmFpbHVyZUlkczogbmV3IFNldCgpLCBob3N0OiBmYWxzZX1dXG4gICkpKVxuICBsZXQgY2hhbmdlZCA9IHRydWVcblxuICB3aGlsZSAoY2hhbmdlZCkge1xuICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zKSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gc3VtbWFyaWVzLmdldChkZWNsYXJhdGlvbi5uYW1lKVxuICAgICAgaWYgKCFzdW1tYXJ5KSBjb250aW51ZVxuICAgICAgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5ib2R5LCAoZXhwcmVzc2lvbikgPT4ge1xuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgICAgIGlmICghc3VtbWFyeS5ob3N0KSB7IHN1bW1hcnkuaG9zdCA9IHRydWU7IGNoYW5nZWQgPSB0cnVlIH1cbiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGVkID0gc3VtbWFyaWVzLmdldChleHByZXNzaW9uLmNhbGxlZSlcbiAgICAgICAgICBpZiAoY2FsbGVkPy5ob3N0ICYmICFzdW1tYXJ5Lmhvc3QpIHsgc3VtbWFyeS5ob3N0ID0gdHJ1ZTsgY2hhbmdlZCA9IHRydWUgfVxuICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBjYWxsZWQgPSBtZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKVxuICAgICAgICAgIGlmIChjYWxsZWQ/Lmhvc3QgJiYgIXN1bW1hcnkuaG9zdCkgeyBzdW1tYXJ5Lmhvc3QgPSB0cnVlOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgIH0sIGZhbHNlKVxuICAgICAgY29uc3QgZXNjYXBpbmcgPSBlc2NhcGluZ0Jsb2NrRmFpbHVyZXMoZGVjbGFyYXRpb24uYm9keSwgc3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKVxuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGVzY2FwaW5nKSBpZiAoIXN1bW1hcnkuZmFpbHVyZUlkcy5oYXMoaWQpKSB7IHN1bW1hcnkuZmFpbHVyZUlkcy5hZGQoaWQpOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW1tYXJpZXNcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY2FwYWJpbGl0eSBmYWlsdXJlcyBlc2NhcGluZyBvbmUgc3RydWN0dXJlZCBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBGdW5jdGlvbiBib2R5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gZnVuY3Rpb25TdW1tYXJpZXMgLSBDdXJyZW50IGZ1bmN0aW9uIGZpeGVkIHBvaW50LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gbWV0aG9kU3VtbWFyaWVzIC0gUmVzb2x2ZWQgbWV0aG9kIHN1bW1hcmllcy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IGNhcGFiaWxpdHlGYWlsdXJlSWRzIC0gRGVjbGFyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcy5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gRXNjYXBpbmcgZmFpbHVyZSBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBlc2NhcGluZ0Jsb2NrRmFpbHVyZXMoYmxvY2ssIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgbGV0IGJvZHkgPSBlc2NhcGluZ0Jsb2NrRmFpbHVyZXMoc3RhdGVtZW50LmJvZHksIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKVxuXG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygc3RhdGVtZW50LmhhbmRsZXJzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGNhdWdodElkID0gaGFuZGxlci5jYXRjaFR5cGU/LmRlY2xhcmF0aW9uSWRcblxuICAgICAgICBpZiAodHlwZW9mIGNhdWdodElkID09IFwic3RyaW5nXCIgJiYgYm9keS5kZWxldGUoY2F1Z2h0SWQpKSB7XG4gICAgICAgICAgYWRkRmFpbHVyZXMoYm9keSwgZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKGhhbmRsZXIuY2F0Y2hCb2R5LCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQuZmluYWxseUJvZHkpIHtcbiAgICAgICAgLy8gQSBjb21wbGV0aW9uIGJsb2NrIHRoYXQgY2FuIHJhaXNlIHJlcGxhY2VzIHRoZSBwZW5kaW5nIGNvbXBsZXRpb24gb24gdGhlIHBhdGhzIHdoZXJlIGl0IGRvZXMsXG4gICAgICAgIC8vIGJ1dCBwZW5kaW5nIGZhaWx1cmVzIHN0aWxsIGVzY2FwZSBvbiB0aGUgcGF0aHMgd2hlcmUgaXQgY29tcGxldGVzIG5vcm1hbGx5LCBzbyBib3RoIGFyZSByZWFjaGFibGUuXG4gICAgICAgIGFkZEZhaWx1cmVzKGJvZHksIGVzY2FwaW5nQmxvY2tGYWlsdXJlcyhzdGF0ZW1lbnQuZmluYWxseUJvZHksIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSlcbiAgICAgIH1cbiAgICAgIGFkZEZhaWx1cmVzKHJlc3VsdCwgYm9keSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXhwcmVzc2lvbiBvZiBzdGF0ZW1lbnRFeHByZXNzaW9ucyhzdGF0ZW1lbnQpKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRmFpbHVyZXMocmVzdWx0LCBleHByZXNzaW9uLCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzKVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiICYmIGNhcGFiaWxpdHlGYWlsdXJlSWRzLmhhcyhzdGF0ZW1lbnQuZXJyb3IuZXJyb3IuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50LmVycm9yLmVycm9yLmRlY2xhcmF0aW9uSWQpXG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdGVtZW50QmxvY2tzKHN0YXRlbWVudCkpIHtcbiAgICAgIGFkZEZhaWx1cmVzKHJlc3VsdCwgZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKGNoaWxkLCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcykpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBZGRzIGZhaWx1cmVzIGV2YWx1YXRlZCBieSBvbmUgZXhwcmVzc2lvbiBzdWJ0cmVlLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdGFyZ2V0IC0gRGVzdGluYXRpb24gaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbiByb290LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gZnVuY3Rpb25TdW1tYXJpZXMgLSBGdW5jdGlvbiBzdW1tYXJpZXMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBtZXRob2RTdW1tYXJpZXMgLSBNZXRob2Qgc3VtbWFyaWVzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEV4cHJlc3Npb25GYWlsdXJlcyh0YXJnZXQsIGV4cHJlc3Npb24sIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMpIHtcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIGFkZEZhaWx1cmVzKHRhcmdldCwgZXhwcmVzc2lvbi5yZXNvbHV0aW9uLmZhaWx1cmVJZHMpXG4gIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIGFkZEZhaWx1cmVzKHRhcmdldCwgZnVuY3Rpb25TdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKT8uZmFpbHVyZUlkcyA/PyBbXSlcbiAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikgYWRkRmFpbHVyZXModGFyZ2V0LCBtZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKT8uZmFpbHVyZUlkcyA/PyBbXSlcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikpIGFkZEV4cHJlc3Npb25GYWlsdXJlcyh0YXJnZXQsIGNoaWxkLCBmdW5jdGlvblN1bW1hcmllcywgbWV0aG9kU3VtbWFyaWVzKVxufVxuXG4vKipcbiAqIFJldHVybnMgZGlyZWN0bHkgZXZhbHVhdGVkIGV4cHJlc3Npb25zIGZvciBvbmUgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlN0YXRlbWVudH0gc3RhdGVtZW50IC0gU3RhdGVtZW50LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBFeHByZXNzaW9uIHJvb3RzLlxuICovXG5mdW5jdGlvbiBzdGF0ZW1lbnRFeHByZXNzaW9ucyhzdGF0ZW1lbnQpIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSByZXR1cm4gW3N0YXRlbWVudC5pbml0aWFsaXplcl1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIiB8fFxuICAgIHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgcmV0dXJuIFtzdGF0ZW1lbnQuZXhwcmVzc2lvbl1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbiA/IFtzdGF0ZW1lbnQuZXhwcmVzc2lvbl0gOiBbXVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSByZXR1cm4gW3N0YXRlbWVudC5lcnJvci5tZXNzYWdlXVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikgcmV0dXJuIFtzdGF0ZW1lbnQuY29uZGl0aW9uXVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIpIHJldHVybiBbc3RhdGVtZW50Lmxpc3RdXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikgcmV0dXJuIFtzdGF0ZW1lbnQubWFwXVxuICByZXR1cm4gW11cbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5lc3RlZCBibG9ja3Mgd2hvc2UgZmFpbHVyZXMgcHJvcGFnYXRlIHRocm91Z2ggb25lIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFN0YXRlbWVudC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrW119IENoaWxkIGJsb2Nrcy5cbiAqL1xuZnVuY3Rpb24gc3RhdGVtZW50QmxvY2tzKHN0YXRlbWVudCkge1xuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSByZXR1cm4gW3N0YXRlbWVudC5jb25zZXF1ZW50LCAuLi4oc3RhdGVtZW50LmFsdGVybmF0ZSA/IFtzdGF0ZW1lbnQuYWx0ZXJuYXRlXSA6IFtdKV1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgIHJldHVybiBbc3RhdGVtZW50LmJvZHldXG4gIH1cbiAgcmV0dXJuIFtdXG59XG5cbi8qKlxuICogQWRkcyBhbiBpdGVyYWJsZSBvZiBmYWlsdXJlIGlkZW50aXRpZXMgdG8gYSBzZXQuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB0YXJnZXQgLSBEZXN0aW5hdGlvbi5cbiAqIEBwYXJhbSB7SXRlcmFibGU8c3RyaW5nPn0gc291cmNlIC0gU291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkRmFpbHVyZXModGFyZ2V0LCBzb3VyY2UpIHtcbiAgZm9yIChjb25zdCBpZCBvZiBzb3VyY2UpIHRhcmdldC5hZGQoaWQpXG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYm91bmRlZCBkaXJlY3Qgc3VtbWFyaWVzIGZvciBjbGFzcyBtZXRob2RzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBSZXNvbHZlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBmdW5jdGlvblN1bW1hcmllcyAtIE9yZGluYXJ5IGZ1bmN0aW9uIHN1bW1hcmllcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IHByaW9yTWV0aG9kU3VtbWFyaWVzIC0gUmVjZWl2ZXIgc3VtbWFyaWVzIGZyb20gdGhlIHByZXZpb3VzIGZpeGVkLXBvaW50IHJvdW5kLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gY2FwYWJpbGl0eUZhaWx1cmVJZHMgLSBEZWNsYXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gYmFzZVN1bW1hcmllcyAtIEltcG9ydGVkIHJlY2VpdmVyIHN1bW1hcmllcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gU3VtbWFyaWVzIGJ5IHJlc29sdmVkIG1ldGhvZCBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gZGlyZWN0TWV0aG9kU3VtbWFyaWVzKG1vZHVsZSwgZnVuY3Rpb25TdW1tYXJpZXMsIHByaW9yTWV0aG9kU3VtbWFyaWVzLCBjYXBhYmlsaXR5RmFpbHVyZUlkcywgYmFzZVN1bW1hcmllcyA9IG5ldyBNYXAoKSkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSAqL1xuICBjb25zdCBzdW1tYXJpZXMgPSBuZXcgTWFwKGJhc2VTdW1tYXJpZXMpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICAgIC8qKiBAdHlwZSB7RWZmZWN0U3VtbWFyeX0gKi9cbiAgICAgIGNvbnN0IHN1bW1hcnkgPSB7ZmFpbHVyZUlkczogZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKG1ldGhvZC5ib2R5LCBmdW5jdGlvblN1bW1hcmllcywgcHJpb3JNZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSwgaG9zdDogZmFsc2V9XG5cbiAgICAgIGZvckVhY2hCbG9ja0V4cHJlc3Npb24obWV0aG9kLmJvZHksIChleHByZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgc3VtbWFyeS5ob3N0ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGZsb3cgPSBleHByZXNzaW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93XG4gICAgICAgICAgY29uc3QgYXJndW1lbnQgPSBmbG93LmtpbmQgPT0gXCJib3Jyb3dcIiB8fCBmbG93LmtpbmQgPT0gXCJjbG9zZVwiID8gZXhwcmVzc2lvbi5hcmd1bWVudHNbZmxvdy5wYXJhbWV0ZXJJbmRleF0gOiB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBib3Jyb3dlZFBhcmFtZXRlck5hbWUgPSBhcmd1bWVudD8ua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiICYmIGFyZ3VtZW50LmV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCJcbiAgICAgICAgICAgID8gYXJndW1lbnQuZXhwcmVzc2lvbi5uYW1lIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3Qga25vd25PcGVuQm9ycm93ID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiICYmIGFyZ3VtZW50Py5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgJiYgKFxuICAgICAgICAgICAgYXJndW1lbnQuZXhwcmVzc2lvbi5raW5kID09IFwiUHJpdmF0ZUZpZWxkUmVhZFwiICYmIGFyZ3VtZW50LmV4cHJlc3Npb24uZmllbGQgPT0gZGVjbGFyYXRpb24ub3duZXJzaGlwLmZpZWxkSWQgfHxcbiAgICAgICAgICAgIGJvcnJvd2VkUGFyYW1ldGVyTmFtZSAhPT0gdW5kZWZpbmVkICYmIG1ldGhvZC5wYXJhbWV0ZXJzLnNvbWUoKHBhcmFtZXRlcikgPT5cbiAgICAgICAgICAgICAgcGFyYW1ldGVyLm5hbWUgPT0gYm9ycm93ZWRQYXJhbWV0ZXJOYW1lICYmXG4gICAgICAgICAgICAgIChwYXJhbWV0ZXIudHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBwYXJhbWV0ZXIudHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpKVxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCB0ZXJtaW5hbEZhaWx1cmVJZCA9IGtub3duT3BlbkJvcnJvd1xuICAgICAgICAgICAgPyBmbG93LmtpbmQgPT0gXCJib3Jyb3dcIiB8fCBmbG93LmtpbmQgPT0gXCJjbG9zZVwiID8gZmxvdy50ZXJtaW5hbEZhaWx1cmVJZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICAgIGlmICh0ZXJtaW5hbEZhaWx1cmVJZCkgc3VtbWFyeS5mYWlsdXJlSWRzLmRlbGV0ZSh0ZXJtaW5hbEZhaWx1cmVJZClcbiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGVkID0gZnVuY3Rpb25TdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKVxuICAgICAgICAgIGlmIChjYWxsZWQ/Lmhvc3QpIHN1bW1hcnkuaG9zdCA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3QgY2FsbGVkID0gcHJpb3JNZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKVxuICAgICAgICAgIGlmIChjYWxsZWQ/Lmhvc3QpIHN1bW1hcnkuaG9zdCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSwgZmFsc2UpXG4gICAgICBzdW1tYXJpZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSwgc3VtbWFyeSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1bW1hcmllc1xufVxuXG4vKipcbiAqIFJlYWRzIGNoZWNrZWQgc3VtbWFyaWVzIGFscmVhZHkgcHJvdmVkIG9uIGltcG9ydGVkIGNsYXNzIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gY2xhc3NlcyAtIFZpc2libGUgY2xhc3Nlcy5cbiAqIEBwYXJhbSB7XCJjb25zdHJ1Y3RvcnNcIiB8IFwibWV0aG9kc1wifSBraW5kIC0gRGVjbGFyYXRpb24gY29ob3J0LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSBJbXBvcnRlZCBzdW1tYXJpZXMgYnkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkQ2xhc3NTdW1tYXJpZXMoY2xhc3Nlcywga2luZCkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIEVmZmVjdFN1bW1hcnk+fSAqL1xuICBjb25zdCBzdW1tYXJpZXMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGNsYXNzZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBtZW1iZXJzID0ga2luZCA9PSBcImNvbnN0cnVjdG9yc1wiID8gW2RlY2xhcmF0aW9uLmNvbnN0cnVjdG9yXSA6IGRlY2xhcmF0aW9uLm1ldGhvZHNcblxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICAgIGlmIChtZW1iZXIuZWZmZWN0cz8ubGVuZ3RoID09IDEgJiYgbWVtYmVyLmVmZmVjdHNbMF0gPT0gXCJob3N0XCIgJiYgQXJyYXkuaXNBcnJheShtZW1iZXIuZmFpbHVyZUlkcykpIHtcbiAgICAgICAgc3VtbWFyaWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKG1lbWJlci5pZCksIHtmYWlsdXJlSWRzOiBuZXcgU2V0KG1lbWJlci5mYWlsdXJlSWRzKSwgaG9zdDogdHJ1ZX0pXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW1tYXJpZXNcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBkaXJlY3QgY29uc3RydWN0b3IgZWZmZWN0cyBhZnRlciBmdW5jdGlvbiBhbmQgbWV0aG9kIGZpeGVkIHBvaW50cyBzdGFiaWxpemUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFJlc29sdmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IGZ1bmN0aW9uU3VtbWFyaWVzIC0gU3RhYmxlIGZ1bmN0aW9uIHN1bW1hcmllcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgRWZmZWN0U3VtbWFyeT59IG1ldGhvZFN1bW1hcmllcyAtIFN0YWJsZSBtZXRob2Qgc3VtbWFyaWVzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gY2FwYWJpbGl0eUZhaWx1cmVJZHMgLSBEZWNsYXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gYmFzZVN1bW1hcmllcyAtIEltcG9ydGVkIGNvbnN0cnVjdG9yIHN1bW1hcmllcy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBFZmZlY3RTdW1tYXJ5Pn0gQ29uc3RydWN0b3Igc3VtbWFyaWVzIGJ5IGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBkaXJlY3RDb25zdHJ1Y3RvclN1bW1hcmllcyhtb2R1bGUsIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzLCBiYXNlU3VtbWFyaWVzKSB7XG4gIGNvbnN0IHN1bW1hcmllcyA9IG5ldyBNYXAoYmFzZVN1bW1hcmllcylcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvclxuICAgIC8qKiBAdHlwZSB7RWZmZWN0U3VtbWFyeX0gKi9cbiAgICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgICAgZmFpbHVyZUlkczogZXNjYXBpbmdCbG9ja0ZhaWx1cmVzKGNvbnN0cnVjdG9yLmJvZHksIGZ1bmN0aW9uU3VtbWFyaWVzLCBtZXRob2RTdW1tYXJpZXMsIGNhcGFiaWxpdHlGYWlsdXJlSWRzKSxcbiAgICAgIGhvc3Q6IGZhbHNlXG4gICAgfVxuXG4gICAgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihjb25zdHJ1Y3Rvci5ib2R5LCAoZXhwcmVzc2lvbikgPT4ge1xuICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHN1bW1hcnkuaG9zdCA9IHRydWVcbiAgICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIgJiYgZnVuY3Rpb25TdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKT8uaG9zdCkgc3VtbWFyeS5ob3N0ID0gdHJ1ZVxuICAgICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiAmJiBtZXRob2RTdW1tYXJpZXMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKT8uaG9zdCkgc3VtbWFyeS5ob3N0ID0gdHJ1ZVxuICAgIH0sIGZhbHNlKVxuICAgIHN1bW1hcmllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjb25zdHJ1Y3Rvci5pZCksIHN1bW1hcnkpXG4gIH1cbiAgcmV0dXJuIHN1bW1hcmllc1xufVxuXG4vKipcbiAqIFJlY29yZHMgb3IgdmVyaWZpZXMgb25lIGNoZWNrZWQgY2xhc3MtbWVtYmVyIHN1bW1hcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuTWV0aG9kRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ2xhc3MgbWVtYmVyLlxuICogQHBhcmFtIHtFZmZlY3RTdW1tYXJ5IHwgdW5kZWZpbmVkfSBzdW1tYXJ5IC0gQ29tcHV0ZWQgc3VtbWFyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplIC0gV2hldGhlciBtZXRhZGF0YSBtYXkgYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7KGNvZGU6IHN0cmluZywgZGV0YWlsOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uKSA9PiBuZXZlcn0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhcHBseURlY2xhcmF0aW9uU3VtbWFyeShkZWNsYXJhdGlvbiwgc3VtbWFyeSwgbm9ybWFsaXplLCBmYWlsKSB7XG4gIGlmICghc3VtbWFyeT8uaG9zdCkge1xuICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgIGRlbGV0ZSBkZWNsYXJhdGlvbi5lZmZlY3RzXG4gICAgICBkZWxldGUgZGVjbGFyYXRpb24uZmFpbHVyZUlkc1xuICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24uZWZmZWN0cyAhPT0gdW5kZWZpbmVkIHx8IGRlY2xhcmF0aW9uLmZhaWx1cmVJZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFpbChcIlVOREVDTEFSRURfRUZGRUNUXCIsIFwiUHVyZSBjbGFzcyBtZW1iZXIgY2FycmllcyBmb3JnZWQgZWZmZWN0IG1ldGFkYXRhLlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgZmFpbHVyZUlkcyA9IFsuLi5zdW1tYXJ5LmZhaWx1cmVJZHNdXG5cbiAgaWYgKG5vcm1hbGl6ZSkge1xuICAgIGRlY2xhcmF0aW9uLmVmZmVjdHMgPSBbXCJob3N0XCJdXG4gICAgZGVjbGFyYXRpb24uZmFpbHVyZUlkcyA9IGZhaWx1cmVJZHNcbiAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi5lZmZlY3RzPy5sZW5ndGggIT0gMSB8fCBkZWNsYXJhdGlvbi5lZmZlY3RzWzBdICE9IFwiaG9zdFwiIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uZmFpbHVyZUlkcykgfHwgZGVjbGFyYXRpb24uZmFpbHVyZUlkcy5qb2luKFwiLFwiKSAhPSBmYWlsdXJlSWRzLmpvaW4oXCIsXCIpKSB7XG4gICAgZmFpbChcIlVOREVDTEFSRURfRUZGRUNUXCIsIFwiQ2xhc3MgbWVtYmVyIGVmZmVjdCBzdW1tYXJ5IGRvZXMgbm90IG1hdGNoIGl0cyBib2R5LlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgZGV0ZXJtaW5pc3RpYyBlZmZlY3Qtc2l0ZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FsbEV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1ldGhvZENhbGxFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWZlcmVuY2VDb25zdHJ1Y3Rpb259IGV4cHJlc3Npb24gLSBFZmZlY3RmdWwgY2FsbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXRlIC0gRXhwZWN0ZWQgdHJhdmVyc2FsIGluZGV4LlxuICogQHBhcmFtIHsoY29kZTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU2l0ZShleHByZXNzaW9uLCBzaXRlLCBmYWlsKSB7XG4gIGlmIChleHByZXNzaW9uLmVmZmVjdFNpdGVJZCAhPSBgZWZmZWN0OiR7c2l0ZX1gKSB7XG4gICAgZmFpbChcIklOVkFMSURfRUZGRUNUX09SREVSXCIsIGBFZmZlY3Qgc2l0ZSAnJHtTdHJpbmcoZXhwcmVzc2lvbi5lZmZlY3RTaXRlSWQpfScgaXMgbm90IGV4cGVjdGVkIHNpdGUgJ2VmZmVjdDoke3NpdGV9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogVmlzaXRzIGV2ZXJ5IGV4cHJlc3Npb24gaW4gZGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgZXZhbHVhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gTW9kdWxlIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtFeHByZXNzaW9uVmlzaXRvcn0gdmlzaXRvciAtIEV4cHJlc3Npb24gdmlzaXRvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bvc3RvcmRlcl0gLSBWaXNpdCBjaGlsZHJlbiBiZWZvcmUgcGFyZW50cy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBmb3JFYWNoRXhwcmVzc2lvbihtb2R1bGUsIHZpc2l0b3IsIHBvc3RvcmRlciA9IGZhbHNlKSB7XG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcilcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKG1ldGhvZC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gIH1cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcilcbiAgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihtb2R1bGUuZW50cnlQb2ludC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG59XG5cbi8qKlxuICogVmlzaXRzIGV4cHJlc3Npb25zIGluIG9uZSBzdHJ1Y3R1cmVkIGJsb2NrLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIEJsb2NrIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIHtFeHByZXNzaW9uVmlzaXRvcn0gdmlzaXRvciAtIEV4cHJlc3Npb24gdmlzaXRvci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcG9zdG9yZGVyIC0gVmlzaXQgY2hpbGRyZW4gYmVmb3JlIHBhcmVudHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihibG9jaywgdmlzaXRvciwgcG9zdG9yZGVyKSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHZpc2l0KHN0YXRlbWVudC5pbml0aWFsaXplcilcbiAgICBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHZpc2l0KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgJiYgc3RhdGVtZW50LmV4cHJlc3Npb24pIHZpc2l0KHN0YXRlbWVudC5leHByZXNzaW9uKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgdmlzaXQoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB2aXNpdChzdGF0ZW1lbnQuY29uZGl0aW9uKTsgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihzdGF0ZW1lbnQuY29uc2VxdWVudCwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIGZvckVhY2hCbG9ja0V4cHJlc3Npb24oc3RhdGVtZW50LmFsdGVybmF0ZSwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KHN0YXRlbWVudC5saXN0KTsgZm9yRWFjaEJsb2NrRXhwcmVzc2lvbihzdGF0ZW1lbnQuYm9keSwgdmlzaXRvciwgcG9zdG9yZGVyKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KHN0YXRlbWVudC5tYXApOyBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKHN0YXRlbWVudC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KHN0YXRlbWVudC5jb25kaXRpb24pOyBmb3JFYWNoQmxvY2tFeHByZXNzaW9uKHN0YXRlbWVudC5ib2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJhaXNlU3RhdGVtZW50XCIpIHZpc2l0KHN0YXRlbWVudC5lcnJvci5tZXNzYWdlKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIGZvckVhY2hCbG9ja0V4cHJlc3Npb24oc3RhdGVtZW50LmJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcilcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBzdGF0ZW1lbnQuaGFuZGxlcnMpIGZvckVhY2hCbG9ja0V4cHJlc3Npb24oaGFuZGxlci5jYXRjaEJvZHksIHZpc2l0b3IsIHBvc3RvcmRlcilcbiAgICAgIGlmIChzdGF0ZW1lbnQuZmluYWxseUJvZHkpIGZvckVhY2hCbG9ja0V4cHJlc3Npb24oc3RhdGVtZW50LmZpbmFsbHlCb2R5LCB2aXNpdG9yLCBwb3N0b3JkZXIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBvbmUgZXhwcmVzc2lvbiBzdWJ0cmVlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gcm9vdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChleHByZXNzaW9uKSB7XG4gICAgaWYgKCFwb3N0b3JkZXIpIHZpc2l0b3IoZXhwcmVzc2lvbilcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGV4cHJlc3Npb25DaGlsZHJlbihleHByZXNzaW9uKSkgdmlzaXQoY2hpbGQpXG4gICAgaWYgKHBvc3RvcmRlcikgdmlzaXRvcihleHByZXNzaW9uKVxuICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIG9uZSBzZW1hbnRpYyBibG9jayByZWZlcmVuY2VzIGEgcmVzZXJ2ZWQgcHJvdGVjdGVkIHByb3ZpZGVyIGVudHJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm90ZWN0ZWQgZW50cnkgbmFtZSBpcyByZWZlcmVuY2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoYmxvY2spIHtcbiAgcmV0dXJuIGJsb2NrLnN0YXRlbWVudHMuc29tZShzdGF0ZW1lbnRSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkpXG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIG9uZSBzZW1hbnRpYyBzdGF0ZW1lbnQgcmVmZXJlbmNlcyBhIHJlc2VydmVkIHByb3RlY3RlZCBwcm92aWRlciBlbnRyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGEgcHJvdGVjdGVkIGVudHJ5IG5hbWUgaXMgcmVmZXJlbmNlZC5cbiAqL1xuZnVuY3Rpb24gc3RhdGVtZW50UmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudCkge1xuICBzd2l0Y2ggKHN0YXRlbWVudC5raW5kKSB7XG4gICAgY2FzZSBcIkxvY2FsRGVjbGFyYXRpb25cIjpcbiAgICAgIHJldHVybiBleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5pbml0aWFsaXplcilcbiAgICBjYXNlIFwiQXNzaWdubWVudFN0YXRlbWVudFwiOlxuICAgIGNhc2UgXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiOlxuICAgICAgcmV0dXJuIGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmV4cHJlc3Npb24pXG4gICAgY2FzZSBcIlJldHVyblN0YXRlbWVudFwiOlxuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uID8gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuZXhwcmVzc2lvbikgOiBmYWxzZVxuICAgIGNhc2UgXCJFeHByZXNzaW9uU3RhdGVtZW50XCI6XG4gICAgY2FzZSBcIlByaW50U3RhdGVtZW50XCI6XG4gICAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuZXhwcmVzc2lvbilcbiAgICBjYXNlIFwiSWZTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5jb25kaXRpb24pIHx8XG4gICAgICAgIGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5jb25zZXF1ZW50KSB8fFxuICAgICAgICAoc3RhdGVtZW50LmFsdGVybmF0ZSA/IGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5hbHRlcm5hdGUpIDogZmFsc2UpXG4gICAgY2FzZSBcIkZvckVhY2hTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5saXN0KSB8fCBibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuYm9keSlcbiAgICBjYXNlIFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiOlxuICAgICAgcmV0dXJuIGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50Lm1hcCkgfHwgYmxvY2tSZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkoc3RhdGVtZW50LmJvZHkpXG4gICAgY2FzZSBcIldoaWxlU3RhdGVtZW50XCI6XG4gICAgICByZXR1cm4gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuY29uZGl0aW9uKSB8fCBibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuYm9keSlcbiAgICBjYXNlIFwiUmFpc2VTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBleHByZXNzaW9uUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5lcnJvci5tZXNzYWdlKVxuICAgIGNhc2UgXCJUcnlTdGF0ZW1lbnRcIjpcbiAgICAgIHJldHVybiBibG9ja1JlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShzdGF0ZW1lbnQuYm9keSkgfHwgc3RhdGVtZW50LmhhbmRsZXJzLnNvbWUoKGhhbmRsZXIpID0+IGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KGhhbmRsZXIuY2F0Y2hCb2R5KSkgfHxcbiAgICAgICAgKHN0YXRlbWVudC5maW5hbGx5Qm9keSA/IGJsb2NrUmVmZXJlbmNlc1Byb3RlY3RlZEVudHJ5KHN0YXRlbWVudC5maW5hbGx5Qm9keSkgOiBmYWxzZSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgb25lIHNlbWFudGljIGV4cHJlc3Npb24gcmVmZXJlbmNlcyBhIHJlc2VydmVkIHByb3RlY3RlZCBwcm92aWRlciBlbnRyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGEgcHJvdGVjdGVkIGVudHJ5IG5hbWUgaXMgcmVmZXJlbmNlZC5cbiAqL1xuZnVuY3Rpb24gZXhwcmVzc2lvblJlZmVyZW5jZXNQcm90ZWN0ZWRFbnRyeShleHByZXNzaW9uKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiICYmIHBhcnNlUHJvdGVjdGVkRW50cnlOYW1lKGV4cHJlc3Npb24ubmFtZSkgIT09IG51bGwpIHJldHVybiB0cnVlXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiICYmIHBhcnNlUHJvdGVjdGVkRW50cnlOYW1lKGV4cHJlc3Npb24uY2FsbGVlKSAhPT0gbnVsbCkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGV4cHJlc3Npb25DaGlsZHJlbihleHByZXNzaW9uKS5zb21lKGV4cHJlc3Npb25SZWZlcmVuY2VzUHJvdGVjdGVkRW50cnkpXG59XG5cbi8qKlxuICogUmV0dXJucyBzZW1hbnRpYyBjaGlsZCBleHByZXNzaW9ucyBpbiBldmFsdWF0aW9uIG9yZGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBQYXJlbnQgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb25bXX0gQ2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGV4cHJlc3Npb25DaGlsZHJlbihleHByZXNzaW9uKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIgfHxcbiAgICBleHByZXNzaW9uLmtpbmQgPT0gXCJSZWNvcmRDb25zdHJ1Y3Rpb25cIikgcmV0dXJuIGV4cHJlc3Npb24uYXJndW1lbnRzXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ucmVjZWl2ZXIsIC4uLmV4cHJlc3Npb24uYXJndW1lbnRzXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24uZXhwcmVzc2lvbl1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmxlZnQsIGV4cHJlc3Npb24ucmlnaHRdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmNvbmRpdGlvbiwgZXhwcmVzc2lvbi5jb25zZXF1ZW50LCBleHByZXNzaW9uLmFsdGVybmF0ZV1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ub3BlcmFuZF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsU29tZVwiKSByZXR1cm4gW2V4cHJlc3Npb24udmFsdWVdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsVW53cmFwXCIpIHJldHVybiBbZXhwcmVzc2lvbi5vcGVyYW5kXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdExpdGVyYWxcIikgcmV0dXJuIGV4cHJlc3Npb24uZWxlbWVudHNcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExpdGVyYWxcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSByZXR1cm4gZXhwcmVzc2lvbi5lbnRyaWVzLm1hcCgoe3ZhbHVlfSkgPT4gdmFsdWUpXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmluZGV4XVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5rZXldXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmNvbGxlY3Rpb25dXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZW1iZXJSZWFkXCIpIHJldHVybiBbZXhwcmVzc2lvbi5yZWNlaXZlcl1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikgcmV0dXJuIFtleHByZXNzaW9uLnJlY2VpdmVyXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRXJyb3JNZXNzYWdlUmVhZFwiKSByZXR1cm4gW2V4cHJlc3Npb24ucmVjZWl2ZXJdXG4gIHJldHVybiBbXVxufVxuIl19
|