semantifold 0.11.0 → 0.12.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 CHANGED
@@ -63,7 +63,7 @@ Binary/resource provenance uses `SemantifoldByteMapping` v1 through `createByteM
63
63
 
64
64
  `discoverCanonicalToolchain` and `discoverToolchain` resolve an exact executable from a configured absolute override or one unambiguous canonical PATH command and capture its version. `runAcceptanceStages` materializes a validated artifact set in a unique temporary directory and runs applicable `parse`, `generate`, `restore`, `compile`, `link`, `validate`, `instantiate`, and `execute` stages with exact argument arrays, a deterministic locale/timezone, bounded per-stage timeouts, captured output, no shell, and normalized stage diagnostics. The canonical overrides are `SEMANTIFOLD_DART`, `SEMANTIFOLD_ZIG`, `SEMANTIFOLD_PHP`, `SEMANTIFOLD_RUBY`, `SEMANTIFOLD_NODE`, `SEMANTIFOLD_TSC`, `SEMANTIFOLD_JAVAC`, `SEMANTIFOLD_JAVA`, `SEMANTIFOLD_KOTLINC`, `SEMANTIFOLD_PYTHON`, `SEMANTIFOLD_DOTNET`, `SEMANTIFOLD_GO`, `SEMANTIFOLD_CLANG`, `SEMANTIFOLD_CLANGPP`, `SEMANTIFOLD_RUSTC`, `SEMANTIFOLD_CARGO`, `SEMANTIFOLD_SWIFTC`, `SEMANTIFOLD_WASM_VALIDATE`, and `SEMANTIFOLD_CHROMIUM`; none of these APIs installs or downloads a tool. The generic `php` profile accepts PHP 8.x, while closed-record execution and the Task 037 PHP provider use the canonical `php82` profile (through the same `SEMANTIFOLD_PHP` override) to require PHP 8.2 or newer with core stream functions. Zig requires exact 0.15.2 on Linux x86-64; Dart requires exact SDK 3.13.3 stable on Linux x64, Kotlin exact 2.4.20 on pinned OpenJDK 25.0.4.1+1 development (Ubuntu 26.04) or TensorBuzz (Ubuntu 24.04) profiles, and Swift exact 6.3.3 on Linux x86-64. Browser Wasm requires WABT 1.0.36 and Chrome/Chromium 152.0.7977.82 in addition to Node 24.
65
65
 
66
- This is not general-purpose support for any of the fifteen languages. PHP, Ruby, JavaScript with JSDoc, TypeScript, and Java implement Task 005 general required functions/calls, Task 006 recursive immutable lists/maps, Task 007 explicit optional values, Task 008 ordered list iteration, Task 009 closed records, Task 010 explicit semantic projects, Task 011 typed unchecked errors, Task 012 invariant unbounded type parameters and generic declarations/applications, Task 014 insertion-ordered immutable map iteration, Task 032 strict-Boolean condition-controlled loops, Task 033 bounded reference classes, and Task 034's bounded effect/resource profile. Dart and Zig implement Task 005 general required functions/calls but none of those later profiles. `OptionalType {valueType}` contains only semantic presence or absence; it composes recursively as a declared list element or map value, and access preserves that optional result. A strict presence test can prove one simple binding present inside exactly the corresponding branch. Ruby uses exact `T?` metadata and `nil?`, JavaScript/JSDoc uses exact `T|null`, TypeScript uses exact `T | null`, PHP uses canonical `?T`, and Java uses exact `java.util.Optional<T>`/`Optional<T>` operations. Arbitrary unions, nested optionals, implicit nullable/default parameters, `undefined`, truthiness, nullish defaults/navigation, Java bare `null`, and unchecked unwrap remain unsupported. Collection support covers homogeneous literals, zero-based list indexing, total string-key map lookup, size, recursive typing, function passage, exact ordered list `for-each`, and the separate `OrderedMapType` pair-iteration profile. Ordinary `MapType` remains unordered and non-iterable. Ordered maps accept unique nonnumeric string keys, evaluate entries left-to-right, and visit key/value pairs in first-insertion order; aliases, mutation, key-only/value-only loops, and unordered conversions fail loudly. Java lowers only safe local ordered literals through a private `LinkedHashMap` insertion sequence and a non-escaping `Collections.unmodifiableSequencedMap` boundary. Every list, ordered-map, and condition-controlled loop has a deterministic semantic identity; each `break` or `continue` resolves to the nearest enclosing identity and cannot cross a function boundary. Collection loops evaluate their operand once and bind values immutably in body-local scope. A condition-controlled loop evaluates an exact Boolean condition before every iteration and may execute zero times; no loop body by itself proves a non-void function complete. Any outer mutable binding assigned on a nested loop path loses its known-value and optional-presence facts before the relevant repeated condition or body validation and after loop exit, including assignment paths ending in `break`, `continue`, or `return`; unaffected bindings keep stable facts. Task 007 does not turn an unchecked missing-key lookup into an optional operation. PHPDoc distinguishes `list<T>` from `array<string,T>`; JavaScript objects are never maps. Immutability is the accepted semantic operation boundary, not a deep-freezing promise. The other eight source languages and browser Wasm remain on the Tasks 001–004 two-parameter/scalar-return profile and reject later-feature modules transactionally. See [language support](docs/language-support.md) before using it on other code.
66
+ This is not general-purpose support for any of the fifteen languages. PHP, Ruby, JavaScript with JSDoc, TypeScript, and Java implement Task 005 general required functions/calls, Task 006 recursive immutable lists/maps, Task 007 explicit optional values, Task 008 ordered list iteration, Task 009 closed records, Task 010 explicit semantic projects, Task 011 typed unchecked errors, Task 012 invariant unbounded type parameters and generic declarations/applications, Task 014 insertion-ordered immutable map iteration, Task 032 strict-Boolean condition-controlled loops, Task 033 bounded reference classes, and Task 034's bounded effect/resource profile. C, Dart, and Zig implement Task 005 general required functions/calls but none of those later profiles. `OptionalType {valueType}` contains only semantic presence or absence; it composes recursively as a declared list element or map value, and access preserves that optional result. A strict presence test can prove one simple binding present inside exactly the corresponding branch. Ruby uses exact `T?` metadata and `nil?`, JavaScript/JSDoc uses exact `T|null`, TypeScript uses exact `T | null`, PHP uses canonical `?T`, and Java uses exact `java.util.Optional<T>`/`Optional<T>` operations. Arbitrary unions, nested optionals, implicit nullable/default parameters, `undefined`, truthiness, nullish defaults/navigation, Java bare `null`, and unchecked unwrap remain unsupported. Collection support covers homogeneous literals, zero-based list indexing, total string-key map lookup, size, recursive typing, function passage, exact ordered list `for-each`, and the separate `OrderedMapType` pair-iteration profile. Ordinary `MapType` remains unordered and non-iterable. Ordered maps accept unique nonnumeric string keys, evaluate entries left-to-right, and visit key/value pairs in first-insertion order; aliases, mutation, key-only/value-only loops, and unordered conversions fail loudly. Java lowers only safe local ordered literals through a private `LinkedHashMap` insertion sequence and a non-escaping `Collections.unmodifiableSequencedMap` boundary. Every list, ordered-map, and condition-controlled loop has a deterministic semantic identity; each `break` or `continue` resolves to the nearest enclosing identity and cannot cross a function boundary. Collection loops evaluate their operand once and bind values immutably in body-local scope. A condition-controlled loop evaluates an exact Boolean condition before every iteration and may execute zero times; no loop body by itself proves a non-void function complete. Any outer mutable binding assigned on a nested loop path loses its known-value and optional-presence facts before the relevant repeated condition or body validation and after loop exit, including assignment paths ending in `break`, `continue`, or `return`; unaffected bindings keep stable facts. Task 007 does not turn an unchecked missing-key lookup into an optional operation. PHPDoc distinguishes `list<T>` from `array<string,T>`; JavaScript objects are never maps. Immutability is the accepted semantic operation boundary, not a deep-freezing promise. The other seven source languages and browser Wasm remain on the Tasks 001–004 two-parameter/scalar-return profile and reject later-feature modules transactionally. See [language support](docs/language-support.md) before using it on other code.
67
67
 
68
68
  Task 009 models nominal product values as ordered `RecordDeclaration`/`RecordField` definitions, identity-bound `RecordType`, exact `RecordConstruction`, and resolved `MemberRead`. Records are closed and immutable: construction supplies every field once in declaration order, member access resolves to stable field identity, and structurally similar objects or maps are not records. Record declaration names cannot be captured by lexical parameters, locals, or iteration bindings. Presence-proven optional record receivers retain nominal field dispatch even when a field is named `length` or `size`, and Java zero-argument `equals()` record access remains distinct from one-argument string equality. Fields may recursively contain supported scalars, optionals, lists, maps, and records; an unmediated value cycle is rejected, while optional- or container-mediated recursion is accepted and compiled by every original-five target. Each frontend accepts only its documented canonical class shape. Backend preflight rejects target-reserved identifiers, including the deterministic PHP 8.2+ core/date/SPL/JSON type baseline and Ruby built-in type names, before emission; generated JavaScript and Ruby bind record freezing independently from user field and function names. Omitted or `undefined` external-IR `records` remains the legacy empty-record shape, while explicit `null` is malformed. Java uses a conventional final class with private-final storage, one constructor, and canonical accessors because pinned `@lezer/java@1.1.3` cannot faithfully represent Java `record` declarations. General classes, inheritance, interfaces/traits/mixins, extra methods, mutation, reflection, computed/dynamic members, decorators, equality/hashing, and copy/destructuring remain outside the profile. PR #34 delivered Task 009 after green TensorBuzz CI. This follow-up hardens JavaScript/Ruby record freezing and Java `equals()` member dispatch; its review and merge remain coordinator-owned.
69
69
 
@@ -7,7 +7,8 @@ export type PlannedStep = import("./ordered-expressions.js").PlannedStep;
7
7
  export type StatementPlan = {
8
8
  id: string;
9
9
  steps: PlannedStep[];
10
- value: PlannedValue;
10
+ value?: PlannedValue;
11
+ terminal?: PlannedStep;
11
12
  };
12
13
  /**
13
14
  * Produces a fully validated, deterministic C17 translation unit and owned support header.
@@ -1 +1 @@
1
- {"version":3,"file":"c.d.ts","sourceRoot":"","sources":["../../../src/backends/c.js"],"names":[],"mappings":"AAYI,YAAyD,cAAc,GAA7D,OAAO,sBAAsB,EAAE,cAAc,CAAgB;AACvE,YAAuD,YAAY,GAAzD,OAAO,sBAAsB,EAAE,YAAY,CAAc;AACnE,YAAoD,SAAS,GAAnD,OAAO,sBAAsB,EAAE,SAAS,CAAW;AAC7D,YAAgD,KAAK,GAA3C,OAAO,sBAAsB,EAAE,KAAK,CAAO;AACrD,YAA2D,YAAY,GAA7D,OAAO,0BAA0B,EAAE,YAAY,CAAc;AACvE,YAA0D,WAAW,GAA3D,OAAO,0BAA0B,EAAE,WAAW,CAAa;AACrE,YAAmE,aAAa,GAAtE;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAC,CAAe;AAWpF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAC,EAHlF;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CAAA;CAG1H,GAFhF;IAAC,SAAS,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CA+B9F"}
1
+ {"version":3,"file":"c.d.ts","sourceRoot":"","sources":["../../../src/backends/c.js"],"names":[],"mappings":"AAYI,YAAyD,cAAc,GAA7D,OAAO,sBAAsB,EAAE,cAAc,CAAgB;AACvE,YAAuD,YAAY,GAAzD,OAAO,sBAAsB,EAAE,YAAY,CAAc;AACnE,YAAoD,SAAS,GAAnD,OAAO,sBAAsB,EAAE,SAAS,CAAW;AAC7D,YAAgD,KAAK,GAA3C,OAAO,sBAAsB,EAAE,KAAK,CAAO;AACrD,YAA2D,YAAY,GAA7D,OAAO,0BAA0B,EAAE,YAAY,CAAc;AACvE,YAA0D,WAAW,GAA3D,OAAO,0BAA0B,EAAE,WAAW,CAAa;AACrE,YAA4F,aAAa,GAA/F;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAAC,CAAe;AAW7G;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAC,EAHlF;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,gBAAgB,CAAA;KAAC,EAAE,CAAA;CAG1H,GAFhF;IAAC,SAAS,EAAE,OAAO,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CA+B9F"}
@@ -14,7 +14,7 @@ import { SourceWriter } from "./writer.js";
14
14
  /** @typedef {import("../semantic/types.js").Block} Block */
15
15
  /** @typedef {import("./ordered-expressions.js").PlannedValue} PlannedValue */
16
16
  /** @typedef {import("./ordered-expressions.js").PlannedStep} PlannedStep */
17
- /** @typedef {{id: string, steps: PlannedStep[], value: PlannedValue}} StatementPlan */
17
+ /** @typedef {{id: string, steps: PlannedStep[], value?: PlannedValue, terminal?: PlannedStep}} StatementPlan */
18
18
  const binaryTokens = new Map([
19
19
  ["IntegerAdd", "semantifold_integer_add"], ["IntegerSubtract", "semantifold_integer_subtract"],
20
20
  ["IntegerMultiply", "semantifold_integer_multiply"], ["StringConcat", "semantifold_string_concat"],
@@ -113,7 +113,7 @@ class CEmitter {
113
113
  this.synthetic('/* semantifold:program:c:v1 */\n#include "semantifold_runtime.h"\n\n', module, "");
114
114
  module.functions.forEach((declaration, index) => {
115
115
  const parameters = declaration.parameters.map((parameter) => `${emitScalarType("c", parameter.type)} ${parameter.name}`).join(", ");
116
- this.synthetic(`static ${emitScalarType("c", declaration.returnType)} ${declaration.name}(${parameters});\n`, declaration, `/functions/${index}`);
116
+ this.synthetic(`static ${emitScalarType("c", declaration.returnType)} ${declaration.name}(${declaration.parameters.length ? parameters : "void"});\n`, declaration, `/functions/${index}`);
117
117
  });
118
118
  module.functions.forEach((declaration, index) => {
119
119
  const path = `/functions/${index}`;
@@ -122,6 +122,8 @@ class CEmitter {
122
122
  this.synthetic(" ", declaration, path);
123
123
  this.mapped(declaration.name, declaration, path, "name");
124
124
  this.synthetic("(", declaration, path);
125
+ if (!declaration.parameters.length)
126
+ this.synthetic("void", declaration, path);
125
127
  declaration.parameters.forEach((parameter, parameterIndex) => {
126
128
  const parameterPath = `${path}/parameters/${parameterIndex}`;
127
129
  if (parameterIndex)
@@ -165,7 +167,26 @@ class CEmitter {
165
167
  const signature = statementSignature(statement);
166
168
  this.synthetic(`${indent}/* ${marker} begin ${plan.id} ${signature} */\n`, statement, path);
167
169
  this.steps(plan.steps, indent);
170
+ if (statement.kind == "ReturnStatement" && !statement.expression) {
171
+ this.synthetic(indent, statement, path);
172
+ this.mapped("return", statement, path);
173
+ this.synthetic(";\n", statement, path);
174
+ this.synthetic(`${indent}/* ${marker} end ${plan.id} ${signature} */\n`, statement, path);
175
+ return;
176
+ }
177
+ if (statement.kind == "ExpressionStatement") {
178
+ if (!plan.terminal)
179
+ throw new Error("Missing validated C terminal call.");
180
+ this.synthetic(indent, statement, path);
181
+ this.operation(plan.terminal);
182
+ this.synthetic(";\n", statement, path);
183
+ this.synthetic(`${indent}/* ${marker} end ${plan.id} ${signature} */\n`, statement, path);
184
+ return;
185
+ }
168
186
  this.synthetic(indent, statement, path);
187
+ const value = plan.value;
188
+ if (!value)
189
+ throw new Error("Missing validated C statement value plan.");
169
190
  if (statement.kind == "LocalDeclaration") {
170
191
  if (!statement.mutable)
171
192
  this.synthetic("const ", statement, path);
@@ -185,10 +206,10 @@ class CEmitter {
185
206
  else if (statement.kind == "ReturnStatement")
186
207
  this.mapped("return ", statement, path);
187
208
  else if (statement.kind == "PrintStatement")
188
- this.mapped(`semantifold_print_${plan.value.type}(`, statement, path);
209
+ this.mapped(`semantifold_print_${value.type}(`, statement, path);
189
210
  else
190
211
  this.mapped("if (", statement, path);
191
- this.value(plan.value);
212
+ this.value(value);
192
213
  if (statement.kind == "IfStatement") {
193
214
  this.synthetic(") {\n", statement, path);
194
215
  this.block(statement.consequent, `${path}/consequent`, `${indent} `);
@@ -305,4 +326,4 @@ class CEmitter {
305
326
  throw new Error("Unsequenced expression passed C planning.");
306
327
  }
307
328
  }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9jLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUM3RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQzFELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFeEMsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSxvRUFBb0U7QUFDcEUsNERBQTREO0FBQzVELDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsdUZBQXVGO0FBRXZGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLENBQUMsWUFBWSxFQUFFLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSw4QkFBOEIsQ0FBQztJQUM5RixDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsMkJBQTJCLENBQUM7SUFDbEcsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLDhCQUE4QixDQUFDO0lBQy9GLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFF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QUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFOUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixPQUFPLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3JGLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDOUQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2ZpbmFsaXplTWFwcGluZywgdG9Tb3VyY2VNYXBWM30gZnJvbSBcIi4uL21hcHBpbmcuanNcIlxuaW1wb3J0IHtzdGF0ZW1lbnRTaWduYXR1cmUsIHBsYW5OYXRpdmVNb2R1bGV9IGZyb20gXCIuL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIlxuaW1wb3J0IHtjUnVudGltZUhlYWRlcn0gZnJvbSBcIi4vYy1ydW50aW1lLmpzXCJcbmltcG9ydCB7bWF4aW11bUNTb3VyY2VMZW5ndGgsIHZhbGlkYXRlQ01lbW9yeX0gZnJvbSBcIi4vYy12YWxpZGF0aW9uLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVOYXRpdmVHcmFwaH0gZnJvbSBcIi4vbmF0aXZlLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtlbWl0U2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7U291cmNlV3JpdGVyfSBmcm9tIFwiLi93cml0ZXIuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpY01vZHVsZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gQmxvY2sgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9vcmRlcmVkLWV4cHJlc3Npb25zLmpzXCIpLlBsYW5uZWRWYWx1ZX0gUGxhbm5lZFZhbHVlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vb3JkZXJlZC1leHByZXNzaW9ucy5qc1wiKS5QbGFubmVkU3RlcH0gUGxhbm5lZFN0ZXAgKi9cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIHN0ZXBzOiBQbGFubmVkU3RlcFtdLCB2YWx1ZTogUGxhbm5lZFZhbHVlfX0gU3RhdGVtZW50UGxhbiAqL1xuXG5jb25zdCBiaW5hcnlUb2tlbnMgPSBuZXcgTWFwKFtcbiAgW1wiSW50ZWdlckFkZFwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfYWRkXCJdLCBbXCJJbnRlZ2VyU3VidHJhY3RcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX3N1YnRyYWN0XCJdLFxuICBbXCJJbnRlZ2VyTXVsdGlwbHlcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX211bHRpcGx5XCJdLCBbXCJTdHJpbmdDb25jYXRcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfY29uY2F0XCJdLFxuICBbXCJTdHJpbmdFcXVhbFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19lcXVhbFwiXSwgW1wiU3RyaW5nTm90RXF1YWxcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfbm90X2VxdWFsXCJdLFxuICBbXCJJbnRlZ2VyRXF1YWxcIiwgXCI9PVwiXSwgW1wiSW50ZWdlck5vdEVxdWFsXCIsIFwiIT1cIl0sIFtcIkJvb2xlYW5FcXVhbFwiLCBcIj09XCJdLCBbXCJCb29sZWFuTm90RXF1YWxcIiwgXCIhPVwiXSxcbiAgW1wiSW50ZWdlckxlc3NUaGFuXCIsIFwiPFwiXSwgW1wiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiLCBcIjw9XCJdLFxuICBbXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiwgXCI+XCJdLCBbXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIsIFwiPj1cIl1cbl0pXG5cbi8qKlxuICogUHJvZHVjZXMgYSBmdWxseSB2YWxpZGF0ZWQsIGRldGVybWluaXN0aWMgQzE3IHRyYW5zbGF0aW9uIHVuaXQgYW5kIG93bmVkIHN1cHBvcnQgaGVhZGVyLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU/OiBzdHJpbmcsIG1hcERpcmVjdGl2ZT86IHVua25vd24sIG1vZHVsZTogU2VtYW50aWNNb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lPzogdW5rbm93biwgc291cmNlcz86IHtmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX19IGlucHV0IC0gQmFja2VuZCByZXF1ZXN0LlxuICogQHJldHVybnMge3thcnRpZmFjdHM6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNldEFydGlmYWN0W10sIHRhcmdldDogc3RyaW5nfX0gQ29tcGxldGUgY2FuZGlkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDUHJvZ3JhbSh7ZmlsZW5hbWUsIG1hcERpcmVjdGl2ZSwgbW9kdWxlLCBzb3VyY2VNYXBGaWxlbmFtZSwgc291cmNlc30pIHtcbiAgdmFsaWRhdGVOYXRpdmVHcmFwaChtb2R1bGUpXG4gIHZhbGlkYXRlQmFja2VuZE1vZHVsZShtb2R1bGUsIFwiY1wiKVxuICB2YWxpZGF0ZUNNZW1vcnkobW9kdWxlKVxuICBpZiAoZmlsZW5hbWUgIT09IHVuZGVmaW5lZCAmJiBmaWxlbmFtZSAhPSBcInByb2dyYW0uY1wiKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJjXCIsIFwiYXJ0aWZhY3QgZmlsZW5hbWUgb3RoZXIgdGhhbiBwcm9ncmFtLmNcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICBpZiAobWFwRGlyZWN0aXZlICE9PSB1bmRlZmluZWQgfHwgc291cmNlTWFwRmlsZW5hbWUgIT09IHVuZGVmaW5lZCkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiY1wiLCBcInNvdXJjZS1tYXAgZmlsZW5hbWUgb3IgZGlyZWN0aXZlIG9wdGlvblwiLCBtb2R1bGUubG9jYXRpb24pXG4gIGNvbnN0IHBsYW5zID0gcGxhbk5hdGl2ZU1vZHVsZShtb2R1bGUpXG5cbiAgbmV3IENFbWl0dGVyKHVuZGVmaW5lZCwgcGxhbnMsIG1vZHVsZS5sb2NhdGlvbikucHJvZ3JhbShtb2R1bGUpXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoe2ZpbGVuYW1lOiBcInByb2dyYW0uY1wiLCBsYW5ndWFnZTogXCJjXCIsIG1vZHVsZSwgc291cmNlc30pXG4gIGNvbnN0IGVtaXR0ZXIgPSBuZXcgQ0VtaXR0ZXIod3JpdGVyLCBwbGFucywgbW9kdWxlLmxvY2F0aW9uKVxuXG4gIGVtaXR0ZXIucHJvZ3JhbShtb2R1bGUpXG4gIGNvbnN0IG1hcHBpbmcgPSBmaW5hbGl6ZU1hcHBpbmcod3JpdGVyLmZpbmlzaCgpKVxuICBjb25zdCByb290ID0gbWFwcGluZy5ub2Rlcy5maW5kKCh7cGF0aH0pID0+IHBhdGggPT0gXCJcIilcblxuICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRlZCBDIG1vZHVsZSBvbWl0dGVkIGl0cyByb290IHByb3ZlbmFuY2UuXCIpXG4gIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcm9vdC5vcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiXG4gICAgPyBbe2xvY2F0aW9uOiByb290Lm9yaWdpbi5sb2NhdGlvbiwgbm9kZUlkOiByb290LmlkLCByb2xlOiBcIm1vZHVsZVwiLCBzb3VyY2VJZDogcm9vdC5vcmlnaW4uc291cmNlSWR9XVxuICAgIDogKHJvb3Qub3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIgPyByb290Lm9yaWdpbi5vcmlnaW5zIDogcm9vdC5vcmlnaW4ucmVsYXRlZE9yaWdpbnMpLm1hcCgob3JpZ2luKSA9PlxuICAgICAgKHsuLi5vcmlnaW4sIG5vZGVJZDogb3JpZ2luLm5vZGVJZCA/PyByb290LmlkLCByb2xlOiBvcmlnaW4ucm9sZSA/PyBcIm1vZHVsZVwifSkpXG5cbiAgcmV0dXJuIHt0YXJnZXQ6IFwiY1wiLCBhcnRpZmFjdHM6IFt7XG4gICAgY29udGVudDogbWFwcGluZy5nZW5lcmF0ZWQuY29udGVudCwgY29udGVudEtpbmQ6IFwidGV4dFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWNcIiwgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLCBwYXRoOiBcInByb2dyYW0uY1wiLFxuICAgIHByb3ZlbmFuY2U6IHtraW5kOiBcInRleHRcIiwgbWFwcGluZywgc291cmNlTWFwOiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpfSwgcm9sZTogXCJlbnRyeVwiXG4gIH0sIHtcbiAgICBjb250ZW50OiBjUnVudGltZUhlYWRlciwgY29udGVudEtpbmQ6IFwidGV4dFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWNcIiwgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLCBwYXRoOiBcInNlbWFudGlmb2xkX3J1bnRpbWUuaFwiLFxuICAgIHByb3ZlbmFuY2U6IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwiQ2Fub25pY2FsIEMxNyBzY2FsYXIgaGVscGVycyBhbmQgbW9kdWxlLWxpZmV0aW1lIGltbXV0YWJsZSBVVEYtOCBhcmVuYS5cIiwgcmVsYXRlZE9yaWdpbnN9LCByb2xlOiBcInN1cHBvcnRcIlxuICB9XX1cbn1cblxuLyoqIFdyaXRlcyBvbmx5IHRhcmdldCBzeW50YXggZnJvbSB2YWxpZGF0ZWQgc2VtYW50aWMgb2NjdXJyZW5jZXMgYW5kIHByaXZhdGUgcGxhbnMuICovXG5jbGFzcyBDRW1pdHRlciB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgd3JpdGVyIGFuZCBjb21wbGV0ZSBwbGFuLlxuICAgKiBAcGFyYW0ge1NvdXJjZVdyaXRlciB8IHVuZGVmaW5lZH0gd3JpdGVyIC0gUHJvdmVuYW5jZSB3cml0ZXI7IG9taXR0ZWQgZm9yIGV4YWN0IHNpemUgcHJlZmxpZ2h0LlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFN0YXRlbWVudFBsYW4+fSBwbGFucyAtIFZhbGlkYXRlZCBvY2N1cnJlbmNlIHBsYW5zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJvb3QgZGlhZ25vc3RpYyBsb2NhdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHdyaXRlciwgcGxhbnMsIGxvY2F0aW9uKSB7XG4gICAgdGhpcy53cml0ZXIgPSB3cml0ZXJcbiAgICB0aGlzLnBsYW5zID0gcGxhbnNcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZ2VuZXJhdGVkIHNjYWZmb2xkIHdpdGggYSByZWxhdGVkIHNlbWFudGljIG9yaWdpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBDIHN5bnRheC5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBSZWxhdGVkIG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gT2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCBub2RlLCBwYXRoKSB7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCwgbm9kZSlcbiAgICB0aGlzLndyaXRlcj8uc3ludGhldGljKHRleHQsIFwiQzE3IG9yZGVyZWQtZXhwcmVzc2lvbiBhbmQgbGlmZXRpbWUgc2NhZmZvbGRcIiwgW25vZGVdLCBbcGF0aF0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFuIG9yaWdpbmFsIHNlbWFudGljIHRva2VuIG9yIGFuY2hvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUYXJnZXQgdG9rZW4uXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gT3JpZ2luYWwgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcm9sZV0gLSBQYXJzZXIgdG9rZW4gcm9sZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwgbm9kZSwgcGF0aCwgcm9sZSkge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/Lm1hcHBlZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IHJvbGUgPyBcImV4YWN0XCIgOiBcImFuY2hvclwiLCBub2RlLCBwYXRoLCAuLi4ocm9sZSA/IHtyb2xlfSA6IHt9KX0pXG4gIH1cblxuICAvKipcbiAgICogQm91bmRzIHByaXZhdGUgZW1pc3Npb24gYmVmb3JlIGFueSBhcnRpZmFjdCBjYW4gZXNjYXBlIHRoZSBwYXJzZXIncyBwcm92ZW4gaW5wdXQgcHJvZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBOZXh0IGV4YWN0IG91dHB1dCBjaHVuay5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBSZWxhdGVkIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2hlY2tTaXplKHRleHQsIG5vZGUpIHtcbiAgICB0aGlzLmxlbmd0aCArPSB0ZXh0Lmxlbmd0aFxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heGltdW1DU291cmNlTGVuZ3RoKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJjXCIsIFwiZ2VuZXJhdGVkIHByb2dyYW0gZXhjZWVkcyB0aGUgZnJvemVuIEMgcGFyc2VyJ3MgMzI3NjcgVVRGLTE2IGlucHV0IGxpbWl0XCIsXG4gICAgICBcImxvY2F0aW9uXCIgaW4gbm9kZSA/IG5vZGUubG9jYXRpb24gOiB0aGlzLmxvY2F0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGNhbm9uaWNhbCBwcm90b3R5cGVzLCBkZWZpbml0aW9ucywgYW5kIHRoZSBjbGVhbnVwLW93bmluZyBtYWluLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvZ3JhbShtb2R1bGUpIHtcbiAgICB0aGlzLnN5bnRoZXRpYygnLyogc2VtYW50aWZvbGQ6cHJvZ3JhbTpjOnYxICovXFxuI2luY2x1ZGUgXCJzZW1hbnRpZm9sZF9ydW50aW1lLmhcIlxcblxcbicsIG1vZHVsZSwgXCJcIilcbiAgICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IGAke2VtaXRTY2FsYXJUeXBlKFwiY1wiLCBwYXJhbWV0ZXIudHlwZSl9ICR7cGFyYW1ldGVyLm5hbWV9YCkuam9pbihcIiwgXCIpXG5cbiAgICAgIHRoaXMuc3ludGhldGljKGBzdGF0aWMgJHtlbWl0U2NhbGFyVHlwZShcImNcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSl9ICR7ZGVjbGFyYXRpb24ubmFtZX0oJHtwYXJhbWV0ZXJzfSk7XFxuYCwgZGVjbGFyYXRpb24sIGAvZnVuY3Rpb25zLyR7aW5kZXh9YClcbiAgICB9KVxuICAgIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG5cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuc3RhdGljIFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY1wiLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlKSwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgYCR7cGF0aH0vcmV0dXJuVHlwZWAsIFwidHlwZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24sIHBhdGgsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIoXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJJbmRleCkgdGhpcy5zeW50aGV0aWMoXCIsIFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY1wiLCBwYXJhbWV0ZXIudHlwZSksIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKHBhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgsIFwibmFtZVwiKVxuICAgICAgfSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKSB7XFxuXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB0aGlzLnN5bnRoZXRpYyhgICAgICh2b2lkKSR7cGFyYW1ldGVyLm5hbWV9O1xcbmAsIHBhcmFtZXRlciwgYCR7cGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWApKVxuICAgICAgdGhpcy5ibG9jayhkZWNsYXJhdGlvbi5ib2R5LCBgJHtwYXRofS9ib2R5YCwgXCIgICAgXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIn1cXG5cIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgfSlcbiAgICB0aGlzLnN5bnRoZXRpYyhcIlxcbmludCBtYWluKHZvaWQpIHtcXG5cIiwgbW9kdWxlLmVudHJ5UG9pbnQsIFwiL2VudHJ5UG9pbnRcIilcbiAgICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBpbmRleCkgPT4gdGhpcy5zeW50aGV0aWMoYCAgICAodm9pZCkke2RlY2xhcmF0aW9uLm5hbWV9O1xcbmAsIGRlY2xhcmF0aW9uLCBgL2Z1bmN0aW9ucy8ke2luZGV4fWApKVxuICAgIHRoaXMuYmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCIvZW50cnlQb2ludC9ib2R5XCIsIFwiICAgIFwiKVxuICAgIHRoaXMuc3ludGhldGljKFwiICAgIHNlbWFudGlmb2xkX2NsZWFudXAoKTtcXG4gICAgcmV0dXJuIDA7XFxufVxcblwiLCBtb2R1bGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHN0YXRlbWVudHMgaW4gc2VtYW50aWMgc291cmNlIG9yZGVyLlxuICAgKiBAcGFyYW0ge0Jsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYmxvY2soYmxvY2ssIHBhdGgsIGluZGVudCkge1xuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4gdGhpcy5zdGF0ZW1lbnQoc3RhdGVtZW50LCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCwgaW5kZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgcGFpcmVkIHJlZ2lvbiB3aXRoIGEgcHVyZSBmaW5hbCBjb25zdW1lci5cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudCAtIE9yaWdpbmFsIHN0YXRlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRlbWVudChzdGF0ZW1lbnQsIHBhdGgsIGluZGVudCkge1xuICAgIGNvbnN0IHBsYW4gPSB0aGlzLnBsYW5zLmdldChwYXRoKVxuXG4gICAgaWYgKCFwbGFuKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHZhbGlkYXRlZCBDIHN0YXRlbWVudCBwbGFuLlwiKVxuICAgIGNvbnN0IG1hcmtlciA9IGBzZW1hbnRpZm9sZDpvcmRlcmVkLWV4cHJlc3Npb246Yzp2MWBcbiAgICBjb25zdCBzaWduYXR1cmUgPSBzdGF0ZW1lbnRTaWduYXR1cmUoc3RhdGVtZW50KVxuXG4gICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fS8qICR7bWFya2VyfSBiZWdpbiAke3BsYW4uaWR9ICR7c2lnbmF0dXJlfSAqL1xcbmAsIHN0YXRlbWVudCwgcGF0aClcbiAgICB0aGlzLnN0ZXBzKHBsYW4uc3RlcHMsIGluZGVudClcbiAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQsIHN0YXRlbWVudCwgcGF0aClcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGlmICghc3RhdGVtZW50Lm11dGFibGUpIHRoaXMuc3ludGhldGljKFwiY29uc3QgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY1wiLCBzdGF0ZW1lbnQudHlwZSksIHN0YXRlbWVudC50eXBlLCBgJHtwYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoc3RhdGVtZW50Lm5hbWUsIHN0YXRlbWVudCwgcGF0aCwgXCJuYW1lXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCI9XCIsIHN0YXRlbWVudCwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHN0YXRlbWVudC50YXJnZXQsIGAke3BhdGh9L3RhcmdldGAsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKFwiPVwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB0aGlzLm1hcHBlZChcInJldHVybiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgdGhpcy5tYXBwZWQoYHNlbWFudGlmb2xkX3ByaW50XyR7cGxhbi52YWx1ZS50eXBlfShgLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgZWxzZSB0aGlzLm1hcHBlZChcImlmIChcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIHRoaXMudmFsdWUocGxhbi52YWx1ZSlcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikge1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtwYXRofS9jb25zZXF1ZW50YCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fX1gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICB0aGlzLm1hcHBlZChcIiBlbHNlIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwie1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9fWAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7c3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiID8gXCIpXCIgOiBcIlwifTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHRoaXMuc3ludGhldGljKGAke2luZGVudH0odm9pZCkke3N0YXRlbWVudC5uYW1lfTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfVxuICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0vKiAke21hcmtlcn0gZW5kICR7cGxhbi5pZH0gJHtzaWduYXR1cmV9ICovXFxuYCwgc3RhdGVtZW50LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGVhY2ggZWFnZXIgc3RlcCBvciBjb25kaXRpb25hbCBSSFMgYXQgaXRzIHBsYW5uZWQgbG9jYXRpb24uXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXBbXX0gc3RlcHMgLSBPcmRlcmVkIHByaXZhdGUgc3RlcHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0ZXBzKHN0ZXBzLCBpbmRlbnQpIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICAgIGNvbnN0IHtyZXN1bHQsIG9wZXJhbmRzLCByaWdodFN0ZXBzfSA9IHN0ZXBcbiAgICAgIGNvbnN0IHtleHByZXNzaW9uLCBwYXRoLCBuYW1lfSA9IHJlc3VsdFxuICAgICAgY29uc3QgdHlwZSA9IGVtaXRTY2FsYXJUeXBlKFwiY1wiLCB7a2luZDogXCJUeXBlUmVmZXJlbmNlXCIsIG5hbWU6IHJlc3VsdC50eXBlfSlcblxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fSR7dHlwZX0gJHtuYW1lfSA9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBpZiAocmlnaHRTdGVwcykge1xuICAgICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzBdKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgO1xcbiR7aW5kZW50fWlmIChgLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmRpdGlvbmFsIEMgcGxhbi5cIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoYCR7ZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJCb29sZWFuT3JcIiA/IFwiIVwiIDogXCJcIn0ke25hbWV9KSB7XFxuYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5zdGVwcyhyaWdodFN0ZXBzLCBgJHtpbmRlbnR9ICAgIGApXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0gICAgJHtuYW1lfSA9ICgke25hbWV9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGV4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk9yXCIgPyBcInx8XCIgOiBcIiYmXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMV0pXG4gICAgICAgIHRoaXMuc3ludGhldGljKGApO1xcbiR7aW5kZW50fX1cXG5gLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24oc3RlcClcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI7XFxuXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBub250cml2aWFsIG9wZXJhdGlvbiB3aXRoIHB1cmUgb3BlcmFuZHMuXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXB9IHN0ZXAgLSBFYWdlciBzdGVwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9wZXJhdGlvbih7cmVzdWx0OiB7ZXhwcmVzc2lvbiwgcGF0aH0sIG9wZXJhbmRzfSkge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLmNhbGxlZSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJjYWxsZWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgb3BlcmFuZHMuZm9yRWFjaCgob3BlcmFuZCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4KSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZClcbiAgICAgIH0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkludGVnZXJOZWdhdGVcIiA/IFwic2VtYW50aWZvbGRfaW50ZWdlcl9uZWdhdGVcIiA6IFwiIVwiLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgdG9rZW4gPSBiaW5hcnlUb2tlbnMuZ2V0KGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBvcGVyYXRpb24gcGFzc2VkIEMgcGxhbm5pbmcuXCIpXG4gICAgICBjb25zdCBoZWxwZXIgPSB0b2tlbi5zdGFydHNXaXRoKFwic2VtYW50aWZvbGRfXCIpXG5cbiAgICAgIGlmIChoZWxwZXIpIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICBpZiAoaGVscGVyKSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1sxXSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKVwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJQdXJlIGV4cHJlc3Npb24gd2FzIHNjaGVkdWxlZCBhcyBhIEMgb3BlcmF0aW9uLlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgcHVyZSBvcGVyYW5kIHdpdGggb3JpZ2luYWwgdG9rZW4gcHJvdmVuYW5jZSBvciBhIHN5bnRoZXRpYyB0ZW1wb3JhcnkgdXNlLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRWYWx1ZX0gdmFsdWUgLSBQbGFubmVkIHB1cmUgb3BlcmFuZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB2YWx1ZSh7ZXhwcmVzc2lvbiwgcGF0aCwgbmFtZX0pIHtcbiAgICBpZiAobmFtZSkgcmV0dXJuIHRoaXMuc3ludGhldGljKG5hbWUsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJldHVybiB0aGlzLm1hcHBlZChleHByZXNzaW9uLm5hbWUsIGV4cHJlc3Npb24sIHBhdGgsIFwibmFtZVwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gdGhpcy5tYXBwZWQoU3RyaW5nKGV4cHJlc3Npb24udmFsdWUpLCBleHByZXNzaW9uLCBwYXRoLCBcImxpdGVyYWxcIilcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikgcmV0dXJuIHRoaXMubWFwcGVkKGBJTlQ2NF9DKCR7ZXhwcmVzc2lvbi52YWx1ZX0pYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZXhwcmVzc2lvbi52YWx1ZSlcbiAgICAgIGNvbnN0IGxpdGVyYWwgPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYFxcXFwke2J5dGUudG9TdHJpbmcoOCkucGFkU3RhcnQoMywgXCIwXCIpfWApLmpvaW4oXCJcIilcblxuICAgICAgcmV0dXJuIHRoaXMubWFwcGVkKGBTRU1BTlRJRk9MRF9TVFJJTkcoXCIke2xpdGVyYWx9XCIpYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuc2VxdWVuY2VkIGV4cHJlc3Npb24gcGFzc2VkIEMgcGxhbm5pbmcuXCIpXG4gIH1cbn1cbiJdfQ==
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9jLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUM3RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQzFELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFeEMsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSxvRUFBb0U7QUFDcEUsNERBQTREO0FBQzVELDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsZ0hBQWdIO0FBRWhILE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLENBQUMsWUFBWSxFQUFFLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSw4QkFBOEIsQ0FBQztJQUM5RixDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsMkJBQTJCLENBQUM7SUFDbEcsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLDhCQUE4QixDQUFDO0lBQy9GLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFF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QUFJLGdCQUFnQjtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLFVBQVUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3hILElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFOUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixPQUFPLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3JGLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDOUQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2ZpbmFsaXplTWFwcGluZywgdG9Tb3VyY2VNYXBWM30gZnJvbSBcIi4uL21hcHBpbmcuanNcIlxuaW1wb3J0IHtzdGF0ZW1lbnRTaWduYXR1cmUsIHBsYW5OYXRpdmVNb2R1bGV9IGZyb20gXCIuL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIlxuaW1wb3J0IHtjUnVudGltZUhlYWRlcn0gZnJvbSBcIi4vYy1ydW50aW1lLmpzXCJcbmltcG9ydCB7bWF4aW11bUNTb3VyY2VMZW5ndGgsIHZhbGlkYXRlQ01lbW9yeX0gZnJvbSBcIi4vYy12YWxpZGF0aW9uLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVOYXRpdmVHcmFwaH0gZnJvbSBcIi4vbmF0aXZlLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtlbWl0U2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7U291cmNlV3JpdGVyfSBmcm9tIFwiLi93cml0ZXIuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpY01vZHVsZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gQmxvY2sgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9vcmRlcmVkLWV4cHJlc3Npb25zLmpzXCIpLlBsYW5uZWRWYWx1ZX0gUGxhbm5lZFZhbHVlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vb3JkZXJlZC1leHByZXNzaW9ucy5qc1wiKS5QbGFubmVkU3RlcH0gUGxhbm5lZFN0ZXAgKi9cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIHN0ZXBzOiBQbGFubmVkU3RlcFtdLCB2YWx1ZT86IFBsYW5uZWRWYWx1ZSwgdGVybWluYWw/OiBQbGFubmVkU3RlcH19IFN0YXRlbWVudFBsYW4gKi9cblxuY29uc3QgYmluYXJ5VG9rZW5zID0gbmV3IE1hcChbXG4gIFtcIkludGVnZXJBZGRcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX2FkZFwiXSwgW1wiSW50ZWdlclN1YnRyYWN0XCIsIFwic2VtYW50aWZvbGRfaW50ZWdlcl9zdWJ0cmFjdFwiXSxcbiAgW1wiSW50ZWdlck11bHRpcGx5XCIsIFwic2VtYW50aWZvbGRfaW50ZWdlcl9tdWx0aXBseVwiXSwgW1wiU3RyaW5nQ29uY2F0XCIsIFwic2VtYW50aWZvbGRfc3RyaW5nX2NvbmNhdFwiXSxcbiAgW1wiU3RyaW5nRXF1YWxcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfZXF1YWxcIl0sIFtcIlN0cmluZ05vdEVxdWFsXCIsIFwic2VtYW50aWZvbGRfc3RyaW5nX25vdF9lcXVhbFwiXSxcbiAgW1wiSW50ZWdlckVxdWFsXCIsIFwiPT1cIl0sIFtcIkludGVnZXJOb3RFcXVhbFwiLCBcIiE9XCJdLCBbXCJCb29sZWFuRXF1YWxcIiwgXCI9PVwiXSwgW1wiQm9vbGVhbk5vdEVxdWFsXCIsIFwiIT1cIl0sXG4gIFtcIkludGVnZXJMZXNzVGhhblwiLCBcIjxcIl0sIFtcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiwgXCI8PVwiXSxcbiAgW1wiSW50ZWdlckdyZWF0ZXJUaGFuXCIsIFwiPlwiXSwgW1wiSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbFwiLCBcIj49XCJdXG5dKVxuXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVsbHkgdmFsaWRhdGVkLCBkZXRlcm1pbmlzdGljIEMxNyB0cmFuc2xhdGlvbiB1bml0IGFuZCBvd25lZCBzdXBwb3J0IGhlYWRlci5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lPzogc3RyaW5nLCBtYXBEaXJlY3RpdmU/OiB1bmtub3duLCBtb2R1bGU6IFNlbWFudGljTW9kdWxlLCBzb3VyY2VNYXBGaWxlbmFtZT86IHVua25vd24sIHNvdXJjZXM/OiB7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119fSBpbnB1dCAtIEJhY2tlbmQgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHt7YXJ0aWZhY3RzOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTZXRBcnRpZmFjdFtdLCB0YXJnZXQ6IHN0cmluZ319IENvbXBsZXRlIGNhbmRpZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ1Byb2dyYW0oe2ZpbGVuYW1lLCBtYXBEaXJlY3RpdmUsIG1vZHVsZSwgc291cmNlTWFwRmlsZW5hbWUsIHNvdXJjZXN9KSB7XG4gIHZhbGlkYXRlTmF0aXZlR3JhcGgobW9kdWxlKVxuICB2YWxpZGF0ZUJhY2tlbmRNb2R1bGUobW9kdWxlLCBcImNcIilcbiAgdmFsaWRhdGVDTWVtb3J5KG1vZHVsZSlcbiAgaWYgKGZpbGVuYW1lICE9PSB1bmRlZmluZWQgJiYgZmlsZW5hbWUgIT0gXCJwcm9ncmFtLmNcIikgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiY1wiLCBcImFydGlmYWN0IGZpbGVuYW1lIG90aGVyIHRoYW4gcHJvZ3JhbS5jXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgaWYgKG1hcERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkIHx8IHNvdXJjZU1hcEZpbGVuYW1lICE9PSB1bmRlZmluZWQpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShcImNcIiwgXCJzb3VyY2UtbWFwIGZpbGVuYW1lIG9yIGRpcmVjdGl2ZSBvcHRpb25cIiwgbW9kdWxlLmxvY2F0aW9uKVxuICBjb25zdCBwbGFucyA9IHBsYW5OYXRpdmVNb2R1bGUobW9kdWxlKVxuXG4gIG5ldyBDRW1pdHRlcih1bmRlZmluZWQsIHBsYW5zLCBtb2R1bGUubG9jYXRpb24pLnByb2dyYW0obW9kdWxlKVxuICBjb25zdCB3cml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKHtmaWxlbmFtZTogXCJwcm9ncmFtLmNcIiwgbGFuZ3VhZ2U6IFwiY1wiLCBtb2R1bGUsIHNvdXJjZXN9KVxuICBjb25zdCBlbWl0dGVyID0gbmV3IENFbWl0dGVyKHdyaXRlciwgcGxhbnMsIG1vZHVsZS5sb2NhdGlvbilcblxuICBlbWl0dGVyLnByb2dyYW0obW9kdWxlKVxuICBjb25zdCBtYXBwaW5nID0gZmluYWxpemVNYXBwaW5nKHdyaXRlci5maW5pc2goKSlcbiAgY29uc3Qgcm9vdCA9IG1hcHBpbmcubm9kZXMuZmluZCgoe3BhdGh9KSA9PiBwYXRoID09IFwiXCIpXG5cbiAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0ZWQgQyBtb2R1bGUgb21pdHRlZCBpdHMgcm9vdCBwcm92ZW5hbmNlLlwiKVxuICBjb25zdCByZWxhdGVkT3JpZ2lucyA9IHJvb3Qub3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIlxuICAgID8gW3tsb2NhdGlvbjogcm9vdC5vcmlnaW4ubG9jYXRpb24sIG5vZGVJZDogcm9vdC5pZCwgcm9sZTogXCJtb2R1bGVcIiwgc291cmNlSWQ6IHJvb3Qub3JpZ2luLnNvdXJjZUlkfV1cbiAgICA6IChyb290Lm9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiID8gcm9vdC5vcmlnaW4ub3JpZ2lucyA6IHJvb3Qub3JpZ2luLnJlbGF0ZWRPcmlnaW5zKS5tYXAoKG9yaWdpbikgPT5cbiAgICAgICh7Li4ub3JpZ2luLCBub2RlSWQ6IG9yaWdpbi5ub2RlSWQgPz8gcm9vdC5pZCwgcm9sZTogb3JpZ2luLnJvbGUgPz8gXCJtb2R1bGVcIn0pKVxuXG4gIHJldHVybiB7dGFyZ2V0OiBcImNcIiwgYXJ0aWZhY3RzOiBbe1xuICAgIGNvbnRlbnQ6IG1hcHBpbmcuZ2VuZXJhdGVkLmNvbnRlbnQsIGNvbnRlbnRLaW5kOiBcInRleHRcIiwgbWVkaWFUeXBlOiBcInRleHQveC1jXCIsIG93bmVyc2hpcDogXCJnZW5lcmF0ZWRcIiwgcGF0aDogXCJwcm9ncmFtLmNcIixcbiAgICBwcm92ZW5hbmNlOiB7a2luZDogXCJ0ZXh0XCIsIG1hcHBpbmcsIHNvdXJjZU1hcDogdG9Tb3VyY2VNYXBWMyhtYXBwaW5nKX0sIHJvbGU6IFwiZW50cnlcIlxuICB9LCB7XG4gICAgY29udGVudDogY1J1bnRpbWVIZWFkZXIsIGNvbnRlbnRLaW5kOiBcInRleHRcIiwgbWVkaWFUeXBlOiBcInRleHQveC1jXCIsIG93bmVyc2hpcDogXCJnZW5lcmF0ZWRcIiwgcGF0aDogXCJzZW1hbnRpZm9sZF9ydW50aW1lLmhcIixcbiAgICBwcm92ZW5hbmNlOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uOiBcIkNhbm9uaWNhbCBDMTcgc2NhbGFyIGhlbHBlcnMgYW5kIG1vZHVsZS1saWZldGltZSBpbW11dGFibGUgVVRGLTggYXJlbmEuXCIsIHJlbGF0ZWRPcmlnaW5zfSwgcm9sZTogXCJzdXBwb3J0XCJcbiAgfV19XG59XG5cbi8qKiBXcml0ZXMgb25seSB0YXJnZXQgc3ludGF4IGZyb20gdmFsaWRhdGVkIHNlbWFudGljIG9jY3VycmVuY2VzIGFuZCBwcml2YXRlIHBsYW5zLiAqL1xuY2xhc3MgQ0VtaXR0ZXIge1xuICAvKipcbiAgICogQmluZHMgdGhlIHdyaXRlciBhbmQgY29tcGxldGUgcGxhbi5cbiAgICogQHBhcmFtIHtTb3VyY2VXcml0ZXIgfCB1bmRlZmluZWR9IHdyaXRlciAtIFByb3ZlbmFuY2Ugd3JpdGVyOyBvbWl0dGVkIGZvciBleGFjdCBzaXplIHByZWZsaWdodC5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTdGF0ZW1lbnRQbGFuPn0gcGxhbnMgLSBWYWxpZGF0ZWQgb2NjdXJyZW5jZSBwbGFucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSb290IGRpYWdub3N0aWMgbG9jYXRpb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih3cml0ZXIsIHBsYW5zLCBsb2NhdGlvbikge1xuICAgIHRoaXMud3JpdGVyID0gd3JpdGVyXG4gICAgdGhpcy5wbGFucyA9IHBsYW5zXG4gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGdlbmVyYXRlZCBzY2FmZm9sZCB3aXRoIGEgcmVsYXRlZCBzZW1hbnRpYyBvcmlnaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gQyBzeW50YXguXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gUmVsYXRlZCBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzeW50aGV0aWModGV4dCwgbm9kZSwgcGF0aCkge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/LnN5bnRoZXRpYyh0ZXh0LCBcIkMxNyBvcmRlcmVkLWV4cHJlc3Npb24gYW5kIGxpZmV0aW1lIHNjYWZmb2xkXCIsIFtub2RlXSwgW3BhdGhdKVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhbiBvcmlnaW5hbCBzZW1hbnRpYyB0b2tlbiBvciBhbmNob3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGFyZ2V0IHRva2VuLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTm9kZX0gbm9kZSAtIE9yaWdpbmFsIG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gT2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JvbGVdIC0gUGFyc2VyIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgbWFwcGVkKHRleHQsIG5vZGUsIHBhdGgsIHJvbGUpIHtcbiAgICB0aGlzLmNoZWNrU2l6ZSh0ZXh0LCBub2RlKVxuICAgIHRoaXMud3JpdGVyPy5tYXBwZWQodGV4dCwge21hcHBpbmdLaW5kOiByb2xlID8gXCJleGFjdFwiIDogXCJhbmNob3JcIiwgbm9kZSwgcGF0aCwgLi4uKHJvbGUgPyB7cm9sZX0gOiB7fSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJvdW5kcyBwcml2YXRlIGVtaXNzaW9uIGJlZm9yZSBhbnkgYXJ0aWZhY3QgY2FuIGVzY2FwZSB0aGUgcGFyc2VyJ3MgcHJvdmVuIGlucHV0IHByb2ZpbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gTmV4dCBleGFjdCBvdXRwdXQgY2h1bmsuXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gUmVsYXRlZCBzZW1hbnRpYyBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNoZWNrU2l6ZSh0ZXh0LCBub2RlKSB7XG4gICAgdGhpcy5sZW5ndGggKz0gdGV4dC5sZW5ndGhcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXhpbXVtQ1NvdXJjZUxlbmd0aCkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiY1wiLCBcImdlbmVyYXRlZCBwcm9ncmFtIGV4Y2VlZHMgdGhlIGZyb3plbiBDIHBhcnNlcidzIDMyNzY3IFVURi0xNiBpbnB1dCBsaW1pdFwiLFxuICAgICAgXCJsb2NhdGlvblwiIGluIG5vZGUgPyBub2RlLmxvY2F0aW9uIDogdGhpcy5sb2NhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBjYW5vbmljYWwgcHJvdG90eXBlcywgZGVmaW5pdGlvbnMsIGFuZCB0aGUgY2xlYW51cC1vd25pbmcgbWFpbi5cbiAgICogQHBhcmFtIHtTZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHByb2dyYW0obW9kdWxlKSB7XG4gICAgdGhpcy5zeW50aGV0aWMoJy8qIHNlbWFudGlmb2xkOnByb2dyYW06Yzp2MSAqL1xcbiNpbmNsdWRlIFwic2VtYW50aWZvbGRfcnVudGltZS5oXCJcXG5cXG4nLCBtb2R1bGUsIFwiXCIpXG4gICAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBgJHtlbWl0U2NhbGFyVHlwZShcImNcIiwgcGFyYW1ldGVyLnR5cGUpfSAke3BhcmFtZXRlci5uYW1lfWApLmpvaW4oXCIsIFwiKVxuXG4gICAgICB0aGlzLnN5bnRoZXRpYyhgc3RhdGljICR7ZW1pdFNjYWxhclR5cGUoXCJjXCIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUpfSAke2RlY2xhcmF0aW9uLm5hbWV9KCR7ZGVjbGFyYXRpb24ucGFyYW1ldGVycy5sZW5ndGggPyBwYXJhbWV0ZXJzIDogXCJ2b2lkXCJ9KTtcXG5gLCBkZWNsYXJhdGlvbiwgYC9mdW5jdGlvbnMvJHtpbmRleH1gKVxuICAgIH0pXG4gICAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL2Z1bmN0aW9ucy8ke2luZGV4fWBcblxuICAgICAgdGhpcy5zeW50aGV0aWMoXCJcXG5zdGF0aWMgXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJjXCIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUpLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLCBgJHtwYXRofS9yZXR1cm5UeXBlYCwgXCJ0eXBlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbiwgcGF0aCwgXCJuYW1lXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICBpZiAoIWRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoKSB0aGlzLnN5bnRoZXRpYyhcInZvaWRcIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAke3BhdGh9L3BhcmFtZXRlcnMvJHtwYXJhbWV0ZXJJbmRleH1gXG5cbiAgICAgICAgaWYgKHBhcmFtZXRlckluZGV4KSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIHBhcmFtZXRlciwgcGFyYW1ldGVyUGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJjXCIsIHBhcmFtZXRlci50eXBlKSwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcInR5cGVcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHBhcmFtZXRlciwgcGFyYW1ldGVyUGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQocGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlciwgcGFyYW1ldGVyUGF0aCwgXCJuYW1lXCIpXG4gICAgICB9KVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpIHtcXG5cIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgcGFyYW1ldGVySW5kZXgpID0+IHRoaXMuc3ludGhldGljKGAgICAgKHZvaWQpJHtwYXJhbWV0ZXIubmFtZX07XFxuYCwgcGFyYW1ldGVyLCBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YCkpXG4gICAgICB0aGlzLmJsb2NrKGRlY2xhcmF0aW9uLmJvZHksIGAke3BhdGh9L2JvZHlgLCBcIiAgICBcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwifVxcblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICB9KVxuICAgIHRoaXMuc3ludGhldGljKFwiXFxuaW50IG1haW4odm9pZCkge1xcblwiLCBtb2R1bGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiKVxuICAgIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB0aGlzLnN5bnRoZXRpYyhgICAgICh2b2lkKSR7ZGVjbGFyYXRpb24ubmFtZX07XFxuYCwgZGVjbGFyYXRpb24sIGAvZnVuY3Rpb25zLyR7aW5kZXh9YCkpXG4gICAgdGhpcy5ibG9jayhtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIi9lbnRyeVBvaW50L2JvZHlcIiwgXCIgICAgXCIpXG4gICAgdGhpcy5zeW50aGV0aWMoXCIgICAgc2VtYW50aWZvbGRfY2xlYW51cCgpO1xcbiAgICByZXR1cm4gMDtcXG59XFxuXCIsIG1vZHVsZS5lbnRyeVBvaW50LCBcIi9lbnRyeVBvaW50XCIpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc3RhdGVtZW50cyBpbiBzZW1hbnRpYyBzb3VyY2Ugb3JkZXIuXG4gICAqIEBwYXJhbSB7QmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gT2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gQ3VycmVudCBpbmRlbnRhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBibG9jayhibG9jaywgcGF0aCwgaW5kZW50KSB7XG4gICAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQsIGluZGV4KSA9PiB0aGlzLnN0YXRlbWVudChzdGF0ZW1lbnQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gLCBpbmRlbnQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBwYWlyZWQgcmVnaW9uIHdpdGggYSBwdXJlIGZpbmFsIGNvbnN1bWVyLlxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50IC0gT3JpZ2luYWwgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGVtZW50KHN0YXRlbWVudCwgcGF0aCwgaW5kZW50KSB7XG4gICAgY29uc3QgcGxhbiA9IHRoaXMucGxhbnMuZ2V0KHBhdGgpXG5cbiAgICBpZiAoIXBsYW4pIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdmFsaWRhdGVkIEMgc3RhdGVtZW50IHBsYW4uXCIpXG4gICAgY29uc3QgbWFya2VyID0gYHNlbWFudGlmb2xkOm9yZGVyZWQtZXhwcmVzc2lvbjpjOnYxYFxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHN0YXRlbWVudFNpZ25hdHVyZShzdGF0ZW1lbnQpXG5cbiAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9LyogJHttYXJrZXJ9IGJlZ2luICR7cGxhbi5pZH0gJHtzaWduYXR1cmV9ICovXFxuYCwgc3RhdGVtZW50LCBwYXRoKVxuICAgIHRoaXMuc3RlcHMocGxhbi5zdGVwcywgaW5kZW50KVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiICYmICFzdGF0ZW1lbnQuZXhwcmVzc2lvbikge1xuICAgICAgdGhpcy5zeW50aGV0aWMoaW5kZW50LCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChcInJldHVyblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIjtcXG5cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fS8qICR7bWFya2VyfSBlbmQgJHtwbGFuLmlkfSAke3NpZ25hdHVyZX0gKi9cXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIXBsYW4udGVybWluYWwpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdmFsaWRhdGVkIEMgdGVybWluYWwgY2FsbC5cIilcbiAgICAgIHRoaXMuc3ludGhldGljKGluZGVudCwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5vcGVyYXRpb24ocGxhbi50ZXJtaW5hbClcbiAgICAgIHRoaXMuc3ludGhldGljKFwiO1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9LyogJHttYXJrZXJ9IGVuZCAke3BsYW4uaWR9ICR7c2lnbmF0dXJlfSAqL1xcbmAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQsIHN0YXRlbWVudCwgcGF0aClcbiAgICBjb25zdCB2YWx1ZSA9IHBsYW4udmFsdWVcblxuICAgIGlmICghdmFsdWUpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdmFsaWRhdGVkIEMgc3RhdGVtZW50IHZhbHVlIHBsYW4uXCIpXG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudC5tdXRhYmxlKSB0aGlzLnN5bnRoZXRpYyhcImNvbnN0IFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcImNcIiwgc3RhdGVtZW50LnR5cGUpLCBzdGF0ZW1lbnQudHlwZSwgYCR7cGF0aH0vdHlwZWAsIFwidHlwZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQsIHBhdGgsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKFwiPVwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgdGhpcy5tYXBwZWQoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBzdGF0ZW1lbnQudGFyZ2V0LCBgJHtwYXRofS90YXJnZXRgLCBcIm5hbWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChcIj1cIiwgc3RhdGVtZW50LCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikgdGhpcy5tYXBwZWQoXCJyZXR1cm4gXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHRoaXMubWFwcGVkKGBzZW1hbnRpZm9sZF9wcmludF8ke3ZhbHVlLnR5cGV9KGAsIHN0YXRlbWVudCwgcGF0aClcbiAgICBlbHNlIHRoaXMubWFwcGVkKFwiaWYgKFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgdGhpcy52YWx1ZSh2YWx1ZSlcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikge1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtwYXRofS9jb25zZXF1ZW50YCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fX1gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICB0aGlzLm1hcHBlZChcIiBlbHNlIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwie1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9fWAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7c3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiID8gXCIpXCIgOiBcIlwifTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHRoaXMuc3ludGhldGljKGAke2luZGVudH0odm9pZCkke3N0YXRlbWVudC5uYW1lfTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfVxuICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0vKiAke21hcmtlcn0gZW5kICR7cGxhbi5pZH0gJHtzaWduYXR1cmV9ICovXFxuYCwgc3RhdGVtZW50LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGVhY2ggZWFnZXIgc3RlcCBvciBjb25kaXRpb25hbCBSSFMgYXQgaXRzIHBsYW5uZWQgbG9jYXRpb24uXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXBbXX0gc3RlcHMgLSBPcmRlcmVkIHByaXZhdGUgc3RlcHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0ZXBzKHN0ZXBzLCBpbmRlbnQpIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICAgIGNvbnN0IHtyZXN1bHQsIG9wZXJhbmRzLCByaWdodFN0ZXBzfSA9IHN0ZXBcbiAgICAgIGNvbnN0IHtleHByZXNzaW9uLCBwYXRoLCBuYW1lfSA9IHJlc3VsdFxuICAgICAgY29uc3QgdHlwZSA9IGVtaXRTY2FsYXJUeXBlKFwiY1wiLCB7a2luZDogXCJUeXBlUmVmZXJlbmNlXCIsIG5hbWU6IHJlc3VsdC50eXBlfSlcblxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fSR7dHlwZX0gJHtuYW1lfSA9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBpZiAocmlnaHRTdGVwcykge1xuICAgICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzBdKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgO1xcbiR7aW5kZW50fWlmIChgLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmRpdGlvbmFsIEMgcGxhbi5cIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoYCR7ZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJCb29sZWFuT3JcIiA/IFwiIVwiIDogXCJcIn0ke25hbWV9KSB7XFxuYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5zdGVwcyhyaWdodFN0ZXBzLCBgJHtpbmRlbnR9ICAgIGApXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0gICAgJHtuYW1lfSA9ICgke25hbWV9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGV4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk9yXCIgPyBcInx8XCIgOiBcIiYmXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMV0pXG4gICAgICAgIHRoaXMuc3ludGhldGljKGApO1xcbiR7aW5kZW50fX1cXG5gLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24oc3RlcClcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI7XFxuXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBub250cml2aWFsIG9wZXJhdGlvbiB3aXRoIHB1cmUgb3BlcmFuZHMuXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXB9IHN0ZXAgLSBFYWdlciBzdGVwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9wZXJhdGlvbih7cmVzdWx0OiB7ZXhwcmVzc2lvbiwgcGF0aH0sIG9wZXJhbmRzfSkge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLmNhbGxlZSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJjYWxsZWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgb3BlcmFuZHMuZm9yRWFjaCgob3BlcmFuZCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4KSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZClcbiAgICAgIH0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkludGVnZXJOZWdhdGVcIiA/IFwic2VtYW50aWZvbGRfaW50ZWdlcl9uZWdhdGVcIiA6IFwiIVwiLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgdG9rZW4gPSBiaW5hcnlUb2tlbnMuZ2V0KGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBvcGVyYXRpb24gcGFzc2VkIEMgcGxhbm5pbmcuXCIpXG4gICAgICBjb25zdCBoZWxwZXIgPSB0b2tlbi5zdGFydHNXaXRoKFwic2VtYW50aWZvbGRfXCIpXG5cbiAgICAgIGlmIChoZWxwZXIpIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICBpZiAoaGVscGVyKSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1sxXSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKVwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJQdXJlIGV4cHJlc3Npb24gd2FzIHNjaGVkdWxlZCBhcyBhIEMgb3BlcmF0aW9uLlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgcHVyZSBvcGVyYW5kIHdpdGggb3JpZ2luYWwgdG9rZW4gcHJvdmVuYW5jZSBvciBhIHN5bnRoZXRpYyB0ZW1wb3JhcnkgdXNlLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRWYWx1ZX0gdmFsdWUgLSBQbGFubmVkIHB1cmUgb3BlcmFuZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB2YWx1ZSh7ZXhwcmVzc2lvbiwgcGF0aCwgbmFtZX0pIHtcbiAgICBpZiAobmFtZSkgcmV0dXJuIHRoaXMuc3ludGhldGljKG5hbWUsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJldHVybiB0aGlzLm1hcHBlZChleHByZXNzaW9uLm5hbWUsIGV4cHJlc3Npb24sIHBhdGgsIFwibmFtZVwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gdGhpcy5tYXBwZWQoU3RyaW5nKGV4cHJlc3Npb24udmFsdWUpLCBleHByZXNzaW9uLCBwYXRoLCBcImxpdGVyYWxcIilcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikgcmV0dXJuIHRoaXMubWFwcGVkKGBJTlQ2NF9DKCR7ZXhwcmVzc2lvbi52YWx1ZX0pYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZXhwcmVzc2lvbi52YWx1ZSlcbiAgICAgIGNvbnN0IGxpdGVyYWwgPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYFxcXFwke2J5dGUudG9TdHJpbmcoOCkucGFkU3RhcnQoMywgXCIwXCIpfWApLmpvaW4oXCJcIilcblxuICAgICAgcmV0dXJuIHRoaXMubWFwcGVkKGBTRU1BTlRJRk9MRF9TVFJJTkcoXCIke2xpdGVyYWx9XCIpYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuc2VxdWVuY2VkIGV4cHJlc3Npb24gcGFzc2VkIEMgcGxhbm5pbmcuXCIpXG4gIH1cbn1cbiJdfQ==
@@ -138,6 +138,8 @@ class CppEmitter {
138
138
  const plan = this.plans.get(path);
139
139
  if (!plan)
140
140
  throw new Error("Missing validated C++ statement plan.");
141
+ if (!plan.value)
142
+ throw new Error("Missing validated C++ statement value plan.");
141
143
  const marker = `semantifold:ordered-expression:cpp:v1`;
142
144
  const signature = statementSignature(statement);
143
145
  this.synthetic(`${indent}/* ${marker} begin ${plan.id} ${signature} */\n`, statement, path);
@@ -282,4 +284,4 @@ class CppEmitter {
282
284
  throw new Error("Unsequenced expression passed C++ planning.");
283
285
  }
284
286
  }
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL2NwcC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDdEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDN0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQzdFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUV4Qyw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLG9FQUFvRTtBQUNwRSw0REFBNEQ7QUFDNUQsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSxnRkFBZ0Y7QUFFaEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDM0IsQ0FBQyxZQUFZLEVBQUUseUJBQXlCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDO0lBQzlGLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsQ0FBQztJQUNsRyxDQUFDLGFBQWEsRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsOEJBQThCLENBQUM7SUFDL0YsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQztJQUNwRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMs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QUFTLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVySSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxVQUFVLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQzlJLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEdBQUcsY0FBYyxLQUFLLEVBQUUsQ0FBQTtZQUVsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDaEgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN0QyxX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LENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFOUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixPQUFPLE1BQU0sS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDL0YsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHt1bnN1cHBvcnRlZENhcGFiaWxpdHl9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7c3RhdGVtZW50U2lnbmF0dXJlLCBwbGFuTmF0aXZlTW9kdWxlfSBmcm9tIFwiLi9vcmRlcmVkLWV4cHJlc3Npb25zLmpzXCJcbmltcG9ydCB7Y3BwUnVudGltZX0gZnJvbSBcIi4vY3BwLXJ1bnRpbWUuanNcIlxuaW1wb3J0IHttYXhpbXVtQ3BwU291cmNlTGVuZ3RoLCB2YWxpZGF0ZUNwcFZhbHVlc30gZnJvbSBcIi4vY3BwLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtlbWl0U2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5pbXBvcnQge1NvdXJjZVdyaXRlcn0gZnJvbSBcIi4vd3JpdGVyLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gU2VtYW50aWNNb2R1bGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBTZW1hbnRpY05vZGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IEJsb2NrICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vb3JkZXJlZC1leHByZXNzaW9ucy5qc1wiKS5QbGFubmVkVmFsdWV9IFBsYW5uZWRWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIikuUGxhbm5lZFN0ZXB9IFBsYW5uZWRTdGVwICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vb3JkZXJlZC1leHByZXNzaW9ucy5qc1wiKS5TdGF0ZW1lbnRQbGFufSBTdGF0ZW1lbnRQbGFuICovXG5cbmNvbnN0IGJpbmFyeVRva2VucyA9IG5ldyBNYXAoW1xuICBbXCJJbnRlZ2VyQWRkXCIsIFwic2VtYW50aWZvbGRfaW50ZWdlcl9hZGRcIl0sIFtcIkludGVnZXJTdWJ0cmFjdFwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfc3VidHJhY3RcIl0sXG4gIFtcIkludGVnZXJNdWx0aXBseVwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfbXVsdGlwbHlcIl0sIFtcIlN0cmluZ0NvbmNhdFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19jb25jYXRcIl0sXG4gIFtcIlN0cmluZ0VxdWFsXCIsIFwic2VtYW50aWZvbGRfc3RyaW5nX2VxdWFsXCJdLCBbXCJTdHJpbmdOb3RFcXVhbFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19ub3RfZXF1YWxcIl0sXG4gIFtcIkludGVnZXJFcXVhbFwiLCBcIj09XCJdLCBbXCJJbnRlZ2VyTm90RXF1YWxcIiwgXCIhPVwiXSwgW1wiQm9vbGVhbkVxdWFsXCIsIFwiPT1cIl0sIFtcIkJvb2xlYW5Ob3RFcXVhbFwiLCBcIiE9XCJdLFxuICBbXCJJbnRlZ2VyTGVzc1RoYW5cIiwgXCI8XCJdLCBbXCJJbnRlZ2VyTGVzc1RoYW5PckVxdWFsXCIsIFwiPD1cIl0sXG4gIFtcIkludGVnZXJHcmVhdGVyVGhhblwiLCBcIj5cIl0sIFtcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIiwgXCI+PVwiXVxuXSlcblxuLyoqXG4gKiBFbWl0cyB0aGUgb25lIGZ1bGx5IHZhbGlkYXRlZCBDKysyMCB0cmFuc2xhdGlvbiB1bml0IHdpdGggb3duZWQgYnktdmFsdWUgc3RyaW5ncy5cbiAqIEBwYXJhbSB7U2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNoYXJlZCB2YWxpZGF0ZWQgc2VtYW50aWNzLlxuICogQHBhcmFtIHtTb3VyY2VXcml0ZXJ9IFt3cml0ZXJdIC0gT3B0aW9uYWwgY2FsbGVyLW93bmVkIHByb3ZlbmFuY2Ugd3JpdGVyLlxuICogQHJldHVybnMge3N0cmluZ30gRGV0ZXJtaW5pc3RpYyBzb3VyY2UgZm9yIHB1YmxpYyBnZW5lcmF0aW9uIG9yIHNhbWUtbGFuZ3VhZ2UgQ1NUIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNwcChtb2R1bGUsIHdyaXRlcikge1xuICB2YWxpZGF0ZUNwcFZhbHVlcyhtb2R1bGUpXG4gIGNvbnN0IHBsYW5zID0gcGxhbk5hdGl2ZU1vZHVsZShtb2R1bGUsIFwiY3BwXCIpXG5cbiAgbmV3IENwcEVtaXR0ZXIodW5kZWZpbmVkLCBwbGFucywgbW9kdWxlLmxvY2F0aW9uKS5wcm9ncmFtKG1vZHVsZSlcbiAgY29uc3Qgb3V0cHV0ID0gd3JpdGVyID8/IG5ldyBTb3VyY2VXcml0ZXIoe2ZpbGVuYW1lOiBcInByb2dyYW0uY3BwXCIsIGxhbmd1YWdlOiBcImNwcFwiLCBtb2R1bGV9KVxuXG4gIG5ldyBDcHBFbWl0dGVyKG91dHB1dCwgcGxhbnMsIG1vZHVsZS5sb2NhdGlvbikucHJvZ3JhbShtb2R1bGUpXG4gIHJldHVybiBvdXRwdXQuZmluaXNoKCkuZ2VuZXJhdGVkLmNvbnRlbnRcbn1cblxuLyoqIFdyaXRlcyBvbmx5IHRhcmdldCBzeW50YXggZnJvbSB2YWxpZGF0ZWQgc2VtYW50aWMgb2NjdXJyZW5jZXMgYW5kIHByaXZhdGUgcGxhbnMuICovXG5jbGFzcyBDcHBFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEJpbmRzIHRoZSB3cml0ZXIgYW5kIGNvbXBsZXRlIHBsYW4uXG4gICAqIEBwYXJhbSB7U291cmNlV3JpdGVyIHwgdW5kZWZpbmVkfSB3cml0ZXIgLSBQcm92ZW5hbmNlIHdyaXRlcjsgb21pdHRlZCBmb3IgZXhhY3Qgc2l6ZSBwcmVmbGlnaHQuXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgU3RhdGVtZW50UGxhbj59IHBsYW5zIC0gVmFsaWRhdGVkIG9jY3VycmVuY2UgcGxhbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUm9vdCBkaWFnbm9zdGljIGxvY2F0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Iod3JpdGVyLCBwbGFucywgbG9jYXRpb24pIHtcbiAgICB0aGlzLndyaXRlciA9IHdyaXRlclxuICAgIHRoaXMucGxhbnMgPSBwbGFuc1xuICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvblxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBnZW5lcmF0ZWQgc2NhZmZvbGQgd2l0aCBhIHJlbGF0ZWQgc2VtYW50aWMgb3JpZ2luLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEMrKyBzeW50YXguXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gUmVsYXRlZCBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzeW50aGV0aWModGV4dCwgbm9kZSwgcGF0aCkge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/LnN5bnRoZXRpYyh0ZXh0LCBcIkMrKzIwIG9yZGVyZWQtZXhwcmVzc2lvbiBhbmQgbGlmZXRpbWUgc2NhZmZvbGRcIiwgW25vZGVdLCBbcGF0aF0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFuIG9yaWdpbmFsIHNlbWFudGljIHRva2VuIG9yIGFuY2hvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUYXJnZXQgdG9rZW4uXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gT3JpZ2luYWwgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcm9sZV0gLSBQYXJzZXIgdG9rZW4gcm9sZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwgbm9kZSwgcGF0aCwgcm9sZSkge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/Lm1hcHBlZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IHJvbGUgPyBcImV4YWN0XCIgOiBcImFuY2hvclwiLCBub2RlLCBwYXRoLCAuLi4ocm9sZSA/IHtyb2xlfSA6IHt9KX0pXG4gIH1cblxuICAvKipcbiAgICogQm91bmRzIHByaXZhdGUgZW1pc3Npb24gYmVmb3JlIGFueSBhcnRpZmFjdCBjYW4gZXNjYXBlIHRoZSBwYXJzZXIncyBwcm92ZW4gaW5wdXQgcHJvZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBOZXh0IGV4YWN0IG91dHB1dCBjaHVuay5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBSZWxhdGVkIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2hlY2tTaXplKHRleHQsIG5vZGUpIHtcbiAgICB0aGlzLmxlbmd0aCArPSB0ZXh0Lmxlbmd0aFxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heGltdW1DcHBTb3VyY2VMZW5ndGgpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShcImNwcFwiLCBcImdlbmVyYXRlZCBwcm9ncmFtIGV4Y2VlZHMgdGhlIGZyb3plbiBDUFAgcGFyc2VyJ3MgMzI3NjcgVVRGLTE2IGlucHV0IGxpbWl0XCIsXG4gICAgICBcImxvY2F0aW9uXCIgaW4gbm9kZSA/IG5vZGUubG9jYXRpb24gOiB0aGlzLmxvY2F0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGNhbm9uaWNhbCBwcm90b3R5cGVzLCBkZWZpbml0aW9ucywgYW5kIHRoZSBwYXJhbWV0ZXJsZXNzIG1haW4uXG4gICAqIEBwYXJhbSB7U2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcm9ncmFtKG1vZHVsZSkge1xuICAgIHRoaXMuc3ludGhldGljKFwiLyogc2VtYW50aWZvbGQ6cHJvZ3JhbTpjcHA6djEgKi9cXG5cIiArIGNwcFJ1bnRpbWUgKyBcIlxcblwiLCBtb2R1bGUsIFwiXCIpXG4gICAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBgJHtlbWl0U2NhbGFyVHlwZShcImNwcFwiLCBwYXJhbWV0ZXIudHlwZSl9ICR7cGFyYW1ldGVyLm5hbWV9YCkuam9pbihcIiwgXCIpXG5cbiAgICAgIHRoaXMuc3ludGhldGljKGAke2VtaXRTY2FsYXJUeXBlKFwiY3BwXCIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUpfSAke2RlY2xhcmF0aW9uLm5hbWV9KCR7cGFyYW1ldGVyc30pO1xcbmAsIGRlY2xhcmF0aW9uLCBgL2Z1bmN0aW9ucy8ke2luZGV4fWApXG4gICAgfSlcbiAgICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvZnVuY3Rpb25zLyR7aW5kZXh9YFxuXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIlxcblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY3BwXCIsIGRlY2xhcmF0aW9uLnJldHVyblR5cGUpLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlLCBgJHtwYXRofS9yZXR1cm5UeXBlYCwgXCJ0eXBlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbiwgcGF0aCwgXCJuYW1lXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aCA9IGAke3BhdGh9L3BhcmFtZXRlcnMvJHtwYXJhbWV0ZXJJbmRleH1gXG5cbiAgICAgICAgaWYgKHBhcmFtZXRlckluZGV4KSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIHBhcmFtZXRlciwgcGFyYW1ldGVyUGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQoZW1pdFNjYWxhclR5cGUoXCJjcHBcIiwgcGFyYW1ldGVyLnR5cGUpLCBwYXJhbWV0ZXIudHlwZSwgYCR7cGFyYW1ldGVyUGF0aH0vdHlwZWAsIFwidHlwZVwiKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoKVxuICAgICAgICB0aGlzLm1hcHBlZChwYXJhbWV0ZXIubmFtZSwgcGFyYW1ldGVyLCBwYXJhbWV0ZXJQYXRoLCBcIm5hbWVcIilcbiAgICAgIH0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikge1xcblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBwYXJhbWV0ZXJJbmRleCkgPT4gdGhpcy5zeW50aGV0aWMoYCAgICAodm9pZCkke3BhcmFtZXRlci5uYW1lfTtcXG5gLCBwYXJhbWV0ZXIsIGAke3BhdGh9L3BhcmFtZXRlcnMvJHtwYXJhbWV0ZXJJbmRleH1gKSlcbiAgICAgIHRoaXMuYmxvY2soZGVjbGFyYXRpb24uYm9keSwgYCR7cGF0aH0vYm9keWAsIFwiICAgIFwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCJ9XFxuXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgIH0pXG4gICAgdGhpcy5zeW50aGV0aWMoXCJcXG5pbnQgbWFpbigpIHtcXG5cIiwgbW9kdWxlLmVudHJ5UG9pbnQsIFwiL2VudHJ5UG9pbnRcIilcbiAgICB0aGlzLmJsb2NrKG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIFwiL2VudHJ5UG9pbnQvYm9keVwiLCBcIiAgICBcIilcbiAgICB0aGlzLnN5bnRoZXRpYyhcIiAgICByZXR1cm4gMDtcXG59XFxuXCIsIG1vZHVsZS5lbnRyeVBvaW50LCBcIi9lbnRyeVBvaW50XCIpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc3RhdGVtZW50cyBpbiBzZW1hbnRpYyBzb3VyY2Ugb3JkZXIuXG4gICAqIEBwYXJhbSB7QmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gT2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5kZW50IC0gQ3VycmVudCBpbmRlbnRhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBibG9jayhibG9jaywgcGF0aCwgaW5kZW50KSB7XG4gICAgYmxvY2suc3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQsIGluZGV4KSA9PiB0aGlzLnN0YXRlbWVudChzdGF0ZW1lbnQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gLCBpbmRlbnQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBwYWlyZWQgcmVnaW9uIHdpdGggYSBwdXJlIGZpbmFsIGNvbnN1bWVyLlxuICAgKiBAcGFyYW0ge1N0YXRlbWVudH0gc3RhdGVtZW50IC0gT3JpZ2luYWwgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGVtZW50KHN0YXRlbWVudCwgcGF0aCwgaW5kZW50KSB7XG4gICAgY29uc3QgcGxhbiA9IHRoaXMucGxhbnMuZ2V0KHBhdGgpXG5cbiAgICBpZiAoIXBsYW4pIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdmFsaWRhdGVkIEMrKyBzdGF0ZW1lbnQgcGxhbi5cIilcbiAgICBjb25zdCBtYXJrZXIgPSBgc2VtYW50aWZvbGQ6b3JkZXJlZC1leHByZXNzaW9uOmNwcDp2MWBcbiAgICBjb25zdCBzaWduYXR1cmUgPSBzdGF0ZW1lbnRTaWduYXR1cmUoc3RhdGVtZW50KVxuXG4gICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fS8qICR7bWFya2VyfSBiZWdpbiAke3BsYW4uaWR9ICR7c2lnbmF0dXJlfSAqL1xcbmAsIHN0YXRlbWVudCwgcGF0aClcbiAgICB0aGlzLnN0ZXBzKHBsYW4uc3RlcHMsIGluZGVudClcbiAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQsIHN0YXRlbWVudCwgcGF0aClcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGlmICghc3RhdGVtZW50Lm11dGFibGUpIHRoaXMuc3ludGhldGljKFwiY29uc3QgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY3BwXCIsIHN0YXRlbWVudC50eXBlKSwgc3RhdGVtZW50LnR5cGUsIGAke3BhdGh9L3R5cGVgLCBcInR5cGVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQubmFtZSwgc3RhdGVtZW50LCBwYXRoLCBcIm5hbWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChcIj1cIiwgc3RhdGVtZW50LCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgIHRoaXMubWFwcGVkKHN0YXRlbWVudC50YXJnZXQubmFtZSwgc3RhdGVtZW50LnRhcmdldCwgYCR7cGF0aH0vdGFyZ2V0YCwgXCJuYW1lXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCI9XCIsIHN0YXRlbWVudCwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHRoaXMubWFwcGVkKFwicmV0dXJuIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB0aGlzLm1hcHBlZChgc2VtYW50aWZvbGRfcHJpbnRfJHtwbGFuLnZhbHVlLnR5cGV9KGAsIHN0YXRlbWVudCwgcGF0aClcbiAgICBlbHNlIHRoaXMubWFwcGVkKFwiaWYgKFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgdGhpcy52YWx1ZShwbGFuLnZhbHVlKVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKSB7XFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCBgJHtpbmRlbnR9ICAgIGApXG4gICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9fWAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB7XG4gICAgICAgIHRoaXMubWFwcGVkKFwiIGVsc2UgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCJ7XFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgICAgdGhpcy5ibG9jayhzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBgJHtwYXRofS9hbHRlcm5hdGVgLCBgJHtpbmRlbnR9ICAgIGApXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH19YCwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgfVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCJcXG5cIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN5bnRoZXRpYyhgJHtzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIgPyBcIilcIiA6IFwiXCJ9O1xcbmAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fSh2b2lkKSR7c3RhdGVtZW50Lm5hbWV9O1xcbmAsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9XG4gICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fS8qICR7bWFya2VyfSBlbmQgJHtwbGFuLmlkfSAke3NpZ25hdHVyZX0gKi9cXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgZWFjaCBlYWdlciBzdGVwIG9yIGNvbmRpdGlvbmFsIFJIUyBhdCBpdHMgcGxhbm5lZCBsb2NhdGlvbi5cbiAgICogQHBhcmFtIHtQbGFubmVkU3RlcFtdfSBzdGVwcyAtIE9yZGVyZWQgcHJpdmF0ZSBzdGVwcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RlcHMoc3RlcHMsIGluZGVudCkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgY29uc3Qge3Jlc3VsdCwgb3BlcmFuZHMsIHJpZ2h0U3RlcHN9ID0gc3RlcFxuICAgICAgY29uc3Qge2V4cHJlc3Npb24sIHBhdGgsIG5hbWV9ID0gcmVzdWx0XG4gICAgICBjb25zdCB0eXBlID0gZW1pdFNjYWxhclR5cGUoXCJjcHBcIiwge2tpbmQ6IFwiVHlwZVJlZmVyZW5jZVwiLCBuYW1lOiByZXN1bHQudHlwZX0pXG5cbiAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0ke3R5cGV9ICR7bmFtZX0gPSBgLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgaWYgKHJpZ2h0U3RlcHMpIHtcbiAgICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1swXSlcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoYDtcXG4ke2luZGVudH1pZiAoYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCAhPSBcIkJpbmFyeUV4cHJlc3Npb25cIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb25kaXRpb25hbCBDKysgcGxhbi5cIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoYCR7ZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJCb29sZWFuT3JcIiA/IFwiIVwiIDogXCJcIn0ke25hbWV9KSB7XFxuYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5zdGVwcyhyaWdodFN0ZXBzLCBgJHtpbmRlbnR9ICAgIGApXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0gICAgJHtuYW1lfSA9ICgke25hbWV9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGV4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk9yXCIgPyBcInx8XCIgOiBcIiYmXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMV0pXG4gICAgICAgIHRoaXMuc3ludGhldGljKGApO1xcbiR7aW5kZW50fX1cXG5gLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24oc3RlcClcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI7XFxuXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBub250cml2aWFsIG9wZXJhdGlvbiB3aXRoIHB1cmUgb3BlcmFuZHMuXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXB9IHN0ZXAgLSBFYWdlciBzdGVwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9wZXJhdGlvbih7cmVzdWx0OiB7ZXhwcmVzc2lvbiwgcGF0aH0sIG9wZXJhbmRzfSkge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLmNhbGxlZSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJjYWxsZWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgb3BlcmFuZHMuZm9yRWFjaCgob3BlcmFuZCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4KSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZClcbiAgICAgIH0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkludGVnZXJOZWdhdGVcIiA/IFwic2VtYW50aWZvbGRfaW50ZWdlcl9uZWdhdGVcIiA6IFwiIVwiLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgdG9rZW4gPSBiaW5hcnlUb2tlbnMuZ2V0KGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBvcGVyYXRpb24gcGFzc2VkIEMrKyBwbGFubmluZy5cIilcbiAgICAgIGNvbnN0IGhlbHBlciA9IHRva2VuLnN0YXJ0c1dpdGgoXCJzZW1hbnRpZm9sZF9cIilcblxuICAgICAgaWYgKGhlbHBlcikgdGhpcy5tYXBwZWQodG9rZW4sIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1swXSlcbiAgICAgIGlmIChoZWxwZXIpIHRoaXMuc3ludGhldGljKFwiLCBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQodG9rZW4sIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzFdKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIlB1cmUgZXhwcmVzc2lvbiB3YXMgc2NoZWR1bGVkIGFzIGEgQ1BQIG9wZXJhdGlvbi5cIilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBhIHB1cmUgb3BlcmFuZCB3aXRoIG9yaWdpbmFsIHRva2VuIHByb3ZlbmFuY2Ugb3IgYSBzeW50aGV0aWMgdGVtcG9yYXJ5IHVzZS5cbiAgICogQHBhcmFtIHtQbGFubmVkVmFsdWV9IHZhbHVlIC0gUGxhbm5lZCBwdXJlIG9wZXJhbmQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdmFsdWUoe2V4cHJlc3Npb24sIHBhdGgsIG5hbWV9KSB7XG4gICAgaWYgKG5hbWUpIHJldHVybiB0aGlzLnN5bnRoZXRpYyhuYW1lLCBleHByZXNzaW9uLCBwYXRoKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5uYW1lLCBleHByZXNzaW9uLCBwYXRoLCBcIm5hbWVcIilcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQm9vbGVhbkxpdGVyYWxcIikgcmV0dXJuIHRoaXMubWFwcGVkKFN0cmluZyhleHByZXNzaW9uLnZhbHVlKSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIpIHJldHVybiB0aGlzLm1hcHBlZChgc3RkOjppbnQ2NF90KCR7ZXhwcmVzc2lvbi52YWx1ZX0pYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZXhwcmVzc2lvbi52YWx1ZSlcbiAgICAgIGNvbnN0IGxpdGVyYWwgPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYFxcXFwke2J5dGUudG9TdHJpbmcoOCkucGFkU3RhcnQoMywgXCIwXCIpfWApLmpvaW4oXCJcIilcblxuICAgICAgcmV0dXJuIHRoaXMubWFwcGVkKGBzdGQ6OnN0cmluZyhcIiR7bGl0ZXJhbH1cIiwgJHtieXRlcy5sZW5ndGh9KWAsIGV4cHJlc3Npb24sIHBhdGgsIFwibGl0ZXJhbFwiKVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnNlcXVlbmNlZCBleHByZXNzaW9uIHBhc3NlZCBDKysgcGxhbm5pbmcuXCIpXG4gIH1cbn1cbiJdfQ==
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL2NwcC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDdEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDN0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQzdFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUV4Qyw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLG9FQUFvRTtBQUNwRSw0REFBNEQ7QUFDNUQsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSxnRkFBZ0Y7QUFFaEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDM0IsQ0FBQyxZQUFZLEVBQUUseUJBQXlCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDO0lBQzlGLENBQUMsaUJBQWlCLEVBQUUsOEJBQThCLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsQ0FBQztJQUNsRyxDQUFDLGFBQWEsRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsOEJBQThCLENBQUM7SUFDL0YsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQztJQUNwRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMs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QUFTLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVySSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxVQUFVLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQzlJLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEdBQUcsY0FBYyxLQUFLLEVBQUUsQ0FBQTtZQUVsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDaEgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN0QyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsRUFBRTtnQkFDM0QsTUFBTSxhQUFhLEdBQUcsR0FBRyxJQUFJLGVBQWUsY0FBYyxFQUFFLENBQUE7Z0JBRTVELElBQUksY0FBYztvQkFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7Z0JBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLGFBQWEsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUNuRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQy9ELENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLGVBQWUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ2xLLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMxQyxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNwRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTTtRQUN2QixLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxlQUFlLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDbEgsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU07UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUE7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sTUFBTSxHQUFHLHVDQUF1QyxDQUFBO1FBQ3RELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRS9DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLE1BQU0sTUFBTSxVQUFVLElBQUksQ0FBQyxFQUFFLElBQUksU0FBUyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdkMsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUMxRixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDcEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3RDLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUM5RSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdEMsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxpQkFBaUI7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7YUFDbEYsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQjtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBOztZQUM3RyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEIsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLGFBQWEsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLENBQUE7WUFDdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUM3QyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN0QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksWUFBWSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsQ0FBQTtnQkFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUMvQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3RGLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxrQkFBa0I7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE1BQU0sU0FBUyxTQUFTLENBQUMsSUFBSSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2xILENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxNQUFNLE1BQU0sUUFBUSxJQUFJLENBQUMsRUFBRSxJQUFJLFNBQVMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMzRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU07UUFDakIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFDM0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLEdBQUcsTUFBTSxDQUFBO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQTtZQUU5RSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDL0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sTUFBTSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUNwRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQTtnQkFDM0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ2pHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsQ0FBQTtnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxJQUFJLE9BQU8sSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUM1RixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxNQUFNLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDdEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBQyxFQUFFLFFBQVEsRUFBQztRQUM5QyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDckMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxLQUFLO29CQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNyQixDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN2QyxDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQ3ZILElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN2QyxDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDakQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFcEQsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO1lBQ3pFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFL0MsSUFBSSxNQUFNO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkIsSUFBSSxNQUFNO2dCQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDN0MsQ0FBQztnQkFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7Z0JBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7Z0JBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN2QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdkMsQ0FBQzs7WUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7SUFDN0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQztRQUM1QixJQUFJLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN2RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksc0JBQXNCO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM1RyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNsSCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixVQUFVLENBQUMsS0FBSyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUM3SCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBRTlGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsT0FBTyxNQUFNLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQy9GLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7SUFDaEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge3N0YXRlbWVudFNpZ25hdHVyZSwgcGxhbk5hdGl2ZU1vZHVsZX0gZnJvbSBcIi4vb3JkZXJlZC1leHByZXNzaW9ucy5qc1wiXG5pbXBvcnQge2NwcFJ1bnRpbWV9IGZyb20gXCIuL2NwcC1ydW50aW1lLmpzXCJcbmltcG9ydCB7bWF4aW11bUNwcFNvdXJjZUxlbmd0aCwgdmFsaWRhdGVDcHBWYWx1ZXN9IGZyb20gXCIuL2NwcC12YWxpZGF0aW9uLmpzXCJcbmltcG9ydCB7ZW1pdFNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuaW1wb3J0IHtTb3VyY2VXcml0ZXJ9IGZyb20gXCIuL3dyaXRlci5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFNlbWFudGljTW9kdWxlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZX0gU2VtYW50aWNOb2RlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlN0YXRlbWVudH0gU3RhdGVtZW50ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBCbG9jayAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIikuUGxhbm5lZFZhbHVlfSBQbGFubmVkVmFsdWUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9vcmRlcmVkLWV4cHJlc3Npb25zLmpzXCIpLlBsYW5uZWRTdGVwfSBQbGFubmVkU3RlcCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIikuU3RhdGVtZW50UGxhbn0gU3RhdGVtZW50UGxhbiAqL1xuXG5jb25zdCBiaW5hcnlUb2tlbnMgPSBuZXcgTWFwKFtcbiAgW1wiSW50ZWdlckFkZFwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfYWRkXCJdLCBbXCJJbnRlZ2VyU3VidHJhY3RcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX3N1YnRyYWN0XCJdLFxuICBbXCJJbnRlZ2VyTXVsdGlwbHlcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX211bHRpcGx5XCJdLCBbXCJTdHJpbmdDb25jYXRcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfY29uY2F0XCJdLFxuICBbXCJTdHJpbmdFcXVhbFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19lcXVhbFwiXSwgW1wiU3RyaW5nTm90RXF1YWxcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfbm90X2VxdWFsXCJdLFxuICBbXCJJbnRlZ2VyRXF1YWxcIiwgXCI9PVwiXSwgW1wiSW50ZWdlck5vdEVxdWFsXCIsIFwiIT1cIl0sIFtcIkJvb2xlYW5FcXVhbFwiLCBcIj09XCJdLCBbXCJCb29sZWFuTm90RXF1YWxcIiwgXCIhPVwiXSxcbiAgW1wiSW50ZWdlckxlc3NUaGFuXCIsIFwiPFwiXSwgW1wiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiLCBcIjw9XCJdLFxuICBbXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiwgXCI+XCJdLCBbXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIsIFwiPj1cIl1cbl0pXG5cbi8qKlxuICogRW1pdHMgdGhlIG9uZSBmdWxseSB2YWxpZGF0ZWQgQysrMjAgdHJhbnNsYXRpb24gdW5pdCB3aXRoIG93bmVkIGJ5LXZhbHVlIHN0cmluZ3MuXG4gKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTaGFyZWQgdmFsaWRhdGVkIHNlbWFudGljcy5cbiAqIEBwYXJhbSB7U291cmNlV3JpdGVyfSBbd3JpdGVyXSAtIE9wdGlvbmFsIGNhbGxlci1vd25lZCBwcm92ZW5hbmNlIHdyaXRlci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IERldGVybWluaXN0aWMgc291cmNlIGZvciBwdWJsaWMgZ2VuZXJhdGlvbiBvciBzYW1lLWxhbmd1YWdlIENTVCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDcHAobW9kdWxlLCB3cml0ZXIpIHtcbiAgdmFsaWRhdGVDcHBWYWx1ZXMobW9kdWxlKVxuICBjb25zdCBwbGFucyA9IHBsYW5OYXRpdmVNb2R1bGUobW9kdWxlLCBcImNwcFwiKVxuXG4gIG5ldyBDcHBFbWl0dGVyKHVuZGVmaW5lZCwgcGxhbnMsIG1vZHVsZS5sb2NhdGlvbikucHJvZ3JhbShtb2R1bGUpXG4gIGNvbnN0IG91dHB1dCA9IHdyaXRlciA/PyBuZXcgU291cmNlV3JpdGVyKHtmaWxlbmFtZTogXCJwcm9ncmFtLmNwcFwiLCBsYW5ndWFnZTogXCJjcHBcIiwgbW9kdWxlfSlcblxuICBuZXcgQ3BwRW1pdHRlcihvdXRwdXQsIHBsYW5zLCBtb2R1bGUubG9jYXRpb24pLnByb2dyYW0obW9kdWxlKVxuICByZXR1cm4gb3V0cHV0LmZpbmlzaCgpLmdlbmVyYXRlZC5jb250ZW50XG59XG5cbi8qKiBXcml0ZXMgb25seSB0YXJnZXQgc3ludGF4IGZyb20gdmFsaWRhdGVkIHNlbWFudGljIG9jY3VycmVuY2VzIGFuZCBwcml2YXRlIHBsYW5zLiAqL1xuY2xhc3MgQ3BwRW1pdHRlciB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgd3JpdGVyIGFuZCBjb21wbGV0ZSBwbGFuLlxuICAgKiBAcGFyYW0ge1NvdXJjZVdyaXRlciB8IHVuZGVmaW5lZH0gd3JpdGVyIC0gUHJvdmVuYW5jZSB3cml0ZXI7IG9taXR0ZWQgZm9yIGV4YWN0IHNpemUgcHJlZmxpZ2h0LlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFN0YXRlbWVudFBsYW4+fSBwbGFucyAtIFZhbGlkYXRlZCBvY2N1cnJlbmNlIHBsYW5zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJvb3QgZGlhZ25vc3RpYyBsb2NhdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHdyaXRlciwgcGxhbnMsIGxvY2F0aW9uKSB7XG4gICAgdGhpcy53cml0ZXIgPSB3cml0ZXJcbiAgICB0aGlzLnBsYW5zID0gcGxhbnNcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZ2VuZXJhdGVkIHNjYWZmb2xkIHdpdGggYSByZWxhdGVkIHNlbWFudGljIG9yaWdpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBDKysgc3ludGF4LlxuICAgKiBAcGFyYW0ge1NlbWFudGljTm9kZX0gbm9kZSAtIFJlbGF0ZWQgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3ludGhldGljKHRleHQsIG5vZGUsIHBhdGgpIHtcbiAgICB0aGlzLmNoZWNrU2l6ZSh0ZXh0LCBub2RlKVxuICAgIHRoaXMud3JpdGVyPy5zeW50aGV0aWModGV4dCwgXCJDKysyMCBvcmRlcmVkLWV4cHJlc3Npb24gYW5kIGxpZmV0aW1lIHNjYWZmb2xkXCIsIFtub2RlXSwgW3BhdGhdKVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhbiBvcmlnaW5hbCBzZW1hbnRpYyB0b2tlbiBvciBhbmNob3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGFyZ2V0IHRva2VuLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTm9kZX0gbm9kZSAtIE9yaWdpbmFsIG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gT2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JvbGVdIC0gUGFyc2VyIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgbWFwcGVkKHRleHQsIG5vZGUsIHBhdGgsIHJvbGUpIHtcbiAgICB0aGlzLmNoZWNrU2l6ZSh0ZXh0LCBub2RlKVxuICAgIHRoaXMud3JpdGVyPy5tYXBwZWQodGV4dCwge21hcHBpbmdLaW5kOiByb2xlID8gXCJleGFjdFwiIDogXCJhbmNob3JcIiwgbm9kZSwgcGF0aCwgLi4uKHJvbGUgPyB7cm9sZX0gOiB7fSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJvdW5kcyBwcml2YXRlIGVtaXNzaW9uIGJlZm9yZSBhbnkgYXJ0aWZhY3QgY2FuIGVzY2FwZSB0aGUgcGFyc2VyJ3MgcHJvdmVuIGlucHV0IHByb2ZpbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gTmV4dCBleGFjdCBvdXRwdXQgY2h1bmsuXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gUmVsYXRlZCBzZW1hbnRpYyBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNoZWNrU2l6ZSh0ZXh0LCBub2RlKSB7XG4gICAgdGhpcy5sZW5ndGggKz0gdGV4dC5sZW5ndGhcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXhpbXVtQ3BwU291cmNlTGVuZ3RoKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJjcHBcIiwgXCJnZW5lcmF0ZWQgcHJvZ3JhbSBleGNlZWRzIHRoZSBmcm96ZW4gQ1BQIHBhcnNlcidzIDMyNzY3IFVURi0xNiBpbnB1dCBsaW1pdFwiLFxuICAgICAgXCJsb2NhdGlvblwiIGluIG5vZGUgPyBub2RlLmxvY2F0aW9uIDogdGhpcy5sb2NhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBjYW5vbmljYWwgcHJvdG90eXBlcywgZGVmaW5pdGlvbnMsIGFuZCB0aGUgcGFyYW1ldGVybGVzcyBtYWluLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvZ3JhbShtb2R1bGUpIHtcbiAgICB0aGlzLnN5bnRoZXRpYyhcIi8qIHNlbWFudGlmb2xkOnByb2dyYW06Y3BwOnYxICovXFxuXCIgKyBjcHBSdW50aW1lICsgXCJcXG5cIiwgbW9kdWxlLCBcIlwiKVxuICAgIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID0gZGVjbGFyYXRpb24ucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gYCR7ZW1pdFNjYWxhclR5cGUoXCJjcHBcIiwgcGFyYW1ldGVyLnR5cGUpfSAke3BhcmFtZXRlci5uYW1lfWApLmpvaW4oXCIsIFwiKVxuXG4gICAgICB0aGlzLnN5bnRoZXRpYyhgJHtlbWl0U2NhbGFyVHlwZShcImNwcFwiLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlKX0gJHtkZWNsYXJhdGlvbi5uYW1lfSgke3BhcmFtZXRlcnN9KTtcXG5gLCBkZWNsYXJhdGlvbiwgYC9mdW5jdGlvbnMvJHtpbmRleH1gKVxuICAgIH0pXG4gICAgbW9kdWxlLmZ1bmN0aW9ucy5mb3JFYWNoKChkZWNsYXJhdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL2Z1bmN0aW9ucy8ke2luZGV4fWBcblxuICAgICAgdGhpcy5zeW50aGV0aWMoXCJcXG5cIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcImNwcFwiLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlKSwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgYCR7cGF0aH0vcmV0dXJuVHlwZWAsIFwidHlwZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24sIHBhdGgsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIoXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJJbmRleCkgdGhpcy5zeW50aGV0aWMoXCIsIFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY3BwXCIsIHBhcmFtZXRlci50eXBlKSwgcGFyYW1ldGVyLnR5cGUsIGAke3BhcmFtZXRlclBhdGh9L3R5cGVgLCBcInR5cGVcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHBhcmFtZXRlciwgcGFyYW1ldGVyUGF0aClcbiAgICAgICAgdGhpcy5tYXBwZWQocGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlciwgcGFyYW1ldGVyUGF0aCwgXCJuYW1lXCIpXG4gICAgICB9KVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpIHtcXG5cIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgICBkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlciwgcGFyYW1ldGVySW5kZXgpID0+IHRoaXMuc3ludGhldGljKGAgICAgKHZvaWQpJHtwYXJhbWV0ZXIubmFtZX07XFxuYCwgcGFyYW1ldGVyLCBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YCkpXG4gICAgICB0aGlzLmJsb2NrKGRlY2xhcmF0aW9uLmJvZHksIGAke3BhdGh9L2JvZHlgLCBcIiAgICBcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwifVxcblwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICB9KVxuICAgIHRoaXMuc3ludGhldGljKFwiXFxuaW50IG1haW4oKSB7XFxuXCIsIG1vZHVsZS5lbnRyeVBvaW50LCBcIi9lbnRyeVBvaW50XCIpXG4gICAgdGhpcy5ibG9jayhtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcIi9lbnRyeVBvaW50L2JvZHlcIiwgXCIgICAgXCIpXG4gICAgdGhpcy5zeW50aGV0aWMoXCIgICAgcmV0dXJuIDA7XFxufVxcblwiLCBtb2R1bGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHN0YXRlbWVudHMgaW4gc2VtYW50aWMgc291cmNlIG9yZGVyLlxuICAgKiBAcGFyYW0ge0Jsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYmxvY2soYmxvY2ssIHBhdGgsIGluZGVudCkge1xuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4gdGhpcy5zdGF0ZW1lbnQoc3RhdGVtZW50LCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCwgaW5kZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgcGFpcmVkIHJlZ2lvbiB3aXRoIGEgcHVyZSBmaW5hbCBjb25zdW1lci5cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudCAtIE9yaWdpbmFsIHN0YXRlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRlbWVudChzdGF0ZW1lbnQsIHBhdGgsIGluZGVudCkge1xuICAgIGNvbnN0IHBsYW4gPSB0aGlzLnBsYW5zLmdldChwYXRoKVxuXG4gICAgaWYgKCFwbGFuKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHZhbGlkYXRlZCBDKysgc3RhdGVtZW50IHBsYW4uXCIpXG4gICAgaWYgKCFwbGFuLnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHZhbGlkYXRlZCBDKysgc3RhdGVtZW50IHZhbHVlIHBsYW4uXCIpXG4gICAgY29uc3QgbWFya2VyID0gYHNlbWFudGlmb2xkOm9yZGVyZWQtZXhwcmVzc2lvbjpjcHA6djFgXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gc3RhdGVtZW50U2lnbmF0dXJlKHN0YXRlbWVudClcblxuICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0vKiAke21hcmtlcn0gYmVnaW4gJHtwbGFuLmlkfSAke3NpZ25hdHVyZX0gKi9cXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgdGhpcy5zdGVwcyhwbGFuLnN0ZXBzLCBpbmRlbnQpXG4gICAgdGhpcy5zeW50aGV0aWMoaW5kZW50LCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudC5tdXRhYmxlKSB0aGlzLnN5bnRoZXRpYyhcImNvbnN0IFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLm1hcHBlZChlbWl0U2NhbGFyVHlwZShcImNwcFwiLCBzdGF0ZW1lbnQudHlwZSksIHN0YXRlbWVudC50eXBlLCBgJHtwYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoc3RhdGVtZW50Lm5hbWUsIHN0YXRlbWVudCwgcGF0aCwgXCJuYW1lXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCI9XCIsIHN0YXRlbWVudCwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHN0YXRlbWVudC50YXJnZXQsIGAke3BhdGh9L3RhcmdldGAsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKFwiPVwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB0aGlzLm1hcHBlZChcInJldHVybiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgdGhpcy5tYXBwZWQoYHNlbWFudGlmb2xkX3ByaW50XyR7cGxhbi52YWx1ZS50eXBlfShgLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgZWxzZSB0aGlzLm1hcHBlZChcImlmIChcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIHRoaXMudmFsdWUocGxhbi52YWx1ZSlcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikge1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtwYXRofS9jb25zZXF1ZW50YCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fX1gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICB0aGlzLm1hcHBlZChcIiBlbHNlIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwie1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9fWAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7c3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiID8gXCIpXCIgOiBcIlwifTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHRoaXMuc3ludGhldGljKGAke2luZGVudH0odm9pZCkke3N0YXRlbWVudC5uYW1lfTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfVxuICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0vKiAke21hcmtlcn0gZW5kICR7cGxhbi5pZH0gJHtzaWduYXR1cmV9ICovXFxuYCwgc3RhdGVtZW50LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGVhY2ggZWFnZXIgc3RlcCBvciBjb25kaXRpb25hbCBSSFMgYXQgaXRzIHBsYW5uZWQgbG9jYXRpb24uXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXBbXX0gc3RlcHMgLSBPcmRlcmVkIHByaXZhdGUgc3RlcHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0ZXBzKHN0ZXBzLCBpbmRlbnQpIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICAgIGNvbnN0IHtyZXN1bHQsIG9wZXJhbmRzLCByaWdodFN0ZXBzfSA9IHN0ZXBcbiAgICAgIGNvbnN0IHtleHByZXNzaW9uLCBwYXRoLCBuYW1lfSA9IHJlc3VsdFxuICAgICAgY29uc3QgdHlwZSA9IGVtaXRTY2FsYXJUeXBlKFwiY3BwXCIsIHtraW5kOiBcIlR5cGVSZWZlcmVuY2VcIiwgbmFtZTogcmVzdWx0LnR5cGV9KVxuXG4gICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9JHt0eXBlfSAke25hbWV9ID0gYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIGlmIChyaWdodFN0ZXBzKSB7XG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICAgIHRoaXMuc3ludGhldGljKGA7XFxuJHtpbmRlbnR9aWYgKGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIGlmIChleHByZXNzaW9uLmtpbmQgIT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uZGl0aW9uYWwgQysrIHBsYW4uXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2V4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk9yXCIgPyBcIiFcIiA6IFwiXCJ9JHtuYW1lfSkge1xcbmAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMuc3RlcHMocmlnaHRTdGVwcywgYCR7aW5kZW50fSAgICBgKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9ICAgICR7bmFtZX0gPSAoJHtuYW1lfSBgLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5PclwiID8gXCJ8fFwiIDogXCImJlwiLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzFdKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgKTtcXG4ke2luZGVudH19XFxuYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uKHN0ZXApXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiO1xcblwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgbm9udHJpdmlhbCBvcGVyYXRpb24gd2l0aCBwdXJlIG9wZXJhbmRzLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRTdGVwfSBzdGVwIC0gRWFnZXIgc3RlcC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvcGVyYXRpb24oe3Jlc3VsdDoge2V4cHJlc3Npb24sIHBhdGh9LCBvcGVyYW5kc30pIHtcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5jYWxsZWUsIGV4cHJlc3Npb24sIHBhdGgsIFwiY2FsbGVlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIG9wZXJhbmRzLmZvckVhY2goKG9wZXJhbmQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCkgdGhpcy5zeW50aGV0aWMoXCIsIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICB0aGlzLnZhbHVlKG9wZXJhbmQpXG4gICAgICB9KVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgdGhpcy5tYXBwZWQoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJJbnRlZ2VyTmVnYXRlXCIgPyBcInNlbWFudGlmb2xkX2ludGVnZXJfbmVnYXRlXCIgOiBcIiFcIiwgZXhwcmVzc2lvbiwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIoXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzBdKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIpXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gYmluYXJ5VG9rZW5zLmdldChleHByZXNzaW9uLm9wZXJhdGlvbilcblxuICAgICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIHBhc3NlZCBDKysgcGxhbm5pbmcuXCIpXG4gICAgICBjb25zdCBoZWxwZXIgPSB0b2tlbi5zdGFydHNXaXRoKFwic2VtYW50aWZvbGRfXCIpXG5cbiAgICAgIGlmIChoZWxwZXIpIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICBpZiAoaGVscGVyKSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1sxXSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKVwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJQdXJlIGV4cHJlc3Npb24gd2FzIHNjaGVkdWxlZCBhcyBhIENQUCBvcGVyYXRpb24uXCIpXG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBwdXJlIG9wZXJhbmQgd2l0aCBvcmlnaW5hbCB0b2tlbiBwcm92ZW5hbmNlIG9yIGEgc3ludGhldGljIHRlbXBvcmFyeSB1c2UuXG4gICAqIEBwYXJhbSB7UGxhbm5lZFZhbHVlfSB2YWx1ZSAtIFBsYW5uZWQgcHVyZSBvcGVyYW5kLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHZhbHVlKHtleHByZXNzaW9uLCBwYXRoLCBuYW1lfSkge1xuICAgIGlmIChuYW1lKSByZXR1cm4gdGhpcy5zeW50aGV0aWMobmFtZSwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIHRoaXMubWFwcGVkKGV4cHJlc3Npb24ubmFtZSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJuYW1lXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHJldHVybiB0aGlzLm1hcHBlZChTdHJpbmcoZXhwcmVzc2lvbi52YWx1ZSksIGV4cHJlc3Npb24sIHBhdGgsIFwibGl0ZXJhbFwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJbnRlZ2VyTGl0ZXJhbFwiKSByZXR1cm4gdGhpcy5tYXBwZWQoYHN0ZDo6aW50NjRfdCgke2V4cHJlc3Npb24udmFsdWV9KWAsIGV4cHJlc3Npb24sIHBhdGgsIFwibGl0ZXJhbFwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGV4cHJlc3Npb24udmFsdWUpXG4gICAgICBjb25zdCBsaXRlcmFsID0gQXJyYXkuZnJvbShieXRlcywgKGJ5dGUpID0+IGBcXFxcJHtieXRlLnRvU3RyaW5nKDgpLnBhZFN0YXJ0KDMsIFwiMFwiKX1gKS5qb2luKFwiXCIpXG5cbiAgICAgIHJldHVybiB0aGlzLm1hcHBlZChgc3RkOjpzdHJpbmcoXCIke2xpdGVyYWx9XCIsICR7Ynl0ZXMubGVuZ3RofSlgLCBleHByZXNzaW9uLCBwYXRoLCBcImxpdGVyYWxcIilcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zZXF1ZW5jZWQgZXhwcmVzc2lvbiBwYXNzZWQgQysrIHBsYW5uaW5nLlwiKVxuICB9XG59XG4iXX0=
@@ -1,9 +1,10 @@
1
1
  export type Expression = import("../semantic/types.js").Expression;
2
2
  export type Scalar = import("../semantic/types.js").SemanticTypeName;
3
+ export type PlannedType = Scalar | "void";
3
4
  export type PlannedValue = {
4
5
  expression: Expression;
5
6
  path: string;
6
- type: Scalar;
7
+ type: PlannedType;
7
8
  name?: string;
8
9
  };
9
10
  export type PlannedStep = {
@@ -14,13 +15,14 @@ export type PlannedStep = {
14
15
  export type Signature = Array<string | number | boolean | Signature>;
15
16
  /** @typedef {import("../semantic/types.js").Expression} Expression */
16
17
  /** @typedef {import("../semantic/types.js").SemanticTypeName} Scalar */
17
- /** @typedef {{expression: Expression, path: string, type: Scalar, name?: string}} PlannedValue */
18
+ /** @typedef {Scalar | "void"} PlannedType */
19
+ /** @typedef {{expression: Expression, path: string, type: PlannedType, name?: string}} PlannedValue */
18
20
  /** @typedef {{result: PlannedValue, operands: PlannedValue[], rightSteps?: PlannedStep[]}} PlannedStep */
19
21
  /** @typedef {Array<string | number | boolean | Signature>} Signature */
20
22
  /** Private occurrence-based native expression sequencer; it never rewrites the IR. */
21
23
  export declare class OrderedExpressionPlanner {
22
24
  language: "c" | "cpp";
23
- functions: Map<string, import("../semantic/types.js").SemanticTypeName>;
25
+ functions: Map<string, PlannedType>;
24
26
  nextTemporary: number;
25
27
  /**
26
28
  * Indexes already validated callable return types.
@@ -32,9 +34,9 @@ export declare class OrderedExpressionPlanner {
32
34
  * Resolves an expression type from the validated lexical environment.
33
35
  * @param {Expression} expression - Semantic expression.
34
36
  * @param {Map<string, Scalar>} bindings - Lexical scalar types.
35
- * @returns {Scalar} Exact semantic result type.
37
+ * @returns {PlannedType} Exact semantic result type.
36
38
  */
37
- type(expression: Expression, bindings: Map<string, Scalar>): Scalar;
39
+ type(expression: Expression, bindings: Map<string, Scalar>): PlannedType;
38
40
  /**
39
41
  * Plans one expression in semantic order, keeping the short-circuit RHS conditional.
40
42
  * @param {Expression} expression - Original occurrence.
@@ -44,6 +46,15 @@ export declare class OrderedExpressionPlanner {
44
46
  * @returns {PlannedValue} Pure final value.
45
47
  */
46
48
  plan(expression: Expression, path: string, bindings: Map<string, Scalar>, steps: PlannedStep[]): PlannedValue;
49
+ /**
50
+ * Plans the arguments of one terminal void call without inventing a void temporary.
51
+ * @param {Expression} expression - Terminal expression occurrence.
52
+ * @param {string} path - Occurrence path.
53
+ * @param {Map<string, Scalar>} bindings - Visible scalar bindings.
54
+ * @param {PlannedStep[]} steps - Ordered enclosing prelude.
55
+ * @returns {PlannedStep} Terminal direct-call step.
56
+ */
57
+ terminal(expression: Expression, path: string, bindings: Map<string, Scalar>, steps: PlannedStep[]): PlannedStep;
47
58
  /**
48
59
  * Allocates one bounded deterministic occurrence name.
49
60
  * @param {Expression} expression - Related expression.
@@ -61,9 +72,10 @@ export declare function statementSignature(statement: import("../semantic/types.
61
72
  export type StatementPlan = {
62
73
  id: string;
63
74
  steps: PlannedStep[];
64
- value: PlannedValue;
75
+ value?: PlannedValue;
76
+ terminal?: PlannedStep;
65
77
  };
66
- /** @typedef {{id: string, steps: PlannedStep[], value: PlannedValue}} StatementPlan */
78
+ /** @typedef {{id: string, steps: PlannedStep[], value?: PlannedValue, terminal?: PlannedStep}} StatementPlan */
67
79
  /**
68
80
  * Plans every occurrence before constructing a writer or exposing either artifact.
69
81
  * @param {import("../semantic/types.js").SemanticModule} module - Validated module.
@@ -1 +1 @@
1
- {"version":3,"file":"ordered-expressions.d.ts","sourceRoot":"","sources":["../../../src/backends/ordered-expressions.js"],"names":[],"mappings":"AAKI,YAAqD,UAAU,GAArD,OAAO,sBAAsB,EAAE,UAAU,CAAY;AAC/D,YAA2D,MAAM,GAAvD,OAAO,sBAAsB,EAAE,gBAAgB,CAAQ;AACjE,YAA+E,YAAY,GAAjF;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAc;AAC3F,YAAwF,WAAW,GAAzF;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;CAAC,CAAa;AACnG,YAAwD,SAAS,GAAvD,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAW;AAJrE,sEAAsE;AACtE,wEAAwE;AACxE,kGAAkG;AAClG,0GAA0G;AAC1G,wEAAwE;AAExE,sFAAsF;AACtF,qBAAa,wBAAwB;IAO5B,QAAQ;IACR,SAAS;IAIT,aAAa;IAXpB;;;;OAIG;IACH,YAAY,MAAM,EAHP,OAAO,sBAAsB,EAAE,cAGxB,EAAE,QAAQ,AAFzB,CACF,EADU,GAAG,GAAG,KAEiB,EAOjC;IAED;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAJJ,UAII,EAAE,QAAQ,EAHd,GAAG,CAAC,MAAM,EAAE,MAAM,CAGJ,GAFZ,MAAM,CAclB;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,UAAU,EANJ,UAMI,EAAE,IAAI,EALV,MAKU,EAAE,QAAQ,EAJpB,GAAG,CAAC,MAAM,EAAE,MAAM,CAIE,EAAE,KAAK,EAH3B,WAAW,EAGgB,GAFzB,YAAY,CA6BxB;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAHR,UAGQ,GAFN,MAAM,CAKlB;CACF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAHjC,OAAO,sBAAsB,EAAE,SAGE,GAF/B,MAAM,CAclB;AAiBG,YAAmE,aAAa,GAAtE;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAC,CAAe;AAApF,uFAAuF;AACvF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAJ5B,OAAO,sBAAsB,EAAE,cAIH,EAAE,QAAQ,AAH9C,CACA,EADQ,GAAG,GAAG,KAGsC,GAF1C,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CA4CtC"}
1
+ {"version":3,"file":"ordered-expressions.d.ts","sourceRoot":"","sources":["../../../src/backends/ordered-expressions.js"],"names":[],"mappings":"AAKI,YAAqD,UAAU,GAArD,OAAO,sBAAsB,EAAE,UAAU,CAAY;AAC/D,YAA2D,MAAM,GAAvD,OAAO,sBAAsB,EAAE,gBAAgB,CAAQ;AACjE,YAA2B,WAAW,GAA5B,MAAM,GAAG,MAAM,CAAa;AACtC,YAAoF,YAAY,GAAtF;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAc;AAChG,YAAwF,WAAW,GAAzF;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAA;CAAC,CAAa;AACnG,YAAwD,SAAS,GAAvD,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAW;AALrE,sEAAsE;AACtE,wEAAwE;AACxE,6CAA6C;AAC7C,uGAAuG;AACvG,0GAA0G;AAC1G,wEAAwE;AAExE,sFAAsF;AACtF,qBAAa,wBAAwB;IAO5B,QAAQ;IACR,SAAS;IAIT,aAAa;IAXpB;;;;OAIG;IACH,YAAY,MAAM,EAHP,OAAO,sBAAsB,EAAE,cAGxB,EAAE,QAAQ,AAFzB,CACF,EADU,GAAG,GAAG,KAEiB,EAOjC;IAED;;;;;OAKG;IACH,IAAI,CAAC,UAAU,EAJJ,UAII,EAAE,QAAQ,EAHd,GAAG,CAAC,MAAM,EAAE,MAAM,CAGJ,GAFZ,WAAW,CAcvB;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,UAAU,EANJ,UAMI,EAAE,IAAI,EALV,MAKU,EAAE,QAAQ,EAJpB,GAAG,CAAC,MAAM,EAAE,MAAM,CAIE,EAAE,KAAK,EAH3B,WAAW,EAGgB,GAFzB,YAAY,CA8BxB;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,EANR,UAMQ,EAAE,IAAI,EALd,MAKc,EAAE,QAAQ,EAJxB,GAAG,CAAC,MAAM,EAAE,MAAM,CAIM,EAAE,KAAK,EAH/B,WAAW,EAGoB,GAF7B,WAAW,CAUvB;IAED;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAHR,UAGQ,GAFN,MAAM,CAKlB;CACF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAHjC,OAAO,sBAAsB,EAAE,SAGE,GAF/B,MAAM,CAclB;AAiBG,YAA4F,aAAa,GAA/F;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAAC,CAAe;AAA7G,gHAAgH;AAChH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAJ5B,OAAO,sBAAsB,EAAE,cAIH,EAAE,QAAQ,AAH9C,CACA,EADQ,GAAG,GAAG,KAGsC,GAF1C,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CA6CtC"}