semantifold 0.3.0 → 0.4.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 +58 -15
- package/build/index.d.ts +48 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +57 -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/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 +154 -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 +23 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +136 -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 +81 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1308 -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 +2158 -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 +235 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +468 -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 +167 -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 +2952 -202
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +688 -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/architecture.md +45 -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 +231 -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 +15 -7
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +366 -4
- package/docs/webassembly.md +52 -0
- package/index.js +63 -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/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 +160 -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 +141 -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 +1407 -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 +2304 -124
- 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 +520 -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 +172 -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 +765 -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,20 +1,121 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import { createGenerationIndex } from "../semantic/provenance.js";
|
|
3
|
+
/**
|
|
4
|
+
* Collects every caller-controlled binding spelling before synthetic names are chosen.
|
|
5
|
+
* @param {unknown} root - Semantic graph.
|
|
6
|
+
* @returns {Set<string>} Used source names.
|
|
7
|
+
*/
|
|
8
|
+
function collectBindingNames(root) {
|
|
9
|
+
const names = new Set();
|
|
10
|
+
const pending = [root];
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
while (pending.length > 0) {
|
|
13
|
+
const value = pending.pop();
|
|
14
|
+
if (!value || typeof value != "object" || seen.has(value))
|
|
15
|
+
continue;
|
|
16
|
+
seen.add(value);
|
|
17
|
+
if (!Array.isArray(value) && typeof Reflect.get(value, "name") == "string")
|
|
18
|
+
names.add(Reflect.get(value, "name"));
|
|
19
|
+
for (const child of Array.isArray(value) ? value : Object.values(value)) {
|
|
20
|
+
if (child && typeof child == "object")
|
|
21
|
+
pending.push(child);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return names;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Converts a logical module identity to its canonical target type segment.
|
|
28
|
+
* @param {string} id - Logical module identity.
|
|
29
|
+
* @returns {string} Portable target class/module name.
|
|
30
|
+
*/
|
|
31
|
+
function moduleClassName(id) {
|
|
32
|
+
return id.split(/[._-]+/u).map((part) => `${part[0].toUpperCase()}${part.slice(1)}`).join("");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Looks up one declaration name in its owning program module.
|
|
36
|
+
* @param {Partial<import("../semantic/types.js").SemanticProgramModule>} module - Owning module.
|
|
37
|
+
* @param {string} declarationId - Stable declaration identity.
|
|
38
|
+
* @returns {string} Declaration name.
|
|
39
|
+
*/
|
|
40
|
+
function declarationName(module, declarationId) {
|
|
41
|
+
const declaration = [...module.functions ?? [], ...module.records ?? [], ...module.classes ?? [], ...module.errors ?? []]
|
|
42
|
+
.find(({ id }) => id == declarationId);
|
|
43
|
+
if (!declaration)
|
|
44
|
+
throw new RangeError(`Unknown program declaration '${declarationId}'.`);
|
|
45
|
+
return declaration.name;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Chooses an unqualified target binding without treating a source-profile qualifier as semantic identity.
|
|
49
|
+
* @param {import("../semantic/types.js").SemanticProgram} program - Owning program.
|
|
50
|
+
* @param {import("../semantic/types.js").SemanticProgramModule} module - Importing module.
|
|
51
|
+
* @param {import("../semantic/types.js").SemanticImport} imported - Resolved import.
|
|
52
|
+
* @returns {string} Target-local binding spelling.
|
|
53
|
+
*/
|
|
54
|
+
export function programImportName(program, module, imported) {
|
|
55
|
+
const source = program.sources.find(({ filename }) => filename == module.sourceFilename);
|
|
56
|
+
if (!source)
|
|
57
|
+
throw new RangeError(`Program module '${module.id}' has no registered source.`);
|
|
58
|
+
return source.language == "ruby" || source.language == "java" ? imported.importedName : imported.localName;
|
|
59
|
+
}
|
|
3
60
|
/** Source-aware deterministic generated-output builder. */
|
|
4
61
|
export class SourceWriter {
|
|
5
62
|
/**
|
|
6
63
|
* Creates a source-aware writer.
|
|
7
64
|
* @param {object} options - Writer options.
|
|
8
65
|
* @param {string} options.filename - Output filename.
|
|
9
|
-
* @param {import("../semantic/types.js").
|
|
66
|
+
* @param {import("../semantic/types.js").GeneratedTextLanguage} options.language - Output text language.
|
|
10
67
|
* @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
|
|
68
|
+
* @param {import("../semantic/types.js").SemanticProgram} [options.program] - Owning multi-file program.
|
|
69
|
+
* @param {Map<string, string>} [options.programPaths] - Planned artifact path by module identity.
|
|
11
70
|
* @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
|
|
71
|
+
* @param {Record<string, string>} [options.stdlibProviderEntries] - Used operation to protected native entry for a linked stdlib provider.
|
|
72
|
+
* @param {string} [options.stdlibProviderPath] - Planned stdlib provider artifact path.
|
|
73
|
+
* @param {string[]} [options.stdlibProviderPaths] - Planned stdlib provider artifact paths.
|
|
74
|
+
* @param {string[]} [options.stdlibProviderImports] - Ordered provider names this module must import.
|
|
75
|
+
* @param {string} [options.stdlibProviderOwnerModule] - Java owner module identity hosting the shared support block and shims.
|
|
76
|
+
* @param {string[]} [options.stdlibProviderShims] - Java owner program-wide used operations exposed as public static shims.
|
|
12
77
|
*/
|
|
13
|
-
constructor({ filename, language, module, sources }) {
|
|
78
|
+
constructor({ filename, language, module, program, programPaths, sources, stdlibProviderEntries, stdlibProviderPath, stdlibProviderPaths, stdlibProviderImports, stdlibProviderOwnerModule, stdlibProviderShims }) {
|
|
14
79
|
const index = createGenerationIndex(module, sources);
|
|
15
80
|
this.filename = filename;
|
|
16
81
|
this.language = language;
|
|
82
|
+
this.module = module;
|
|
83
|
+
this.program = program;
|
|
84
|
+
this.programPaths = programPaths;
|
|
17
85
|
this.index = index;
|
|
86
|
+
this.stdlibProviderEntries = stdlibProviderEntries;
|
|
87
|
+
this.stdlibProviderPath = stdlibProviderPath;
|
|
88
|
+
this.stdlibProviderPaths = stdlibProviderPaths ?? (stdlibProviderPath ? [stdlibProviderPath] : undefined);
|
|
89
|
+
this.stdlibProviderImports = stdlibProviderImports;
|
|
90
|
+
this.stdlibProviderOwnerModule = stdlibProviderOwnerModule;
|
|
91
|
+
this.stdlibProviderShims = stdlibProviderShims;
|
|
92
|
+
const programRecords = program?.modules.flatMap((programModule) => programModule.records ?? []) ?? module.records ?? [];
|
|
93
|
+
const programClasses = program?.modules.flatMap((programModule) => programModule.classes ?? []) ?? module.classes ?? [];
|
|
94
|
+
const capabilityFailures = module.capabilities?.flatMap(({ failures }) => failures) ?? [];
|
|
95
|
+
const programErrors = program?.modules.flatMap((programModule) => [
|
|
96
|
+
...(programModule.errors ?? []),
|
|
97
|
+
...(programModule.capabilities?.flatMap(({ failures }) => failures) ?? [])
|
|
98
|
+
]) ?? [...module.errors ?? [], ...capabilityFailures];
|
|
99
|
+
const programFunctions = program?.modules.flatMap((programModule) => programModule.functions) ?? module.functions;
|
|
100
|
+
this.records = new Map(programRecords.map((record) => [record.id, record]));
|
|
101
|
+
this.classes = new Map(programClasses.map((declaration) => [declaration.id, declaration]));
|
|
102
|
+
this.errors = new Map(programErrors.map((error) => [error.id, error]));
|
|
103
|
+
this.resources = new Map((module.capabilities?.flatMap(({ resources }) => resources) ?? []).map((resource) => [resource.id, resource]));
|
|
104
|
+
this.effectOperations = new Map((module.capabilities?.flatMap(({ operations }) => operations) ?? []).map((operation) => [operation.id, operation]));
|
|
105
|
+
this.effectOperationModules = new Map((module.capabilities?.flatMap((capability) => capability.operations.map((operation) => [operation.id, capability.authorityId])) ?? []));
|
|
106
|
+
this.fields = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, field])));
|
|
107
|
+
this.fieldRecords = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, record])));
|
|
108
|
+
this.privateFields = new Map(programClasses.flatMap((declaration) => declaration.fields.map((field) => [field.id, field])));
|
|
109
|
+
this.methods = new Map(programClasses.flatMap((declaration) => declaration.methods.map((method) => [method.id, method])));
|
|
110
|
+
this.typeParameters = new Map([...programRecords, ...programFunctions].flatMap((declaration) => (declaration.typeParameters ?? []).map((parameter) => [parameter.id, parameter])));
|
|
111
|
+
this.referenceClassEmissionDepth = 0;
|
|
112
|
+
/** @type {Map<string, import("../semantic/types.js").SemanticProgramModule>} */
|
|
113
|
+
this.declarationModules = new Map(program?.modules.flatMap((programModule) => [
|
|
114
|
+
...(programModule.records ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
|
|
115
|
+
...(programModule.classes ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
|
|
116
|
+
...(programModule.errors ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
|
|
117
|
+
...programModule.functions.map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule]))
|
|
118
|
+
]) ?? []);
|
|
18
119
|
/** @type {string[]} */
|
|
19
120
|
this.parts = [];
|
|
20
121
|
/** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
|
|
@@ -22,6 +123,63 @@ export class SourceWriter {
|
|
|
22
123
|
this.offset = 0;
|
|
23
124
|
this.line = 1;
|
|
24
125
|
this.column = 1;
|
|
126
|
+
/** @type {Map<import("../semantic/types.js").Expression, string>} */
|
|
127
|
+
this.effectTemporaryNames = new Map();
|
|
128
|
+
/** @type {Map<import("../semantic/types.js").Expression, string>} */
|
|
129
|
+
this.effectReplacementNames = new Map();
|
|
130
|
+
/** @type {import("../semantic/types.js").Expression | undefined} */
|
|
131
|
+
this.effectDefinition = undefined;
|
|
132
|
+
this.usedBindingNames = collectBindingNames(module);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Installs the effect expressions lowered immediately before the current statement.
|
|
136
|
+
* @param {import("../semantic/types.js").Expression[]} expressions - Ordered expressions.
|
|
137
|
+
* @returns {void}
|
|
138
|
+
*/
|
|
139
|
+
planEffectReplacements(expressions) {
|
|
140
|
+
this.effectReplacementNames = new Map(expressions.map((expression) => [expression, this.effectTemporaryName(expression)]));
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Allocates a collision-safe name for one deterministic effect site.
|
|
144
|
+
* @param {import("../semantic/types.js").Expression} expression - Effectful expression.
|
|
145
|
+
* @returns {string} Stable temporary name.
|
|
146
|
+
*/
|
|
147
|
+
effectTemporaryName(expression) {
|
|
148
|
+
const known = this.effectTemporaryNames.get(expression);
|
|
149
|
+
if (known)
|
|
150
|
+
return known;
|
|
151
|
+
const site = typeof Reflect.get(expression, "effectSiteId") == "string"
|
|
152
|
+
? Reflect.get(expression, "effectSiteId").slice("effect:".length) : String(this.effectTemporaryNames.size);
|
|
153
|
+
let name = `__semantifold_effect_${site}`;
|
|
154
|
+
while (this.usedBindingNames.has(name))
|
|
155
|
+
name = `${name}_`;
|
|
156
|
+
this.usedBindingNames.add(name);
|
|
157
|
+
this.effectTemporaryNames.set(expression, name);
|
|
158
|
+
return name;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Returns the planned temporary replacement outside its own definition.
|
|
162
|
+
* @param {import("../semantic/types.js").Expression} expression - Candidate expression.
|
|
163
|
+
* @returns {string | undefined} Temporary name.
|
|
164
|
+
*/
|
|
165
|
+
effectReplacementName(expression) {
|
|
166
|
+
return this.effectDefinition === expression ? undefined : this.effectReplacementNames.get(expression);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Emits one effect definition without recursively replacing itself.
|
|
170
|
+
* @param {import("../semantic/types.js").Expression} expression - Defined expression.
|
|
171
|
+
* @param {() => void} emit - Target expression emitter.
|
|
172
|
+
* @returns {void}
|
|
173
|
+
*/
|
|
174
|
+
emitEffectDefinition(expression, emit) {
|
|
175
|
+
const previous = this.effectDefinition;
|
|
176
|
+
this.effectDefinition = expression;
|
|
177
|
+
try {
|
|
178
|
+
emit();
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
this.effectDefinition = previous;
|
|
182
|
+
}
|
|
25
183
|
}
|
|
26
184
|
/**
|
|
27
185
|
* Returns generated content so far.
|
|
@@ -38,6 +196,313 @@ export class SourceWriter {
|
|
|
38
196
|
occurrencePath(node) {
|
|
39
197
|
return this.index.recordFor(node).path;
|
|
40
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Resolves a validated nominal declaration identity for target emission.
|
|
201
|
+
* @param {string} declarationId - Semantic record identity.
|
|
202
|
+
* @returns {import("../semantic/types.js").RecordDeclaration} Record declaration.
|
|
203
|
+
*/
|
|
204
|
+
recordForId(declarationId) {
|
|
205
|
+
const record = this.records.get(declarationId);
|
|
206
|
+
if (!record)
|
|
207
|
+
throw new RangeError(`Unknown validated record identity '${declarationId}'.`);
|
|
208
|
+
return record;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Returns the target spelling for a nominal record identity.
|
|
212
|
+
* @param {string} declarationId - Stable record declaration identity.
|
|
213
|
+
* @param {boolean} [valuePosition] - Whether the binding must exist at runtime.
|
|
214
|
+
* @returns {string} Target record spelling.
|
|
215
|
+
*/
|
|
216
|
+
recordNameForId(declarationId, valuePosition = false) {
|
|
217
|
+
const record = this.recordForId(declarationId);
|
|
218
|
+
const owner = this.declarationModules.get(declarationId);
|
|
219
|
+
const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId && (!valuePosition || !item.typeOnly));
|
|
220
|
+
if (this.program && owner && owner.id != Reflect.get(this.module, "id") && this.language == "ruby") {
|
|
221
|
+
return `${moduleClassName(owner.id)}::${record.name}`;
|
|
222
|
+
}
|
|
223
|
+
if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
|
|
224
|
+
return this.importNameFor(imported);
|
|
225
|
+
}
|
|
226
|
+
return record.name;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Resolves one validated reference class.
|
|
230
|
+
* @param {string} declarationId - Stable class identity.
|
|
231
|
+
* @returns {import("../semantic/types.js").ClassDeclaration} Class declaration.
|
|
232
|
+
*/
|
|
233
|
+
classForId(declarationId) {
|
|
234
|
+
const declaration = this.classes.get(declarationId);
|
|
235
|
+
if (!declaration)
|
|
236
|
+
throw new RangeError(`Unknown validated reference class identity '${declarationId}'.`);
|
|
237
|
+
return declaration;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Returns the target spelling of one reference class.
|
|
241
|
+
* @param {string} declarationId - Stable class identity.
|
|
242
|
+
* @returns {string} Target spelling.
|
|
243
|
+
*/
|
|
244
|
+
classNameForId(declarationId) {
|
|
245
|
+
const declaration = this.classForId(declarationId);
|
|
246
|
+
const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
|
|
247
|
+
if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
|
|
248
|
+
return this.importNameFor(imported);
|
|
249
|
+
}
|
|
250
|
+
return declaration.name;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Resolves one validated owned-resource declaration.
|
|
254
|
+
* @param {string} resourceId - Stable resource identity.
|
|
255
|
+
* @returns {import("../semantic/types.js").EffectResourceDeclaration} Resource declaration.
|
|
256
|
+
*/
|
|
257
|
+
resourceForId(resourceId) {
|
|
258
|
+
const resource = this.resources.get(resourceId);
|
|
259
|
+
if (!resource)
|
|
260
|
+
throw new RangeError(`Unknown validated resource identity '${resourceId}'.`);
|
|
261
|
+
return resource;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Resolves one validated capability operation declaration.
|
|
265
|
+
* @param {string} operationId - Stable operation identity.
|
|
266
|
+
* @returns {import("../semantic/types.js").EffectOperationDeclaration} Operation declaration.
|
|
267
|
+
*/
|
|
268
|
+
effectOperationForId(operationId) {
|
|
269
|
+
const operation = this.effectOperations.get(operationId);
|
|
270
|
+
if (!operation)
|
|
271
|
+
throw new RangeError(`Unknown validated effect operation identity '${operationId}'.`);
|
|
272
|
+
return operation;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Resolves one validated private field.
|
|
276
|
+
* @param {string} fieldId - Stable private-field identity.
|
|
277
|
+
* @returns {import("../semantic/types.js").PrivateField} Field declaration.
|
|
278
|
+
*/
|
|
279
|
+
privateFieldForId(fieldId) {
|
|
280
|
+
const field = this.privateFields.get(fieldId);
|
|
281
|
+
if (!field)
|
|
282
|
+
throw new RangeError(`Unknown validated private field identity '${fieldId}'.`);
|
|
283
|
+
return field;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Resolves one validated receiver method.
|
|
287
|
+
* @param {string} methodId - Stable method identity.
|
|
288
|
+
* @returns {import("../semantic/types.js").MethodDeclaration} Method declaration.
|
|
289
|
+
*/
|
|
290
|
+
methodForId(methodId) {
|
|
291
|
+
const method = this.methods.get(methodId);
|
|
292
|
+
if (!method)
|
|
293
|
+
throw new RangeError(`Unknown validated method identity '${methodId}'.`);
|
|
294
|
+
return method;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Resolves one validated declaration-scoped type parameter.
|
|
298
|
+
* @param {string} parameterId - Stable type-parameter identity.
|
|
299
|
+
* @returns {import("../semantic/types.js").TypeParameter} Type parameter.
|
|
300
|
+
*/
|
|
301
|
+
typeParameterForId(parameterId) {
|
|
302
|
+
const parameter = this.typeParameters.get(parameterId);
|
|
303
|
+
if (!parameter)
|
|
304
|
+
throw new RangeError(`Unknown validated type parameter identity '${parameterId}'.`);
|
|
305
|
+
return parameter;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Returns the validated nominal error declaration for an identity.
|
|
309
|
+
* @param {string} declarationId - Stable error identity.
|
|
310
|
+
* @returns {import("../semantic/types.js").ErrorDeclaration | import("../semantic/types.js").EffectFailureDeclaration} Error declaration.
|
|
311
|
+
*/
|
|
312
|
+
errorForId(declarationId) {
|
|
313
|
+
const error = this.errors.get(declarationId);
|
|
314
|
+
if (!error)
|
|
315
|
+
throw new RangeError(`Unknown validated error identity '${declarationId}'.`);
|
|
316
|
+
return error;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Returns the target-visible spelling for one nominal error identity.
|
|
320
|
+
* @param {string} declarationId - Stable error identity.
|
|
321
|
+
* @returns {string} Target-visible name.
|
|
322
|
+
*/
|
|
323
|
+
errorNameForId(declarationId) {
|
|
324
|
+
const error = this.errorForId(declarationId);
|
|
325
|
+
const owner = this.declarationModules.get(declarationId);
|
|
326
|
+
const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
|
|
327
|
+
if (this.program && owner && owner.id != Reflect.get(this.module, "id") && this.language == "ruby") {
|
|
328
|
+
return `${moduleClassName(owner.id)}::${error.name}`;
|
|
329
|
+
}
|
|
330
|
+
if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
|
|
331
|
+
return this.importNameFor(imported);
|
|
332
|
+
}
|
|
333
|
+
return owner ? error.name : this.capabilityNominalName(error.name);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Returns the target spelling for a nominal name owned by a compiler-authorized capability.
|
|
337
|
+
* PHP program entries live in a generated namespace while stdlib provider classes remain
|
|
338
|
+
* global, so PHP program mode fully qualifies capability names.
|
|
339
|
+
* @param {string} name - Declared nominal name.
|
|
340
|
+
* @returns {string} Target spelling.
|
|
341
|
+
*/
|
|
342
|
+
capabilityNominalName(name) {
|
|
343
|
+
return this.program && this.language == "php" ? `\\${name}` : name;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Returns the target spelling for a resolved function call.
|
|
347
|
+
* @param {import("../semantic/types.js").CallExpression} expression - Resolved call.
|
|
348
|
+
* @returns {string} Target call name.
|
|
349
|
+
*/
|
|
350
|
+
callNameFor(expression) {
|
|
351
|
+
const declarationId = expression.resolution?.declarationId;
|
|
352
|
+
const owner = declarationId ? this.declarationModules.get(declarationId) : undefined;
|
|
353
|
+
const imported = declarationId ? this.#programModule()?.imports.find((item) => item.declarationId == declarationId) : undefined;
|
|
354
|
+
if (this.language == "java" && !this.program && this.referenceClassEmissionDepth > 0)
|
|
355
|
+
return `Main.${expression.callee}`;
|
|
356
|
+
if (!declarationId || !this.program || !owner || owner.id == Reflect.get(this.module, "id"))
|
|
357
|
+
return expression.callee;
|
|
358
|
+
if (this.language == "ruby" || this.language == "java")
|
|
359
|
+
return `${moduleClassName(owner.id)}.${declarationName(owner, declarationId)}`;
|
|
360
|
+
if (imported)
|
|
361
|
+
return this.importNameFor(imported);
|
|
362
|
+
return declarationName(owner, declarationId);
|
|
363
|
+
}
|
|
364
|
+
/** Marks emission as occurring inside one top-level reference class. */
|
|
365
|
+
beginReferenceClassEmission() {
|
|
366
|
+
this.referenceClassEmissionDepth += 1;
|
|
367
|
+
}
|
|
368
|
+
/** Ends one balanced top-level reference-class emission scope. */
|
|
369
|
+
endReferenceClassEmission() {
|
|
370
|
+
if (this.referenceClassEmissionDepth == 0)
|
|
371
|
+
throw new RangeError("Reference-class emission scope is not active.");
|
|
372
|
+
this.referenceClassEmissionDepth -= 1;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Returns the target-local binding for one resolved import.
|
|
376
|
+
* @param {import("../semantic/types.js").SemanticImport} imported - Resolved import.
|
|
377
|
+
* @returns {string} Emitted import name.
|
|
378
|
+
*/
|
|
379
|
+
importNameFor(imported) {
|
|
380
|
+
const module = this.#programModule();
|
|
381
|
+
if (!this.program || !module)
|
|
382
|
+
throw new RangeError("Import names require a validated semantic program.");
|
|
383
|
+
return programImportName(this.program, module, imported);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Reports whether one local declaration is exported by the current program module.
|
|
387
|
+
* @param {string | undefined} declarationId - Declaration identity.
|
|
388
|
+
* @returns {boolean} Whether it has a same-name program export.
|
|
389
|
+
*/
|
|
390
|
+
isDirectlyExported(declarationId) {
|
|
391
|
+
const module = /** @type {Partial<import("../semantic/types.js").SemanticProgramModule>} */ (this.module);
|
|
392
|
+
return typeof declarationId == "string" && Boolean(module.exports?.some((item) => item.declarationId == declarationId && item.exportedName == declarationName(module, declarationId)));
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Reports whether one export edge uses its declaration's emitted name.
|
|
396
|
+
* @param {import("../semantic/types.js").SemanticExport} exported - Current export edge.
|
|
397
|
+
* @returns {boolean} Whether this edge is represented by the declaration prefix.
|
|
398
|
+
*/
|
|
399
|
+
isDirectExport(exported) {
|
|
400
|
+
return exported.exportedName == declarationName(this.module, exported.declarationId);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Reports whether one local declaration has any public program export.
|
|
404
|
+
* @param {string | undefined} declarationId - Declaration identity.
|
|
405
|
+
* @returns {boolean} Whether the declaration is exported.
|
|
406
|
+
*/
|
|
407
|
+
isExported(declarationId) {
|
|
408
|
+
const module = /** @type {Partial<import("../semantic/types.js").SemanticProgramModule>} */ (this.module);
|
|
409
|
+
return typeof declarationId == "string" && Boolean(module.exports?.some((item) => item.declarationId == declarationId));
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Returns whether this is the selected program entry module.
|
|
413
|
+
* @returns {boolean} Whether this writer owns the selected entry.
|
|
414
|
+
*/
|
|
415
|
+
isProgramEntry() {
|
|
416
|
+
return this.program?.entryModule == Reflect.get(this.module, "id");
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Returns the canonical class/module segment for a logical module identity.
|
|
420
|
+
* @param {string} moduleId - Logical module identity.
|
|
421
|
+
* @returns {string} Target class/module name.
|
|
422
|
+
*/
|
|
423
|
+
programModuleName(moduleId) {
|
|
424
|
+
if (!this.program?.modules.some(({ id }) => id == moduleId))
|
|
425
|
+
throw new RangeError(`Unknown program module '${moduleId}'.`);
|
|
426
|
+
return moduleClassName(moduleId);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Finds the current module in the complete program.
|
|
430
|
+
* @returns {import("../semantic/types.js").SemanticProgramModule | undefined} Current program module.
|
|
431
|
+
*/
|
|
432
|
+
#programModule() {
|
|
433
|
+
if (!this.program)
|
|
434
|
+
return undefined;
|
|
435
|
+
return this.program.modules.find(({ id }) => id == Reflect.get(this.module, "id"));
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Returns a relative ESM/require specifier for a planned dependency artifact.
|
|
439
|
+
* @param {string} moduleId - Dependency module identity.
|
|
440
|
+
* @param {string} [extension] - Optional replacement extension.
|
|
441
|
+
* @returns {string} Relative POSIX specifier.
|
|
442
|
+
*/
|
|
443
|
+
relativeModuleSpecifier(moduleId, extension) {
|
|
444
|
+
const targetPath = this.programPaths?.get(moduleId);
|
|
445
|
+
if (!targetPath)
|
|
446
|
+
throw new RangeError(`Unknown planned module path '${moduleId}'.`);
|
|
447
|
+
const adjustedTarget = extension ? targetPath.replace(/\.[^./]+$/u, extension) : targetPath;
|
|
448
|
+
const from = this.filename.split("/").slice(0, -1);
|
|
449
|
+
const to = adjustedTarget.split("/");
|
|
450
|
+
let common = 0;
|
|
451
|
+
while (common < from.length && common < to.length && from[common] == to[common])
|
|
452
|
+
common++;
|
|
453
|
+
const relative = [...from.slice(common).map(() => ".."), ...to.slice(common)].join("/");
|
|
454
|
+
return relative.startsWith(".") ? relative : `./${relative}`;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Returns the protected native entry for one used stdlib provider operation.
|
|
458
|
+
* @param {import("../semantic/types.js").EffectOperationDeclaration} operation - Canonical operation declaration.
|
|
459
|
+
* @returns {string | undefined} Linked protected entry, or undefined when the operation stays inlined.
|
|
460
|
+
*/
|
|
461
|
+
stdlibProviderEntryFor(operation) {
|
|
462
|
+
const module = this.effectOperationModules.get(operation.id);
|
|
463
|
+
return module === undefined ? undefined : this.stdlibProviderEntries?.[`${module}\u0000${operation.name}`];
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Returns a relative specifier for the planned stdlib provider artifact.
|
|
467
|
+
* @param {string} [extension] - Optional replacement extension.
|
|
468
|
+
* @param {string} [providerPath] - One selected provider artifact path.
|
|
469
|
+
* @returns {string} Relative POSIX specifier.
|
|
470
|
+
*/
|
|
471
|
+
stdlibProviderSpecifier(extension, providerPath) {
|
|
472
|
+
const targetPath = providerPath ?? this.stdlibProviderPath ?? this.stdlibProviderPaths?.[0];
|
|
473
|
+
if (!targetPath)
|
|
474
|
+
throw new RangeError("A stdlib provider specifier requires a planned provider path.");
|
|
475
|
+
const adjustedTarget = extension ? targetPath.replace(/\.[^./]+$/u, extension) : targetPath;
|
|
476
|
+
const from = this.filename.split("/").slice(0, -1);
|
|
477
|
+
const to = adjustedTarget.split("/");
|
|
478
|
+
let common = 0;
|
|
479
|
+
while (common < from.length && common < to.length && from[common] == to[common])
|
|
480
|
+
common++;
|
|
481
|
+
const relative = [...from.slice(common).map(() => ".."), ...to.slice(common)].join("/");
|
|
482
|
+
return relative.startsWith(".") ? relative : `./${relative}`;
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Resolves a validated field identity for target emission.
|
|
486
|
+
* @param {string} fieldId - Semantic field identity.
|
|
487
|
+
* @returns {import("../semantic/types.js").RecordField} Record field.
|
|
488
|
+
*/
|
|
489
|
+
fieldForId(fieldId) {
|
|
490
|
+
const field = this.fields.get(fieldId);
|
|
491
|
+
if (!field)
|
|
492
|
+
throw new RangeError(`Unknown validated field identity '${fieldId}'.`);
|
|
493
|
+
return field;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Resolves the record declaration that owns a validated field identity.
|
|
497
|
+
* @param {string} fieldId - Semantic field identity.
|
|
498
|
+
* @returns {import("../semantic/types.js").RecordDeclaration} Owning record.
|
|
499
|
+
*/
|
|
500
|
+
recordForFieldId(fieldId) {
|
|
501
|
+
const record = this.fieldRecords.get(fieldId);
|
|
502
|
+
if (!record)
|
|
503
|
+
throw new RangeError(`Unknown validated field identity '${fieldId}'.`);
|
|
504
|
+
return record;
|
|
505
|
+
}
|
|
41
506
|
/**
|
|
42
507
|
* Reports whether an exact parser-owned role range is available.
|
|
43
508
|
* @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
|
|
@@ -204,4 +669,4 @@ function relatedOriginKey(origin) {
|
|
|
204
669
|
origin.role ?? null
|
|
205
670
|
]);
|
|
206
671
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0QsMkRBQTJEO0FBQzNELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsSUFBSTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLElBQUksRUFBRSxJ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QUFTLGlCQUFpQixDQUFDLE1BQU07SUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDNUYsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFFbkQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFBO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNO0lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixNQUFNLENBQUMsUUFBUTtRQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDMUIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3JCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN2QixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRpb25JbmRleH0gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKiogU291cmNlLWF3YXJlIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkLW91dHB1dCBidWlsZGVyLiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVdyaXRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc291cmNlLWF3YXJlIHdyaXRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBXcml0ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gb3B0aW9ucy5sYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSkge1xuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgc291cmNlcylcblxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5wYXJ0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gICAgdGhpcy5zcGFucyA9IFtdXG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5saW5lID0gMVxuICAgIHRoaXMuY29sdW1uID0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2VuZXJhdGVkIGNvbnRlbnQgc28gZmFyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHZW5lcmF0ZWQgY29udGVudC5cbiAgICovXG4gIGdldCBjb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEpTT04gUG9pbnRlciBmb3Igb25lIHVuYW1iaWd1b3VzIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDdXJyZW50IG9jY3VycmVuY2UgcGF0aC5cbiAgICovXG4gIG9jY3VycmVuY2VQYXRoKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSkucGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
|
|
672
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBSTtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUTtRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2pILEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFL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LFFBQVE7UUFDZixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1FBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSTtRQUNyQixNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDdkIsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJO0tBQ3BCLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVHZW5lcmF0aW9uSW5kZXh9IGZyb20gXCIuLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBjYWxsZXItY29udHJvbGxlZCBiaW5kaW5nIHNwZWxsaW5nIGJlZm9yZSBzeW50aGV0aWMgbmFtZXMgYXJlIGNob3Nlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcm9vdCAtIFNlbWFudGljIGdyYXBoLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBVc2VkIHNvdXJjZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyhyb290KSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpXG4gIGNvbnN0IHBlbmRpbmcgPSBbcm9vdF1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpID09IFwic3RyaW5nXCIpIG5hbWVzLmFkZChSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpKVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eSB0byBpdHMgY2Fub25pY2FsIHRhcmdldCB0eXBlIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFBvcnRhYmxlIHRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbW9kdWxlQ2xhc3NOYW1lKGlkKSB7XG4gIHJldHVybiBpZC5zcGxpdCgvWy5fLV0rL3UpLm1hcCgocGFydCkgPT4gYCR7cGFydFswXS50b1VwcGVyQ2FzZSgpfSR7cGFydC5zbGljZSgxKX1gKS5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogTG9va3MgdXAgb25lIGRlY2xhcmF0aW9uIG5hbWUgaW4gaXRzIG93bmluZyBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSBtb2R1bGUgLSBPd25pbmcgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWNsYXJhdGlvbiBuYW1lLlxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvbk5hbWUobW9kdWxlLCBkZWNsYXJhdGlvbklkKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gWy4uLm1vZHVsZS5mdW5jdGlvbnMgPz8gW10sIC4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXV1cbiAgICAuZmluZCgoe2lkfSkgPT4gaWQgPT0gZGVjbGFyYXRpb25JZClcblxuICBpZiAoIWRlY2xhcmF0aW9uKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uSWR9Jy5gKVxuXG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lXG59XG5cbi8qKlxuICogQ2hvb3NlcyBhbiB1bnF1YWxpZmllZCB0YXJnZXQgYmluZGluZyB3aXRob3V0IHRyZWF0aW5nIGEgc291cmNlLXByb2ZpbGUgcXVhbGlmaWVyIGFzIHNlbWFudGljIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBPd25pbmcgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBJbXBvcnRpbmcgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0ltcG9ydH0gaW1wb3J0ZWQgLSBSZXNvbHZlZCBpbXBvcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQtbG9jYWwgYmluZGluZyBzcGVsbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2dyYW1JbXBvcnROYW1lKHByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpIHtcbiAgY29uc3Qgc291cmNlID0gcHJvZ3JhbS5zb3VyY2VzLmZpbmQoKHtmaWxlbmFtZX0pID0+IGZpbGVuYW1lID09IG1vZHVsZS5zb3VyY2VGaWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFByb2dyYW0gbW9kdWxlICcke21vZHVsZS5pZH0nIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZS5gKVxuXG4gIHJldHVybiBzb3VyY2UubGFuZ3VhZ2UgPT0gXCJydWJ5XCIgfHwgc291cmNlLmxhbmd1YWdlID09IFwiamF2YVwiID8gaW1wb3J0ZWQuaW1wb3J0ZWROYW1lIDogaW1wb3J0ZWQubG9jYWxOYW1lXG59XG5cbi8qKiBTb3VyY2UtYXdhcmUgZGV0ZXJtaW5pc3RpYyBnZW5lcmF0ZWQtb3V0cHV0IGJ1aWxkZXIuICovXG5leHBvcnQgY2xhc3MgU291cmNlV3JpdGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzb3VyY2UtYXdhcmUgd3JpdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFdyaXRlciBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5maWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IG9wdGlvbnMubGFuZ3VhZ2UgLSBPdXRwdXQgdGV4dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBbb3B0aW9ucy5wcm9ncmFtXSAtIE93bmluZyBtdWx0aS1maWxlIHByb2dyYW0uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gW29wdGlvbnMucHJvZ3JhbVBhdGhzXSAtIFBsYW5uZWQgYXJ0aWZhY3QgcGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLnN0ZGxpYlByb3ZpZGVyRW50cmllc10gLSBVc2VkIG9wZXJhdGlvbiB0byBwcm90ZWN0ZWQgbmF0aXZlIGVudHJ5IGZvciBhIGxpbmtlZCBzdGRsaWIgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlclBhdGhdIC0gUGxhbm5lZCBzdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJQYXRoc10gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCBwYXRocy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJJbXBvcnRzXSAtIE9yZGVyZWQgcHJvdmlkZXIgbmFtZXMgdGhpcyBtb2R1bGUgbXVzdCBpbXBvcnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlck93bmVyTW9kdWxlXSAtIEphdmEgb3duZXIgbW9kdWxlIGlkZW50aXR5IGhvc3RpbmcgdGhlIHNoYXJlZCBzdXBwb3J0IGJsb2NrIGFuZCBzaGltcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJTaGltc10gLSBKYXZhIG93bmVyIHByb2dyYW0td2lkZSB1c2VkIG9wZXJhdGlvbnMgZXhwb3NlZCBhcyBwdWJsaWMgc3RhdGljIHNoaW1zLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBwcm9ncmFtLCBwcm9ncmFtUGF0aHMsIHNvdXJjZXMsIHN0ZGxpYlByb3ZpZGVyRW50cmllcywgc3RkbGliUHJvdmlkZXJQYXRoLFxuICAgIHN0ZGxpYlByb3ZpZGVyUGF0aHMsIHN0ZGxpYlByb3ZpZGVySW1wb3J0cywgc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSwgc3RkbGliUHJvdmlkZXJTaGltc30pIHtcbiAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUsIHNvdXJjZXMpXG5cbiAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2VcbiAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZVxuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW1cbiAgICB0aGlzLnByb2dyYW1QYXRocyA9IHByb2dyYW1QYXRoc1xuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJFbnRyaWVzID0gc3RkbGliUHJvdmlkZXJFbnRyaWVzXG4gICAgdGhpcy5zdGRsaWJQcm92aWRlclBhdGggPSBzdGRsaWJQcm92aWRlclBhdGhcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyUGF0aHMgPSBzdGRsaWJQcm92aWRlclBhdGhzID8/IChzdGRsaWJQcm92aWRlclBhdGggPyBbc3RkbGliUHJvdmlkZXJQYXRoXSA6IHVuZGVmaW5lZClcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVySW1wb3J0cyA9IHN0ZGxpYlByb3ZpZGVySW1wb3J0c1xuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSA9IHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGVcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyU2hpbXMgPSBzdGRsaWJQcm92aWRlclNoaW1zXG4gICAgY29uc3QgcHJvZ3JhbVJlY29yZHMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkgPz8gbW9kdWxlLnJlY29yZHMgPz8gW11cbiAgICBjb25zdCBwcm9ncmFtQ2xhc3NlcyA9IHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gcHJvZ3JhbU1vZHVsZS5jbGFzc2VzID8/IFtdKSA/PyBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICAgIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlcyA9IG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXVxuICAgIGNvbnN0IHByb2dyYW1FcnJvcnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IFtcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmVycm9ycyA/PyBbXSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXSlcbiAgICBdKSA/PyBbLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4uY2FwYWJpbGl0eUZhaWx1cmVzXVxuICAgIGNvbnN0IHByb2dyYW1GdW5jdGlvbnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUuZnVuY3Rpb25zKSA/PyBtb2R1bGUuZnVuY3Rpb25zXG5cbiAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbcmVjb3JkLmlkLCByZWNvcmRdKSlcbiAgICB0aGlzLmNsYXNzZXMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb25dKSlcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBNYXAocHJvZ3JhbUVycm9ycy5tYXAoKGVycm9yKSA9PiBbZXJyb3IuaWQsIGVycm9yXSkpXG4gICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKSA/PyBbXSkubWFwKChyZXNvdXJjZSkgPT4gW3Jlc291cmNlLmlkLCByZXNvdXJjZV0pKVxuICAgIHRoaXMuZWZmZWN0T3BlcmF0aW9ucyA9IG5ldyBNYXAoKG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT4gb3BlcmF0aW9ucykgPz8gW10pLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBvcGVyYXRpb25dKSlcbiAgICB0aGlzLmVmZmVjdE9wZXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKChjYXBhYmlsaXR5KSA9PlxuICAgICAgY2FwYWJpbGl0eS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBjYXBhYmlsaXR5LmF1dGhvcml0eUlkXSkpID8/IFtdKSlcbiAgICB0aGlzLmZpZWxkcyA9IG5ldyBNYXAocHJvZ3JhbVJlY29yZHMuZmxhdE1hcCgocmVjb3JkKSA9PiByZWNvcmQuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5pZCwgZmllbGRdKSkpXG4gICAgdGhpcy5maWVsZFJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbZmllbGQuaWQsIHJlY29yZF0pKSlcbiAgICB0aGlzLnByaXZhdGVGaWVsZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmlkLCBmaWVsZF0pKSlcbiAgICB0aGlzLm1ldGhvZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5tZXRob2RzLm1hcCgobWV0aG9kKSA9PiBbbWV0aG9kLmlkLCBtZXRob2RdKSkpXG4gICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoWy4uLnByb2dyYW1SZWNvcmRzLCAuLi5wcm9ncmFtRnVuY3Rpb25zXS5mbGF0TWFwKChkZWNsYXJhdGlvbikgPT5cbiAgICAgIChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIuaWQsIHBhcmFtZXRlcl0pKSlcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCA9IDBcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZT59ICovXG4gICAgdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gW1xuICAgICAgLi4uKHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgcHJvZ3JhbU1vZHVsZV0pKSxcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmNsYXNzZXMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5lcnJvcnMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi5wcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiAvKiogQHR5cGUge2NvbnN0fSAqLyAoWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBwcm9ncmFtTW9kdWxlXSkpXG4gICAgXSkgPz8gW10pXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLnBhcnRzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgICB0aGlzLnNwYW5zID0gW11cbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICB0aGlzLmxpbmUgPSAxXG4gICAgdGhpcy5jb2x1bW4gPSAxXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFJlcGxhY2VtZW50TmFtZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy51c2VkQmluZGluZ05hbWVzID0gY29sbGVjdEJpbmRpbmdOYW1lcyhtb2R1bGUpXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGVmZmVjdCBleHByZXNzaW9ucyBsb3dlcmVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3VycmVudCBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBleHByZXNzaW9ucyAtIE9yZGVyZWQgZXhwcmVzc2lvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcGxhbkVmZmVjdFJlcGxhY2VtZW50cyhleHByZXNzaW9ucykge1xuICAgIHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcyA9IG5ldyBNYXAoZXhwcmVzc2lvbnMubWFwKChleHByZXNzaW9uKSA9PiBbZXhwcmVzc2lvbiwgdGhpcy5lZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pXSkpXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIGEgY29sbGlzaW9uLXNhZmUgbmFtZSBmb3Igb25lIGRldGVybWluaXN0aWMgZWZmZWN0IHNpdGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEVmZmVjdGZ1bCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgdGVtcG9yYXJ5IG5hbWUuXG4gICAqL1xuICBlZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMuZWZmZWN0VGVtcG9yYXJ5TmFtZXMuZ2V0KGV4cHJlc3Npb24pXG4gICAgaWYgKGtub3duKSByZXR1cm4ga25vd25cbiAgICBjb25zdCBzaXRlID0gdHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCJcbiAgICAgID8gUmVmbGVjdC5nZXQoZXhwcmVzc2lvbiwgXCJlZmZlY3RTaXRlSWRcIikuc2xpY2UoXCJlZmZlY3Q6XCIubGVuZ3RoKSA6IFN0cmluZyh0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNpemUpXG4gICAgbGV0IG5hbWUgPSBgX19zZW1hbnRpZm9sZF9lZmZlY3RfJHtzaXRlfWBcblxuICAgIHdoaWxlICh0aGlzLnVzZWRCaW5kaW5nTmFtZXMuaGFzKG5hbWUpKSBuYW1lID0gYCR7bmFtZX1fYFxuICAgIHRoaXMudXNlZEJpbmRpbmdOYW1lcy5hZGQobmFtZSlcbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNldChleHByZXNzaW9uLCBuYW1lKVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGxhbm5lZCB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgb3V0c2lkZSBpdHMgb3duIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUZW1wb3JhcnkgbmFtZS5cbiAgICovXG4gIGVmZmVjdFJlcGxhY2VtZW50TmFtZShleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0RGVmaW5pdGlvbiA9PT0gZXhwcmVzc2lvbiA/IHVuZGVmaW5lZCA6IHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcy5nZXQoZXhwcmVzc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgZWZmZWN0IGRlZmluaXRpb24gd2l0aG91dCByZWN1cnNpdmVseSByZXBsYWNpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBEZWZpbmVkIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZW1pdCAtIFRhcmdldCBleHByZXNzaW9uIGVtaXR0ZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdEVmZmVjdERlZmluaXRpb24oZXhwcmVzc2lvbiwgZW1pdCkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lZmZlY3REZWZpbml0aW9uXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gZXhwcmVzc2lvblxuICAgIHRyeSB7XG4gICAgICBlbWl0KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gcHJldmlvdXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZW5lcmF0ZWQgY29udGVudCBzbyBmYXIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBjb250ZW50LlxuICAgKi9cbiAgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuam9pbihcIlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgSlNPTiBQb2ludGVyIGZvciBvbmUgdW5hbWJpZ3VvdXMgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgb2NjdXJyZW5jZSBwYXRoLlxuICAgKi9cbiAgb2NjdXJyZW5jZVBhdGgobm9kZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlKS5wYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSB2YWxpZGF0ZWQgbm9taW5hbCBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFNlbWFudGljIHJlY29yZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBSZWNvcmQgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWNvcmQgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgcmVjb3JkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlUG9zaXRpb25dIC0gV2hldGhlciB0aGUgYmluZGluZyBtdXN0IGV4aXN0IGF0IHJ1bnRpbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCByZWNvcmQgc3BlbGxpbmcuXG4gICAqL1xuICByZWNvcmROYW1lRm9ySWQoZGVjbGFyYXRpb25JZCwgdmFsdWVQb3NpdGlvbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IG93bmVyID0gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3QgaW1wb3J0ZWQgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmICghdmFsdWVQb3NpdGlvbiB8fCAhaXRlbS50eXBlT25seSkpXG5cbiAgICBpZiAodGhpcy5wcm9ncmFtICYmIG93bmVyICYmIG93bmVyLmlkICE9IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfTo6JHtyZWNvcmQubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZC5uYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGNsYXNzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBjbGFzc0ZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3Nlcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlbGxpbmcgb2Ygb25lIHJlZmVyZW5jZSBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgY2xhc3MgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBzcGVsbGluZy5cbiAgICovXG4gIGNsYXNzTmFtZUZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3NGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKGltcG9ydGVkICYmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInBocFwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcbiAgICB9XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIG93bmVkLXJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAtIFN0YWJsZSByZXNvdXJjZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb259IFJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcmVzb3VyY2VGb3JJZChyZXNvdXJjZUlkKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlcy5nZXQocmVzb3VyY2VJZClcbiAgICBpZiAoIXJlc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgcmVzb3VyY2UgaWRlbnRpdHkgJyR7cmVzb3VyY2VJZH0nLmApXG4gICAgcmV0dXJuIHJlc291cmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBjYXBhYmlsaXR5IG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbklkIC0gU3RhYmxlIG9wZXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9ufSBPcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqL1xuICBlZmZlY3RPcGVyYXRpb25Gb3JJZChvcGVyYXRpb25JZCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZWZmZWN0T3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uSWQpXG4gICAgaWYgKCFvcGVyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aXR5ICcke29wZXJhdGlvbklkfScuYClcbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFN0YWJsZSBwcml2YXRlLWZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkfSBGaWVsZCBkZWNsYXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGVGaWVsZEZvcklkKGZpZWxkSWQpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMucHJpdmF0ZUZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIGZpZWxkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWNlaXZlciBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RJZCAtIFN0YWJsZSBtZXRob2QgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NZXRob2REZWNsYXJhdGlvbn0gTWV0aG9kIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgbWV0aG9kRm9ySWQobWV0aG9kSWQpIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZHMuZ2V0KG1ldGhvZElkKVxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBtZXRob2QgaWRlbnRpdHkgJyR7bWV0aG9kSWR9Jy5gKVxuXG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyfSBUeXBlIHBhcmFtZXRlci5cbiAgICovXG4gIHR5cGVQYXJhbWV0ZXJGb3JJZChwYXJhbWV0ZXJJZCkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMudHlwZVBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlcklkKVxuXG4gICAgaWYgKCFwYXJhbWV0ZXIpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCB0eXBlIHBhcmFtZXRlciBpZGVudGl0eSAnJHtwYXJhbWV0ZXJJZH0nLmApXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGVkIG5vbWluYWwgZXJyb3IgZGVjbGFyYXRpb24gZm9yIGFuIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RGYWlsdXJlRGVjbGFyYXRpb259IEVycm9yIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgZXJyb3JGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9ycy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZXJyb3IpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlcnJvciBpZGVudGl0eSAnJHtkZWNsYXJhdGlvbklkfScuYClcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC12aXNpYmxlIHNwZWxsaW5nIGZvciBvbmUgbm9taW5hbCBlcnJvciBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldC12aXNpYmxlIG5hbWUuXG4gICAqL1xuICBlcnJvck5hbWVGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yRm9ySWQoZGVjbGFyYXRpb25JZClcbiAgICBjb25zdCBvd25lciA9IHRoaXMuZGVjbGFyYXRpb25Nb2R1bGVzLmdldChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKHRoaXMucHJvZ3JhbSAmJiBvd25lciAmJiBvd25lci5pZCAhPSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSAmJiB0aGlzLmxhbmd1YWdlID09IFwicnVieVwiKSB7XG4gICAgICByZXR1cm4gYCR7bW9kdWxlQ2xhc3NOYW1lKG93bmVyLmlkKX06OiR7ZXJyb3IubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG93bmVyID8gZXJyb3IubmFtZSA6IHRoaXMuY2FwYWJpbGl0eU5vbWluYWxOYW1lKGVycm9yLm5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgbmFtZSBvd25lZCBieSBhIGNvbXBpbGVyLWF1dGhvcml6ZWQgY2FwYWJpbGl0eS5cbiAgICogUEhQIHByb2dyYW0gZW50cmllcyBsaXZlIGluIGEgZ2VuZXJhdGVkIG5hbWVzcGFjZSB3aGlsZSBzdGRsaWIgcHJvdmlkZXIgY2xhc3NlcyByZW1haW5cbiAgICogZ2xvYmFsLCBzbyBQSFAgcHJvZ3JhbSBtb2RlIGZ1bGx5IHF1YWxpZmllcyBjYXBhYmlsaXR5IG5hbWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIG5vbWluYWwgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IHNwZWxsaW5nLlxuICAgKi9cbiAgY2FwYWJpbGl0eU5vbWluYWxOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IGBcXFxcJHtuYW1lfWAgOiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIHJlc29sdmVkIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBSZXNvbHZlZCBjYWxsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQgY2FsbCBuYW1lLlxuICAgKi9cbiAgY2FsbE5hbWVGb3IoZXhwcmVzc2lvbikge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uSWQgPSBleHByZXNzaW9uLnJlc29sdXRpb24/LmRlY2xhcmF0aW9uSWRcbiAgICBjb25zdCBvd25lciA9IGRlY2xhcmF0aW9uSWQgPyB0aGlzLmRlY2xhcmF0aW9uTW9kdWxlcy5nZXQoZGVjbGFyYXRpb25JZCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBpbXBvcnRlZCA9IGRlY2xhcmF0aW9uSWQgPyB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT4gaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQpIDogdW5kZWZpbmVkXG5cbiAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIiAmJiAhdGhpcy5wcm9ncmFtICYmIHRoaXMucmVmZXJlbmNlQ2xhc3NFbWlzc2lvbkRlcHRoID4gMCkgcmV0dXJuIGBNYWluLiR7ZXhwcmVzc2lvbi5jYWxsZWV9YFxuICAgIGlmICghZGVjbGFyYXRpb25JZCB8fCAhdGhpcy5wcm9ncmFtIHx8ICFvd25lciB8fCBvd25lci5pZCA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSkgcmV0dXJuIGV4cHJlc3Npb24uY2FsbGVlXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikgcmV0dXJuIGAke21vZHVsZUNsYXNzTmFtZShvd25lci5pZCl9LiR7ZGVjbGFyYXRpb25OYW1lKG93bmVyLCBkZWNsYXJhdGlvbklkKX1gXG4gICAgaWYgKGltcG9ydGVkKSByZXR1cm4gdGhpcy5pbXBvcnROYW1lRm9yKGltcG9ydGVkKVxuXG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uTmFtZShvd25lciwgZGVjbGFyYXRpb25JZClcbiAgfVxuXG4gIC8qKiBNYXJrcyBlbWlzc2lvbiBhcyBvY2N1cnJpbmcgaW5zaWRlIG9uZSB0b3AtbGV2ZWwgcmVmZXJlbmNlIGNsYXNzLiAqL1xuICBiZWdpblJlZmVyZW5jZUNsYXNzRW1pc3Npb24oKSB7XG4gICAgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggKz0gMVxuICB9XG5cbiAgLyoqIEVuZHMgb25lIGJhbGFuY2VkIHRvcC1sZXZlbCByZWZlcmVuY2UtY2xhc3MgZW1pc3Npb24gc2NvcGUuICovXG4gIGVuZFJlZmVyZW5jZUNsYXNzRW1pc3Npb24oKSB7XG4gICAgaWYgKHRoaXMucmVmZXJlbmNlQ2xhc3NFbWlzc2lvbkRlcHRoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVmZXJlbmNlLWNsYXNzIGVtaXNzaW9uIHNjb3BlIGlzIG5vdCBhY3RpdmUuXCIpXG4gICAgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggLT0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC1sb2NhbCBiaW5kaW5nIGZvciBvbmUgcmVzb2x2ZWQgaW1wb3J0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljSW1wb3J0fSBpbXBvcnRlZCAtIFJlc29sdmVkIGltcG9ydC5cbiAgICogQHJldHVybnMge3N0cmluZ30gRW1pdHRlZCBpbXBvcnQgbmFtZS5cbiAgICovXG4gIGltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKClcblxuICAgIGlmICghdGhpcy5wcm9ncmFtIHx8ICFtb2R1bGUpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW1wb3J0IG5hbWVzIHJlcXVpcmUgYSB2YWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cIilcblxuICAgIHJldHVybiBwcm9ncmFtSW1wb3J0TmFtZSh0aGlzLnByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIG9uZSBsb2NhbCBkZWNsYXJhdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgY3VycmVudCBwcm9ncmFtIG1vZHVsZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRlY2xhcmF0aW9uSWQgLSBEZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaXQgaGFzIGEgc2FtZS1uYW1lIHByb2dyYW0gZXhwb3J0LlxuICAgKi9cbiAgaXNEaXJlY3RseUV4cG9ydGVkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSAvKiogQHR5cGUge1BhcnRpYWw8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi8gKHRoaXMubW9kdWxlKVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtb2R1bGUuZXhwb3J0cz8uc29tZSgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmIGl0ZW0uZXhwb3J0ZWROYW1lID09IGRlY2xhcmF0aW9uTmFtZShtb2R1bGUsIGRlY2xhcmF0aW9uSWQpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGV4cG9ydCBlZGdlIHVzZXMgaXRzIGRlY2xhcmF0aW9uJ3MgZW1pdHRlZCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRXhwb3J0fSBleHBvcnRlZCAtIEN1cnJlbnQgZXhwb3J0IGVkZ2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgZWRnZSBpcyByZXByZXNlbnRlZCBieSB0aGUgZGVjbGFyYXRpb24gcHJlZml4LlxuICAgKi9cbiAgaXNEaXJlY3RFeHBvcnQoZXhwb3J0ZWQpIHtcbiAgICByZXR1cm4gZXhwb3J0ZWQuZXhwb3J0ZWROYW1lID09IGRlY2xhcmF0aW9uTmFtZSh0aGlzLm1vZHVsZSwgZXhwb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGxvY2FsIGRlY2xhcmF0aW9uIGhhcyBhbnkgcHVibGljIHByb2dyYW0gZXhwb3J0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZGVjbGFyYXRpb25JZCAtIERlY2xhcmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3J0ZWQuXG4gICAqL1xuICBpc0V4cG9ydGVkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSAvKiogQHR5cGUge1BhcnRpYWw8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi8gKHRoaXMubW9kdWxlKVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtb2R1bGUuZXhwb3J0cz8uc29tZSgoaXRlbSkgPT4gaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIHRoZSBzZWxlY3RlZCBwcm9ncmFtIGVudHJ5IG1vZHVsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB3cml0ZXIgb3ducyB0aGUgc2VsZWN0ZWQgZW50cnkuXG4gICAqL1xuICBpc1Byb2dyYW1FbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtPy5lbnRyeU1vZHVsZSA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBjbGFzcy9tb2R1bGUgc2VnbWVudCBmb3IgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIC0gTG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAgICovXG4gIHByb2dyYW1Nb2R1bGVOYW1lKG1vZHVsZUlkKSB7XG4gICAgaWYgKCF0aGlzLnByb2dyYW0/Lm1vZHVsZXMuc29tZSgoe2lkfSkgPT4gaWQgPT0gbW9kdWxlSWQpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIG1vZHVsZSAnJHttb2R1bGVJZH0nLmApXG5cbiAgICByZXR1cm4gbW9kdWxlQ2xhc3NOYW1lKG1vZHVsZUlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjdXJyZW50IG1vZHVsZSBpbiB0aGUgY29tcGxldGUgcHJvZ3JhbS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IHVuZGVmaW5lZH0gQ3VycmVudCBwcm9ncmFtIG1vZHVsZS5cbiAgICovXG4gICNwcm9ncmFtTW9kdWxlKCkge1xuICAgIGlmICghdGhpcy5wcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtLm1vZHVsZXMuZmluZCgoe2lkfSkgPT4gaWQgPT0gUmVmbGVjdC5nZXQodGhpcy5tb2R1bGUsIFwiaWRcIikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlbGF0aXZlIEVTTS9yZXF1aXJlIHNwZWNpZmllciBmb3IgYSBwbGFubmVkIGRlcGVuZGVuY3kgYXJ0aWZhY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCAtIERlcGVuZGVuY3kgbW9kdWxlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dGVuc2lvbl0gLSBPcHRpb25hbCByZXBsYWNlbWVudCBleHRlbnNpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlbGF0aXZlIFBPU0lYIHNwZWNpZmllci5cbiAgICovXG4gIHJlbGF0aXZlTW9kdWxlU3BlY2lmaWVyKG1vZHVsZUlkLCBleHRlbnNpb24pIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gdGhpcy5wcm9ncmFtUGF0aHM/LmdldChtb2R1bGVJZClcblxuICAgIGlmICghdGFyZ2V0UGF0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gcGxhbm5lZCBtb2R1bGUgcGF0aCAnJHttb2R1bGVJZH0nLmApXG4gICAgY29uc3QgYWRqdXN0ZWRUYXJnZXQgPSBleHRlbnNpb24gPyB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcLlteLi9dKyQvdSwgZXh0ZW5zaW9uKSA6IHRhcmdldFBhdGhcbiAgICBjb25zdCBmcm9tID0gdGhpcy5maWxlbmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpXG4gICAgY29uc3QgdG8gPSBhZGp1c3RlZFRhcmdldC5zcGxpdChcIi9cIilcbiAgICBsZXQgY29tbW9uID0gMFxuXG4gICAgd2hpbGUgKGNvbW1vbiA8IGZyb20ubGVuZ3RoICYmIGNvbW1vbiA8IHRvLmxlbmd0aCAmJiBmcm9tW2NvbW1vbl0gPT0gdG9bY29tbW9uXSkgY29tbW9uKytcbiAgICBjb25zdCByZWxhdGl2ZSA9IFsuLi5mcm9tLnNsaWNlKGNvbW1vbikubWFwKCgpID0+IFwiLi5cIiksIC4uLnRvLnNsaWNlKGNvbW1vbildLmpvaW4oXCIvXCIpXG5cbiAgICByZXR1cm4gcmVsYXRpdmUuc3RhcnRzV2l0aChcIi5cIikgPyByZWxhdGl2ZSA6IGAuLyR7cmVsYXRpdmV9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3RlY3RlZCBuYXRpdmUgZW50cnkgZm9yIG9uZSB1c2VkIHN0ZGxpYiBwcm92aWRlciBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb259IG9wZXJhdGlvbiAtIENhbm9uaWNhbCBvcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IExpbmtlZCBwcm90ZWN0ZWQgZW50cnksIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBvcGVyYXRpb24gc3RheXMgaW5saW5lZC5cbiAgICovXG4gIHN0ZGxpYlByb3ZpZGVyRW50cnlGb3Iob3BlcmF0aW9uKSB7XG4gICAgY29uc3QgbW9kdWxlID0gdGhpcy5lZmZlY3RPcGVyYXRpb25Nb2R1bGVzLmdldChvcGVyYXRpb24uaWQpXG5cbiAgICByZXR1cm4gbW9kdWxlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnN0ZGxpYlByb3ZpZGVyRW50cmllcz8uW2Ake21vZHVsZX1cXHUwMDAwJHtvcGVyYXRpb24ubmFtZX1gXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWxhdGl2ZSBzcGVjaWZpZXIgZm9yIHRoZSBwbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHRlbnNpb25dIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVyUGF0aF0gLSBPbmUgc2VsZWN0ZWQgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVsYXRpdmUgUE9TSVggc3BlY2lmaWVyLlxuICAgKi9cbiAgc3RkbGliUHJvdmlkZXJTcGVjaWZpZXIoZXh0ZW5zaW9uLCBwcm92aWRlclBhdGgpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcHJvdmlkZXJQYXRoID8/IHRoaXMuc3RkbGliUHJvdmlkZXJQYXRoID8/IHRoaXMuc3RkbGliUHJvdmlkZXJQYXRocz8uWzBdXG5cbiAgICBpZiAoIXRhcmdldFBhdGgpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBzdGRsaWIgcHJvdmlkZXIgc3BlY2lmaWVyIHJlcXVpcmVzIGEgcGxhbm5lZCBwcm92aWRlciBwYXRoLlwiKVxuICAgIGNvbnN0IGFkanVzdGVkVGFyZ2V0ID0gZXh0ZW5zaW9uID8gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC5bXi4vXSskL3UsIGV4dGVuc2lvbikgOiB0YXJnZXRQYXRoXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuZmlsZW5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKVxuICAgIGNvbnN0IHRvID0gYWRqdXN0ZWRUYXJnZXQuc3BsaXQoXCIvXCIpXG4gICAgbGV0IGNvbW1vbiA9IDBcblxuICAgIHdoaWxlIChjb21tb24gPCBmcm9tLmxlbmd0aCAmJiBjb21tb24gPCB0by5sZW5ndGggJiYgZnJvbVtjb21tb25dID09IHRvW2NvbW1vbl0pIGNvbW1vbisrXG4gICAgY29uc3QgcmVsYXRpdmUgPSBbLi4uZnJvbS5zbGljZShjb21tb24pLm1hcCgoKSA9PiBcIi4uXCIpLCAuLi50by5zbGljZShjb21tb24pXS5qb2luKFwiL1wiKVxuXG4gICAgcmV0dXJuIHJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuXCIpID8gcmVsYXRpdmUgOiBgLi8ke3JlbGF0aXZlfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFNlbWFudGljIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRmllbGR9IFJlY29yZCBmaWVsZC5cbiAgICovXG4gIGZpZWxkRm9ySWQoZmllbGRJZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZ2V0KGZpZWxkSWQpXG5cbiAgICBpZiAoIWZpZWxkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgZmllbGQgaWRlbnRpdHkgJyR7ZmllbGRJZH0nLmApXG5cbiAgICByZXR1cm4gZmllbGRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVjb3JkIGRlY2xhcmF0aW9uIHRoYXQgb3ducyBhIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkSWQgLSBTZW1hbnRpYyBmaWVsZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBPd25pbmcgcmVjb3JkLlxuICAgKi9cbiAgcmVjb3JkRm9yRmllbGRJZChmaWVsZElkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5maWVsZFJlY29yZHMuZ2V0KGZpZWxkSWQpXG5cbiAgICBpZiAoIXJlY29yZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIHJlY29yZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
|