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, requiresCanonicalZeroRendering } from "./shared.js";
|
|
3
|
-
import {
|
|
2
|
+
import { emitExpression, emitType, requiresCanonicalZeroRendering } from "./shared.js";
|
|
3
|
+
import { emitEffectPrefixes, emitEffectSupport } from "./effects.js";
|
|
4
4
|
/**
|
|
5
5
|
* Emits an independently executable TypeScript program through the source-aware writer.
|
|
6
6
|
* @param {import("../semantic/types.js").SemanticModule} module - Semantic module.
|
|
@@ -9,12 +9,64 @@ import { emitScalarType } from "./scalars.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export function generateTypeScript(module, writer) {
|
|
11
11
|
const canonicalizeZero = requiresCanonicalZeroRendering(module);
|
|
12
|
+
const records = module.records ?? [];
|
|
13
|
+
const classes = module.classes ?? [];
|
|
14
|
+
const errors = module.errors ?? [];
|
|
15
|
+
emitProgramImports(module, writer);
|
|
16
|
+
emitEffectSupport(writer, module, "typescript");
|
|
17
|
+
errors.forEach((error, errorIndex) => {
|
|
18
|
+
const path = `/errors/${errorIndex}`;
|
|
19
|
+
if (errorIndex > 0)
|
|
20
|
+
writer.synthetic("\n\n", "error declaration separator", [error], [path]);
|
|
21
|
+
if (writer.isDirectlyExported(error.id))
|
|
22
|
+
writer.synthetic("export ", "ESM error export", [error], [path]);
|
|
23
|
+
writer.mapped("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(" extends Error {}", "TypeScript 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
|
+
if (writer.isDirectlyExported(record.id))
|
|
35
|
+
writer.synthetic("export ", "ESM record export", [record], [recordPath]);
|
|
36
|
+
writer.mapped("class", { mappingKind: "anchor", node: record, path: recordPath });
|
|
37
|
+
writer.synthetic(" ", "record declaration spacing", [record], [recordPath]);
|
|
38
|
+
writer.mapped(record.name, { mappingKind: "exact", node: record, path: recordPath, role: "name" });
|
|
39
|
+
emitTypeParameters(writer, record.typeParameters ?? [], `${recordPath}/typeParameters`);
|
|
40
|
+
writer.synthetic(" {\n constructor(", "TypeScript record constructor scaffolding", [record], [recordPath]);
|
|
41
|
+
record.fields.forEach((field, fieldIndex) => {
|
|
42
|
+
const fieldPath = `${recordPath}/fields/${fieldIndex}`;
|
|
43
|
+
if (fieldIndex)
|
|
44
|
+
writer.synthetic(", ", "record field separator", [record], [recordPath]);
|
|
45
|
+
writer.synthetic("readonly ", "TypeScript readonly field scaffolding", [field], [fieldPath]);
|
|
46
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
47
|
+
writer.synthetic(": ", "type separator", [field], [fieldPath]);
|
|
48
|
+
emitType(writer, field.type, `${fieldPath}/type`, "typescript");
|
|
49
|
+
});
|
|
50
|
+
writer.synthetic(") {}\n}", "TypeScript record constructor scaffolding", [record], [recordPath]);
|
|
51
|
+
});
|
|
52
|
+
if (records.length > 0)
|
|
53
|
+
writer.synthetic("\n\n", "record/function separator", [module]);
|
|
54
|
+
classes.forEach((declaration, classIndex) => {
|
|
55
|
+
if (classIndex > 0)
|
|
56
|
+
writer.synthetic("\n\n", "reference class separator", [declaration], [`/classes/${classIndex}`]);
|
|
57
|
+
emitReferenceClass(writer, declaration, classIndex, canonicalizeZero);
|
|
58
|
+
});
|
|
59
|
+
if (classes.length > 0)
|
|
60
|
+
writer.synthetic("\n\n", "reference class/function separator", [module]);
|
|
12
61
|
module.functions.forEach((declaration, functionIndex) => {
|
|
13
62
|
if (functionIndex > 0)
|
|
14
63
|
writer.synthetic("\n\n", "declaration separator", [declaration]);
|
|
64
|
+
if (writer.isDirectlyExported(declaration.id))
|
|
65
|
+
writer.synthetic("export ", "ESM function export", [declaration]);
|
|
15
66
|
writer.mapped("function", { mappingKind: "anchor", node: declaration });
|
|
16
67
|
writer.synthetic(" ", "function spacing", [declaration]);
|
|
17
68
|
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, role: "name" });
|
|
69
|
+
emitTypeParameters(writer, declaration.typeParameters ?? [], `/functions/${functionIndex}/typeParameters`);
|
|
18
70
|
writer.mapped("(", { mappingKind: "anchor", node: declaration });
|
|
19
71
|
declaration.parameters.forEach((parameter, index) => {
|
|
20
72
|
const parameterPath = `/functions/${functionIndex}/parameters/${index}`;
|
|
@@ -22,29 +74,190 @@ export function generateTypeScript(module, writer) {
|
|
|
22
74
|
writer.synthetic(", ", "parameter separator", [declaration]);
|
|
23
75
|
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
24
76
|
writer.synthetic(": ", "type separator", [parameter], [parameterPath]);
|
|
25
|
-
writer
|
|
26
|
-
mappingKind: "exact",
|
|
27
|
-
node: parameter.type,
|
|
28
|
-
path: `${parameterPath}/type`,
|
|
29
|
-
role: "type"
|
|
30
|
-
});
|
|
77
|
+
emitType(writer, parameter.type, `${parameterPath}/type`, "typescript");
|
|
31
78
|
});
|
|
32
79
|
writer.mapped(")", { mappingKind: "anchor", node: declaration });
|
|
33
80
|
writer.synthetic(": ", "return type separator", [declaration]);
|
|
34
|
-
writer
|
|
35
|
-
mappingKind: "exact",
|
|
36
|
-
node: declaration.returnType,
|
|
37
|
-
path: `/functions/${functionIndex}/returnType`,
|
|
38
|
-
role: "type"
|
|
39
|
-
});
|
|
81
|
+
emitType(writer, declaration.returnType, `/functions/${functionIndex}/returnType`, "typescript");
|
|
40
82
|
writer.synthetic(" ", "function spacing", [declaration]);
|
|
41
83
|
writer.mapped("{", { mappingKind: "anchor", node: declaration });
|
|
42
84
|
writer.synthetic("\n", "line break", [declaration]);
|
|
43
85
|
emitBlock(writer, declaration.body, " ", `/functions/${functionIndex}/body`, canonicalizeZero);
|
|
44
86
|
writer.mapped("}", { mappingKind: "anchor", node: declaration });
|
|
45
87
|
});
|
|
46
|
-
|
|
47
|
-
|
|
88
|
+
emitAliasedExports(module, writer);
|
|
89
|
+
if (!writer.program || writer.isProgramEntry()) {
|
|
90
|
+
writer.synthetic("\n\n", "entry-point separator", [module.entryPoint]);
|
|
91
|
+
emitBlock(writer, module.entryPoint.body, "", "/entryPoint/body", canonicalizeZero);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Emits one native TypeScript reference class.
|
|
96
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
97
|
+
* @param {import("../semantic/types.js").ClassDeclaration} declaration - Reference class.
|
|
98
|
+
* @param {number} classIndex - Module class index.
|
|
99
|
+
* @param {boolean} canonicalizeZero - Whether scalar output canonicalizes zero.
|
|
100
|
+
* @returns {void}
|
|
101
|
+
*/
|
|
102
|
+
function emitReferenceClass(writer, declaration, classIndex, canonicalizeZero) {
|
|
103
|
+
const path = `/classes/${classIndex}`;
|
|
104
|
+
writer.mapped("class", { mappingKind: "anchor", node: declaration, path });
|
|
105
|
+
writer.synthetic(" ", "reference class spacing", [declaration], [path]);
|
|
106
|
+
writer.mapped(declaration.name, { mappingKind: "exact", node: declaration, path, role: "name" });
|
|
107
|
+
writer.synthetic(" {\n", "reference class open", [declaration], [path]);
|
|
108
|
+
declaration.fields.forEach((field, index) => {
|
|
109
|
+
const fieldPath = `${path}/fields/${index}`;
|
|
110
|
+
writer.synthetic(" private ", "private field scaffolding", [field], [fieldPath]);
|
|
111
|
+
writer.mapped(field.name, { mappingKind: "exact", node: field, path: fieldPath, role: "name" });
|
|
112
|
+
writer.synthetic(": ", "private field type separator", [field], [fieldPath]);
|
|
113
|
+
emitType(writer, field.type, `${fieldPath}/type`, "typescript");
|
|
114
|
+
writer.synthetic("\n", "line break", [field], [fieldPath]);
|
|
115
|
+
});
|
|
116
|
+
const constructor = declaration.constructor;
|
|
117
|
+
const constructorPath = `${path}/constructor`;
|
|
118
|
+
writer.synthetic("\n ", "constructor spacing", [constructor], [constructorPath]);
|
|
119
|
+
writer.mapped("constructor", { mappingKind: "exact", node: constructor, path: constructorPath, role: "constructor" });
|
|
120
|
+
emitParameters(writer, constructor.parameters, `${constructorPath}/parameters`);
|
|
121
|
+
writer.synthetic(" {\n", "constructor open", [constructor], [constructorPath]);
|
|
122
|
+
emitBlock(writer, constructor.body, " ", `${constructorPath}/body`, canonicalizeZero);
|
|
123
|
+
writer.synthetic(" }", "constructor close", [constructor], [constructorPath]);
|
|
124
|
+
declaration.methods.forEach((method, index) => {
|
|
125
|
+
const methodPath = `${path}/methods/${index}`;
|
|
126
|
+
writer.synthetic("\n\n ", "method spacing", [method], [methodPath]);
|
|
127
|
+
writer.mapped(method.name, { mappingKind: "exact", node: method, path: methodPath, role: "name" });
|
|
128
|
+
emitParameters(writer, method.parameters, `${methodPath}/parameters`);
|
|
129
|
+
writer.synthetic(": ", "method return separator", [method], [methodPath]);
|
|
130
|
+
emitType(writer, method.returnType, `${methodPath}/returnType`, "typescript");
|
|
131
|
+
writer.synthetic(" {\n", "method open", [method], [methodPath]);
|
|
132
|
+
emitBlock(writer, method.body, " ", `${methodPath}/body`, canonicalizeZero);
|
|
133
|
+
writer.synthetic(" }", "method close", [method], [methodPath]);
|
|
134
|
+
});
|
|
135
|
+
writer.synthetic("\n", "line break", [declaration], [path]);
|
|
136
|
+
writer.mapped("}", { mappingKind: "anchor", node: declaration, path });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Emits one TypeScript parameter list.
|
|
140
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
141
|
+
* @param {import("../semantic/types.js").Parameter[]} parameters - Ordered parameters.
|
|
142
|
+
* @param {string} path - Parameter collection path.
|
|
143
|
+
* @returns {void}
|
|
144
|
+
*/
|
|
145
|
+
function emitParameters(writer, parameters, path) {
|
|
146
|
+
writer.synthetic("(", "parameter list open", parameters);
|
|
147
|
+
parameters.forEach((parameter, index) => {
|
|
148
|
+
const parameterPath = `${path}/${index}`;
|
|
149
|
+
if (index)
|
|
150
|
+
writer.synthetic(", ", "parameter separator", parameters);
|
|
151
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: parameterPath, role: "name" });
|
|
152
|
+
writer.synthetic(": ", "parameter type separator", [parameter], [parameterPath]);
|
|
153
|
+
emitType(writer, parameter.type, `${parameterPath}/type`, "typescript");
|
|
154
|
+
});
|
|
155
|
+
writer.synthetic(")", "parameter list close", parameters);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Emits native invariant TypeScript declaration parameters.
|
|
159
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
160
|
+
* @param {import("../semantic/types.js").TypeParameter[]} parameters - Ordered type parameters.
|
|
161
|
+
* @param {string} path - Type-parameter collection path.
|
|
162
|
+
*/
|
|
163
|
+
function emitTypeParameters(writer, parameters, path) {
|
|
164
|
+
if (parameters.length == 0)
|
|
165
|
+
return;
|
|
166
|
+
writer.synthetic("<", "TypeScript type parameter open", parameters);
|
|
167
|
+
parameters.forEach((parameter, index) => {
|
|
168
|
+
if (index)
|
|
169
|
+
writer.synthetic(", ", "TypeScript type parameter separator", parameters);
|
|
170
|
+
writer.mapped(parameter.name, { mappingKind: "exact", node: parameter, path: `${path}/${index}`, role: "name" });
|
|
171
|
+
});
|
|
172
|
+
writer.synthetic(">", "TypeScript type parameter close", parameters);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Emits grouped value and type-only ESM imports for a program module.
|
|
176
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current module.
|
|
177
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
178
|
+
*/
|
|
179
|
+
function emitProgramImports(module, writer) {
|
|
180
|
+
if (!writer.program)
|
|
181
|
+
return;
|
|
182
|
+
const imports = /** @type {import("../semantic/types.js").SemanticProgramModule} */ ( /** @type {unknown} */(module)).imports;
|
|
183
|
+
const groups = [];
|
|
184
|
+
for (const moduleId of [...new Set(imports.map((item) => item.moduleId))]) {
|
|
185
|
+
const selected = imports.filter((item) => item.moduleId == moduleId);
|
|
186
|
+
const typeOnly = selected.filter((item) => item.typeOnly);
|
|
187
|
+
const values = selected.filter((item) => !item.typeOnly);
|
|
188
|
+
if (typeOnly.length > 0)
|
|
189
|
+
groups.push({ items: typeOnly, moduleId, typeOnly: true });
|
|
190
|
+
if (values.length > 0)
|
|
191
|
+
groups.push({ items: values, moduleId, typeOnly: false });
|
|
192
|
+
}
|
|
193
|
+
for (const group of groups) {
|
|
194
|
+
writer.synthetic(group.typeOnly ? "import type {" : "import {", "TypeScript ESM import declaration", group.items);
|
|
195
|
+
group.items.forEach((item, index) => {
|
|
196
|
+
const itemPath = `/imports/${imports.indexOf(item)}`;
|
|
197
|
+
const localName = writer.importNameFor(item);
|
|
198
|
+
if (index)
|
|
199
|
+
writer.synthetic(", ", "ESM import separator", group.items);
|
|
200
|
+
writer.mapped(item.importedName, { mappingKind: "exact", node: item, path: itemPath, role: "importedName" });
|
|
201
|
+
if (localName != item.importedName) {
|
|
202
|
+
writer.synthetic(" as ", "ESM import alias", [item], [itemPath]);
|
|
203
|
+
writer.mapped(localName, { mappingKind: "exact", node: item, path: itemPath, role: "localName" });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
writer.synthetic("} from ", "ESM import source", group.items);
|
|
207
|
+
writer.mapped(JSON.stringify(writer.relativeModuleSpecifier(group.moduleId, ".js")), {
|
|
208
|
+
mappingKind: "anchor", node: group.items[0], path: `/imports/${imports.indexOf(group.items[0])}`, role: "path"
|
|
209
|
+
});
|
|
210
|
+
writer.synthetic("\n", "ESM import terminator", group.items);
|
|
211
|
+
}
|
|
212
|
+
if (groups.length > 0)
|
|
213
|
+
writer.synthetic("\n", "ESM import separator", [module]);
|
|
214
|
+
emitStdlibProviderImports(module, writer);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Emits the grouped named ESM import for one linked stdlib provider.
|
|
218
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current module.
|
|
219
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
220
|
+
*/
|
|
221
|
+
function emitStdlibProviderImports(module, writer) {
|
|
222
|
+
const names = writer.stdlibProviderImports;
|
|
223
|
+
if (!writer.program || !names || names.length == 0)
|
|
224
|
+
return;
|
|
225
|
+
writer.synthetic("import {", "ESM stdlib provider import declaration", [module]);
|
|
226
|
+
names.forEach((name, index) => {
|
|
227
|
+
if (index)
|
|
228
|
+
writer.synthetic(", ", "ESM stdlib provider import separator", [module]);
|
|
229
|
+
writer.synthetic(name, "ESM stdlib provider import name", [module]);
|
|
230
|
+
});
|
|
231
|
+
writer.synthetic("} from ", "ESM stdlib provider import source", [module]);
|
|
232
|
+
writer.synthetic(JSON.stringify(writer.stdlibProviderSpecifier(".js")), "ESM stdlib provider import path", [module]);
|
|
233
|
+
writer.synthetic("\n", "ESM stdlib provider import terminator", [module]);
|
|
234
|
+
writer.synthetic("\n", "ESM stdlib provider import separator", [module]);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Emits explicit ESM export clauses for source aliases.
|
|
238
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Current module.
|
|
239
|
+
* @param {import("./writer.js").SourceWriter} writer - Source-aware writer.
|
|
240
|
+
*/
|
|
241
|
+
function emitAliasedExports(module, writer) {
|
|
242
|
+
if (!writer.program)
|
|
243
|
+
return;
|
|
244
|
+
const programModule = /** @type {import("../semantic/types.js").SemanticProgramModule} */ ( /** @type {unknown} */(module));
|
|
245
|
+
const aliases = programModule.exports.filter((item) => !writer.isDirectExport(item));
|
|
246
|
+
if (aliases.length == 0)
|
|
247
|
+
return;
|
|
248
|
+
writer.synthetic("\n\nexport {", "ESM aliased exports", [module]);
|
|
249
|
+
aliases.forEach((item, index) => {
|
|
250
|
+
if (index)
|
|
251
|
+
writer.synthetic(", ", "ESM export separator", [module]);
|
|
252
|
+
const declaration = [...programModule.functions, ...(programModule.records ?? []), ...(programModule.errors ?? [])].find(({ id }) => id == item.declarationId);
|
|
253
|
+
if (!declaration)
|
|
254
|
+
throw new RangeError(`Unknown exported declaration '${item.declarationId}'.`);
|
|
255
|
+
const exportPath = `/exports/${programModule.exports.indexOf(item)}`;
|
|
256
|
+
writer.mapped(declaration.name, { mappingKind: "exact", name: declaration.name, node: item, path: exportPath, role: "localName" });
|
|
257
|
+
writer.synthetic(" as ", "ESM aliased export operator", [item], [exportPath]);
|
|
258
|
+
writer.mapped(item.exportedName, { mappingKind: "exact", name: item.exportedName, node: item, path: exportPath, role: "exportedName" });
|
|
259
|
+
});
|
|
260
|
+
writer.synthetic("}", "ESM aliased export close", [module]);
|
|
48
261
|
}
|
|
49
262
|
/**
|
|
50
263
|
* Emits one ordered TypeScript block body.
|
|
@@ -68,15 +281,127 @@ function emitBlock(writer, block, indent, path, canonicalizeZero) {
|
|
|
68
281
|
* @returns {void}
|
|
69
282
|
*/
|
|
70
283
|
function emitStatement(writer, statement, indent, path, canonicalizeZero) {
|
|
284
|
+
emitEffectPrefixes(writer, statement, indent, path, "typescript", (expression, expressionPath) => emitExpression(writer, expression, expressionPath, "typescript", identity));
|
|
71
285
|
if (statement.kind == "LocalDeclaration" || statement.kind == "AssignmentStatement") {
|
|
72
286
|
emitLocal(writer, statement, indent, path);
|
|
73
287
|
writer.synthetic("\n", "line break", [statement], [path]);
|
|
74
288
|
return;
|
|
75
289
|
}
|
|
76
290
|
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
291
|
+
if (statement.kind == "PrivateFieldWriteStatement") {
|
|
292
|
+
emitExpression(writer, statement.receiver, `${path}/receiver`, "typescript", identity);
|
|
293
|
+
const field = writer.privateFieldForId(statement.field);
|
|
294
|
+
writer.mapped(`.${field.name}`, { mappingKind: "exact", name: field.name, node: statement, path, role: "member" });
|
|
295
|
+
writer.synthetic(" = ", "private field assignment", [statement], [path]);
|
|
296
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
|
|
297
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if (statement.kind == "BreakStatement" || statement.kind == "ContinueStatement") {
|
|
301
|
+
writer.mapped(statement.kind == "BreakStatement" ? "break" : "continue", { mappingKind: "exact", node: statement, path });
|
|
302
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (statement.kind == "WhileStatement") {
|
|
306
|
+
writer.mapped("while", { mappingKind: "exact", node: statement, path });
|
|
307
|
+
writer.synthetic(" (", "condition-controlled loop spacing", [statement], [path]);
|
|
308
|
+
emitExpression(writer, statement.condition, `${path}/condition`, "typescript", identity);
|
|
309
|
+
writer.synthetic(") ", "condition-controlled loop spacing", [statement], [path]);
|
|
310
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
311
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
312
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
313
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
314
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
315
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (statement.kind == "ForEachStatement") {
|
|
319
|
+
writer.mapped("for", { mappingKind: "anchor", node: statement, path });
|
|
320
|
+
writer.synthetic(" (const ", "loop scaffolding", [statement], [path]);
|
|
321
|
+
writer.mapped(statement.valueBinding.name, {
|
|
322
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
323
|
+
});
|
|
324
|
+
writer.synthetic(" of ", "loop scaffolding", [statement], [path]);
|
|
325
|
+
emitExpression(writer, statement.list, `${path}/list`, "typescript", identity);
|
|
326
|
+
writer.synthetic(") ", "loop scaffolding", [statement], [path]);
|
|
327
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
328
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
329
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
330
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
331
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
332
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (statement.kind == "ForEachMapStatement") {
|
|
336
|
+
writer.mapped("for", { mappingKind: "anchor", node: statement, path });
|
|
337
|
+
writer.synthetic(" (const [", "map loop scaffolding", [statement], [path]);
|
|
338
|
+
writer.mapped(statement.keyBinding.name, {
|
|
339
|
+
mappingKind: "exact", node: statement.keyBinding, path: `${path}/keyBinding`, role: "name"
|
|
340
|
+
});
|
|
341
|
+
writer.synthetic(", ", "map iteration binding separator", [statement], [path]);
|
|
342
|
+
writer.mapped(statement.valueBinding.name, {
|
|
343
|
+
mappingKind: "exact", node: statement.valueBinding, path: `${path}/valueBinding`, role: "name"
|
|
344
|
+
});
|
|
345
|
+
writer.synthetic("] of ", "map loop scaffolding", [statement], [path]);
|
|
346
|
+
emitExpression(writer, statement.map, `${path}/map`, "typescript", identity);
|
|
347
|
+
writer.synthetic(") ", "map loop scaffolding", [statement], [path]);
|
|
348
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
349
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
350
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
351
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
352
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
353
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
if (statement.kind == "RaiseStatement") {
|
|
357
|
+
const type = statement.error.error;
|
|
358
|
+
const error = writer.errorForId(type.declarationId);
|
|
359
|
+
writer.mapped("throw", { mappingKind: "anchor", node: statement, path });
|
|
360
|
+
writer.synthetic(" new ", "error construction scaffolding", [statement.error], [`${path}/error`]);
|
|
361
|
+
writer.mapped(writer.errorNameForId(type.declarationId), { mappingKind: "exact", name: error.name, node: statement.error, path: `${path}/error`, role: "type" });
|
|
362
|
+
writer.synthetic("(", "error construction open", [statement.error], [`${path}/error`]);
|
|
363
|
+
emitExpression(writer, statement.error.message, `${path}/error/message`, "typescript", identity);
|
|
364
|
+
writer.synthetic(")\n", "error construction close", [statement.error], [`${path}/error`]);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (statement.kind == "TryStatement") {
|
|
368
|
+
const caught = writer.errorForId(statement.catchType.declarationId);
|
|
369
|
+
const targetName = writer.errorNameForId(statement.catchType.declarationId);
|
|
370
|
+
writer.mapped("try", { mappingKind: "anchor", node: statement, path });
|
|
371
|
+
writer.synthetic(" ", "try spacing", [statement], [path]);
|
|
372
|
+
writer.mapped("{", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
373
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
374
|
+
emitBlock(writer, statement.body, `${indent} `, `${path}/body`, canonicalizeZero);
|
|
375
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
376
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.body, path: `${path}/body` });
|
|
377
|
+
writer.synthetic(" ", "catch spacing", [statement], [path]);
|
|
378
|
+
writer.mapped("catch", { mappingKind: "anchor", node: statement, path, role: "catch" });
|
|
379
|
+
writer.synthetic(" (", "catch binding scaffolding", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
380
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
381
|
+
writer.synthetic(") {\n", "catch binding scaffolding", [statement.catchBinding], [`${path}/catchBinding`]);
|
|
382
|
+
writer.synthetic(`${indent} if (!(`, "exact catch guard", [statement], [path]);
|
|
383
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
384
|
+
writer.synthetic(" instanceof ", "exact catch guard", [statement], [path]);
|
|
385
|
+
writer.mapped(targetName, { mappingKind: "exact", name: caught.name, node: statement.catchType, path: `${path}/catchType`, role: "type" });
|
|
386
|
+
writer.synthetic(`)) {\n${indent} throw `, "unmatched error propagation", [statement], [path]);
|
|
387
|
+
writer.mapped(statement.catchBinding.name, { mappingKind: "exact", node: statement.catchBinding, path: `${path}/catchBinding`, role: "name" });
|
|
388
|
+
writer.synthetic(`\n${indent} }\n`, "unmatched error propagation", [statement], [path]);
|
|
389
|
+
emitBlock(writer, statement.catchBody, `${indent} `, `${path}/catchBody`, canonicalizeZero);
|
|
390
|
+
writer.synthetic(indent, "indentation", [statement], [path]);
|
|
391
|
+
writer.mapped("}", { mappingKind: "anchor", node: statement.catchBody, path: `${path}/catchBody` });
|
|
392
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
77
395
|
if (statement.kind == "ReturnStatement") {
|
|
78
396
|
writer.mapped("return", { mappingKind: "anchor", node: statement, path });
|
|
79
|
-
|
|
397
|
+
if (statement.expression) {
|
|
398
|
+
writer.synthetic(" ", "return spacing", [statement], [path]);
|
|
399
|
+
emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
|
|
400
|
+
}
|
|
401
|
+
writer.synthetic("\n", "line break", [statement], [path]);
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
if (statement.kind == "ExpressionStatement") {
|
|
80
405
|
emitExpression(writer, statement.expression, `${path}/expression`, "typescript", identity);
|
|
81
406
|
writer.synthetic("\n", "line break", [statement], [path]);
|
|
82
407
|
return;
|
|
@@ -138,12 +463,7 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
138
463
|
writer.synthetic(" ", "declaration spacing", [statement], [statementPath]);
|
|
139
464
|
writer.mapped(statement.name, { mappingKind: "exact", node: statement, path: statementPath, role: "name" });
|
|
140
465
|
writer.synthetic(": ", "type separator", [statement], [statementPath]);
|
|
141
|
-
writer
|
|
142
|
-
mappingKind: "exact",
|
|
143
|
-
node: statement.type,
|
|
144
|
-
path: `${statementPath}/type`,
|
|
145
|
-
role: "type"
|
|
146
|
-
});
|
|
466
|
+
emitType(writer, statement.type, `${statementPath}/type`, "typescript");
|
|
147
467
|
writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
|
|
148
468
|
writer.mapped("=", { mappingKind: "exact", node: statement, path: statementPath, role: "operator" });
|
|
149
469
|
writer.synthetic(" ", "assignment spacing", [statement], [statementPath]);
|
|
@@ -157,4 +477,4 @@ function emitLocal(writer, statement, indent, statementPath) {
|
|
|
157
477
|
function identity(name) {
|
|
158
478
|
return name;
|
|
159
479
|
}
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy90eXBlc2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLDhCQUE4QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUvRCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGFBQWEsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRXZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxXQUFXLENBQUMsVUFBVSxDQUFD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QUFDLENBQUE7SUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUNsRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxhQUFhLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDdkcsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2VtaXRFeHByZXNzaW9uLCByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmd9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2VtaXRTY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcblxuLyoqXG4gKiBFbWl0cyBhbiBpbmRlcGVuZGVudGx5IGV4ZWN1dGFibGUgVHlwZVNjcmlwdCBwcm9ncmFtIHRocm91Z2ggdGhlIHNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlU2NyaXB0KG1vZHVsZSwgd3JpdGVyKSB7XG4gIGNvbnN0IGNhbm9uaWNhbGl6ZVplcm8gPSByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmcobW9kdWxlKVxuXG4gIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGZ1bmN0aW9uSW5kZXgpID0+IHtcbiAgICBpZiAoZnVuY3Rpb25JbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIHdyaXRlci5tYXBwZWQoXCJmdW5jdGlvblwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke2luZGV4fWBcblxuICAgICAgaWYgKGluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwicGFyYW1ldGVyIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwidHlwZSBzZXBhcmF0b3JcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ0eXBlc2NyaXB0XCIsIHBhcmFtZXRlci50eXBlKSwge1xuICAgICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLFxuICAgICAgICBub2RlOiBwYXJhbWV0ZXIudHlwZSxcbiAgICAgICAgcGF0aDogYCR7cGFyYW1ldGVyUGF0aH0vdHlwZWAsXG4gICAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgICB9KVxuICAgIH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwicmV0dXJuIHR5cGUgc2VwYXJhdG9yXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcInR5cGVzY3JpcHRcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSksIHtcbiAgICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgICBub2RlOiBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgICAgcGF0aDogYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9yZXR1cm5UeXBlYCxcbiAgICAgIHJvbGU6IFwidHlwZVwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImZ1bmN0aW9uIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSlcbiAgICB3cml0ZXIubWFwcGVkKFwie1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dKVxuXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgZGVjbGFyYXRpb24uYm9keSwgXCIgIFwiLCBgL2Z1bmN0aW9ucy8ke2Z1bmN0aW9uSW5kZXh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICB9KVxuXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJlbnRyeS1wb2ludCBzZXBhcmF0b3JcIiwgW21vZHVsZS5lbnRyeVBvaW50XSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCJcIiwgXCIvZW50cnlQb2ludC9ib2R5XCIsIGNhbm9uaWNhbGl6ZVplcm8pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIG9yZGVyZWQgVHlwZVNjcmlwdCBibG9jayBib2R5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEluZGVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBFeGFjdCBibG9jayBwYXRoLlxuICogQHBhcmFtIHtib29sZWFufSBjYW5vbmljYWxpemVaZXJvIC0gV2hldGhlciBwcmludGVkIGludGVnZXIgemVybyBtdXN0IGJlIGNhbm9uaWNhbGl6ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdEJsb2NrKHdyaXRlciwgYmxvY2ssIGluZGVudCwgcGF0aCwgY2Fub25pY2FsaXplWmVybykge1xuICBibG9jay5zdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCwgaW5kZXgpID0+IGVtaXRTdGF0ZW1lbnQod3JpdGVyLCBzdGF0ZW1lbnQsIGluZGVudCwgYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWAsIGNhbm9uaWNhbGl6ZVplcm8pKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBUeXBlU2NyaXB0IHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFNlbWFudGljIHN0YXRlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3Qgc3RhdGVtZW50IHBhdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbm9uaWNhbGl6ZVplcm8gLSBXaGV0aGVyIHByaW50ZWQgaW50ZWdlciB6ZXJvIG11c3QgYmUgY2Fub25pY2FsaXplZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBlbWl0U3RhdGVtZW50KHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgZW1pdExvY2FsKHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIHBhdGgpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJyZXR1cm5cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmV0dXJuIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJjb25zb2xlLmxvZ1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIGlmIChjYW5vbmljYWxpemVaZXJvKSB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcImNhbm9uaWNhbCBpbnRlZ2VyIG91dHB1dFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInR5cGVzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgaWYgKGNhbm9uaWNhbGl6ZVplcm8pIHdyaXRlci5zeW50aGV0aWMoXCIpLnRvU3RyaW5nKClcIiwgXCJjYW5vbmljYWwgaW50ZWdlciBvdXRwdXRcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIubWFwcGVkKFwiaWZcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY29uc2VxdWVudCwgcGF0aDogYCR7cGF0aH0vY29uc2VxdWVudGB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vY29uc2VxdWVudGAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZWxzZVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5hbHRlcm5hdGUsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICB9XG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIFR5cGVTY3JpcHQgbG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBMb2NhbCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gTGVhZGluZyBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZW1lbnRQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGlzIHN0YXRlbWVudCBvY2N1cnJlbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBzdGF0ZW1lbnRQYXRoKSB7XG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG5cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudGFyZ2V0LCBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90YXJnZXRgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiPVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm9wZXJhdG9yXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50Lm11dGFibGUgPyBcImxldFwiIDogXCJjb25zdFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInR5cGUgc2VwYXJhdG9yXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJ0eXBlc2NyaXB0XCIsIHN0YXRlbWVudC50eXBlKSwge1xuICAgIG1hcHBpbmdLaW5kOiBcImV4YWN0XCIsXG4gICAgbm9kZTogc3RhdGVtZW50LnR5cGUsXG4gICAgcGF0aDogYCR7c3RhdGVtZW50UGF0aH0vdHlwZWAsXG4gICAgcm9sZTogXCJ0eXBlXCJcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGAke3N0YXRlbWVudFBhdGh9L2luaXRpYWxpemVyYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gdW5jaGFuZ2VkIFR5cGVTY3JpcHQgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gSWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IElkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbn1cbiJdfQ==
|
|
480
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy90eXBlc2NyaXB0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSw4QkFBOEIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNwRixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFFbEU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU07SUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUVsQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbEMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUUvQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQ25DLE1BQU0sSUFBSSxHQUFHLFdBQVcsVUFBVSxFQUFFLENBQUE7UUFFcEMsSUFBSSxVQUFVLEdBQUcsQ0FBQztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLDZCQUE2QixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVGLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLDJCQUEyQixFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDbEYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSx3Q0FBd0MsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsRyxDQUFDLENBQUMsQ0FBQTtJQUNGLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBRXhGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxVQUFVLEdBQUcsWUFBWSxXQUFXLEVBQUUsQ0FBQTtRQUU1QyxJQUFJLFdBQVcsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFDckcsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ2xILE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLDRCQUE0QixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ2hHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxHQUFHLFVBQVUsaUJBQWlCLENBQUMsQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLDJDQUEyQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzNHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsVUFBVSxXQUFXLFVBQVUsRUFBRSxDQUFBO1lBRXRELElBQUksVUFBVTtnQkFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtZQUN4RixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSx1Q0FBdUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUM1RixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUM3RixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUM5RCxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxTQUFTLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUNqRSxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLDJDQUEyQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ2xHLENBQUMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFFdkYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUMxQyxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFlBQVksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3BILGtCQUFrQixDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDdkUsQ0FBQyxDQUFDLENBQUE7SUFDRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLG9DQUFvQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUVoRyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUN0RCxJQUFJLGFBQWEsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRXZGLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDaEgsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDeEYsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGNBQWMsYUFBYSxpQkFBaUIsQ0FBQyxDQUFBO1FBQzFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNsRCxNQUFNLGFBQWEsR0FBRyxjQUFjLGFBQWEsZUFBZSxLQUFLLEVBQUUsQ0FBQTtZQUV2RSxJQUFJLEtBQUssR0FBRyxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtZQUN6RyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUN0RSxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxhQUFhLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUN6RSxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDOUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLGNBQWMsYUFBYSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDaEcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUM5RCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBRW5ELFNBQVMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxhQUFhLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBQy9GLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtJQUNoRSxDQUFDLENBQUMsQ0FBQTtJQUVGLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztRQUMvQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDckYsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0I7SUFDM0UsTUFBTSxJQUFJLEdBQUcsWUFBWSxVQUFVLEVBQUUsQ0FBQTtJQUVyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3hFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLHlCQUF5QixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDOUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdkUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDMUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxJQUFJLFdBQVcsS0FBSyxFQUFFLENBQUE7UUFFM0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDakYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDN0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDNUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDL0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzVELENBQUMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQTtJQUMzQyxNQUFNLGVBQWUsR0FBRyxHQUFHLElBQUksY0FBYyxDQUFBO0lBRTdDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUE7SUFDbkgsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsZUFBZSxhQUFhLENBQUMsQ0FBQTtJQUMvRSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtJQUM5RSxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsZUFBZSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtJQUN4RixNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtJQUM5RSxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QyxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FBQTtRQUU3QyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUNwRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUNoRyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxVQUFVLGFBQWEsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ3pFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLFVBQVUsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQzdFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUMvRCxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUM5RSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFDakUsQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtBQUN0RSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJO0lBQzlDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3hELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxhQUFhLEdBQUcsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUE7UUFFeEMsSUFBSSxLQUFLO1lBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDekcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFDaEYsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsYUFBYSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDekUsQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUMzRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSTtJQUNsRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU07SUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsZ0NBQWdDLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDbkUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUN0QyxJQUFJLEtBQUs7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxxQ0FBcUMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUNwRixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO0lBQ2hILENBQUMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsaUNBQWlDLEVBQUUsVUFBVSxDQUFDLENBQUE7QUFDdEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNO0lBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztRQUFFLE9BQU07SUFDM0IsTUFBTSxPQUFPLEdBQUcsbUVBQW1FLENBQUMsRUFBQyxzQkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUM3SCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFFakIsS0FBSyxNQUFNLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUE7UUFDcEUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXhELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ2pGLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2pILEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xDLE1BQU0sUUFBUSxHQUFHLFlBQVksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFBO1lBQ3BELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFNUMsSUFBSSxLQUFLO2dCQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN0RSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQTtZQUMxRyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO2dCQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1lBQ2pHLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNuRixXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU07U0FDL0csQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUMvRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxNQUFNO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQTtJQUUxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFNO0lBRTFELE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNoRixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzVCLElBQUksS0FBSztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHNDQUFzQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNuRixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDckUsQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDMUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlDQUFpQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNwSCxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSx1Q0FBdUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDekUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87UUFBRSxPQUFNO0lBQzNCLE1BQU0sYUFBYSxHQUFHLG1FQUFtRSxDQUFDLEVBQUMsc0JBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUMzSCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFFcEYsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFNO0lBQy9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLHFCQUFxQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUNqRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzlCLElBQUksS0FBSztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUNuRSxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFNUosSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLGlDQUFpQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQTtRQUMvRixNQUFNLFVBQVUsR0FBRyxZQUFZLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7UUFFcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7UUFDaEksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFDN0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUE7SUFDdkksQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDN0QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQjtJQUM5RCxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksZUFBZSxLQUFLLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7QUFDM0ksQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQjtJQUN0RSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUM5RCxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUM3RyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksa0JBQWtCLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BGLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMxQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsT0FBTTtJQUNSLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDNUQsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLDRCQUE0QixFQUFFLENBQUM7UUFDbkQsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFDaEgsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDeEUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzFGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDaEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3ZILE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDckUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDaEYsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxZQUFZLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3hGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDdkYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pELFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNsRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDekMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTTtTQUMvRixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNqRSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDOUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDL0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ2xGLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ3ZGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDcEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDMUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN2QyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNO1NBQzNGLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzlFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDekMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTTtTQUMvRixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN0RSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDNUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ2xGLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ3ZGLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFBO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDdEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNqRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUM5SixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3RGLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNoRyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3pGLE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNwRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ2xGLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ3ZGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDckYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQTtRQUN2RyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUM1SSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFBO1FBQzFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUMvRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUM1SSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUMxRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7UUFDeEksTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLE1BQU0sWUFBWSxFQUFFLDZCQUE2QixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2pHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQzVJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN4RixTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDNUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBQyxDQUFDLENBQUE7UUFDakcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUN2RSxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUM1RCxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDNUYsQ0FBQztRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMxRixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQzVFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDbEUsSUFBSSxnQkFBZ0I7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RixjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDMUYsSUFBSSxnQkFBZ0I7WUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN2RyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUNsRSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDeEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUNsRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBQ25HLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN6RCxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDOUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLGFBQWEsRUFBQyxDQUFDLENBQUE7SUFDbkcsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1FBQ2pHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN6RCxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDNUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLFlBQVksRUFBQyxDQUFDLENBQUE7SUFDbkcsQ0FBQztJQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGFBQWE7SUFDekQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBRXJFLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLGFBQWEsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBQ25JLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFDbEcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFDekUsY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsYUFBYSxhQUFhLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ25HLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUNqSCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUMxRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtJQUN6RyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN0RSxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxhQUFhLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN2RSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQ2xHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0lBQ3pFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHLGFBQWEsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUN2RyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQUk7SUFDcEIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZW1pdEV4cHJlc3Npb24sIGVtaXRUeXBlLCByZXF1aXJlc0Nhbm9uaWNhbFplcm9SZW5kZXJpbmd9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge2VtaXRFZmZlY3RQcmVmaXhlcywgZW1pdEVmZmVjdFN1cHBvcnR9IGZyb20gXCIuL2VmZmVjdHMuanNcIlxuXG4vKipcbiAqIEVtaXRzIGFuIGluZGVwZW5kZW50bHkgZXhlY3V0YWJsZSBUeXBlU2NyaXB0IHByb2dyYW0gdGhyb3VnaCB0aGUgc291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVR5cGVTY3JpcHQobW9kdWxlLCB3cml0ZXIpIHtcbiAgY29uc3QgY2Fub25pY2FsaXplWmVybyA9IHJlcXVpcmVzQ2Fub25pY2FsWmVyb1JlbmRlcmluZyhtb2R1bGUpXG4gIGNvbnN0IHJlY29yZHMgPSBtb2R1bGUucmVjb3JkcyA/PyBbXVxuICBjb25zdCBjbGFzc2VzID0gbW9kdWxlLmNsYXNzZXMgPz8gW11cbiAgY29uc3QgZXJyb3JzID0gbW9kdWxlLmVycm9ycyA/PyBbXVxuXG4gIGVtaXRQcm9ncmFtSW1wb3J0cyhtb2R1bGUsIHdyaXRlcilcbiAgZW1pdEVmZmVjdFN1cHBvcnQod3JpdGVyLCBtb2R1bGUsIFwidHlwZXNjcmlwdFwiKVxuXG4gIGVycm9ycy5mb3JFYWNoKChlcnJvciwgZXJyb3JJbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBgL2Vycm9ycy8ke2Vycm9ySW5kZXh9YFxuXG4gICAgaWYgKGVycm9ySW5kZXggPiAwKSB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZXJyb3IgZGVjbGFyYXRpb24gc2VwYXJhdG9yXCIsIFtlcnJvcl0sIFtwYXRoXSlcbiAgICBpZiAod3JpdGVyLmlzRGlyZWN0bHlFeHBvcnRlZChlcnJvci5pZCkpIHdyaXRlci5zeW50aGV0aWMoXCJleHBvcnQgXCIsIFwiRVNNIGVycm9yIGV4cG9ydFwiLCBbZXJyb3JdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImNsYXNzXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZXJyb3IsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZXJyb3IgZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbZXJyb3JdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChlcnJvci5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZXJyb3IsIHBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIGV4dGVuZHMgRXJyb3Ige31cIiwgXCJUeXBlU2NyaXB0IHVuY2hlY2tlZCBlcnJvciBzY2FmZm9sZGluZ1wiLCBbZXJyb3JdLCBbcGF0aF0pXG4gIH0pXG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcImVycm9yL2RlY2xhcmF0aW9uIHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcblxuICByZWNvcmRzLmZvckVhY2goKHJlY29yZCwgcmVjb3JkSW5kZXgpID0+IHtcbiAgICBjb25zdCByZWNvcmRQYXRoID0gYC9yZWNvcmRzLyR7cmVjb3JkSW5kZXh9YFxuXG4gICAgaWYgKHJlY29yZEluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlY29yZCBkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgICBpZiAod3JpdGVyLmlzRGlyZWN0bHlFeHBvcnRlZChyZWNvcmQuaWQpKSB3cml0ZXIuc3ludGhldGljKFwiZXhwb3J0IFwiLCBcIkVTTSByZWNvcmQgZXhwb3J0XCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcImNsYXNzXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogcmVjb3JkLCBwYXRoOiByZWNvcmRQYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInJlY29yZCBkZWNsYXJhdGlvbiBzcGFjaW5nXCIsIFtyZWNvcmRdLCBbcmVjb3JkUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChyZWNvcmQubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHJlY29yZCwgcGF0aDogcmVjb3JkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIGVtaXRUeXBlUGFyYW1ldGVycyh3cml0ZXIsIHJlY29yZC50eXBlUGFyYW1ldGVycyA/PyBbXSwgYCR7cmVjb3JkUGF0aH0vdHlwZVBhcmFtZXRlcnNgKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIge1xcbiAgY29uc3RydWN0b3IoXCIsIFwiVHlwZVNjcmlwdCByZWNvcmQgY29uc3RydWN0b3Igc2NhZmZvbGRpbmdcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgICByZWNvcmQuZmllbGRzLmZvckVhY2goKGZpZWxkLCBmaWVsZEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFBhdGggPSBgJHtyZWNvcmRQYXRofS9maWVsZHMvJHtmaWVsZEluZGV4fWBcblxuICAgICAgaWYgKGZpZWxkSW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcInJlY29yZCBmaWVsZCBzZXBhcmF0b3JcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgICAgIHdyaXRlci5zeW50aGV0aWMoXCJyZWFkb25seSBcIiwgXCJUeXBlU2NyaXB0IHJlYWRvbmx5IGZpZWxkIHNjYWZmb2xkaW5nXCIsIFtmaWVsZF0sIFtmaWVsZFBhdGhdKVxuICAgICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwidHlwZSBzZXBhcmF0b3JcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgICBlbWl0VHlwZSh3cml0ZXIsIGZpZWxkLnR5cGUsIGAke2ZpZWxkUGF0aH0vdHlwZWAsIFwidHlwZXNjcmlwdFwiKVxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikge31cXG59XCIsIFwiVHlwZVNjcmlwdCByZWNvcmQgY29uc3RydWN0b3Igc2NhZmZvbGRpbmdcIiwgW3JlY29yZF0sIFtyZWNvcmRQYXRoXSlcbiAgfSlcbiAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlY29yZC9mdW5jdGlvbiBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG5cbiAgY2xhc3Nlcy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgY2xhc3NJbmRleCkgPT4ge1xuICAgIGlmIChjbGFzc0luZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblxcblwiLCBcInJlZmVyZW5jZSBjbGFzcyBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSwgW2AvY2xhc3Nlcy8ke2NsYXNzSW5kZXh9YF0pXG4gICAgZW1pdFJlZmVyZW5jZUNsYXNzKHdyaXRlciwgZGVjbGFyYXRpb24sIGNsYXNzSW5kZXgsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIH0pXG4gIGlmIChjbGFzc2VzLmxlbmd0aCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJyZWZlcmVuY2UgY2xhc3MvZnVuY3Rpb24gc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxuXG4gIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGZ1bmN0aW9uSW5kZXgpID0+IHtcbiAgICBpZiAoZnVuY3Rpb25JbmRleCA+IDApIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cXG5cIiwgXCJkZWNsYXJhdGlvbiBzZXBhcmF0b3JcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIGlmICh3cml0ZXIuaXNEaXJlY3RseUV4cG9ydGVkKGRlY2xhcmF0aW9uLmlkKSkgd3JpdGVyLnN5bnRoZXRpYyhcImV4cG9ydCBcIiwgXCJFU00gZnVuY3Rpb24gZXhwb3J0XCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChcImZ1bmN0aW9uXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZnVuY3Rpb24gc3BhY2luZ1wiLCBbZGVjbGFyYXRpb25dKVxuICAgIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGRlY2xhcmF0aW9uLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgZW1pdFR5cGVQYXJhbWV0ZXJzKHdyaXRlciwgZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10sIGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vdHlwZVBhcmFtZXRlcnNgKVxuICAgIHdyaXRlci5tYXBwZWQoXCIoXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAvZnVuY3Rpb25zLyR7ZnVuY3Rpb25JbmRleH0vcGFyYW1ldGVycy8ke2luZGV4fWBcblxuICAgICAgaWYgKGluZGV4ID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwicGFyYW1ldGVyIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIjogXCIsIFwidHlwZSBzZXBhcmF0b3JcIiwgW3BhcmFtZXRlcl0sIFtwYXJhbWV0ZXJQYXRoXSlcbiAgICAgIGVtaXRUeXBlKHdyaXRlciwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcInR5cGVzY3JpcHRcIilcbiAgICB9KVxuICAgIHdyaXRlci5tYXBwZWQoXCIpXCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb259KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInJldHVybiB0eXBlIHNlcGFyYXRvclwiLCBbZGVjbGFyYXRpb25dKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9yZXR1cm5UeXBlYCwgXCJ0eXBlc2NyaXB0XCIpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJmdW5jdGlvbiBzcGFjaW5nXCIsIFtkZWNsYXJhdGlvbl0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW2RlY2xhcmF0aW9uXSlcblxuICAgIGVtaXRCbG9jayh3cml0ZXIsIGRlY2xhcmF0aW9uLmJvZHksIFwiICBcIiwgYC9mdW5jdGlvbnMvJHtmdW5jdGlvbkluZGV4fS9ib2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGRlY2xhcmF0aW9ufSlcbiAgfSlcblxuICBlbWl0QWxpYXNlZEV4cG9ydHMobW9kdWxlLCB3cml0ZXIpXG4gIGlmICghd3JpdGVyLnByb2dyYW0gfHwgd3JpdGVyLmlzUHJvZ3JhbUVudHJ5KCkpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuXCIsIFwiZW50cnktcG9pbnQgc2VwYXJhdG9yXCIsIFttb2R1bGUuZW50cnlQb2ludF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCJcIiwgXCIvZW50cnlQb2ludC9ib2R5XCIsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgbmF0aXZlIFR5cGVTY3JpcHQgcmVmZXJlbmNlIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gUmVmZXJlbmNlIGNsYXNzLlxuICogQHBhcmFtIHtudW1iZXJ9IGNsYXNzSW5kZXggLSBNb2R1bGUgY2xhc3MgaW5kZXguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbm9uaWNhbGl6ZVplcm8gLSBXaGV0aGVyIHNjYWxhciBvdXRwdXQgY2Fub25pY2FsaXplcyB6ZXJvLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRSZWZlcmVuY2VDbGFzcyh3cml0ZXIsIGRlY2xhcmF0aW9uLCBjbGFzc0luZGV4LCBjYW5vbmljYWxpemVaZXJvKSB7XG4gIGNvbnN0IHBhdGggPSBgL2NsYXNzZXMvJHtjbGFzc0luZGV4fWBcblxuICB3cml0ZXIubWFwcGVkKFwiY2xhc3NcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwicmVmZXJlbmNlIGNsYXNzIHNwYWNpbmdcIiwgW2RlY2xhcmF0aW9uXSwgW3BhdGhdKVxuICB3cml0ZXIubWFwcGVkKGRlY2xhcmF0aW9uLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBkZWNsYXJhdGlvbiwgcGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIHtcXG5cIiwgXCJyZWZlcmVuY2UgY2xhc3Mgb3BlblwiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gIGRlY2xhcmF0aW9uLmZpZWxkcy5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBmaWVsZFBhdGggPSBgJHtwYXRofS9maWVsZHMvJHtpbmRleH1gXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiICBwcml2YXRlIFwiLCBcInByaXZhdGUgZmllbGQgc2NhZmZvbGRpbmdcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChmaWVsZC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogZmllbGQsIHBhdGg6IGZpZWxkUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInByaXZhdGUgZmllbGQgdHlwZSBzZXBhcmF0b3JcIiwgW2ZpZWxkXSwgW2ZpZWxkUGF0aF0pXG4gICAgZW1pdFR5cGUod3JpdGVyLCBmaWVsZC50eXBlLCBgJHtmaWVsZFBhdGh9L3R5cGVgLCBcInR5cGVzY3JpcHRcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZmllbGRdLCBbZmllbGRQYXRoXSlcbiAgfSlcbiAgY29uc3QgY29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvclxuICBjb25zdCBjb25zdHJ1Y3RvclBhdGggPSBgJHtwYXRofS9jb25zdHJ1Y3RvcmBcblxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuICBcIiwgXCJjb25zdHJ1Y3RvciBzcGFjaW5nXCIsIFtjb25zdHJ1Y3Rvcl0sIFtjb25zdHJ1Y3RvclBhdGhdKVxuICB3cml0ZXIubWFwcGVkKFwiY29uc3RydWN0b3JcIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGNvbnN0cnVjdG9yLCBwYXRoOiBjb25zdHJ1Y3RvclBhdGgsIHJvbGU6IFwiY29uc3RydWN0b3JcIn0pXG4gIGVtaXRQYXJhbWV0ZXJzKHdyaXRlciwgY29uc3RydWN0b3IucGFyYW1ldGVycywgYCR7Y29uc3RydWN0b3JQYXRofS9wYXJhbWV0ZXJzYClcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiB7XFxuXCIsIFwiY29uc3RydWN0b3Igb3BlblwiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgZW1pdEJsb2NrKHdyaXRlciwgY29uc3RydWN0b3IuYm9keSwgXCIgICAgXCIsIGAke2NvbnN0cnVjdG9yUGF0aH0vYm9keWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgIH1cIiwgXCJjb25zdHJ1Y3RvciBjbG9zZVwiLCBbY29uc3RydWN0b3JdLCBbY29uc3RydWN0b3JQYXRoXSlcbiAgZGVjbGFyYXRpb24ubWV0aG9kcy5mb3JFYWNoKChtZXRob2QsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgbWV0aG9kUGF0aCA9IGAke3BhdGh9L21ldGhvZHMvJHtpbmRleH1gXG5cbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuICBcIiwgXCJtZXRob2Qgc3BhY2luZ1wiLCBbbWV0aG9kXSwgW21ldGhvZFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQobWV0aG9kLm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBtZXRob2QsIHBhdGg6IG1ldGhvZFBhdGgsIHJvbGU6IFwibmFtZVwifSlcbiAgICBlbWl0UGFyYW1ldGVycyh3cml0ZXIsIG1ldGhvZC5wYXJhbWV0ZXJzLCBgJHttZXRob2RQYXRofS9wYXJhbWV0ZXJzYClcbiAgICB3cml0ZXIuc3ludGhldGljKFwiOiBcIiwgXCJtZXRob2QgcmV0dXJuIHNlcGFyYXRvclwiLCBbbWV0aG9kXSwgW21ldGhvZFBhdGhdKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgbWV0aG9kLnJldHVyblR5cGUsIGAke21ldGhvZFBhdGh9L3JldHVyblR5cGVgLCBcInR5cGVzY3JpcHRcIilcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIHtcXG5cIiwgXCJtZXRob2Qgb3BlblwiLCBbbWV0aG9kXSwgW21ldGhvZFBhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIG1ldGhvZC5ib2R5LCBcIiAgICBcIiwgYCR7bWV0aG9kUGF0aH0vYm9keWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiAgfVwiLCBcIm1ldGhvZCBjbG9zZVwiLCBbbWV0aG9kXSwgW21ldGhvZFBhdGhdKVxuICB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbZGVjbGFyYXRpb25dLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogZGVjbGFyYXRpb24sIHBhdGh9KVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBUeXBlU2NyaXB0IHBhcmFtZXRlciBsaXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gT3JkZXJlZCBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXJhbWV0ZXIgY29sbGVjdGlvbiBwYXRoLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRQYXJhbWV0ZXJzKHdyaXRlciwgcGFyYW1ldGVycywgcGF0aCkge1xuICB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcInBhcmFtZXRlciBsaXN0IG9wZW5cIiwgcGFyYW1ldGVycylcbiAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAke3BhdGh9LyR7aW5kZXh9YFxuXG4gICAgaWYgKGluZGV4KSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIHBhcmFtZXRlcnMpXG4gICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogcGFyYW1ldGVyUGF0aCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInBhcmFtZXRlciB0eXBlIHNlcGFyYXRvclwiLCBbcGFyYW1ldGVyXSwgW3BhcmFtZXRlclBhdGhdKVxuICAgIGVtaXRUeXBlKHdyaXRlciwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcInR5cGVzY3JpcHRcIilcbiAgfSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIilcIiwgXCJwYXJhbWV0ZXIgbGlzdCBjbG9zZVwiLCBwYXJhbWV0ZXJzKVxufVxuXG4vKipcbiAqIEVtaXRzIG5hdGl2ZSBpbnZhcmlhbnQgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlR5cGVQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIE9yZGVyZWQgdHlwZSBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUeXBlLXBhcmFtZXRlciBjb2xsZWN0aW9uIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGVtaXRUeXBlUGFyYW1ldGVycyh3cml0ZXIsIHBhcmFtZXRlcnMsIHBhdGgpIHtcbiAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09IDApIHJldHVyblxuICB3cml0ZXIuc3ludGhldGljKFwiPFwiLCBcIlR5cGVTY3JpcHQgdHlwZSBwYXJhbWV0ZXIgb3BlblwiLCBwYXJhbWV0ZXJzKVxuICBwYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICBpZiAoaW5kZXgpIHdyaXRlci5zeW50aGV0aWMoXCIsIFwiLCBcIlR5cGVTY3JpcHQgdHlwZSBwYXJhbWV0ZXIgc2VwYXJhdG9yXCIsIHBhcmFtZXRlcnMpXG4gICAgd3JpdGVyLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHBhcmFtZXRlciwgcGF0aDogYCR7cGF0aH0vJHtpbmRleH1gLCByb2xlOiBcIm5hbWVcIn0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCI+XCIsIFwiVHlwZVNjcmlwdCB0eXBlIHBhcmFtZXRlciBjbG9zZVwiLCBwYXJhbWV0ZXJzKVxufVxuXG4vKipcbiAqIEVtaXRzIGdyb3VwZWQgdmFsdWUgYW5kIHR5cGUtb25seSBFU00gaW1wb3J0cyBmb3IgYSBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIEN1cnJlbnQgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRQcm9ncmFtSW1wb3J0cyhtb2R1bGUsIHdyaXRlcikge1xuICBpZiAoIXdyaXRlci5wcm9ncmFtKSByZXR1cm5cbiAgY29uc3QgaW1wb3J0cyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobW9kdWxlKSkuaW1wb3J0c1xuICBjb25zdCBncm91cHMgPSBbXVxuXG4gIGZvciAoY29uc3QgbW9kdWxlSWQgb2YgWy4uLm5ldyBTZXQoaW1wb3J0cy5tYXAoKGl0ZW0pID0+IGl0ZW0ubW9kdWxlSWQpKV0pIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGltcG9ydHMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm1vZHVsZUlkID09IG1vZHVsZUlkKVxuICAgIGNvbnN0IHR5cGVPbmx5ID0gc2VsZWN0ZWQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGVPbmx5KVxuICAgIGNvbnN0IHZhbHVlcyA9IHNlbGVjdGVkLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0udHlwZU9ubHkpXG5cbiAgICBpZiAodHlwZU9ubHkubGVuZ3RoID4gMCkgZ3JvdXBzLnB1c2goe2l0ZW1zOiB0eXBlT25seSwgbW9kdWxlSWQsIHR5cGVPbmx5OiB0cnVlfSlcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIGdyb3Vwcy5wdXNoKHtpdGVtczogdmFsdWVzLCBtb2R1bGVJZCwgdHlwZU9ubHk6IGZhbHNlfSlcbiAgfVxuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgIHdyaXRlci5zeW50aGV0aWMoZ3JvdXAudHlwZU9ubHkgPyBcImltcG9ydCB0eXBlIHtcIiA6IFwiaW1wb3J0IHtcIiwgXCJUeXBlU2NyaXB0IEVTTSBpbXBvcnQgZGVjbGFyYXRpb25cIiwgZ3JvdXAuaXRlbXMpXG4gICAgZ3JvdXAuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1QYXRoID0gYC9pbXBvcnRzLyR7aW1wb3J0cy5pbmRleE9mKGl0ZW0pfWBcbiAgICAgIGNvbnN0IGxvY2FsTmFtZSA9IHdyaXRlci5pbXBvcnROYW1lRm9yKGl0ZW0pXG5cbiAgICAgIGlmIChpbmRleCkgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwiRVNNIGltcG9ydCBzZXBhcmF0b3JcIiwgZ3JvdXAuaXRlbXMpXG4gICAgICB3cml0ZXIubWFwcGVkKGl0ZW0uaW1wb3J0ZWROYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogaXRlbSwgcGF0aDogaXRlbVBhdGgsIHJvbGU6IFwiaW1wb3J0ZWROYW1lXCJ9KVxuICAgICAgaWYgKGxvY2FsTmFtZSAhPSBpdGVtLmltcG9ydGVkTmFtZSkge1xuICAgICAgICB3cml0ZXIuc3ludGhldGljKFwiIGFzIFwiLCBcIkVTTSBpbXBvcnQgYWxpYXNcIiwgW2l0ZW1dLCBbaXRlbVBhdGhdKVxuICAgICAgICB3cml0ZXIubWFwcGVkKGxvY2FsTmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IGl0ZW0sIHBhdGg6IGl0ZW1QYXRoLCByb2xlOiBcImxvY2FsTmFtZVwifSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJ9IGZyb20gXCIsIFwiRVNNIGltcG9ydCBzb3VyY2VcIiwgZ3JvdXAuaXRlbXMpXG4gICAgd3JpdGVyLm1hcHBlZChKU09OLnN0cmluZ2lmeSh3cml0ZXIucmVsYXRpdmVNb2R1bGVTcGVjaWZpZXIoZ3JvdXAubW9kdWxlSWQsIFwiLmpzXCIpKSwge1xuICAgICAgbWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IGdyb3VwLml0ZW1zWzBdLCBwYXRoOiBgL2ltcG9ydHMvJHtpbXBvcnRzLmluZGV4T2YoZ3JvdXAuaXRlbXNbMF0pfWAsIHJvbGU6IFwicGF0aFwiXG4gICAgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwiRVNNIGltcG9ydCB0ZXJtaW5hdG9yXCIsIGdyb3VwLml0ZW1zKVxuICB9XG4gIGlmIChncm91cHMubGVuZ3RoID4gMCkgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIkVTTSBpbXBvcnQgc2VwYXJhdG9yXCIsIFttb2R1bGVdKVxuICBlbWl0U3RkbGliUHJvdmlkZXJJbXBvcnRzKG1vZHVsZSwgd3JpdGVyKVxufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBncm91cGVkIG5hbWVkIEVTTSBpbXBvcnQgZm9yIG9uZSBsaW5rZWQgc3RkbGliIHByb3ZpZGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gQ3VycmVudCBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqL1xuZnVuY3Rpb24gZW1pdFN0ZGxpYlByb3ZpZGVySW1wb3J0cyhtb2R1bGUsIHdyaXRlcikge1xuICBjb25zdCBuYW1lcyA9IHdyaXRlci5zdGRsaWJQcm92aWRlckltcG9ydHNcblxuICBpZiAoIXdyaXRlci5wcm9ncmFtIHx8ICFuYW1lcyB8fCBuYW1lcy5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgd3JpdGVyLnN5bnRoZXRpYyhcImltcG9ydCB7XCIsIFwiRVNNIHN0ZGxpYiBwcm92aWRlciBpbXBvcnQgZGVjbGFyYXRpb25cIiwgW21vZHVsZV0pXG4gIG5hbWVzLmZvckVhY2goKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4KSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJFU00gc3RkbGliIHByb3ZpZGVyIGltcG9ydCBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhuYW1lLCBcIkVTTSBzdGRsaWIgcHJvdmlkZXIgaW1wb3J0IG5hbWVcIiwgW21vZHVsZV0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCJ9IGZyb20gXCIsIFwiRVNNIHN0ZGxpYiBwcm92aWRlciBpbXBvcnQgc291cmNlXCIsIFttb2R1bGVdKVxuICB3cml0ZXIuc3ludGhldGljKEpTT04uc3RyaW5naWZ5KHdyaXRlci5zdGRsaWJQcm92aWRlclNwZWNpZmllcihcIi5qc1wiKSksIFwiRVNNIHN0ZGxpYiBwcm92aWRlciBpbXBvcnQgcGF0aFwiLCBbbW9kdWxlXSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcIkVTTSBzdGRsaWIgcHJvdmlkZXIgaW1wb3J0IHRlcm1pbmF0b3JcIiwgW21vZHVsZV0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJFU00gc3RkbGliIHByb3ZpZGVyIGltcG9ydCBzZXBhcmF0b3JcIiwgW21vZHVsZV0pXG59XG5cbi8qKlxuICogRW1pdHMgZXhwbGljaXQgRVNNIGV4cG9ydCBjbGF1c2VzIGZvciBzb3VyY2UgYWxpYXNlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIEN1cnJlbnQgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKi9cbmZ1bmN0aW9uIGVtaXRBbGlhc2VkRXhwb3J0cyhtb2R1bGUsIHdyaXRlcikge1xuICBpZiAoIXdyaXRlci5wcm9ncmFtKSByZXR1cm5cbiAgY29uc3QgcHJvZ3JhbU1vZHVsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobW9kdWxlKSlcbiAgY29uc3QgYWxpYXNlcyA9IHByb2dyYW1Nb2R1bGUuZXhwb3J0cy5maWx0ZXIoKGl0ZW0pID0+ICF3cml0ZXIuaXNEaXJlY3RFeHBvcnQoaXRlbSkpXG5cbiAgaWYgKGFsaWFzZXMubGVuZ3RoID09IDApIHJldHVyblxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXFxuZXhwb3J0IHtcIiwgXCJFU00gYWxpYXNlZCBleHBvcnRzXCIsIFttb2R1bGVdKVxuICBhbGlhc2VzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4KSB3cml0ZXIuc3ludGhldGljKFwiLCBcIiwgXCJFU00gZXhwb3J0IHNlcGFyYXRvclwiLCBbbW9kdWxlXSlcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IFsuLi5wcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucywgLi4uKHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSksIC4uLihwcm9ncmFtTW9kdWxlLmVycm9ycyA/PyBbXSldLmZpbmQoKHtpZH0pID0+IGlkID09IGl0ZW0uZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke2l0ZW0uZGVjbGFyYXRpb25JZH0nLmApXG4gICAgY29uc3QgZXhwb3J0UGF0aCA9IGAvZXhwb3J0cy8ke3Byb2dyYW1Nb2R1bGUuZXhwb3J0cy5pbmRleE9mKGl0ZW0pfWBcblxuICAgIHdyaXRlci5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5hbWU6IGRlY2xhcmF0aW9uLm5hbWUsIG5vZGU6IGl0ZW0sIHBhdGg6IGV4cG9ydFBhdGgsIHJvbGU6IFwibG9jYWxOYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgYXMgXCIsIFwiRVNNIGFsaWFzZWQgZXhwb3J0IG9wZXJhdG9yXCIsIFtpdGVtXSwgW2V4cG9ydFBhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoaXRlbS5leHBvcnRlZE5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBuYW1lOiBpdGVtLmV4cG9ydGVkTmFtZSwgbm9kZTogaXRlbSwgcGF0aDogZXhwb3J0UGF0aCwgcm9sZTogXCJleHBvcnRlZE5hbWVcIn0pXG4gIH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCJ9XCIsIFwiRVNNIGFsaWFzZWQgZXhwb3J0IGNsb3NlXCIsIFttb2R1bGVdKVxufVxuXG4vKipcbiAqIEVtaXRzIG9uZSBvcmRlcmVkIFR5cGVTY3JpcHQgYmxvY2sgYm9keS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi93cml0ZXIuanNcIikuU291cmNlV3JpdGVyfSB3cml0ZXIgLSBTb3VyY2UtYXdhcmUgd3JpdGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBJbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhhY3QgYmxvY2sgcGF0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2Fub25pY2FsaXplWmVybyAtIFdoZXRoZXIgcHJpbnRlZCBpbnRlZ2VyIHplcm8gbXVzdCBiZSBjYW5vbmljYWxpemVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRCbG9jayh3cml0ZXIsIGJsb2NrLCBpbmRlbnQsIHBhdGgsIGNhbm9uaWNhbGl6ZVplcm8pIHtcbiAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQsIGluZGV4KSA9PiBlbWl0U3RhdGVtZW50KHdyaXRlciwgc3RhdGVtZW50LCBpbmRlbnQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gLCBjYW5vbmljYWxpemVaZXJvKSlcbn1cblxuLyoqXG4gKiBFbWl0cyBvbmUgVHlwZVNjcmlwdCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vd3JpdGVyLmpzXCIpLlNvdXJjZVdyaXRlcn0gd3JpdGVyIC0gU291cmNlLWF3YXJlIHdyaXRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBTZW1hbnRpYyBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gSW5kZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4YWN0IHN0YXRlbWVudCBwYXRoLlxuICogQHBhcmFtIHtib29sZWFufSBjYW5vbmljYWxpemVaZXJvIC0gV2hldGhlciBwcmludGVkIGludGVnZXIgemVybyBtdXN0IGJlIGNhbm9uaWNhbGl6ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZW1pdFN0YXRlbWVudCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBjYW5vbmljYWxpemVaZXJvKSB7XG4gIGVtaXRFZmZlY3RQcmVmaXhlcyh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoLCBcInR5cGVzY3JpcHRcIixcbiAgICAoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblBhdGgpID0+IGVtaXRFeHByZXNzaW9uKHdyaXRlciwgZXhwcmVzc2lvbiwgZXhwcmVzc2lvblBhdGgsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSkpXG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBwYXRoKVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIikge1xuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LnJlY2VpdmVyLCBgJHtwYXRofS9yZWNlaXZlcmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICBjb25zdCBmaWVsZCA9IHdyaXRlci5wcml2YXRlRmllbGRGb3JJZChzdGF0ZW1lbnQuZmllbGQpXG5cbiAgICB3cml0ZXIubWFwcGVkKGAuJHtmaWVsZC5uYW1lfWAsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBuYW1lOiBmaWVsZC5uYW1lLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGgsIHJvbGU6IFwibWVtYmVyXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgPSBcIiwgXCJwcml2YXRlIGZpZWxkIGFzc2lnbm1lbnRcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHtcbiAgICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiA/IFwiYnJlYWtcIiA6IFwiY29udGludWVcIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChcIndoaWxlXCIsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKFwiLCBcImNvbmRpdGlvbi1jb250cm9sbGVkIGxvb3Agc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmNvbmRpdGlvbiwgYCR7cGF0aH0vY29uZGl0aW9uYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIpIFwiLCBcImNvbmRpdGlvbi1jb250cm9sbGVkIGxvb3Agc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5ib2R5LCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9ib2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJmb3JcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKGNvbnN0IFwiLCBcImxvb3Agc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZSwge1xuICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LnZhbHVlQmluZGluZywgcGF0aDogYCR7cGF0aH0vdmFsdWVCaW5kaW5nYCwgcm9sZTogXCJuYW1lXCJcbiAgICB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgb2YgXCIsIFwibG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50Lmxpc3QsIGAke3BhdGh9L2xpc3RgLCBcInR5cGVzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIikgXCIsIFwibG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5ib2R5LCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9ib2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJmb3JcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgKGNvbnN0IFtcIiwgXCJtYXAgbG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LmtleUJpbmRpbmcubmFtZSwge1xuICAgICAgbWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LmtleUJpbmRpbmcsIHBhdGg6IGAke3BhdGh9L2tleUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiwgXCIsIFwibWFwIGl0ZXJhdGlvbiBiaW5kaW5nIHNlcGFyYXRvclwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LnZhbHVlQmluZGluZy5uYW1lLCB7XG4gICAgICBtYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBwYXRoOiBgJHtwYXRofS92YWx1ZUJpbmRpbmdgLCByb2xlOiBcIm5hbWVcIlxuICAgIH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIl0gb2YgXCIsIFwibWFwIGxvb3Agc2NhZmZvbGRpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5tYXAsIGAke3BhdGh9L21hcGAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiKSBcIiwgXCJtYXAgbG9vcCBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ7XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5ib2R5LCBgJHtpbmRlbnR9ICBgLCBgJHtwYXRofS9ib2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmJvZHksIHBhdGg6IGAke3BhdGh9L2JvZHlgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJhaXNlU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCB0eXBlID0gc3RhdGVtZW50LmVycm9yLmVycm9yXG4gICAgY29uc3QgZXJyb3IgPSB3cml0ZXIuZXJyb3JGb3JJZCh0eXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICB3cml0ZXIubWFwcGVkKFwidGhyb3dcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgbmV3IFwiLCBcImVycm9yIGNvbnN0cnVjdGlvbiBzY2FmZm9sZGluZ1wiLCBbc3RhdGVtZW50LmVycm9yXSwgW2Ake3BhdGh9L2Vycm9yYF0pXG4gICAgd3JpdGVyLm1hcHBlZCh3cml0ZXIuZXJyb3JOYW1lRm9ySWQodHlwZS5kZWNsYXJhdGlvbklkKSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5hbWU6IGVycm9yLm5hbWUsIG5vZGU6IHN0YXRlbWVudC5lcnJvciwgcGF0aDogYCR7cGF0aH0vZXJyb3JgLCByb2xlOiBcInR5cGVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIihcIiwgXCJlcnJvciBjb25zdHJ1Y3Rpb24gb3BlblwiLCBbc3RhdGVtZW50LmVycm9yXSwgW2Ake3BhdGh9L2Vycm9yYF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZSwgYCR7cGF0aH0vZXJyb3IvbWVzc2FnZWAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiKVxcblwiLCBcImVycm9yIGNvbnN0cnVjdGlvbiBjbG9zZVwiLCBbc3RhdGVtZW50LmVycm9yXSwgW2Ake3BhdGh9L2Vycm9yYF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCBjYXVnaHQgPSB3cml0ZXIuZXJyb3JGb3JJZChzdGF0ZW1lbnQuY2F0Y2hUeXBlLmRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHdyaXRlci5lcnJvck5hbWVGb3JJZChzdGF0ZW1lbnQuY2F0Y2hUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICB3cml0ZXIubWFwcGVkKFwidHJ5XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRofSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcInRyeSBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmJvZHksIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2JvZHlgLCBjYW5vbmljYWxpemVaZXJvKVxuICAgIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIn1cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYm9keSwgcGF0aDogYCR7cGF0aH0vYm9keWB9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiY2F0Y2ggc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJjYXRjaFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aCwgcm9sZTogXCJjYXRjaFwifSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIChcIiwgXCJjYXRjaCBiaW5kaW5nIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nXSwgW2Ake3BhdGh9L2NhdGNoQmluZGluZ2BdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LmNhdGNoQmluZGluZy5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LmNhdGNoQmluZGluZywgcGF0aDogYCR7cGF0aH0vY2F0Y2hCaW5kaW5nYCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIpIHtcXG5cIiwgXCJjYXRjaCBiaW5kaW5nIHNjYWZmb2xkaW5nXCIsIFtzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nXSwgW2Ake3BhdGh9L2NhdGNoQmluZGluZ2BdKVxuICAgIHdyaXRlci5zeW50aGV0aWMoYCR7aW5kZW50fSAgaWYgKCEoYCwgXCJleGFjdCBjYXRjaCBndWFyZFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LmNhdGNoQmluZGluZy5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LmNhdGNoQmluZGluZywgcGF0aDogYCR7cGF0aH0vY2F0Y2hCaW5kaW5nYCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgaW5zdGFuY2VvZiBcIiwgXCJleGFjdCBjYXRjaCBndWFyZFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQodGFyZ2V0TmFtZSwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5hbWU6IGNhdWdodC5uYW1lLCBub2RlOiBzdGF0ZW1lbnQuY2F0Y2hUeXBlLCBwYXRoOiBgJHtwYXRofS9jYXRjaFR5cGVgLCByb2xlOiBcInR5cGVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhgKSkge1xcbiR7aW5kZW50fSAgICB0aHJvdyBgLCBcInVubWF0Y2hlZCBlcnJvciBwcm9wYWdhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50LmNhdGNoQmluZGluZy5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LmNhdGNoQmluZGluZywgcGF0aDogYCR7cGF0aH0vY2F0Y2hCaW5kaW5nYCwgcm9sZTogXCJuYW1lXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoYFxcbiR7aW5kZW50fSAgfVxcbmAsIFwidW5tYXRjaGVkIGVycm9yIHByb3BhZ2F0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgZW1pdEJsb2NrKHdyaXRlciwgc3RhdGVtZW50LmNhdGNoQm9keSwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vY2F0Y2hCb2R5YCwgY2Fub25pY2FsaXplWmVybylcbiAgICB3cml0ZXIuc3ludGhldGljKGluZGVudCwgXCJpbmRlbnRhdGlvblwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNhdGNoQm9keSwgcGF0aDogYCR7cGF0aH0vY2F0Y2hCb2R5YH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJyZXR1cm5cIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbikge1xuICAgICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJyZXR1cm4gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICB9XG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpIHtcbiAgICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgIHdyaXRlci5tYXBwZWQoXCJjb25zb2xlLmxvZ1wiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICAgIGlmIChjYW5vbmljYWxpemVaZXJvKSB3cml0ZXIuc3ludGhldGljKFwiKFwiLCBcImNhbm9uaWNhbCBpbnRlZ2VyIG91dHB1dFwiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRFeHByZXNzaW9uKHdyaXRlciwgc3RhdGVtZW50LmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBcInR5cGVzY3JpcHRcIiwgaWRlbnRpdHkpXG4gICAgaWYgKGNhbm9uaWNhbGl6ZVplcm8pIHdyaXRlci5zeW50aGV0aWMoXCIpLnRvU3RyaW5nKClcIiwgXCJjYW5vbmljYWwgaW50ZWdlciBvdXRwdXRcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiKVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIlxcblwiLCBcImxpbmUgYnJlYWtcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICByZXR1cm5cbiAgfVxuICB3cml0ZXIubWFwcGVkKFwiaWZcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIihcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICBlbWl0RXhwcmVzc2lvbih3cml0ZXIsIHN0YXRlbWVudC5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgd3JpdGVyLm1hcHBlZChcIilcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQsIHBhdGh9KVxuICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuY29uc2VxdWVudCwgcGF0aDogYCR7cGF0aH0vY29uc2VxdWVudGB9KVxuICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICBlbWl0QmxvY2sod3JpdGVyLCBzdGF0ZW1lbnQuY29uc2VxdWVudCwgYCR7aW5kZW50fSAgYCwgYCR7cGF0aH0vY29uc2VxdWVudGAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gIHdyaXRlci5tYXBwZWQoXCJ9XCIsIHttYXBwaW5nS2luZDogXCJhbmNob3JcIiwgbm9kZTogc3RhdGVtZW50LmNvbnNlcXVlbnQsIHBhdGg6IGAke3BhdGh9L2NvbnNlcXVlbnRgfSlcbiAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICB3cml0ZXIuc3ludGhldGljKFwiIFwiLCBcImNvbmRpdGlvbmFsIHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiZWxzZVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aH0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJjb25kaXRpb25hbCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG4gICAgd3JpdGVyLm1hcHBlZChcIntcIiwge21hcHBpbmdLaW5kOiBcImFuY2hvclwiLCBub2RlOiBzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBwYXRoOiBgJHtwYXRofS9hbHRlcm5hdGVgfSlcbiAgICB3cml0ZXIuc3ludGhldGljKFwiXFxuXCIsIFwibGluZSBicmVha1wiLCBbc3RhdGVtZW50XSwgW3BhdGhdKVxuICAgIGVtaXRCbG9jayh3cml0ZXIsIHN0YXRlbWVudC5hbHRlcm5hdGUsIGAke2luZGVudH0gIGAsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGNhbm9uaWNhbGl6ZVplcm8pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhpbmRlbnQsIFwiaW5kZW50YXRpb25cIiwgW3N0YXRlbWVudF0sIFtwYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwifVwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudC5hbHRlcm5hdGUsIHBhdGg6IGAke3BhdGh9L2FsdGVybmF0ZWB9KVxuICB9XG4gIHdyaXRlci5zeW50aGV0aWMoXCJcXG5cIiwgXCJsaW5lIGJyZWFrXCIsIFtzdGF0ZW1lbnRdLCBbcGF0aF0pXG59XG5cbi8qKlxuICogRW1pdHMgb25lIFR5cGVTY3JpcHQgbG9jYWwgc3RhdGVtZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3dyaXRlci5qc1wiKS5Tb3VyY2VXcml0ZXJ9IHdyaXRlciAtIFNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkxvY2FsU3RhdGVtZW50fSBzdGF0ZW1lbnQgLSBMb2NhbCBzdGF0ZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gTGVhZGluZyBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZW1lbnRQYXRoIC0gRXhhY3QgSlNPTiBQb2ludGVyIGZvciB0aGlzIHN0YXRlbWVudCBvY2N1cnJlbmNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGVtaXRMb2NhbCh3cml0ZXIsIHN0YXRlbWVudCwgaW5kZW50LCBzdGF0ZW1lbnRQYXRoKSB7XG4gIHdyaXRlci5zeW50aGV0aWMoaW5kZW50LCBcImluZGVudGF0aW9uXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG5cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgd3JpdGVyLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHttYXBwaW5nS2luZDogXCJleGFjdFwiLCBub2RlOiBzdGF0ZW1lbnQudGFyZ2V0LCBwYXRoOiBgJHtzdGF0ZW1lbnRQYXRofS90YXJnZXRgLCByb2xlOiBcIm5hbWVcIn0pXG4gICAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgICB3cml0ZXIubWFwcGVkKFwiPVwiLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm9wZXJhdG9yXCJ9KVxuICAgIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiYXNzaWdubWVudCBzcGFjaW5nXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gICAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmAsIFwidHlwZXNjcmlwdFwiLCBpZGVudGl0eSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHdyaXRlci5tYXBwZWQoc3RhdGVtZW50Lm11dGFibGUgPyBcImxldFwiIDogXCJjb25zdFwiLCB7bWFwcGluZ0tpbmQ6IFwiYW5jaG9yXCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aH0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCIgXCIsIFwiZGVjbGFyYXRpb24gc3BhY2luZ1wiLCBbc3RhdGVtZW50XSwgW3N0YXRlbWVudFBhdGhdKVxuICB3cml0ZXIubWFwcGVkKHN0YXRlbWVudC5uYW1lLCB7bWFwcGluZ0tpbmQ6IFwiZXhhY3RcIiwgbm9kZTogc3RhdGVtZW50LCBwYXRoOiBzdGF0ZW1lbnRQYXRoLCByb2xlOiBcIm5hbWVcIn0pXG4gIHdyaXRlci5zeW50aGV0aWMoXCI6IFwiLCBcInR5cGUgc2VwYXJhdG9yXCIsIFtzdGF0ZW1lbnRdLCBbc3RhdGVtZW50UGF0aF0pXG4gIGVtaXRUeXBlKHdyaXRlciwgc3RhdGVtZW50LnR5cGUsIGAke3N0YXRlbWVudFBhdGh9L3R5cGVgLCBcInR5cGVzY3JpcHRcIilcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgd3JpdGVyLm1hcHBlZChcIj1cIiwge21hcHBpbmdLaW5kOiBcImV4YWN0XCIsIG5vZGU6IHN0YXRlbWVudCwgcGF0aDogc3RhdGVtZW50UGF0aCwgcm9sZTogXCJvcGVyYXRvclwifSlcbiAgd3JpdGVyLnN5bnRoZXRpYyhcIiBcIiwgXCJhc3NpZ25tZW50IHNwYWNpbmdcIiwgW3N0YXRlbWVudF0sIFtzdGF0ZW1lbnRQYXRoXSlcbiAgZW1pdEV4cHJlc3Npb24od3JpdGVyLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGAke3N0YXRlbWVudFBhdGh9L2luaXRpYWxpemVyYCwgXCJ0eXBlc2NyaXB0XCIsIGlkZW50aXR5KVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gdW5jaGFuZ2VkIFR5cGVTY3JpcHQgaWRlbnRpZmllci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gSWRlbnRpZmllci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IElkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbn1cbiJdfQ==
|