semantifold 0.3.0 → 0.5.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 +61 -15
- package/build/index.d.ts +52 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +60 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1274 -0
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +160 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +33 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +138 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +83 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1309 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2174 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +255 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +491 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +177 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +3108 -178
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +730 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/android.md +79 -0
- package/docs/architecture.md +47 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +238 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +17 -7
- package/docs/specification.md +5 -0
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +381 -4
- package/docs/webassembly.md +52 -0
- package/index.js +66 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/android.js +1370 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +166 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +144 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1408 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2314 -115
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +545 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +182 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +810 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
import { emitExpression } from "./shared.js";
|
|
3
|
-
import {
|
|
2
|
+
import { emitExpression, emitType } from "./shared.js";
|
|
3
|
+
import { emitEffectPrefixes, emitEffectSupport } from "./effects.js";
|
|
4
4
|
/**
|
|
5
5
|
* Emits an independently executable PHP program through the source-aware writer.
|
|
6
6
|
* @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
|
|
@@ -8,10 +8,105 @@ import { emitScalarType } from "./scalars.js";
|
|
|
8
8
|
* @returns {void}
|
|
9
9
|
*/
|
|
10
10
|
export function generatePhp(module, writer) {
|
|
11
|
-
writer.
|
|
11
|
+
if (writer.program)
|
|
12
|
+
emitProgramHeader(module, writer);
|
|
13
|
+
else
|
|
14
|
+
writer.synthetic("<?php\ndeclare(strict_types=1);\n\n", "PHP program scaffolding", [module]);
|
|
15
|
+
emitEffectSupport(writer, module, "php");
|
|
16
|
+
const records = module.records ?? [];
|
|
17
|
+
const classes = module.classes ?? [];
|
|
18
|
+
const errors = module.errors ?? [];
|
|
19
|
+
errors.forEach((error, index) => {
|
|
20
|
+
const path = `/errors/${index}`;
|
|
21
|
+
if (index > 0)
|
|
22
|
+
writer.synthetic("\n\n", "error declaration separator", [error], [path]);
|
|
23
|
+
writer.mapped("final class", { mappingKind: "anchor", node: error, path });
|
|
24
|
+
writer.synthetic(" ", "error declaration spacing", [error], [path]);
|
|
25
|
+
writer.mapped(error.name, { mappingKind: "exact", node: error, path, role: "name" });
|
|
26
|
+
writer.synthetic(writer.program ? " extends \\RuntimeException {}" : " extends RuntimeException {}", "PHP unchecked error scaffolding", [error], [path]);
|
|
27
|
+
});
|
|
28
|
+
if (errors.length > 0)
|
|
29
|
+
writer.synthetic("\n\n", "error/declaration separator", [module]);
|
|
30
|
+
records.forEach((record, recordIndex) => {
|
|
31
|
+
const recordPath = `/records/${recordIndex}`;
|
|
32
|
+
if (recordIndex > 0)
|
|
33
|
+
writer.synthetic("\n\n", "record declaration separator", [record], [recordPath]);
|
|
34
|
+
emitTemplateDocumentation(writer, record.typeParameters ?? [], `${recordPath}/typeParameters`);
|
|
35
|
+
if ((record.typeParameters?.length ?? 0) > 0) {
|
|
36
|
+
emitDocumentedGenericRecord(writer, record, recordPath);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
writer.mapped("final readonly class", { mappingKind: "anchor", node: record, path: recordPath });
|
|
40
|
+
writer.synthetic(" ", "record declaration spacing", [record], [recordPath]);
|
|
41
|
+
writer.mapped(record.name, { mappingKind: "exact", node: record, path: recordPath, role: "name" });
|
|
42
|
+
writer.synthetic(" {\n", "record class scaffolding", [record], [recordPath]);
|
|
43
|
+
const documented = record.fields.filter((field) => phpTypeNeedsDocumentation(field.type));
|
|
44
|
+
if (documented.length > 0) {
|
|
45
|
+
writer.synthetic(" /**\n", "PHP record type scaffolding", [record], [recordPath]);
|
|
46
|
+
for (const field of documented) {
|
|
47
|
+
const fieldIndex = record.fields.indexOf(field);
|
|
48
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
49
|
+
writer.synthetic(" * @param ", "PHP record type scaffolding", [field], [fieldPath]);
|
|
50
|
+
emitType(writer, field.type, `${fieldPath}/type`, "php");
|
|
51
|
+
writer.synthetic(" ", "PHP record type scaffolding", [field], [fieldPath]);
|
|
52
|
+
writer.mapped(`$${field.name}`, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
53
|
+
writer.synthetic("\n", "PHP record type scaffolding", [field], [fieldPath]);
|
|
54
|
+
}
|
|
55
|
+
writer.synthetic(" */\n", "PHP record type scaffolding", [record], [recordPath]);
|
|
56
|
+
}
|
|
57
|
+
writer.synthetic(" public function __construct(\n", "PHP record constructor scaffolding", [record], [recordPath]);
|
|
58
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
59
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
60
|
+
writer.synthetic(" public ", "PHP promoted field scaffolding", [field], [fieldPath]);
|
|
61
|
+
emitNativePhpType(writer, field.type, `${fieldPath}/type`);
|
|
62
|
+
if (hasNativePhpType(field.type))
|
|
63
|
+
writer.synthetic(" ", "PHP promoted field spacing", [field], [fieldPath]);
|
|
64
|
+
writer.mapped(`$${field.name}`, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
65
|
+
writer.synthetic(fieldIndex + 1 == record.fields.length ? "\n" : ",\n", "PHP promoted field separator", [field], [fieldPath]);
|
|
66
|
+
});
|
|
67
|
+
writer.synthetic(" ) {}\n}", "PHP record constructor scaffolding", [record], [recordPath]);
|
|
68
|
+
});
|
|
69
|
+
if (records.length > 0)
|
|
70
|
+
writer.synthetic("\n\n", "record/function separator", [module]);
|
|
71
|
+
classes.forEach((declaration, classIndex) => {
|
|
72
|
+
if (classIndex > 0)
|
|
73
|
+
writer.synthetic("\n\n", "reference class separator", [declaration], [`/classes/${classIndex}`]);
|
|
74
|
+
emitReferenceClass(writer, declaration, classIndex);
|
|
75
|
+
});
|
|
76
|
+
if (classes.length > 0)
|
|
77
|
+
writer.synthetic("\n\n", "reference class/function separator", [module]);
|
|
12
78
|
module.functions.forEach((declaration, functionIndex) => {
|
|
13
79
|
if (functionIndex > 0)
|
|
14
80
|
writer.synthetic("\n\n", "declaration separator", [declaration]);
|
|
81
|
+
const documentedParameters = declaration.parameters.map((parameter, index) => [parameter, index])
|
|
82
|
+
.filter(([parameter]) => phpTypeNeedsDocumentation(/** @type {import("../semantic/types.js").Parameter} */ (parameter).type));
|
|
83
|
+
const documentedReturn = phpTypeNeedsDocumentation(declaration.returnType);
|
|
84
|
+
if ((declaration.typeParameters?.length ?? 0) > 0 || documentedParameters.length > 0 || documentedReturn) {
|
|
85
|
+
writer.synthetic("/**\n", "PHP collection type scaffolding", [declaration]);
|
|
86
|
+
for (const [parameterIndex, parameter] of (declaration.typeParameters ?? []).entries()) {
|
|
87
|
+
writer.synthetic(" * @template ", "PHP type parameter scaffolding", [parameter], [`/functions/${functionIndex}/typeParameters/${parameterIndex}`]);
|
|
88
|
+
writer.mapped(parameter.name, {
|
|
89
|
+
mappingKind: "exact", node: parameter, path: `/functions/${functionIndex}/typeParameters/${parameterIndex}`, role: "name"
|
|
90
|
+
});
|
|
91
|
+
writer.synthetic("\n", "line break", [parameter]);
|
|
92
|
+
}
|
|
93
|
+
for (const [candidate, index] of documentedParameters) {
|
|
94
|
+
const parameter = /** @type {import("../semantic/types.js").Parameter} */ (candidate);
|
|
95
|
+
const parameterIndex = /** @type {number} */ (index);
|
|
96
|
+
const parameterPath = `/functions/${functionIndex}/parameters/${parameterIndex}`;
|
|
97
|
+
writer.synthetic(" * @param ", "PHP collection type scaffolding", [parameter], [parameterPath]);
|
|
98
|
+
emitType(writer, parameter.type, `${parameterPath}/type`, "php");
|
|
99
|
+
writer.synthetic(" ", "PHP collection type scaffolding", [parameter], [parameterPath]);
|
|
100
|
+
writer.mapped(`$${parameter.name}`, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
101
|
+
writer.synthetic("\n", "PHP collection type scaffolding", [parameter], [parameterPath]);
|
|
102
|
+
}
|
|
103
|
+
if (documentedReturn) {
|
|
104
|
+
writer.synthetic(" * @return ", "PHP collection type scaffolding", [declaration]);
|
|
105
|
+
emitType(writer, declaration.returnType, `/functions/${functionIndex}/returnType`, "php");
|
|
106
|
+
writer.synthetic("\n", "PHP collection type scaffolding", [declaration]);
|
|
107
|
+
}
|
|
108
|
+
writer.synthetic(" */\n", "PHP collection type scaffolding", [declaration]);
|
|
109
|
+
}
|
|
15
110
|
writer.mapped("function", { mappingKind: "anchor", node: declaration });
|
|
16
111
|
writer.synthetic(" ", "function spacing", [declaration]);
|
|
17
112
|
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
|
|
@@ -20,31 +115,250 @@ export function generatePhp(module, writer) {
|
|
|
20
115
|
const parameterPath = `/functions/${functionIndex}/parameters/${index}`;
|
|
21
116
|
if (index > 0)
|
|
22
117
|
writer.synthetic(", ", "parameter separator", [declaration]);
|
|
23
|
-
writer
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
path: `${parameterPath}/type`,
|
|
27
|
-
role: "type"
|
|
28
|
-
});
|
|
29
|
-
writer.synthetic(" ", "parameter spacing", [parameter], [parameterPath]);
|
|
118
|
+
emitNativePhpType(writer, parameter.type, `${parameterPath}/type`);
|
|
119
|
+
if (hasNativePhpType(parameter.type))
|
|
120
|
+
writer.synthetic(" ", "parameter spacing", [parameter], [parameterPath]);
|
|
30
121
|
writer.mapped(`$${parameter.name}`, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
31
122
|
});
|
|
32
123
|
writer.mapped(")", { mappingKind: "anchor", node: declaration });
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
path: `/functions/${functionIndex}/returnType`,
|
|
38
|
-
role: "type"
|
|
39
|
-
});
|
|
124
|
+
if (hasNativePhpType(declaration.returnType)) {
|
|
125
|
+
writer.synthetic(": ", "return type separator", [declaration]);
|
|
126
|
+
emitNativePhpType(writer, declaration.returnType, `/functions/${functionIndex}/returnType`);
|
|
127
|
+
}
|
|
40
128
|
writer.synthetic("\n", "line break", [declaration]);
|
|
41
129
|
writer.mapped("{", { mappingKind: "anchor", node: declaration });
|
|
42
130
|
writer.synthetic("\n", "line break", [declaration]);
|
|
43
131
|
emitBlock(writer, declaration.body, " ", `/functions/${functionIndex}/body`);
|
|
44
132
|
writer.mapped("}", { mappingKind: "anchor", node: declaration });
|
|
45
133
|
});
|
|
46
|
-
writer.
|
|
47
|
-
|
|
134
|
+
if (!writer.program || writer.isProgramEntry()) {
|
|
135
|
+
writer.synthetic("\n\n", "entry-point separator", [module.entryPoint]);
|
|
136
|
+
emitBlock(writer, module.entryPoint.body, "", "/entryPoint/body");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Emits one native PHP reference class.
|
|
141
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
142
|
+
* @param {import("../semantic/types.js").ClassDeclaration} declaration - Reference class.
|
|
143
|
+
* @param {number} classIndex - Module class index.
|
|
144
|
+
* @returns {void}
|
|
145
|
+
*/
|
|
146
|
+
function emitReferenceClass(writer, declaration, classIndex) {
|
|
147
|
+
const path = `/classes/${classIndex}`;
|
|
148
|
+
writer.mapped("final class", { mappingKind: "anchor", node: declaration, path });
|
|
149
|
+
writer.synthetic(" ", "reference class spacing", [declaration], [path]);
|
|
150
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, path, role: "name" });
|
|
151
|
+
writer.synthetic(" {\n", "reference class open", [declaration], [path]);
|
|
152
|
+
declaration.fields.forEach((field, index) => {
|
|
153
|
+
const fieldPath = `${path}/fields/${index}`;
|
|
154
|
+
writer.synthetic(" private ", "private field scaffolding", [field], [fieldPath]);
|
|
155
|
+
emitNativePhpType(writer, field.type, `${fieldPath}/type`);
|
|
156
|
+
writer.synthetic(" $", "private field spacing", [field], [fieldPath]);
|
|
157
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
158
|
+
writer.synthetic(";\n", "line break", [field], [fieldPath]);
|
|
159
|
+
});
|
|
160
|
+
const constructor = declaration.constructor;
|
|
161
|
+
const constructorPath = `${path}/constructor`;
|
|
162
|
+
writer.synthetic("\n public function ", "constructor scaffolding", [constructor], [constructorPath]);
|
|
163
|
+
writer.mapped("__construct", { mappingKind: "exact", node: constructor, path: constructorPath, role: "constructor" });
|
|
164
|
+
emitPhpParameters(writer, constructor.parameters, `${constructorPath}/parameters`);
|
|
165
|
+
writer.synthetic(" {\n", "constructor open", [constructor], [constructorPath]);
|
|
166
|
+
emitBlock(writer, constructor.body, " ", `${constructorPath}/body`);
|
|
167
|
+
writer.synthetic(" }", "constructor close", [constructor], [constructorPath]);
|
|
168
|
+
declaration.methods.forEach((method, index) => {
|
|
169
|
+
const methodPath = `${path}/methods/${index}`;
|
|
170
|
+
writer.synthetic("\n\n public function ", "method scaffolding", [method], [methodPath]);
|
|
171
|
+
writer.mapped(method.name, { mappingKind: "exact", node: method, path: methodPath, role: "name" });
|
|
172
|
+
emitPhpParameters(writer, method.parameters, `${methodPath}/parameters`);
|
|
173
|
+
writer.synthetic(": ", "method return separator", [method], [methodPath]);
|
|
174
|
+
emitNativePhpType(writer, method.returnType, `${methodPath}/returnType`);
|
|
175
|
+
writer.synthetic(" {\n", "method open", [method], [methodPath]);
|
|
176
|
+
emitBlock(writer, method.body, " ", `${methodPath}/body`);
|
|
177
|
+
writer.synthetic(" }", "method close", [method], [methodPath]);
|
|
178
|
+
});
|
|
179
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
180
|
+
writer.mapped("}", { mappingKind: "anchor", node: declaration, path });
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Emits one PHP parameter list.
|
|
184
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
185
|
+
* @param {import("../semantic/types.js").Parameter[]} parameters - Ordered parameters.
|
|
186
|
+
* @param {string} path - Parameter collection path.
|
|
187
|
+
* @returns {void}
|
|
188
|
+
*/
|
|
189
|
+
function emitPhpParameters(writer, parameters, path) {
|
|
190
|
+
writer.synthetic("(", "parameter list open", parameters);
|
|
191
|
+
parameters.forEach((parameter, index) => {
|
|
192
|
+
const parameterPath = `${path}/${index}`;
|
|
193
|
+
if (index)
|
|
194
|
+
writer.synthetic(", ", "parameter separator", parameters);
|
|
195
|
+
emitNativePhpType(writer, parameter.type, `${parameterPath}/type`);
|
|
196
|
+
writer.synthetic(" $", "parameter spacing", [parameter], [parameterPath]);
|
|
197
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
198
|
+
});
|
|
199
|
+
writer.synthetic(")", "parameter list close", parameters);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Emits PHP's exact documented generic-record profile. Private promoted storage
|
|
203
|
+
* plus public getters preserves record immutability when a type variable has no
|
|
204
|
+
* faithful native property type.
|
|
205
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
206
|
+
* @param {import("../semantic/types.js").RecordDeclaration} record - Generic semantic record.
|
|
207
|
+
* @param {string} recordPath - Exact record path.
|
|
208
|
+
*/
|
|
209
|
+
function emitDocumentedGenericRecord(writer, record, recordPath) {
|
|
210
|
+
writer.mapped("final class", { mappingKind: "anchor", node: record, path: recordPath });
|
|
211
|
+
writer.synthetic(" ", "record declaration spacing", [record], [recordPath]);
|
|
212
|
+
writer.mapped(record.name, { mappingKind: "exact", node: record, path: recordPath, role: "name" });
|
|
213
|
+
writer.synthetic(" {\n /**\n", "PHP documented generic record scaffolding", [record], [recordPath]);
|
|
214
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
215
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
216
|
+
writer.synthetic(" * @param ", "PHP documented generic record scaffolding", [field], [fieldPath]);
|
|
217
|
+
emitType(writer, field.type, `${fieldPath}/type`, "php");
|
|
218
|
+
writer.synthetic(" ", "PHP documented generic record scaffolding", [field], [fieldPath]);
|
|
219
|
+
writer.mapped(`$${field.name}`, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
220
|
+
writer.synthetic("\n", "PHP documented generic record scaffolding", [field], [fieldPath]);
|
|
221
|
+
});
|
|
222
|
+
writer.synthetic(" */\n public function __construct(\n", "PHP documented generic record scaffolding", [record], [recordPath]);
|
|
223
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
224
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
225
|
+
writer.synthetic(" private ", "PHP private promoted field scaffolding", [field], [fieldPath]);
|
|
226
|
+
emitNativePhpType(writer, field.type, `${fieldPath}/type`);
|
|
227
|
+
if (hasNativePhpType(field.type))
|
|
228
|
+
writer.synthetic(" ", "PHP promoted field spacing", [field], [fieldPath]);
|
|
229
|
+
writer.mapped(`$${field.name}`, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
230
|
+
writer.synthetic(fieldIndex + 1 == record.fields.length ? "\n" : ",\n", "PHP promoted field separator", [field], [fieldPath]);
|
|
231
|
+
});
|
|
232
|
+
writer.synthetic(" ) {}", "PHP documented generic record scaffolding", [record], [recordPath]);
|
|
233
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
234
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
235
|
+
writer.synthetic("\n\n /**\n * @return ", "PHP documented generic getter scaffolding", [field], [fieldPath]);
|
|
236
|
+
emitType(writer, field.type, `${fieldPath}/type`, "php");
|
|
237
|
+
writer.synthetic("\n */\n public function ", "PHP documented generic getter scaffolding", [field], [fieldPath]);
|
|
238
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
239
|
+
writer.synthetic("()", "PHP documented generic getter scaffolding", [field], [fieldPath]);
|
|
240
|
+
if (hasNativePhpType(field.type)) {
|
|
241
|
+
writer.synthetic(": ", "PHP getter return type spacing", [field], [fieldPath]);
|
|
242
|
+
emitNativePhpType(writer, field.type, `${fieldPath}/type`);
|
|
243
|
+
}
|
|
244
|
+
writer.synthetic(" {\n return $this->", "PHP documented generic getter scaffolding", [field], [fieldPath]);
|
|
245
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
246
|
+
writer.synthetic(";\n }", "PHP documented generic getter scaffolding", [field], [fieldPath]);
|
|
247
|
+
});
|
|
248
|
+
writer.synthetic("\n}", "PHP documented generic record scaffolding", [record], [recordPath]);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Emits a standalone PHPDoc template block.
|
|
252
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
253
|
+
* @param {import("../semantic/types.js").TypeParameter[]} parameters - Ordered type parameters.
|
|
254
|
+
* @param {string} path - Type-parameter collection path.
|
|
255
|
+
*/
|
|
256
|
+
function emitTemplateDocumentation(writer, parameters, path) {
|
|
257
|
+
if (parameters.length == 0)
|
|
258
|
+
return;
|
|
259
|
+
writer.synthetic("/**\n", "PHP type parameter scaffolding", parameters);
|
|
260
|
+
parameters.forEach((parameter, index) => {
|
|
261
|
+
writer.synthetic(" * @template ", "PHP type parameter scaffolding", [parameter], [`${path}/${index}`]);
|
|
262
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${path}/${index}`, role: "name" });
|
|
263
|
+
writer.synthetic("\n", "line break", [parameter]);
|
|
264
|
+
});
|
|
265
|
+
writer.synthetic(" */\n", "PHP type parameter scaffolding", parameters);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Emits one canonical namespace, explicit imports, and matching literal load edges.
|
|
269
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current program module.
|
|
270
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
271
|
+
*/
|
|
272
|
+
function emitProgramHeader(module, writer) {
|
|
273
|
+
const programModule = /** @type {import("../semantic/types.js").SemanticProgramModule} */ ( /** @type {unknown} */(module));
|
|
274
|
+
writer.synthetic(`<?php\ndeclare(strict_types=1);\nnamespace Semantifold\\Generated\\${writer.programModuleName(programModule.id)};\n`, "PHP semantic namespace", [module]);
|
|
275
|
+
for (const imported of programModule.imports) {
|
|
276
|
+
const dependency = writer.programModuleName(imported.moduleId);
|
|
277
|
+
const prefix = imported.symbolKind == "function" ? "use function" : "use";
|
|
278
|
+
const importPath = `/imports/${programModule.imports.indexOf(imported)}`;
|
|
279
|
+
const localName = writer.importNameFor(imported);
|
|
280
|
+
writer.synthetic(`${prefix} Semantifold\\Generated\\${dependency}\\`, "PHP semantic import", [imported], [importPath]);
|
|
281
|
+
writer.mapped(imported.importedName, { mappingKind: "exact", node: imported, path: importPath, role: "importedName" });
|
|
282
|
+
if (localName != imported.importedName) {
|
|
283
|
+
writer.synthetic(" as ", "PHP semantic import alias", [imported], [importPath]);
|
|
284
|
+
writer.mapped(localName, { mappingKind: "exact", node: imported, path: importPath, role: "localName" });
|
|
285
|
+
}
|
|
286
|
+
writer.synthetic(";\n", "PHP semantic import terminator", [imported], [importPath]);
|
|
287
|
+
}
|
|
288
|
+
for (const moduleId of [...new Set(programModule.imports.map((item) => item.moduleId))]) {
|
|
289
|
+
const relative = writer.relativeModuleSpecifier(moduleId).replace(/^\.\//u, "");
|
|
290
|
+
const imported = /** @type {import("../semantic/types.js").SemanticImport} */ (programModule.imports.find((item) => item.moduleId == moduleId));
|
|
291
|
+
const importPath = `/imports/${programModule.imports.indexOf(imported)}`;
|
|
292
|
+
writer.synthetic("require_once __DIR__ . ", "PHP require-once edge", [imported], [importPath]);
|
|
293
|
+
writer.mapped(JSON.stringify(`/${relative}`), { mappingKind: "anchor", node: imported, path: importPath, role: "path" });
|
|
294
|
+
writer.synthetic(";\n", "PHP require-once terminator", [imported], [importPath]);
|
|
295
|
+
}
|
|
296
|
+
if (writer.stdlibProviderEntries) {
|
|
297
|
+
for (const providerPath of writer.stdlibProviderPaths ?? []) {
|
|
298
|
+
const relative = writer.stdlibProviderSpecifier(undefined, providerPath).replace(/^\.\//u, "");
|
|
299
|
+
writer.synthetic("require_once __DIR__ . ", "PHP stdlib provider require-once edge", [module]);
|
|
300
|
+
writer.synthetic(JSON.stringify(`/${relative}`), "PHP stdlib provider require-once path", [module]);
|
|
301
|
+
writer.synthetic(";\n", "PHP stdlib provider require-once terminator", [module]);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
writer.synthetic("\n", "PHP namespace/declaration separator", [module]);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Returns whether a PHP native type needs an accompanying recursive PHPDoc type.
|
|
308
|
+
* @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
|
|
309
|
+
* @returns {boolean} Whether the type contains a collection.
|
|
310
|
+
*/
|
|
311
|
+
function phpTypeNeedsDocumentation(type) {
|
|
312
|
+
return type.kind == "TypeVariableReference" || type.kind == "ListType" || type.kind == "MapType" ||
|
|
313
|
+
type.kind == "OrderedMapType" ||
|
|
314
|
+
type.kind == "RecordType" && (type.arguments?.length ?? 0) > 0 ||
|
|
315
|
+
type.kind == "OptionalType" && phpTypeNeedsDocumentation(type.valueType);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Emits the exact native PHP carrier while retaining recursive type mappings.
|
|
319
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
320
|
+
* @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
|
|
321
|
+
* @param {string} path - Exact type occurrence path.
|
|
322
|
+
* @returns {void}
|
|
323
|
+
*/
|
|
324
|
+
function emitNativePhpType(writer, type, path) {
|
|
325
|
+
if (type.kind == "TypeVariableReference" || type.kind == "OptionalType" && type.valueType.kind == "TypeVariableReference")
|
|
326
|
+
return;
|
|
327
|
+
if (type.kind == "RecordType") {
|
|
328
|
+
const record = writer.recordForId(type.declarationId);
|
|
329
|
+
writer.mapped(writer.recordNameForId(type.declarationId), {
|
|
330
|
+
mappingKind: "exact", name: record.name, node: type, path, role: "type"
|
|
331
|
+
});
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
if (type.kind == "ReferenceType" || type.kind == "OwnedResourceType" || type.kind == "OwnedReferenceType") {
|
|
335
|
+
emitType(writer, type, path, "php");
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (type.kind == "TypeReference") {
|
|
339
|
+
emitType(writer, type, path, "php");
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (type.kind == "OptionalType") {
|
|
343
|
+
writer.mapped("?", { mappingKind: "exact", node: type, path, role: "type" });
|
|
344
|
+
if (type.valueType.kind == "RecordType")
|
|
345
|
+
emitNativePhpType(writer, type.valueType, `${path}/valueType`);
|
|
346
|
+
else if (type.valueType.kind == "TypeReference")
|
|
347
|
+
emitType(writer, type.valueType, `${path}/valueType`, "php");
|
|
348
|
+
else
|
|
349
|
+
writer.mapped("array", { mappingKind: "anchor", node: type, path });
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
writer.mapped("array", { mappingKind: "exact", node: type, path, role: "type" });
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Returns whether PHP has a faithful native carrier for one exact semantic type.
|
|
356
|
+
* @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
|
|
357
|
+
* @returns {boolean} Whether a native annotation can be emitted.
|
|
358
|
+
*/
|
|
359
|
+
function hasNativePhpType(type) {
|
|
360
|
+
return type.kind != "TypeVariableReference" &&
|
|
361
|
+
!(type.kind == "OptionalType" && type.valueType.kind == "TypeVariableReference");
|
|
48
362
|
}
|
|
49
363
|
/**
|
|
50
364
|
* Emits one ordered PHP block body.
|
|
@@ -66,12 +380,123 @@ function emitBlock(writer, block, indent, path) {
|
|
|
66
380
|
* @returns {void}
|
|
67
381
|
*/
|
|
68
382
|
function emitStatement(writer, statement, indent, path) {
|
|
383
|
+
emitEffectPrefixes(writer, statement, indent, path, "php", (expression, expressionPath) => emitExpression(writer, expression, expressionPath, "php", phpIdentifier));
|
|
69
384
|
if (statement.kind == "LocalDeclaration" || statement.kind == "AssignmentStatement")
|
|
70
385
|
return emitLocal(writer, statement, indent, path);
|
|
71
386
|
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
387
|
+
if (statement.kind == "PrivateFieldWriteStatement") {
|
|
388
|
+
emitExpression(writer, statement.receiver, `${path}/receiver`, "php", phpIdentifier);
|
|
389
|
+
const field = writer.privateFieldForId(statement.field);
|
|
390
|
+
writer.mapped(`->${field.name}`, { mappingKind: "exact", name: field.name, node: statement, path, role: "member" });
|
|
391
|
+
writer.synthetic(" = ", "private field assignment", [statement], [path]);
|
|
392
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "php", phpIdentifier);
|
|
393
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
394
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
if (statement.kind == "BreakStatement" || statement.kind == "ContinueStatement") {
|
|
398
|
+
writer.mapped(statement.kind == "BreakStatement" ? "break" : "continue", { mappingKind: "exact", node: statement, path });
|
|
399
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
400
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (statement.kind == "WhileStatement") {
|
|
404
|
+
writer.mapped("while", { mappingKind: "exact", node: statement, path });
|
|
405
|
+
writer.synthetic(" (", "condition-controlled loop spacing", [statement], [path]);
|
|
406
|
+
emitExpression(writer, statement.condition, `${path}/condition`, "php", phpIdentifier);
|
|
407
|
+
writer.synthetic(") ", "condition-controlled loop spacing", [statement], [path]);
|
|
408
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
409
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
410
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
411
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
412
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
413
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
if (statement.kind == "ForEachStatement") {
|
|
417
|
+
writer.mapped("foreach", { mappingKind: "anchor", node: statement, path });
|
|
418
|
+
writer.synthetic(" (", "loop scaffolding", [statement], [path]);
|
|
419
|
+
emitExpression(writer, statement.list, `${path}/list`, "php", phpIdentifier);
|
|
420
|
+
writer.synthetic(" as ", "loop scaffolding", [statement], [path]);
|
|
421
|
+
writer.mapped(`$${statement.valueBinding.name}`, {
|
|
422
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
423
|
+
});
|
|
424
|
+
writer.synthetic(") ", "loop scaffolding", [statement], [path]);
|
|
425
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
426
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
427
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
428
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
429
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
430
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (statement.kind == "ForEachMapStatement") {
|
|
434
|
+
writer.mapped("foreach", { mappingKind: "anchor", node: statement, path });
|
|
435
|
+
writer.synthetic(" (", "map loop scaffolding", [statement], [path]);
|
|
436
|
+
emitExpression(writer, statement.map, `${path}/map`, "php", phpIdentifier);
|
|
437
|
+
writer.synthetic(" as ", "map loop scaffolding", [statement], [path]);
|
|
438
|
+
writer.mapped(`$${statement.keyBinding.name}`, {
|
|
439
|
+
mappingKind: "exact", node: statement.keyBinding, path: `${path}/keyBinding`, role: "name"
|
|
440
|
+
});
|
|
441
|
+
writer.synthetic(" => ", "map iteration binding separator", [statement], [path]);
|
|
442
|
+
writer.mapped(`$${statement.valueBinding.name}`, {
|
|
443
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
444
|
+
});
|
|
445
|
+
writer.synthetic(") ", "map loop scaffolding", [statement], [path]);
|
|
446
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
447
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
448
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
449
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
450
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
451
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
if (statement.kind == "RaiseStatement") {
|
|
455
|
+
const type = statement.error.error;
|
|
456
|
+
const error = writer.errorForId(type.declarationId);
|
|
457
|
+
writer.mapped("throw", { mappingKind: "anchor", node: statement, path });
|
|
458
|
+
writer.synthetic(" new ", "error construction scaffolding", [statement.error], [`${path}/error`]);
|
|
459
|
+
writer.mapped(writer.errorNameForId(type.declarationId), { mappingKind: "exact", name: error.name, node: statement.error, path: `${path}/error`, role: "type" });
|
|
460
|
+
writer.synthetic("(", "error construction open", [statement.error], [`${path}/error`]);
|
|
461
|
+
emitExpression(writer, statement.error.message, `${path}/error/message`, "php", phpIdentifier);
|
|
462
|
+
writer.synthetic(");\n", "error construction close", [statement.error], [`${path}/error`]);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
if (statement.kind == "TryStatement") {
|
|
466
|
+
const caught = writer.errorForId(statement.catchType.declarationId);
|
|
467
|
+
writer.mapped("try", { mappingKind: "anchor", node: statement, path });
|
|
468
|
+
writer.synthetic(" ", "try spacing", [statement], [path]);
|
|
469
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
470
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
471
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`);
|
|
472
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
473
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
474
|
+
writer.synthetic(" ", "catch spacing", [statement], [path]);
|
|
475
|
+
writer.mapped("catch", { mappingKind: "anchor", node: statement, path, role: "catch" });
|
|
476
|
+
writer.synthetic(" (", "catch binding scaffolding", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
477
|
+
writer.mapped(writer.errorNameForId(statement.catchType.declarationId), { mappingKind: "exact", name: caught.name, node: statement.catchType, path: `${path}/catchType`, role: "type" });
|
|
478
|
+
writer.synthetic(" ", "catch binding spacing", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
479
|
+
writer.mapped(`$${statement.catchBinding.name}`, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
480
|
+
writer.synthetic(") ", "catch binding scaffolding", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
481
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.catchBody, path: `${path}/catchBody` });
|
|
482
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
483
|
+
emitBlock(writer, statement.catchBody, `${indent} `, `${path}/catchBody`);
|
|
484
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
485
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.catchBody, path: `${path}/catchBody` });
|
|
486
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
72
489
|
if (statement.kind == "ReturnStatement") {
|
|
73
490
|
writer.mapped("return", { mappingKind: "anchor", node: statement, path });
|
|
74
|
-
|
|
491
|
+
if (statement.expression) {
|
|
492
|
+
writer.synthetic(" ", "return spacing", [statement], [path]);
|
|
493
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "php", phpIdentifier);
|
|
494
|
+
}
|
|
495
|
+
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
496
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
if (statement.kind == "ExpressionStatement") {
|
|
75
500
|
emitExpression(writer, statement.expression, `${path}/expression`, "php", phpIdentifier);
|
|
76
501
|
writer.mapped(";", { mappingKind: "anchor", node: statement, path });
|
|
77
502
|
writer.synthetic("\n", "line break", [statement], [path]);
|
|
@@ -132,12 +557,7 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
132
557
|
}
|
|
133
558
|
if (statement.mutable) {
|
|
134
559
|
writer.synthetic("/** @var ", "PHP local type scaffolding", [statement], [statementPath]);
|
|
135
|
-
writer
|
|
136
|
-
mappingKind: "exact",
|
|
137
|
-
node: statement.type,
|
|
138
|
-
path: `${statementPath}/type`,
|
|
139
|
-
role: "type"
|
|
140
|
-
});
|
|
560
|
+
emitType(writer, statement.type, `${statementPath}/type`, "php");
|
|
141
561
|
writer.synthetic(" ", "PHP local type scaffolding", [statement], [statementPath]);
|
|
142
562
|
writer.mapped(`$${statement.name}`, { mappingKind: "exact", node: statement, path: statementPath, role: "name" });
|
|
143
563
|
writer.synthetic(" */\n", "PHP local type scaffolding", [statement], [statementPath]);
|
|
@@ -145,12 +565,7 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
145
565
|
else {
|
|
146
566
|
writer.synthetic("/**\n", "PHP local type scaffolding", [statement], [statementPath]);
|
|
147
567
|
writer.synthetic(`${indent} * @var `, "PHP local type scaffolding", [statement], [statementPath]);
|
|
148
|
-
writer
|
|
149
|
-
mappingKind: "exact",
|
|
150
|
-
node: statement.type,
|
|
151
|
-
path: `${statementPath}/type`,
|
|
152
|
-
role: "type"
|
|
153
|
-
});
|
|
568
|
+
emitType(writer, statement.type, `${statementPath}/type`, "php");
|
|
154
569
|
writer.synthetic(" ", "PHP local type scaffolding", [statement], [statementPath]);
|
|
155
570
|
writer.mapped(`$${statement.name}`, { mappingKind: "exact", node: statement, path: statementPath, role: "name" });
|
|
156
571
|
writer.synthetic(`\n${indent} * @semantifold-immutable\n${indent} */\n`, "PHP local type scaffolding", [statement], [statementPath]);
|
|
@@ -172,4 +587,4 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
172
587
|
function phpIdentifier(name) {
|
|
173
588
|
return `$${name}`;
|
|
174
589
|
}
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3BocC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLHlCQUF5QixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUU1RixNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGFBQWEsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRXZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxXQUFXLENBQUMsVUFBVSxDQUFDLE9B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LENBQUE7SUFDakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUNsRSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDdEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUNsRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBQ25HLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN6RCxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxNQUFNLE1BQU0sRUFBRSxHQUFHLElBQUksYUFBYSxDQUFDLENBQUE7SUFDOUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FB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QUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtJQUMvRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQ2xHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHLGFBQWEsY0FBYyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUNuRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUNqRixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7QUFDcEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQTtBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZW1pdEV4cHJlc3Npb259IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2VtaXRTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcblxuLyoqXG4gKiBFbWl0cyBhbiBpbmRlcGVuZGVudGx5IGV4ZWN1dGFibGUgUEhQIHByb2dyYW0gdGhyb3VnaCB0aGUgc291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBocChtb2R1bGUsIHdyaXRlcikge1xuICB3cml0ZXIuc3ludGhldGljKFwiPD9waHBcXG5kZWNsYXJlKHN0cmljdF90eXBlcz0xKTtcXG5cXG5cIiwgXCJQSFAgcHJvZ3JhbSBzY2FmZm9sZGluZ1wiLCBbbW9kdWxlXSlcblxuICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBmdW5jdGlvbkluZGV4KSA9PiB7XG4gICAgaWYgKGZ1bmN0aW9uSW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG5cbiAgICB3cml0ZXIubWFwcGVkKFwiZnVuY3Rpb25cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJmdW5jdGlvbiBzcGFjaW5nXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZGVjbGFyYXRpb24sIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3BhcmFtZXRlcnMvJHtpbmRleH1gXG5cbiAgICAgIGlmIChpbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcInBhcmFtZXRlciBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJwaHBcIiwgcGFyYW1ldGVyLnR5cGUpLCB7XG4gICAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgICAgIG5vZGU6IHBhcmFtZXRlci50eXBlLFxuICAgICAgICBwYXRoOiBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYCxcbiAgICAgICAgcm9sZTogXCJ0eXBlXCJcbiAgICAgIH0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInBhcmFtZXRlciBzcGFjaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGAkJHtwYXJhbWV0ZXIubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBwYXJhbWV0ZXJQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgfSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiOiBcIiwgXCJyZXR1cm4gdHlwZSBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwicGhwXCIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUpLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgbm9kZTogZGVjbGFyYXRpb24ucmV0dXJuVHlwZSxcbiAgICAgIHBhdGg6IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcmV0dXJuVHlwZWAsXG4gICAgICByb2xlOiBcInR5cGVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgZGVjbGFyYXRpb24uYm9keSwgXCIgICAgXCIsIGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vYm9keWApXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gIH0pXG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVudHJ5LXBvaW50IHNlcGFyYXRvclwiLCBbbW9kdWxlLmVudHJ5UG9pbnRdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIlwiLCBcIi9lbnRyeVBvaW50L2JvZHlcIilcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgb3JkZXJlZCBQSFAgYmxvY2sgYm9keS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3QgYmxvY2sgcGF0aC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0QmxvY2sod3JpdGVyLCBibG9jaywgaW5kZW50LCBwYXRoKSB7XG4gIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCkpXG59XG5cbi8qKlxuICogRW1pdHMgb25lIFBIUCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4YWN0IHN0YXRlbWVudCBwYXRoLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRTdGF0ZW1lbnQod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgcGF0aCkge1xuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHJldHVybiBlbWl0TG9jYWwod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgcGF0aClcbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKFwicmV0dXJuXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJldHVybiBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwicGhwXCIsIHBocElkZW50aWZpZXIpXG4gICAgd3JpdGVyLm1hcHBlZChcIjtcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJlY2hvXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInByaW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJwaHBcIiwgcGhwSWRlbnRpZmllcilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJQSFAgcHJpbnQgc2VwYXJhdG9yXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIlBIUF9FT0xcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5tYXBwZWQoXCI7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIHdyaXRlci5tYXBwZWQoXCJpZlwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwiKFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmNvbmRpdGlvbiwgYCR7cGF0aH0vY29uZGl0aW9uYCwgXCJwaHBcIiwgcGhwSWRlbnRpZmllcilcbiAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY29uc2VxdWVudCwgcGF0aDogYCR7cGF0aH0vY29uc2VxdWVudGB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7aW5kZW50fSAgICBgLCBgJHtwYXRofS9jb25zZXF1ZW50YClcbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY29uc2VxdWVudCwgcGF0aDogYCR7cGF0aH0vY29uc2VxdWVudGB9KVxuICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJlbHNlXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7aW5kZW50fSAgICBgLCBgJHtwYXRofS9hbHRlcm5hdGVgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgfVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBQSFAgbG9jYWwgc3RhdGVtZW50IHdpdGggaXRzIGV4YWN0IFNlbWFudGlmb2xkIHByb2ZpbGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuTG9jYWxTdGF0ZW1lbnR9IHN0YXRlbWVudCAtIExvY2FsIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBMZWFkaW5nIGluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlbWVudFBhdGggLSBFeGFjdCBKU09OIFBvaW50ZXIgZm9yIHRoaXMgc3RhdGVtZW50IG9jY3VycmVuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdExvY2FsKHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHN0YXRlbWVudFBhdGgpIHtcbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcblxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKGAkJHtzdGF0ZW1lbnQudGFyZ2V0Lm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudC50YXJnZXQsIHBhdGg6IGAke3N0YXRlbWVudFBhdGh9L3RhcmdldGAsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtzdGF0ZW1lbnRQYXRofS9leHByZXNzaW9uYCwgXCJwaHBcIiwgcGhwSWRlbnRpZmllcilcbiAgICB3cml0ZXIubWFwcGVkKFwiO1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzdGF0ZW1lbnQubXV0YWJsZSkge1xuICAgIHdyaXRlci5zeW50aGV0aWMoXCIvKiogQHZhciBcIiwgXCJQSFAgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJwaHBcIiwgc3RhdGVtZW50LnR5cGUpLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgbm9kZTogc3RhdGVtZW50LnR5cGUsXG4gICAgICBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90eXBlYCxcbiAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcIlBIUCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChgJCR7c3RhdGVtZW50Lm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKi9cXG5cIiwgXCJQSFAgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB9IGVsc2Uge1xuICAgIHdyaXRlci5zeW50aGV0aWMoXCIvKipcXG5cIiwgXCJQSFAgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHdyaXRlci5zeW50aGV0aWMoYCR7aW5kZW50fSAqIEB2YXIgYCwgXCJQSFAgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJwaHBcIiwgc3RhdGVtZW50LnR5cGUpLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgbm9kZTogc3RhdGVtZW50LnR5cGUsXG4gICAgICBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90eXBlYCxcbiAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcIlBIUCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChgJCR7c3RhdGVtZW50Lm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoYFxcbiR7aW5kZW50fSAqIEBzZW1hbnRpZm9sZC1pbW11dGFibGVcXG4ke2luZGVudH0gKi9cXG5gLCBcIlBIUCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIH1cblxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKGAkJHtzdGF0ZW1lbnQubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmAsIFwicGhwXCIsIHBocElkZW50aWZpZXIpXG4gIHdyaXRlci5tYXBwZWQoXCI7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG9uZSBQSFAgdmFyaWFibGUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFBIUCBpZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBwaHBJZGVudGlmaWVyKG5hbWUpIHtcbiAgcmV0dXJuIGAkJHtuYW1lfWBcbn1cbiJdfQ==
|
|
590
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3BocC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRWxFOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUN4QyxJQUFJLE1BQU0sQ0FBQyxPQUFPO1FBQUUsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBOztRQUNoRCxNQUFNLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLHlCQUF5QixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNqRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBO0lBRWxDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEdBQUcsV0FBVyxLQUFLLEVBQUUsQ0FBQTtRQUUvQixJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDdkYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFB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SSxPQUFPLENBQUMsQ0FBQTtRQUNsRSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ3JGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUE7UUFDdkcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3RMLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENB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QUFTLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDbEcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDekUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUcsYUFBYSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ25HLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtBQUNwRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQUk7SUFDekIsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFBO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtlbWl0RXhwcmVzc2lvbiwgZW1pdFR5cGV9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2VtaXRFZmZlY3RQcmVmaXhlcywgZW1pdEVmZmVjdFN1cHBvcnR9IGZyb20gXCIuL2VmZmVjdHMuanNcIlxuXG4vKipcbiAqIEVtaXRzIGFuIGluZGVwZW5kZW50bHkgZXhlY3V0YWJsZSBQSFAgcHJvZ3JhbSB0aHJvdWdoIHRoZSBzb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGhwKG1vZHVsZSwgd3JpdGVyKSB7XG4gIGlmICh3cml0ZXIucHJvZ3JhbSkgZW1pdFByb2dyYW1IZWFkZXIobW9kdWxlLCB3cml0ZXIpXG4gIGVsc2Ugd3JpdGVyLnN5bnRoZXRpYyhcIjw/cGhwXFxuZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7XFxuXFxuXCIsIFwiUEhQIHByb2dyYW0gc2NhZmZvbGRpbmdcIiwgW21vZHVsZV0pXG4gIGVtaXRFZmZlY3RTdXBwb3J0KHdyaXRlciwgbW9kdWxlLCBcInBocFwiKVxuICBjb25zdCByZWNvcmRzID0gbW9kdWxlLnJlY29yZHMgPz8gW11cbiAgY29uc3QgY2xhc3NlcyA9IG1vZHVsZS5jbGFzc2VzID8/IFtdXG4gIGNvbnN0IGVycm9ycyA9IG1vZHVsZS5lcnJvcnMgPz8gW11cblxuICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IGAvZXJyb3JzLyR7aW5kZXh9YFxuXG4gICAgaWYgKGluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVycm9yIGRlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbZXJyb3JdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImZpbmFsIGNsYXNzXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZXJyb3IsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZXJyb3IgZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbZXJyb3JdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChlcnJvci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZXJyb3IsIHBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKHdyaXRlci5wcm9ncmFtID8gXCIgZXh0ZW5kcyBcXFxcUnVudGltZUV4Y2VwdGlvbiB7fVwiIDogXCIgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XCIsXG4gICAgICBcIlBIUCB1bmNoZWNrZWQgZXJyb3Igc2NhZmZvbGRpbmdcIiwgW2Vycm9yXSwgW3BhdGhdKVxuICB9KVxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJlcnJvci9kZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG5cbiAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQsIHJlY29yZEluZGV4KSA9PiB7XG4gICAgY29uc3QgcmVjb3JkUGF0aCA9IGAvcmVjb3Jkcy8ke3JlY29yZEluZGV4fWBcblxuICAgIGlmIChyZWNvcmRJbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJyZWNvcmQgZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgZW1pdFRlbXBsYXRlRG9jdW1lbnRhdGlvbih3cml0ZXIsIHJlY29yZC50eXBlUGFyYW1ldGVycyA/PyBbXSwgYCR7cmVjb3JkUGF0aH0vdHlwZVBhcmFtZXRlcnNgKVxuICAgIGlmICgocmVjb3JkLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCkgPiAwKSB7XG4gICAgICBlbWl0RG9jdW1lbnRlZEdlbmVyaWNSZWNvcmQod3JpdGVyLCByZWNvcmQsIHJlY29yZFBhdGgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgd3JpdGVyLm1hcHBlZChcImZpbmFsIHJlYWRvbmx5IGNsYXNzXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogcmVjb3JkLCBwYXRoOiByZWNvcmRQYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJlY29yZCBkZWNsYXJhdGlvbiBzcGFjaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChyZWNvcmQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHJlY29yZCwgcGF0aDogcmVjb3JkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIge1xcblwiLCBcInJlY29yZCBjbGFzcyBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSByZWNvcmQuZmllbGRzLmZpbHRlcigoZmllbGQpID0+IHBocFR5cGVOZWVkc0RvY3VtZW50YXRpb24oZmllbGQudHlwZSkpXG5cbiAgICBpZiAoZG9jdW1lbnRlZC5sZW5ndGggPiAwKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICAgIC8qKlxcblwiLCBcIlBIUCByZWNvcmQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBkb2N1bWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkSW5kZXggPSByZWNvcmQuZmllbGRzLmluZGV4T2YoZmllbGQpXG4gICAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3JlY29yZFBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YFxuXG4gICAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgICAgICogQHBhcmFtIFwiLCBcIlBIUCByZWNvcmQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICAgICAgZW1pdFR5cGUod3JpdGVyLCBmaWVsZC50eXBlLCBgJHtmaWVsZFBhdGh9L3R5cGVgLCBcInBocFwiKVxuICAgICAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcIlBIUCByZWNvcmQgdHlwZSBzY2FmZm9sZGluZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICAgICAgd3JpdGVyLm1hcHBlZChgJCR7ZmllbGQubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwiUEhQIHJlY29yZCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgfVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgICAgKi9cXG5cIiwgXCJQSFAgcmVjb3JkIHR5cGUgc2NhZmZvbGRpbmdcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgICB9XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXFxuXCIsIFwiUEhQIHJlY29yZCBjb25zdHJ1Y3RvciBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICAgIHJlY29yZC5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3JlY29yZFBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YFxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiICAgICAgICBwdWJsaWMgXCIsIFwiUEhQIHByb21vdGVkIGZpZWxkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgZW1pdE5hdGl2ZVBocFR5cGUod3JpdGVyLCBmaWVsZC50eXBlLCBgJHtmaWVsZFBhdGh9L3R5cGVgKVxuICAgICAgaWYgKGhhc05hdGl2ZVBocFR5cGUoZmllbGQudHlwZSkpIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiUEhQIHByb21vdGVkIGZpZWxkIHNwYWNpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgICB3cml0ZXIubWFwcGVkKGAkJHtmaWVsZC5uYW1lfWAsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBmaWVsZCwgcGF0aDogZmllbGRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgICB3cml0ZXIuc3ludGhldGljKGZpZWxkSW5kZXggKyAxID09IHJlY29yZC5maWVsZHMubGVuZ3RoID8gXCJcXG5cIiA6IFwiLFxcblwiLCBcIlBIUCBwcm9tb3RlZCBmaWVsZCBzZXBhcmF0b3JcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAgICkge31cXG59XCIsIFwiUEhQIHJlY29yZCBjb25zdHJ1Y3RvciBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICB9KVxuICBpZiAocmVjb3Jkcy5sZW5ndGggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwicmVjb3JkL2Z1bmN0aW9uIHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcblxuICBjbGFzc2VzLmZvckVhY2goKGRlY2xhcmF0aW9uLCBjbGFzc0luZGV4KSA9PiB7XG4gICAgaWYgKGNsYXNzSW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwicmVmZXJlbmNlIGNsYXNzIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dLCBbYC9jbGFzc2VzLyR7Y2xhc3NJbmRleH1gXSlcbiAgICBlbWl0UmVmZXJlbmNlQ2xhc3Mod3JpdGVyLCBkZWNsYXJhdGlvbiwgY2xhc3NJbmRleClcbiAgfSlcbiAgaWYgKGNsYXNzZXMubGVuZ3RoID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlZmVyZW5jZSBjbGFzcy9mdW5jdGlvbiBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG5cbiAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgZnVuY3Rpb25JbmRleCkgPT4ge1xuICAgIGlmIChmdW5jdGlvbkluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImRlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgY29uc3QgZG9jdW1lbnRlZFBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4gW3BhcmFtZXRlciwgaW5kZXhdKVxuICAgICAgLmZpbHRlcigoW3BhcmFtZXRlcl0pID0+IHBocFR5cGVOZWVkc0RvY3VtZW50YXRpb24oLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5QYXJhbWV0ZXJ9ICovIChwYXJhbWV0ZXIpLnR5cGUpKVxuICAgIGNvbnN0IGRvY3VtZW50ZWRSZXR1cm4gPSBwaHBUeXBlTmVlZHNEb2N1bWVudGF0aW9uKGRlY2xhcmF0aW9uLnJldHVyblR5cGUpXG5cbiAgICBpZiAoKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCkgPiAwIHx8IGRvY3VtZW50ZWRQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgfHwgZG9jdW1lbnRlZFJldHVybikge1xuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIi8qKlxcblwiLCBcIlBIUCBjb2xsZWN0aW9uIHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkuZW50cmllcygpKSB7XG4gICAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKiBAdGVtcGxhdGUgXCIsIFwiUEhQIHR5cGUgcGFyYW1ldGVyIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS90eXBlUGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBdKVxuICAgICAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7XG4gICAgICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3R5cGVQYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YCwgcm9sZTogXCJuYW1lXCJcbiAgICAgICAgfSlcbiAgICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3BhcmFtZXRlcl0pXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtjYW5kaWRhdGUsIGluZGV4XSBvZiBkb2N1bWVudGVkUGFyYW1ldGVycykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcn0gKi8gKGNhbmRpZGF0ZSlcbiAgICAgICAgY29uc3QgcGFyYW1ldGVySW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGluZGV4KVxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKiBAcGFyYW0gXCIsIFwiUEhQIGNvbGxlY3Rpb24gdHlwZSBzY2FmZm9sZGluZ1wiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgICBlbWl0VHlwZSh3cml0ZXIsIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYCwgXCJwaHBcIilcbiAgICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJQSFAgY29sbGVjdGlvbiB0eXBlIHNjYWZmb2xkaW5nXCIsIFtwYXJhbWV0ZXJdLCBbcGFyYW1ldGVyUGF0aF0pXG4gICAgICAgIHdyaXRlci5tYXBwZWQoYCQke3BhcmFtZXRlci5uYW1lfWAsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBwYXJhbWV0ZXIsIHBhdGg6IHBhcmFtZXRlclBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIlBIUCBjb2xsZWN0aW9uIHR5cGUgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIH1cbiAgICAgIGlmIChkb2N1bWVudGVkUmV0dXJuKSB7XG4gICAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKiBAcmV0dXJuIFwiLCBcIlBIUCBjb2xsZWN0aW9uIHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICAgICAgZW1pdFR5cGUod3JpdGVyLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3JldHVyblR5cGVgLCBcInBocFwiKVxuICAgICAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwiUEhQIGNvbGxlY3Rpb24gdHlwZSBzY2FmZm9sZGluZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgfVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAqL1xcblwiLCBcIlBIUCBjb2xsZWN0aW9uIHR5cGUgc2NhZmZvbGRpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB9XG4gICAgd3JpdGVyLm1hcHBlZChcImZ1bmN0aW9uXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZnVuY3Rpb24gc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoID0gYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9wYXJhbWV0ZXJzLyR7aW5kZXh9YFxuXG4gICAgICBpZiAoaW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgICBlbWl0TmF0aXZlUGhwVHlwZSh3cml0ZXIsIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYClcbiAgICAgIGlmIChoYXNOYXRpdmVQaHBUeXBlKHBhcmFtZXRlci50eXBlKSkgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJwYXJhbWV0ZXIgc3BhY2luZ1wiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChgJCR7cGFyYW1ldGVyLm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgaWYgKGhhc05hdGl2ZVBocFR5cGUoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSkpIHtcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInJldHVybiB0eXBlIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgZW1pdE5hdGl2ZVBocFR5cGUod3JpdGVyLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L3JldHVyblR5cGVgKVxuICAgIH1cbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtkZWNsYXJhdGlvbl0pXG5cbiAgICBlbWl0QmxvY2sod3JpdGVyLCBkZWNsYXJhdGlvbi5ib2R5LCBcIiAgICBcIiwgYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9ib2R5YClcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgfSlcblxuICBpZiAoIXdyaXRlci5wcm9ncmFtIHx8IHdyaXRlci5pc1Byb2dyYW1FbnRyeSgpKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVudHJ5LXBvaW50IHNlcGFyYXRvclwiLCBbbW9kdWxlLmVudHJ5UG9pbnRdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIFwiXCIsIFwiL2VudHJ5UG9pbnQvYm9keVwiKVxuICB9XG59XG5cbi8qKlxuICogRW1pdHMgb25lIG5hdGl2ZSBQSFAgcmVmZXJlbmNlIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUmVmZXJlbmNlIGNsYXNzLlxuICogQHBhcmFtIHtudW1iZXJ9IGNsYXNzSW5kZXggLSBNb2R1bGUgY2xhc3MgaW5kZXguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFJlZmVyZW5jZUNsYXNzKHdyaXRlciwgZGVjbGFyYXRpb24sIGNsYXNzSW5kZXgpIHtcbiAgY29uc3QgcGF0aCA9IGAvY2xhc3Nlcy8ke2NsYXNzSW5kZXh9YFxuXG4gIHdyaXRlci5tYXBwZWQoXCJmaW5hbCBjbGFzc1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9uLCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZWZlcmVuY2UgY2xhc3Mgc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLCBwYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIge1xcblwiLCBcInJlZmVyZW5jZSBjbGFzcyBvcGVuXCIsIFtkZWNsYXJhdGlvbl0sIFtwYXRoXSlcbiAgZGVjbGFyYXRpb24uZmllbGRzLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkUGF0aCA9IGAke3BhdGh9L2ZpZWxkcy8ke2luZGV4fWBcblxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgICAgcHJpdmF0ZSBcIiwgXCJwcml2YXRlIGZpZWxkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIGVtaXROYXRpdmVQaHBUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYClcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICRcIiwgXCJwcml2YXRlIGZpZWxkIHNwYWNpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI7XFxuXCIsIFwibGluZSBicmVha1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgfSlcbiAgY29uc3QgY29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvclxuICBjb25zdCBjb25zdHJ1Y3RvclBhdGggPSBgJHtwYXRofS9jb25zdHJ1Y3RvcmBcblxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuICAgIHB1YmxpYyBmdW5jdGlvbiBcIiwgXCJjb25zdHJ1Y3RvciBzY2FmZm9sZGluZ1wiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIl9fY29uc3RydWN0XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBjb25zdHJ1Y3RvciwgcGF0aDogY29uc3RydWN0b3JQYXRoLCByb2xlOiBcImNvbnN0cnVjdG9yXCJ9KVxuICBlbWl0UGhwUGFyYW1ldGVycyh3cml0ZXIsIGNvbnN0cnVjdG9yLnBhcmFtZXRlcnMsIGAke2NvbnN0cnVjdG9yUGF0aH0vcGFyYW1ldGVyc2ApXG4gIHdyaXRlci5zeW50aGV0aWMoXCIge1xcblwiLCBcImNvbnN0cnVjdG9yIG9wZW5cIiwgW2NvbnN0cnVjdG9yXSwgW2NvbnN0cnVjdG9yUGF0aF0pXG4gIGVtaXRCbG9jayh3cml0ZXIsIGNvbnN0cnVjdG9yLmJvZHksIFwiICAgICAgICBcIiwgYCR7Y29uc3RydWN0b3JQYXRofS9ib2R5YClcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgICB9XCIsIFwiY29uc3RydWN0b3IgY2xvc2VcIiwgW2NvbnN0cnVjdG9yXSwgW2NvbnN0cnVjdG9yUGF0aF0pXG4gIGRlY2xhcmF0aW9uLm1ldGhvZHMuZm9yRWFjaCgobWV0aG9kLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZFBhdGggPSBgJHtwYXRofS9tZXRob2RzLyR7aW5kZXh9YFxuXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcbiAgICBwdWJsaWMgZnVuY3Rpb24gXCIsIFwibWV0aG9kIHNjYWZmb2xkaW5nXCIsIFttZXRob2RdLCBbbWV0aG9kUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChtZXRob2QubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IG1ldGhvZCwgcGF0aDogbWV0aG9kUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIGVtaXRQaHBQYXJhbWV0ZXJzKHdyaXRlciwgbWV0aG9kLnBhcmFtZXRlcnMsIGAke21ldGhvZFBhdGh9L3BhcmFtZXRlcnNgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcIm1ldGhvZCByZXR1cm4gc2VwYXJhdG9yXCIsIFttZXRob2RdLCBbbWV0aG9kUGF0aF0pXG4gICAgZW1pdE5hdGl2ZVBocFR5cGUod3JpdGVyLCBtZXRob2QucmV0dXJuVHlwZSwgYCR7bWV0aG9kUGF0aH0vcmV0dXJuVHlwZWApXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiB7XFxuXCIsIFwibWV0aG9kIG9wZW5cIiwgW21ldGhvZF0sIFttZXRob2RQYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBtZXRob2QuYm9keSwgXCIgICAgICAgIFwiLCBgJHttZXRob2RQYXRofS9ib2R5YClcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAgIH1cIiwgXCJtZXRob2QgY2xvc2VcIiwgW21ldGhvZF0sIFttZXRob2RQYXRoXSlcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9uLCBwYXRofSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgUEhQIHBhcmFtZXRlciBsaXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gT3JkZXJlZCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXJhbWV0ZXIgY29sbGVjdGlvbiBwYXRoLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRQaHBQYXJhbWV0ZXJzKHdyaXRlciwgcGFyYW1ldGVycywgcGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcInBhcmFtZXRlciBsaXN0IG9wZW5cIiwgcGFyYW1ldGVycylcbiAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAke3BhdGh9LyR7aW5kZXh9YFxuXG4gICAgaWYgKGluZGV4KSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIHBhcmFtZXRlcnMpXG4gICAgZW1pdE5hdGl2ZVBocFR5cGUod3JpdGVyLCBwYXJhbWV0ZXIudHlwZSwgYCR7cGFyYW1ldGVyUGF0aH0vdHlwZWApXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAkXCIsIFwicGFyYW1ldGVyIHNwYWNpbmdcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKHBhcmFtZXRlci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogcGFyYW1ldGVyLCBwYXRoOiBwYXJhbWV0ZXJQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIpXCIsIFwicGFyYW1ldGVyIGxpc3QgY2xvc2VcIiwgcGFyYW1ldGVycylcbn1cblxuLyoqXG4gKiBFbWl0cyBQSFAncyBleGFjdCBkb2N1bWVudGVkIGdlbmVyaWMtcmVjb3JkIHByb2ZpbGUuIFByaXZhdGUgcHJvbW90ZWQgc3RvcmFnZVxuICogcGx1cyBwdWJsaWMgZ2V0dGVycyBwcmVzZXJ2ZXMgcmVjb3JkIGltbXV0YWJpbGl0eSB3aGVuIGEgdHlwZSB2YXJpYWJsZSBoYXMgbm9cbiAqIGZhaXRoZnVsIG5hdGl2ZSBwcm9wZXJ0eSB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSByZWNvcmQgLSBHZW5lcmljIHNlbWFudGljIHJlY29yZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWNvcmRQYXRoIC0gRXhhY3QgcmVjb3JkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGVtaXREb2N1bWVudGVkR2VuZXJpY1JlY29yZCh3cml0ZXIsIHJlY29yZCwgcmVjb3JkUGF0aCkge1xuICB3cml0ZXIubWFwcGVkKFwiZmluYWwgY2xhc3NcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiByZWNvcmQsIHBhdGg6IHJlY29yZFBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJlY29yZCBkZWNsYXJhdGlvbiBzcGFjaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gIHdyaXRlci5tYXBwZWQocmVjb3JkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiByZWNvcmQsIHBhdGg6IHJlY29yZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiB7XFxuICAgIC8qKlxcblwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgcmVjb3JkIHNjYWZmb2xkaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gIHJlY29yZC5maWVsZHMuZm9yRWFjaCgoZmllbGQsIGZpZWxkSW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBgJHtyZWNvcmRQYXRofS9maWVsZHMvJHtmaWVsZEluZGV4fWBcblxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgICAgICogQHBhcmFtIFwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgcmVjb3JkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYCwgXCJwaHBcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgcmVjb3JkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoYCQke2ZpZWxkLm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGZpZWxkLCBwYXRoOiBmaWVsZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwiUEhQIGRvY3VtZW50ZWQgZ2VuZXJpYyByZWNvcmQgc2NhZmZvbGRpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgICAgICovXFxuICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcXG5cIiwgXCJQSFAgZG9jdW1lbnRlZCBnZW5lcmljIHJlY29yZCBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICByZWNvcmQuZmllbGRzLmZvckVhY2goKGZpZWxkLCBmaWVsZEluZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRQYXRoID0gYCR7cmVjb3JkUGF0aH0vZmllbGRzLyR7ZmllbGRJbmRleH1gXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiICAgICAgICBwcml2YXRlIFwiLCBcIlBIUCBwcml2YXRlIHByb21vdGVkIGZpZWxkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIGVtaXROYXRpdmVQaHBUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYClcbiAgICBpZiAoaGFzTmF0aXZlUGhwVHlwZShmaWVsZC50eXBlKSkgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJQSFAgcHJvbW90ZWQgZmllbGQgc3BhY2luZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKGAkJHtmaWVsZC5uYW1lfWAsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBmaWVsZCwgcGF0aDogZmllbGRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhmaWVsZEluZGV4ICsgMSA9PSByZWNvcmQuZmllbGRzLmxlbmd0aCA/IFwiXFxuXCIgOiBcIixcXG5cIiwgXCJQSFAgcHJvbW90ZWQgZmllbGQgc2VwYXJhdG9yXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiICAgICkge31cIiwgXCJQSFAgZG9jdW1lbnRlZCBnZW5lcmljIHJlY29yZCBzY2FmZm9sZGluZ1wiLCBbcmVjb3JkXSwgW3JlY29yZFBhdGhdKVxuICByZWNvcmQuZmllbGRzLmZvckVhY2goKGZpZWxkLCBmaWVsZEluZGV4KSA9PiB7XG4gICAgY29uc3QgZmllbGRQYXRoID0gYCR7cmVjb3JkUGF0aH0vZmllbGRzLyR7ZmllbGRJbmRleH1gXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuICAgIC8qKlxcbiAgICAgKiBAcmV0dXJuIFwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgZ2V0dGVyIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgZmllbGQudHlwZSwgYCR7ZmllbGRQYXRofS90eXBlYCwgXCJwaHBcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuICAgICAqL1xcbiAgICBwdWJsaWMgZnVuY3Rpb24gXCIsIFwiUEhQIGRvY3VtZW50ZWQgZ2VuZXJpYyBnZXR0ZXIgc2NhZmZvbGRpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIoKVwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgZ2V0dGVyIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgIGlmIChoYXNOYXRpdmVQaHBUeXBlKGZpZWxkLnR5cGUpKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiOiBcIiwgXCJQSFAgZ2V0dGVyIHJldHVybiB0eXBlIHNwYWNpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgICBlbWl0TmF0aXZlUGhwVHlwZSh3cml0ZXIsIGZpZWxkLnR5cGUsIGAke2ZpZWxkUGF0aH0vdHlwZWApXG4gICAgfVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIge1xcbiAgICAgICAgcmV0dXJuICR0aGlzLT5cIiwgXCJQSFAgZG9jdW1lbnRlZCBnZW5lcmljIGdldHRlciBzY2FmZm9sZGluZ1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKGZpZWxkLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBmaWVsZCwgcGF0aDogZmllbGRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIjtcXG4gICAgfVwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgZ2V0dGVyIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxufVwiLCBcIlBIUCBkb2N1bWVudGVkIGdlbmVyaWMgcmVjb3JkIHNjYWZmb2xkaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG59XG5cbi8qKlxuICogRW1pdHMgYSBzdGFuZGFsb25lIFBIUERvYyB0ZW1wbGF0ZSBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBPcmRlcmVkIHR5cGUgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVHlwZS1wYXJhbWV0ZXIgY29sbGVjdGlvbiBwYXRoLlxuICovXG5mdW5jdGlvbiBlbWl0VGVtcGxhdGVEb2N1bWVudGF0aW9uKHdyaXRlciwgcGFyYW1ldGVycywgcGF0aCkge1xuICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkgcmV0dXJuXG4gIHdyaXRlci5zeW50aGV0aWMoXCIvKipcXG5cIiwgXCJQSFAgdHlwZSBwYXJhbWV0ZXIgc2NhZmZvbGRpbmdcIiwgcGFyYW1ldGVycylcbiAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAqIEB0ZW1wbGF0ZSBcIiwgXCJQSFAgdHlwZSBwYXJhbWV0ZXIgc2NhZmZvbGRpbmdcIiwgW3BhcmFtZXRlcl0sIFtgJHtwYXRofS8ke2luZGV4fWBdKVxuICAgIHdyaXRlci5tYXBwZWQocGFyYW1ldGVyLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBwYXJhbWV0ZXIsIHBhdGg6IGAke3BhdGh9LyR7aW5kZXh9YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtwYXJhbWV0ZXJdKVxuICB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiICovXFxuXCIsIFwiUEhQIHR5cGUgcGFyYW1ldGVyIHNjYWZmb2xkaW5nXCIsIHBhcmFtZXRlcnMpXG59XG5cbi8qKlxuICogRW1pdHMgb25lIGNhbm9uaWNhbCBuYW1lc3BhY2UsIGV4cGxpY2l0IGltcG9ydHMsIGFuZCBtYXRjaGluZyBsaXRlcmFsIGxvYWQgZWRnZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBDdXJyZW50IHByb2dyYW0gbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRQcm9ncmFtSGVhZGVyKG1vZHVsZSwgd3JpdGVyKSB7XG4gIGNvbnN0IHByb2dyYW1Nb2R1bGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG1vZHVsZSkpXG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhgPD9waHBcXG5kZWNsYXJlKHN0cmljdF90eXBlcz0xKTtcXG5uYW1lc3BhY2UgU2VtYW50aWZvbGRcXFxcR2VuZXJhdGVkXFxcXCR7d3JpdGVyLnByb2dyYW1Nb2R1bGVOYW1lKHByb2dyYW1Nb2R1bGUuaWQpfTtcXG5gLFxuICAgIFwiUEhQIHNlbWFudGljIG5hbWVzcGFjZVwiLCBbbW9kdWxlXSlcbiAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBwcm9ncmFtTW9kdWxlLmltcG9ydHMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5ID0gd3JpdGVyLnByb2dyYW1Nb2R1bGVOYW1lKGltcG9ydGVkLm1vZHVsZUlkKVxuICAgIGNvbnN0IHByZWZpeCA9IGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJmdW5jdGlvblwiID8gXCJ1c2UgZnVuY3Rpb25cIiA6IFwidXNlXCJcbiAgICBjb25zdCBpbXBvcnRQYXRoID0gYC9pbXBvcnRzLyR7cHJvZ3JhbU1vZHVsZS5pbXBvcnRzLmluZGV4T2YoaW1wb3J0ZWQpfWBcbiAgICBjb25zdCBsb2NhbE5hbWUgPSB3cml0ZXIuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcblxuICAgIHdyaXRlci5zeW50aGV0aWMoYCR7cHJlZml4fSBTZW1hbnRpZm9sZFxcXFxHZW5lcmF0ZWRcXFxcJHtkZXBlbmRlbmN5fVxcXFxgLCBcIlBIUCBzZW1hbnRpYyBpbXBvcnRcIiwgW2ltcG9ydGVkXSwgW2ltcG9ydFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoaW1wb3J0ZWQuaW1wb3J0ZWROYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogaW1wb3J0ZWQsIHBhdGg6IGltcG9ydFBhdGgsIHJvbGU6IFwiaW1wb3J0ZWROYW1lXCJ9KVxuICAgIGlmIChsb2NhbE5hbWUgIT0gaW1wb3J0ZWQuaW1wb3J0ZWROYW1lKSB7XG4gICAgICB3cml0ZXIuc3ludGhldGljKFwiIGFzIFwiLCBcIlBIUCBzZW1hbnRpYyBpbXBvcnQgYWxpYXNcIiwgW2ltcG9ydGVkXSwgW2ltcG9ydFBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChsb2NhbE5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBpbXBvcnRlZCwgcGF0aDogaW1wb3J0UGF0aCwgcm9sZTogXCJsb2NhbE5hbWVcIn0pXG4gICAgfVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI7XFxuXCIsIFwiUEhQIHNlbWFudGljIGltcG9ydCB0ZXJtaW5hdG9yXCIsIFtpbXBvcnRlZF0sIFtpbXBvcnRQYXRoXSlcbiAgfVxuICBmb3IgKGNvbnN0IG1vZHVsZUlkIG9mIFsuLi5uZXcgU2V0KHByb2dyYW1Nb2R1bGUuaW1wb3J0cy5tYXAoKGl0ZW0pID0+IGl0ZW0ubW9kdWxlSWQpKV0pIHtcbiAgICBjb25zdCByZWxhdGl2ZSA9IHdyaXRlci5yZWxhdGl2ZU1vZHVsZVNwZWNpZmllcihtb2R1bGVJZCkucmVwbGFjZSgvXlxcLlxcLy91LCBcIlwiKVxuICAgIGNvbnN0IGltcG9ydGVkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0ltcG9ydH0gKi8gKFxuICAgICAgcHJvZ3JhbU1vZHVsZS5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubW9kdWxlSWQgPT0gbW9kdWxlSWQpKVxuICAgIGNvbnN0IGltcG9ydFBhdGggPSBgL2ltcG9ydHMvJHtwcm9ncmFtTW9kdWxlLmltcG9ydHMuaW5kZXhPZihpbXBvcnRlZCl9YFxuXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcInJlcXVpcmVfb25jZSBfX0RJUl9fIC4gXCIsIFwiUEhQIHJlcXVpcmUtb25jZSBlZGdlXCIsIFtpbXBvcnRlZF0sIFtpbXBvcnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKEpTT04uc3RyaW5naWZ5KGAvJHtyZWxhdGl2ZX1gKSwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBpbXBvcnRlZCwgcGF0aDogaW1wb3J0UGF0aCwgcm9sZTogXCJwYXRoXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI7XFxuXCIsIFwiUEhQIHJlcXVpcmUtb25jZSB0ZXJtaW5hdG9yXCIsIFtpbXBvcnRlZF0sIFtpbXBvcnRQYXRoXSlcbiAgfVxuICBpZiAod3JpdGVyLnN0ZGxpYlByb3ZpZGVyRW50cmllcykge1xuICAgIGZvciAoY29uc3QgcHJvdmlkZXJQYXRoIG9mIHdyaXRlci5zdGRsaWJQcm92aWRlclBhdGhzID8/IFtdKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZSA9IHdyaXRlci5zdGRsaWJQcm92aWRlclNwZWNpZmllcih1bmRlZmluZWQsIHByb3ZpZGVyUGF0aCkucmVwbGFjZSgvXlxcLlxcLy91LCBcIlwiKVxuXG4gICAgICB3cml0ZXIuc3ludGhldGljKFwicmVxdWlyZV9vbmNlIF9fRElSX18gLiBcIiwgXCJQSFAgc3RkbGliIHByb3ZpZGVyIHJlcXVpcmUtb25jZSBlZGdlXCIsIFttb2R1bGVdKVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhKU09OLnN0cmluZ2lmeShgLyR7cmVsYXRpdmV9YCksIFwiUEhQIHN0ZGxpYiBwcm92aWRlciByZXF1aXJlLW9uY2UgcGF0aFwiLCBbbW9kdWxlXSlcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCI7XFxuXCIsIFwiUEhQIHN0ZGxpYiBwcm92aWRlciByZXF1aXJlLW9uY2UgdGVybWluYXRvclwiLCBbbW9kdWxlXSlcbiAgICB9XG4gIH1cbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIlBIUCBuYW1lc3BhY2UvZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIFBIUCBuYXRpdmUgdHlwZSBuZWVkcyBhbiBhY2NvbXBhbnlpbmcgcmVjdXJzaXZlIFBIUERvYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHlwZSBjb250YWlucyBhIGNvbGxlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHBocFR5cGVOZWVkc0RvY3VtZW50YXRpb24odHlwZSkge1xuICByZXR1cm4gdHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIgfHwgdHlwZS5raW5kID09IFwiTGlzdFR5cGVcIiB8fCB0eXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHxcbiAgICB0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiIHx8XG4gICAgdHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmICh0eXBlLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgIHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIHBocFR5cGVOZWVkc0RvY3VtZW50YXRpb24odHlwZS52YWx1ZVR5cGUpXG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGV4YWN0IG5hdGl2ZSBQSFAgY2FycmllciB3aGlsZSByZXRhaW5pbmcgcmVjdXJzaXZlIHR5cGUgbWFwcGluZ3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBFeGFjdCB0eXBlIG9jY3VycmVuY2UgcGF0aC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0TmF0aXZlUGhwVHlwZSh3cml0ZXIsIHR5cGUsIHBhdGgpIHtcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiIHx8IHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIHR5cGUudmFsdWVUeXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICBjb25zdCByZWNvcmQgPSB3cml0ZXIucmVjb3JkRm9ySWQodHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgd3JpdGVyLm1hcHBlZCh3cml0ZXIucmVjb3JkTmFtZUZvcklkKHR5cGUuZGVjbGFyYXRpb25JZCksIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5hbWU6IHJlY29yZC5uYW1lLCBub2RlOiB0eXBlLCBwYXRoLCByb2xlOiBcInR5cGVcIlxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fCB0eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgZW1pdFR5cGUod3JpdGVyLCB0eXBlLCBwYXRoLCBcInBocFwiKVxuICAgIHJldHVyblxuICB9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICBlbWl0VHlwZSh3cml0ZXIsIHR5cGUsIHBhdGgsIFwicGhwXCIpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcIj9cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHR5cGUsIHBhdGgsIHJvbGU6IFwidHlwZVwifSlcbiAgICBpZiAodHlwZS52YWx1ZVR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikgZW1pdE5hdGl2ZVBocFR5cGUod3JpdGVyLCB0eXBlLnZhbHVlVHlwZSwgYCR7cGF0aH0vdmFsdWVUeXBlYClcbiAgICBlbHNlIGlmICh0eXBlLnZhbHVlVHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiKSBlbWl0VHlwZSh3cml0ZXIsIHR5cGUudmFsdWVUeXBlLCBgJHtwYXRofS92YWx1ZVR5cGVgLCBcInBocFwiKVxuICAgIGVsc2Ugd3JpdGVyLm1hcHBlZChcImFycmF5XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogdHlwZSwgcGF0aH0pXG4gICAgcmV0dXJuXG4gIH1cblxuICB3cml0ZXIubWFwcGVkKFwiYXJyYXlcIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHR5cGUsIHBhdGgsIHJvbGU6IFwidHlwZVwifSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgUEhQIGhhcyBhIGZhaXRoZnVsIG5hdGl2ZSBjYXJyaWVyIGZvciBvbmUgZXhhY3Qgc2VtYW50aWMgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYSBuYXRpdmUgYW5ub3RhdGlvbiBjYW4gYmUgZW1pdHRlZC5cbiAqL1xuZnVuY3Rpb24gaGFzTmF0aXZlUGhwVHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmtpbmQgIT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiAmJlxuICAgICEodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIgJiYgdHlwZS52YWx1ZVR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBvcmRlcmVkIFBIUCBibG9jayBib2R5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBFeGFjdCBibG9jayBwYXRoLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRCbG9jayh3cml0ZXIsIGJsb2NrLCBpbmRlbnQsIHBhdGgpIHtcbiAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQsIGluZGV4KSA9PiBlbWl0U3RhdGVtZW50KHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gKSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgUEhQIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3Qgc3RhdGVtZW50IHBhdGguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKSB7XG4gIGVtaXRFZmZlY3RQcmVmaXhlcyh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBcInBocFwiLFxuICAgIChleHByZXNzaW9uLCBleHByZXNzaW9uUGF0aCkgPT4gZW1pdEV4cHJlc3Npb24od3JpdGVyLCBleHByZXNzaW9uLCBleHByZXNzaW9uUGF0aCwgXCJwaHBcIiwgcGhwSWRlbnRpZmllcikpXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikgcmV0dXJuIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiKSB7XG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQucmVjZWl2ZXIsIGAke3BhdGh9L3JlY2VpdmVyYCwgXCJwaHBcIiwgcGhwSWRlbnRpZmllcilcbiAgICBjb25zdCBmaWVsZCA9IHdyaXRlci5wcml2YXRlRmllbGRGb3JJZChzdGF0ZW1lbnQuZmllbGQpXG5cbiAgICB3cml0ZXIubWFwcGVkKGAtPiR7ZmllbGQubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogZmllbGQubmFtZSwgbm9kZTogc3RhdGVtZW50LCBwYXRoLCByb2xlOiBcIm1lbWJlclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiID0gXCIsIFwicHJpdmF0ZSBmaWVsZCBhc3NpZ25tZW50XCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwicGhwXCIsIHBocElkZW50aWZpZXIpXG4gICAgd3JpdGVyLm1hcHBlZChcIjtcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiA/IFwiYnJlYWtcIiA6IFwiY29udGludWVcIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIjtcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJ3aGlsZVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIChcIiwgXCJjb25kaXRpb24tY29udHJvbGxlZCBsb29wIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIFwicGhwXCIsIHBocElkZW50aWZpZXIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikgXCIsIFwiY29uZGl0aW9uLWNvbnRyb2xsZWQgbG9vcCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gICAgYCwgYCR7cGF0aH0vYm9keWApXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKFwiZm9yZWFjaFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAoXCIsIFwibG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50Lmxpc3QsIGAke3BhdGh9L2xpc3RgLCBcInBocFwiLCBwaHBJZGVudGlmaWVyKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgYXMgXCIsIFwibG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoYCQke3N0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZX1gLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS92YWx1ZUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikgXCIsIFwibG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5ib2R5LCBgJHtpbmRlbnR9ICAgIGAsIGAke3BhdGh9L2JvZHlgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcImZvcmVhY2hcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKFwiLCBcIm1hcCBsb29wIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQubWFwLCBgJHtwYXRofS9tYXBgLCBcInBocFwiLCBwaHBJZGVudGlmaWVyKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgYXMgXCIsIFwibWFwIGxvb3Agc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKGAkJHtzdGF0ZW1lbnQua2V5QmluZGluZy5uYW1lfWAsIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudC5rZXlCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS9rZXlCaW5kaW5nYCwgcm9sZTogXCJuYW1lXCJcbiAgICB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgPT4gXCIsIFwibWFwIGl0ZXJhdGlvbiBiaW5kaW5nIHNlcGFyYXRvclwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoYCQke3N0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZX1gLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS92YWx1ZUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikgXCIsIFwibWFwIGxvb3Agc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYm9keSwgYCR7aW5kZW50fSAgICBgLCBgJHtwYXRofS9ib2R5YClcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJhaXNlU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCB0eXBlID0gc3RhdGVtZW50LmVycm9yLmVycm9yXG4gICAgY29uc3QgZXJyb3IgPSB3cml0ZXIuZXJyb3JGb3JJZCh0eXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICB3cml0ZXIubWFwcGVkKFwidGhyb3dcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgbmV3IFwiLCBcImVycm9yIGNvbnN0cnVjdGlvbiBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50LmVycm9yXSwgW2Ake3BhdGh9L2Vycm9yYF0pXG4gICAgd3JpdGVyLm1hcHBlZCh3cml0ZXIuZXJyb3JOYW1lRm9ySWQodHlwZS5kZWNsYXJhdGlvbklkKSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5hbWU6IGVycm9yLm5hbWUsIG5vZGU6IHN0YXRlbWVudC5lcnJvciwgcGF0aDogYCR7cGF0aH0vZXJyb3JgLCByb2xlOiBcInR5cGVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIihcIiwgXCJlcnJvciBjb25zdHJ1Y3Rpb24gb3BlblwiLCBbc3RhdGVtZW50LmVycm9yXSwgW2Ake3BhdGh9L2Vycm9yYF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZSwgYCR7cGF0aH0vZXJyb3IvbWVzc2FnZWAsIFwicGhwXCIsIHBocElkZW50aWZpZXIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIik7XFxuXCIsIFwiZXJyb3IgY29uc3RydWN0aW9uIGNsb3NlXCIsIFtzdGF0ZW1lbnQuZXJyb3JdLCBbYCR7cGF0aH0vZXJyb3JgXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IGNhdWdodCA9IHdyaXRlci5lcnJvckZvcklkKHN0YXRlbWVudC5jYXRjaFR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIHdyaXRlci5tYXBwZWQoXCJ0cnlcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwidHJ5IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5ib2R5LCBwYXRoOiBgJHtwYXRofS9ib2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYm9keSwgYCR7aW5kZW50fSAgICBgLCBgJHtwYXRofS9ib2R5YClcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNhdGNoIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiY2F0Y2hcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGgsIHJvbGU6IFwiY2F0Y2hcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAoXCIsIFwiY2F0Y2ggYmluZGluZyBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50LmNhdGNoQmluZGluZ10sIFtgJHtwYXRofS9jYXRjaEJpbmRpbmdgXSlcbiAgICB3cml0ZXIubWFwcGVkKHdyaXRlci5lcnJvck5hbWVGb3JJZChzdGF0ZW1lbnQuY2F0Y2hUeXBlLmRlY2xhcmF0aW9uSWQpLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbmFtZTogY2F1Z2h0Lm5hbWUsIG5vZGU6IHN0YXRlbWVudC5jYXRjaFR5cGUsIHBhdGg6IGAke3BhdGh9L2NhdGNoVHlwZWAsIHJvbGU6IFwidHlwZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNhdGNoIGJpbmRpbmcgc3BhY2luZ1wiLCBbc3RhdGVtZW50LmNhdGNoQmluZGluZ10sIFtgJHtwYXRofS9jYXRjaEJpbmRpbmdgXSlcbiAgICB3cml0ZXIubWFwcGVkKGAkJHtzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudC5jYXRjaEJpbmRpbmcsIHBhdGg6IGAke3BhdGh9L2NhdGNoQmluZGluZ2AsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiKSBcIiwgXCJjYXRjaCBiaW5kaW5nIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nXSwgW2Ake3BhdGh9L2NhdGNoQmluZGluZ2BdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNhdGNoQm9keSwgcGF0aDogYCR7cGF0aH0vY2F0Y2hCb2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBgJHtpbmRlbnR9ICAgIGAsIGAke3BhdGh9L2NhdGNoQm9keWApXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5jYXRjaEJvZHksIHBhdGg6IGAke3BhdGh9L2NhdGNoQm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKFwicmV0dXJuXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmV0dXJuIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInBocFwiLCBwaHBJZGVudGlmaWVyKVxuICAgIH1cbiAgICB3cml0ZXIubWFwcGVkKFwiO1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHtcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJwaHBcIiwgcGhwSWRlbnRpZmllcilcbiAgICB3cml0ZXIubWFwcGVkKFwiO1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcImVjaG9cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicHJpbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInBocFwiLCBwaHBJZGVudGlmaWVyKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcIlBIUCBwcmludCBzZXBhcmF0b3JcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiUEhQX0VPTFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIjtcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgd3JpdGVyLm1hcHBlZChcImlmXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBcInBocFwiLCBwaHBJZGVudGlmaWVyKVxuICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5jb25zZXF1ZW50LCBwYXRoOiBgJHtwYXRofS9jb25zZXF1ZW50YH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtpbmRlbnR9ICAgIGAsIGAke3BhdGh9L2NvbnNlcXVlbnRgKVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5jb25zZXF1ZW50LCBwYXRoOiBgJHtwYXRofS9jb25zZXF1ZW50YH0pXG4gIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImVsc2VcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY29uZGl0aW9uYWwgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmFsdGVybmF0ZSwgcGF0aDogYCR7cGF0aH0vYWx0ZXJuYXRlYH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBgJHtpbmRlbnR9ICAgIGAsIGAke3BhdGh9L2FsdGVybmF0ZWApXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICB9XG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIFBIUCBsb2NhbCBzdGF0ZW1lbnQgd2l0aCBpdHMgZXhhY3QgU2VtYW50aWZvbGQgcHJvZmlsZSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Mb2NhbFN0YXRlbWVudH0gc3RhdGVtZW50IC0gTG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIExlYWRpbmcgaW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhdGVtZW50UGF0aCAtIEV4YWN0IEpTT04gUG9pbnRlciBmb3IgdGhpcyBzdGF0ZW1lbnQgb2NjdXJyZW5jZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0TG9jYWwod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgc3RhdGVtZW50UGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoYCQke3N0YXRlbWVudC50YXJnZXQubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LnRhcmdldCwgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdGFyZ2V0YCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImFzc2lnbm1lbnQgc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gLCBcInBocFwiLCBwaHBJZGVudGlmaWVyKVxuICAgIHdyaXRlci5tYXBwZWQoXCI7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHN0YXRlbWVudC5tdXRhYmxlKSB7XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIi8qKiBAdmFyIFwiLCBcIlBIUCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgZW1pdFR5cGUod3JpdGVyLCBzdGF0ZW1lbnQudHlwZSwgYCR7c3RhdGVtZW50UGF0aH0vdHlwZWAsIFwicGhwXCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJQSFAgbG9jYWwgdHlwZSBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoYCQke3N0YXRlbWVudC5uYW1lfWAsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiICovXFxuXCIsIFwiUEhQIGxvY2FsIHR5cGUgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgfSBlbHNlIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiLyoqXFxuXCIsIFwiUEhQIGxvY2FsIHR5cGUgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICB3cml0ZXIuc3ludGhldGljKGAke2luZGVudH0gKiBAdmFyIGAsIFwiUEhQIGxvY2FsIHR5cGUgc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICBlbWl0VHlwZSh3cml0ZXIsIHN0YXRlbWVudC50eXBlLCBgJHtzdGF0ZW1lbnRQYXRofS90eXBlYCwgXCJwaHBcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcIlBIUCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChgJCR7c3RhdGVtZW50Lm5hbWV9YCwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoYFxcbiR7aW5kZW50fSAqIEBzZW1hbnRpZm9sZC1pbW11dGFibGVcXG4ke2luZGVudH0gKi9cXG5gLCBcIlBIUCBsb2NhbCB0eXBlIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIH1cblxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKGAkJHtzdGF0ZW1lbnQubmFtZX1gLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCI9XCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGg6IHN0YXRlbWVudFBhdGgsIHJvbGU6IFwib3BlcmF0b3JcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmluaXRpYWxpemVyLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmAsIFwicGhwXCIsIHBocElkZW50aWZpZXIpXG4gIHdyaXRlci5tYXBwZWQoXCI7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRofSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG9uZSBQSFAgdmFyaWFibGUgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgaWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFBIUCBpZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBwaHBJZGVudGlmaWVyKG5hbWUpIHtcbiAgcmV0dXJuIGAkJHtuYW1lfWBcbn1cbiJdfQ==
|