@workflow/core 5.0.0-beta.43 → 5.0.0-beta.44
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/dist/capabilities.d.ts +4 -4
- package/dist/capabilities.js +5 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +2 -2
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +19 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +33 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +12 -12
- package/dist/global.d.ts +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +21 -65
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +160 -38
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +24 -24
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +49 -43
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +18 -18
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +21 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +199 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +126 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +2 -2
- package/dist/runtime/resume-hook.js +27 -27
- package/dist/runtime/resume-latency.d.ts +25 -25
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -4
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +21 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +104 -10
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +27 -23
- package/dist/runtime/step-executor.d.ts +14 -14
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +54 -39
- package/dist/runtime/step-latency.d.ts +14 -14
- package/dist/runtime/step-latency.js +11 -11
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +29 -17
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +206 -71
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +300 -206
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +18 -18
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +41 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +29 -23
- package/dist/serialization.d.ts +10 -10
- package/dist/serialization.js +98 -98
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.js +12 -12
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +21 -13
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -15
- package/dist/telemetry.d.ts +3 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +19 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.js +16 -16
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +21 -7
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +35 -35
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +46 -41
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +53 -35
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
package/dist/vm/script-cache.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Script } from 'node:vm';
|
|
2
|
+
import { globalSingleton } from '@workflow/utils';
|
|
2
3
|
/**
|
|
3
4
|
* Module-level cache of compiled workflow-bundle `vm.Script` objects.
|
|
4
5
|
*
|
|
@@ -10,17 +11,17 @@ import { Script } from 'node:vm';
|
|
|
10
11
|
* contains every workflow function in the app and registers them on
|
|
11
12
|
* `globalThis.__private_workflows`. Previously each replay called
|
|
12
13
|
* `vm.runInContext(workflowCode, context, { filename })`, which RE-PARSES and
|
|
13
|
-
* RE-COMPILES the entire bundle every time
|
|
14
|
+
* RE-COMPILES the entire bundle every time: O(N) full re-parses for a
|
|
14
15
|
* sequential workflow of N steps, plus the same parse cost repeated across
|
|
15
16
|
* every invocation in the process.
|
|
16
17
|
*
|
|
17
18
|
* Compilation is a pure function of `(code, filename)`: a `vm.Script` carries
|
|
18
|
-
* no realm/context state
|
|
19
|
+
* no realm/context state; it is only bound to a context at `runInContext`
|
|
19
20
|
* time. So a single compiled `Script` can be reused across replays AND across
|
|
20
21
|
* workflow invocations in the same process without affecting determinism: the
|
|
21
22
|
* produced workflow function is identical to the previous re-parse-every-time
|
|
22
23
|
* behaviour, with identical `filename` source attribution (see the precise
|
|
23
|
-
* claim
|
|
24
|
+
* claim, and its one caveat, in `runWorkflow`).
|
|
24
25
|
*
|
|
25
26
|
* Keying
|
|
26
27
|
* ------
|
|
@@ -29,7 +30,7 @@ import { Script } from 'node:vm';
|
|
|
29
30
|
* attribution and surfaces in stack traces, where `remapErrorStack` keys on it
|
|
30
31
|
* to map frames back to the user's source. Two workflows in the same bundle
|
|
31
32
|
* share the same `code` but have different `filename`s, so they intentionally
|
|
32
|
-
* compile to distinct `Script`s
|
|
33
|
+
* compile to distinct `Script`s; collapsing them onto a single shared `Script`
|
|
33
34
|
* would misattribute one workflow's stack frames to another file. The cost of
|
|
34
35
|
* keeping them distinct is that the whole bundle is compiled once per distinct
|
|
35
36
|
* `filename` (not once per bundle); in practice that is bounded by the number
|
|
@@ -49,7 +50,7 @@ import { Script } from 'node:vm';
|
|
|
49
50
|
* (skew protection runs old versions as separate processes), so there is a
|
|
50
51
|
* single `code` key for the process lifetime. The bound exists for dev/watch
|
|
51
52
|
* mode, where the dev route re-reads `workflowCode` from disk and re-invokes
|
|
52
|
-
* the entrypoint on every edit
|
|
53
|
+
* the entrypoint on every edit: each edit produces a NEW bundle string, which
|
|
53
54
|
* without a bound would pin every historical version forever (~0.8MB per edit,
|
|
54
55
|
* growing monotonically with edit count). The dev path only ever needs the
|
|
55
56
|
* latest bundle, so an LRU that keeps the few most-recent bundles and evicts
|
|
@@ -59,12 +60,17 @@ import { Script } from 'node:vm';
|
|
|
59
60
|
* source files in a bundle and is dropped wholesale when its parent `code`
|
|
60
61
|
* entry is evicted.
|
|
61
62
|
*/
|
|
62
|
-
|
|
63
|
+
// On `globalThis` (see `globalSingleton`): compiling a bundle is the expensive
|
|
64
|
+
// part this cache exists to skip, and per-copy caches would pay it once per
|
|
65
|
+
// bundler layer that compiles a workflow.
|
|
66
|
+
const scripts = globalSingleton('@workflow/core//vmScriptCache', 1, () => ({
|
|
67
|
+
byCode: new Map(),
|
|
68
|
+
}));
|
|
63
69
|
/**
|
|
64
70
|
* Max number of distinct bundle (`code`) versions to retain. One is enough for
|
|
65
71
|
* production; a handful covers pathological dev hot-reload / repeated-rebuild
|
|
66
72
|
* churn within a single long-lived process (e.g. a watch session or a test
|
|
67
|
-
* file) without unbounded growth. Kept deliberately small
|
|
73
|
+
* file) without unbounded growth. Kept deliberately small: there is no value
|
|
68
74
|
* in retaining stale bundles, only a memory cost.
|
|
69
75
|
*/
|
|
70
76
|
const MAX_BUNDLES = 8;
|
|
@@ -75,13 +81,13 @@ const MAX_BUNDLES = 8;
|
|
|
75
81
|
* least-recently-used eviction candidate.
|
|
76
82
|
*/
|
|
77
83
|
function touchBundle(code) {
|
|
78
|
-
const byFilename =
|
|
84
|
+
const byFilename = scripts.byCode.get(code);
|
|
79
85
|
if (byFilename === undefined) {
|
|
80
86
|
return undefined;
|
|
81
87
|
}
|
|
82
88
|
// Move to the most-recently-used position (end of insertion order).
|
|
83
|
-
|
|
84
|
-
|
|
89
|
+
scripts.byCode.delete(code);
|
|
90
|
+
scripts.byCode.set(code, byFilename);
|
|
85
91
|
return byFilename;
|
|
86
92
|
}
|
|
87
93
|
/**
|
|
@@ -98,15 +104,15 @@ export function getCachedWorkflowScript(code, filename) {
|
|
|
98
104
|
let byFilename = touchBundle(code);
|
|
99
105
|
if (byFilename === undefined) {
|
|
100
106
|
byFilename = new Map();
|
|
101
|
-
|
|
107
|
+
scripts.byCode.set(code, byFilename);
|
|
102
108
|
// Evict the least-recently-used bundle(s) when over the cap. New bundles
|
|
103
109
|
// are appended at the end, so the oldest live at the front.
|
|
104
|
-
while (
|
|
105
|
-
const oldest =
|
|
110
|
+
while (scripts.byCode.size > MAX_BUNDLES) {
|
|
111
|
+
const oldest = scripts.byCode.keys().next().value;
|
|
106
112
|
if (oldest === undefined) {
|
|
107
113
|
break;
|
|
108
114
|
}
|
|
109
|
-
|
|
115
|
+
scripts.byCode.delete(oldest);
|
|
110
116
|
}
|
|
111
117
|
}
|
|
112
118
|
let script = byFilename.get(filename);
|
|
@@ -128,13 +134,13 @@ export function runCachedWorkflowScript(code, filename, context) {
|
|
|
128
134
|
* compile-vs-cache behaviour in isolation; not used on the hot path.
|
|
129
135
|
*/
|
|
130
136
|
export function clearWorkflowScriptCache() {
|
|
131
|
-
|
|
137
|
+
scripts.byCode.clear();
|
|
132
138
|
}
|
|
133
139
|
/**
|
|
134
140
|
* Number of distinct bundle (`code`) versions currently retained. Exposed for
|
|
135
141
|
* tests asserting the LRU bound; not used on the hot path.
|
|
136
142
|
*/
|
|
137
143
|
export function workflowScriptCacheSize() {
|
|
138
|
-
return
|
|
144
|
+
return scripts.byCode.size;
|
|
139
145
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZtL3NjcmlwdC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztBQUUzRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELG9FQUFvRTtJQUNwRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQjtJQUVoQixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLHlFQUF5RTtRQUN6RSw0REFBNEQ7UUFDNUQsT0FBTyxXQUFXLENBQUMsSUFBSSxHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDL0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixDQUFDO1lBQ0QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQixFQUNoQixPQUFnQjtJQUVoQixPQUFPLHVCQUF1QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb250ZXh0LCBTY3JpcHQgfSBmcm9tICdub2RlOnZtJztcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgb2YgY29tcGlsZWQgd29ya2Zsb3ctYnVuZGxlIGB2bS5TY3JpcHRgIG9iamVjdHMuXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzXG4gKiAtLS0tLS0tLS0tLS0tLS1cbiAqIFJlcGxheWluZyBhIHdvcmtmbG93IHJlLWV2YWx1YXRlcyB0aGUgd29ya2Zsb3cgYnVuZGxlIGFnYWluc3QgYSBmcmVzaCBWTVxuICogY29udGV4dCBvbiBldmVyeSBpdGVyYXRpb24gb2YgdGhlIGlubGluZSByZXBsYXkgbG9vcCAoc2VlXG4gKiBgcnVuV29ya2Zsb3dgIGluIGAuLi93b3JrZmxvdy50c2ApLiBUaGUgYnVuZGxlIGlzIGEgc2luZ2xlIHN0cmluZyB0aGF0XG4gKiBjb250YWlucyBldmVyeSB3b3JrZmxvdyBmdW5jdGlvbiBpbiB0aGUgYXBwIGFuZCByZWdpc3RlcnMgdGhlbSBvblxuICogYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93c2AuIFByZXZpb3VzbHkgZWFjaCByZXBsYXkgY2FsbGVkXG4gKiBgdm0ucnVuSW5Db250ZXh0KHdvcmtmbG93Q29kZSwgY29udGV4dCwgeyBmaWxlbmFtZSB9KWAsIHdoaWNoIFJFLVBBUlNFUyBhbmRcbiAqIFJFLUNPTVBJTEVTIHRoZSBlbnRpcmUgYnVuZGxlIGV2ZXJ5IHRpbWUg4oCUIE8oTikgZnVsbCByZS1wYXJzZXMgZm9yIGFcbiAqIHNlcXVlbnRpYWwgd29ya2Zsb3cgb2YgTiBzdGVwcywgcGx1cyB0aGUgc2FtZSBwYXJzZSBjb3N0IHJlcGVhdGVkIGFjcm9zc1xuICogZXZlcnkgaW52b2NhdGlvbiBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBDb21waWxhdGlvbiBpcyBhIHB1cmUgZnVuY3Rpb24gb2YgYChjb2RlLCBmaWxlbmFtZSlgOiBhIGB2bS5TY3JpcHRgIGNhcnJpZXNcbiAqIG5vIHJlYWxtL2NvbnRleHQgc3RhdGUg4oCUIGl0IGlzIG9ubHkgYm91bmQgdG8gYSBjb250ZXh0IGF0IGBydW5JbkNvbnRleHRgXG4gKiB0aW1lLiBTbyBhIHNpbmdsZSBjb21waWxlZCBgU2NyaXB0YCBjYW4gYmUgcmV1c2VkIGFjcm9zcyByZXBsYXlzIEFORCBhY3Jvc3NcbiAqIHdvcmtmbG93IGludm9jYXRpb25zIGluIHRoZSBzYW1lIHByb2Nlc3Mgd2l0aG91dCBhZmZlY3RpbmcgZGV0ZXJtaW5pc206IHRoZVxuICogcHJvZHVjZWQgd29ya2Zsb3cgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cyByZS1wYXJzZS1ldmVyeS10aW1lXG4gKiBiZWhhdmlvdXIsIHdpdGggaWRlbnRpY2FsIGBmaWxlbmFtZWAgc291cmNlIGF0dHJpYnV0aW9uIChzZWUgdGhlIHByZWNpc2VcbiAqIGNsYWltIOKAlCBhbmQgaXRzIG9uZSBjYXZlYXQg4oCUIGluIGBydW5Xb3JrZmxvd2ApLlxuICpcbiAqIEtleWluZ1xuICogLS0tLS0tXG4gKiBLZXllZCBieSBgY29kZWAgdGhlbiBgZmlsZW5hbWVgLiBUaGUgYGZpbGVuYW1lYCBpcyBwYXJ0IG9mIHRoZSBrZXkgb25cbiAqIHB1cnBvc2UsIE5PVCBhcyBhIGRlZHVwZSBrZXk6IGl0IGlzIGJha2VkIGludG8gdGhlIGNvbXBpbGVkIHNjcmlwdCdzIHNvdXJjZVxuICogYXR0cmlidXRpb24gYW5kIHN1cmZhY2VzIGluIHN0YWNrIHRyYWNlcywgd2hlcmUgYHJlbWFwRXJyb3JTdGFja2Aga2V5cyBvbiBpdFxuICogdG8gbWFwIGZyYW1lcyBiYWNrIHRvIHRoZSB1c2VyJ3Mgc291cmNlLiBUd28gd29ya2Zsb3dzIGluIHRoZSBzYW1lIGJ1bmRsZVxuICogc2hhcmUgdGhlIHNhbWUgYGNvZGVgIGJ1dCBoYXZlIGRpZmZlcmVudCBgZmlsZW5hbWVgcywgc28gdGhleSBpbnRlbnRpb25hbGx5XG4gKiBjb21waWxlIHRvIGRpc3RpbmN0IGBTY3JpcHRgcyDigJQgY29sbGFwc2luZyB0aGVtIG9udG8gYSBzaW5nbGUgc2hhcmVkIGBTY3JpcHRgXG4gKiB3b3VsZCBtaXNhdHRyaWJ1dGUgb25lIHdvcmtmbG93J3Mgc3RhY2sgZnJhbWVzIHRvIGFub3RoZXIgZmlsZS4gVGhlIGNvc3Qgb2ZcbiAqIGtlZXBpbmcgdGhlbSBkaXN0aW5jdCBpcyB0aGF0IHRoZSB3aG9sZSBidW5kbGUgaXMgY29tcGlsZWQgb25jZSBwZXIgZGlzdGluY3RcbiAqIGBmaWxlbmFtZWAgKG5vdCBvbmNlIHBlciBidW5kbGUpOyBpbiBwcmFjdGljZSB0aGF0IGlzIGJvdW5kZWQgYnkgdGhlIG51bWJlclxuICogb2Ygc291cmNlIGZpbGVzIHRoYXQgZGVmaW5lIGEgd29ya2Zsb3csIGFuZCBiZWNhdXNlIFY4IGxhemlseSBjb21waWxlc1xuICogZnVuY3Rpb24gYm9kaWVzIHRoZSBkdXBsaWNhdGVkIHdvcmsgaXMgdGhlIChjaGVhcCkgdG9wLWxldmVsIHBhcnNlLCBub3QgZnVsbFxuICogcGVyLXdvcmtmbG93IGNvZGVnZW4uXG4gKlxuICogV2UgdXNlIGEgbmVzdGVkIE1hcCAoY29kZSAtPiBmaWxlbmFtZSAtPiBTY3JpcHQpIHNvIHRoYXQgZXZpY3RpbmcgYSBidW5kbGVcbiAqIChlLmcuIGEgbmV3IGRlcGxveW1lbnQvaG90LXJlbG9hZCBwcm9kdWNpbmcgYSBkaWZmZXJlbnQgYGNvZGVgKSBkcm9wcyB0aGUgb2xkXG4gKiBjb2RlIHN0cmluZyBhbmQgYWxsIG9mIGl0cyBwZXItZmlsZW5hbWUgc2NyaXB0cyB0b2dldGhlci5cbiAqXG4gKiBCb3VuZGluZ1xuICogLS0tLS0tLS1cbiAqIFRoZSB0b3AtbGV2ZWwgKGBjb2RlYC1rZXllZCkgbWFwIGlzIGFuIGluc2VydGlvbi1vcmRlcmVkIExSVSBjYXBwZWQgYXRcbiAqIGBNQVhfQlVORExFU2AgZW50cmllcy4gSW4gcHJvZHVjdGlvbiB0aGlzIGJvdW5kIGlzIG5ldmVyIHJlYWNoZWQ6IGFcbiAqIGRlcGxveW1lbnQgaXMgaXRzIG93biBwcm9jZXNzIHNlcnZpbmcgZXhhY3RseSBvbmUgYnVpbGQtdGltZSBidW5kbGUgbGl0ZXJhbFxuICogKHNrZXcgcHJvdGVjdGlvbiBydW5zIG9sZCB2ZXJzaW9ucyBhcyBzZXBhcmF0ZSBwcm9jZXNzZXMpLCBzbyB0aGVyZSBpcyBhXG4gKiBzaW5nbGUgYGNvZGVgIGtleSBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUuIFRoZSBib3VuZCBleGlzdHMgZm9yIGRldi93YXRjaFxuICogbW9kZSwgd2hlcmUgdGhlIGRldiByb3V0ZSByZS1yZWFkcyBgd29ya2Zsb3dDb2RlYCBmcm9tIGRpc2sgYW5kIHJlLWludm9rZXNcbiAqIHRoZSBlbnRyeXBvaW50IG9uIGV2ZXJ5IGVkaXQg4oCUIGVhY2ggZWRpdCBwcm9kdWNlcyBhIE5FVyBidW5kbGUgc3RyaW5nLCB3aGljaFxuICogd2l0aG91dCBhIGJvdW5kIHdvdWxkIHBpbiBldmVyeSBoaXN0b3JpY2FsIHZlcnNpb24gZm9yZXZlciAofjAuOE1CIHBlciBlZGl0LFxuICogZ3Jvd2luZyBtb25vdG9uaWNhbGx5IHdpdGggZWRpdCBjb3VudCkuIFRoZSBkZXYgcGF0aCBvbmx5IGV2ZXIgbmVlZHMgdGhlXG4gKiBsYXRlc3QgYnVuZGxlLCBzbyBhbiBMUlUgdGhhdCBrZWVwcyB0aGUgZmV3IG1vc3QtcmVjZW50IGJ1bmRsZXMgYW5kIGV2aWN0c1xuICogdGhlIHJlc3QgcHJlc2VydmVzIHRoZSBwcmUtY2FjaGUgR0MgYmVoYXZpb3VyIHdoaWxlIHN0aWxsIHNlcnZpbmcgdGhlXG4gKiBzdGVhZHktc3RhdGUgc2luZ2xlLWJ1bmRsZSBjYXNlIGZvciBmcmVlLiBUaGUgcGVyLWBmaWxlbmFtZWAgaW5uZXIgbWFwIGlzIG5vdFxuICogc2VwYXJhdGVseSBib3VuZGVkOiBpdCBpcyBuYXR1cmFsbHkgYm91bmRlZCBieSB0aGUgKHNtYWxsKSBudW1iZXIgb2Ygd29ya2Zsb3dcbiAqIHNvdXJjZSBmaWxlcyBpbiBhIGJ1bmRsZSBhbmQgaXMgZHJvcHBlZCB3aG9sZXNhbGUgd2hlbiBpdHMgcGFyZW50IGBjb2RlYFxuICogZW50cnkgaXMgZXZpY3RlZC5cbiAqL1xuY29uc3Qgc2NyaXB0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2NyaXB0Pj4oKTtcblxuLyoqXG4gKiBNYXggbnVtYmVyIG9mIGRpc3RpbmN0IGJ1bmRsZSAoYGNvZGVgKSB2ZXJzaW9ucyB0byByZXRhaW4uIE9uZSBpcyBlbm91Z2ggZm9yXG4gKiBwcm9kdWN0aW9uOyBhIGhhbmRmdWwgY292ZXJzIHBhdGhvbG9naWNhbCBkZXYgaG90LXJlbG9hZCAvIHJlcGVhdGVkLXJlYnVpbGRcbiAqIGNodXJuIHdpdGhpbiBhIHNpbmdsZSBsb25nLWxpdmVkIHByb2Nlc3MgKGUuZy4gYSB3YXRjaCBzZXNzaW9uIG9yIGEgdGVzdFxuICogZmlsZSkgd2l0aG91dCB1bmJvdW5kZWQgZ3Jvd3RoLiBLZXB0IGRlbGliZXJhdGVseSBzbWFsbCDigJQgdGhlcmUgaXMgbm8gdmFsdWVcbiAqIGluIHJldGFpbmluZyBzdGFsZSBidW5kbGVzLCBvbmx5IGEgbWVtb3J5IGNvc3QuXG4gKi9cbmNvbnN0IE1BWF9CVU5ETEVTID0gODtcblxuLyoqXG4gKiBMb29rcyB1cCB0aGUgcGVyLWZpbGVuYW1lIG1hcCBmb3IgYGNvZGVgLCBtYXJraW5nIGl0IG1vc3QtcmVjZW50bHktdXNlZC5cbiAqIFJlbGllcyBvbiBgTWFwYCBwcmVzZXJ2aW5nIGluc2VydGlvbiBvcmRlcjogZGVsZXRpbmcgYW5kIHJlLWluc2VydGluZyBhblxuICogZXhpc3Rpbmcga2V5IG1vdmVzIGl0IHRvIHRoZSBlbmQgKG5ld2VzdCksIHNvIHRoZSBmaXJzdCBrZXkgaXMgYWx3YXlzIHRoZVxuICogbGVhc3QtcmVjZW50bHktdXNlZCBldmljdGlvbiBjYW5kaWRhdGUuXG4gKi9cbmZ1bmN0aW9uIHRvdWNoQnVuZGxlKGNvZGU6IHN0cmluZyk6IE1hcDxzdHJpbmcsIFNjcmlwdD4gfCB1bmRlZmluZWQge1xuICBjb25zdCBieUZpbGVuYW1lID0gc2NyaXB0Q2FjaGUuZ2V0KGNvZGUpO1xuICBpZiAoYnlGaWxlbmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBNb3ZlIHRvIHRoZSBtb3N0LXJlY2VudGx5LXVzZWQgcG9zaXRpb24gKGVuZCBvZiBpbnNlcnRpb24gb3JkZXIpLlxuICBzY3JpcHRDYWNoZS5kZWxldGUoY29kZSk7XG4gIHNjcmlwdENhY2hlLnNldChjb2RlLCBieUZpbGVuYW1lKTtcbiAgcmV0dXJuIGJ5RmlsZW5hbWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBpbGVkIGB2bS5TY3JpcHRgIGZvciB0aGUgZ2l2ZW4gd29ya2Zsb3cgYnVuZGxlIGNvZGUgYW5kXG4gKiBmaWxlbmFtZSwgY29tcGlsaW5nIGFuZCBjYWNoaW5nIGl0IG9uIGZpcnN0IHVzZS4gU3Vic2VxdWVudCBjYWxscyB3aXRoIHRoZVxuICogc2FtZSBgKGNvZGUsIGZpbGVuYW1lKWAgcmV0dXJuIHRoZSBjYWNoZWQgYFNjcmlwdGAuXG4gKlxuICogVGhlIHJldHVybmVkIGBTY3JpcHRgIGlzIG5vdCB5ZXQgYm91bmQgdG8gYW55IGNvbnRleHQ7IHRoZSBjYWxsZXIgcnVucyBpdFxuICogYWdhaW5zdCBhIHNwZWNpZmljIFZNIGNvbnRleHQgdmlhIGBzY3JpcHQucnVuSW5Db250ZXh0KGNvbnRleHQpYC4gVGhpcyBpc1xuICogZXF1aXZhbGVudCB0byBgdm0ucnVuSW5Db250ZXh0KGNvZGUsIGNvbnRleHQsIHsgZmlsZW5hbWUgfSlgIGJ1dCBza2lwcyB0aGVcbiAqIHJlY29tcGlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZFdvcmtmbG93U2NyaXB0KFxuICBjb2RlOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmdcbik6IFNjcmlwdCB7XG4gIGxldCBieUZpbGVuYW1lID0gdG91Y2hCdW5kbGUoY29kZSk7XG4gIGlmIChieUZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBieUZpbGVuYW1lID0gbmV3IE1hcDxzdHJpbmcsIFNjcmlwdD4oKTtcbiAgICBzY3JpcHRDYWNoZS5zZXQoY29kZSwgYnlGaWxlbmFtZSk7XG4gICAgLy8gRXZpY3QgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgYnVuZGxlKHMpIHdoZW4gb3ZlciB0aGUgY2FwLiBOZXcgYnVuZGxlc1xuICAgIC8vIGFyZSBhcHBlbmRlZCBhdCB0aGUgZW5kLCBzbyB0aGUgb2xkZXN0IGxpdmUgYXQgdGhlIGZyb250LlxuICAgIHdoaWxlIChzY3JpcHRDYWNoZS5zaXplID4gTUFYX0JVTkRMRVMpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHNjcmlwdENhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY3JpcHRDYWNoZS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH1cbiAgbGV0IHNjcmlwdCA9IGJ5RmlsZW5hbWUuZ2V0KGZpbGVuYW1lKTtcbiAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc2NyaXB0ID0gbmV3IFNjcmlwdChjb2RlLCB7IGZpbGVuYW1lIH0pO1xuICAgIGJ5RmlsZW5hbWUuc2V0KGZpbGVuYW1lLCBzY3JpcHQpO1xuICB9XG4gIHJldHVybiBzY3JpcHQ7XG59XG5cbi8qKlxuICogUnVucyB0aGUgY2FjaGVkIHdvcmtmbG93LWJ1bmRsZSBgU2NyaXB0YCBhZ2FpbnN0IGBjb250ZXh0YC4gQ29tcGlsZXMgYW5kXG4gKiBjYWNoZXMgdGhlIGBTY3JpcHRgIG9uIGZpcnN0IHVzZSBmb3IgdGhlIGdpdmVuIGAoY29kZSwgZmlsZW5hbWUpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0KFxuICBjb2RlOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IENvbnRleHRcbik6IHVua25vd24ge1xuICByZXR1cm4gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQoY29kZSwgZmlsZW5hbWUpLnJ1bkluQ29udGV4dChjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGNvbXBpbGVkLXNjcmlwdCBjYWNoZS4gSW50ZW5kZWQgZm9yIHRlc3RzIHRoYXQgd2FudCB0byBhc3NlcnRcbiAqIGNvbXBpbGUtdnMtY2FjaGUgYmVoYXZpb3VyIGluIGlzb2xhdGlvbjsgbm90IHVzZWQgb24gdGhlIGhvdCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJXb3JrZmxvd1NjcmlwdENhY2hlKCk6IHZvaWQge1xuICBzY3JpcHRDYWNoZS5jbGVhcigpO1xufVxuXG4vKipcbiAqIE51bWJlciBvZiBkaXN0aW5jdCBidW5kbGUgKGBjb2RlYCkgdmVyc2lvbnMgY3VycmVudGx5IHJldGFpbmVkLiBFeHBvc2VkIGZvclxuICogdGVzdHMgYXNzZXJ0aW5nIHRoZSBMUlUgYm91bmQ7IG5vdCB1c2VkIG9uIHRoZSBob3QgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93U2NyaXB0Q2FjaGVTaXplKCk6IG51bWJlciB7XG4gIHJldHVybiBzY3JpcHRDYWNoZS5zaXplO1xufVxuIl19
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZtL3NjcmlwdC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHO0FBQ0gsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwwQ0FBMEM7QUFDMUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLCtCQUErQixFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBK0I7Q0FDL0MsQ0FBQyxDQUFDLENBQUM7QUFFSjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxvRUFBb0U7SUFDcEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQjtJQUVoQixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyQyx5RUFBeUU7UUFDekUsNERBQTREO1FBQzVELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsT0FBZ0I7SUFFaEIsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb250ZXh0LCBTY3JpcHQgfSBmcm9tICdub2RlOnZtJztcbmltcG9ydCB7IGdsb2JhbFNpbmdsZXRvbiB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5cbi8qKlxuICogTW9kdWxlLWxldmVsIGNhY2hlIG9mIGNvbXBpbGVkIHdvcmtmbG93LWJ1bmRsZSBgdm0uU2NyaXB0YCBvYmplY3RzLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0c1xuICogLS0tLS0tLS0tLS0tLS0tXG4gKiBSZXBsYXlpbmcgYSB3b3JrZmxvdyByZS1ldmFsdWF0ZXMgdGhlIHdvcmtmbG93IGJ1bmRsZSBhZ2FpbnN0IGEgZnJlc2ggVk1cbiAqIGNvbnRleHQgb24gZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBpbmxpbmUgcmVwbGF5IGxvb3AgKHNlZVxuICogYHJ1bldvcmtmbG93YCBpbiBgLi4vd29ya2Zsb3cudHNgKS4gVGhlIGJ1bmRsZSBpcyBhIHNpbmdsZSBzdHJpbmcgdGhhdFxuICogY29udGFpbnMgZXZlcnkgd29ya2Zsb3cgZnVuY3Rpb24gaW4gdGhlIGFwcCBhbmQgcmVnaXN0ZXJzIHRoZW0gb25cbiAqIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3NgLiBQcmV2aW91c2x5IGVhY2ggcmVwbGF5IGNhbGxlZFxuICogYHZtLnJ1bkluQ29udGV4dCh3b3JrZmxvd0NvZGUsIGNvbnRleHQsIHsgZmlsZW5hbWUgfSlgLCB3aGljaCBSRS1QQVJTRVMgYW5kXG4gKiBSRS1DT01QSUxFUyB0aGUgZW50aXJlIGJ1bmRsZSBldmVyeSB0aW1lOiBPKE4pIGZ1bGwgcmUtcGFyc2VzIGZvciBhXG4gKiBzZXF1ZW50aWFsIHdvcmtmbG93IG9mIE4gc3RlcHMsIHBsdXMgdGhlIHNhbWUgcGFyc2UgY29zdCByZXBlYXRlZCBhY3Jvc3NcbiAqIGV2ZXJ5IGludm9jYXRpb24gaW4gdGhlIHByb2Nlc3MuXG4gKlxuICogQ29tcGlsYXRpb24gaXMgYSBwdXJlIGZ1bmN0aW9uIG9mIGAoY29kZSwgZmlsZW5hbWUpYDogYSBgdm0uU2NyaXB0YCBjYXJyaWVzXG4gKiBubyByZWFsbS9jb250ZXh0IHN0YXRlOyBpdCBpcyBvbmx5IGJvdW5kIHRvIGEgY29udGV4dCBhdCBgcnVuSW5Db250ZXh0YFxuICogdGltZS4gU28gYSBzaW5nbGUgY29tcGlsZWQgYFNjcmlwdGAgY2FuIGJlIHJldXNlZCBhY3Jvc3MgcmVwbGF5cyBBTkQgYWNyb3NzXG4gKiB3b3JrZmxvdyBpbnZvY2F0aW9ucyBpbiB0aGUgc2FtZSBwcm9jZXNzIHdpdGhvdXQgYWZmZWN0aW5nIGRldGVybWluaXNtOiB0aGVcbiAqIHByb2R1Y2VkIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgcmUtcGFyc2UtZXZlcnktdGltZVxuICogYmVoYXZpb3VyLCB3aXRoIGlkZW50aWNhbCBgZmlsZW5hbWVgIHNvdXJjZSBhdHRyaWJ1dGlvbiAoc2VlIHRoZSBwcmVjaXNlXG4gKiBjbGFpbSwgYW5kIGl0cyBvbmUgY2F2ZWF0LCBpbiBgcnVuV29ya2Zsb3dgKS5cbiAqXG4gKiBLZXlpbmdcbiAqIC0tLS0tLVxuICogS2V5ZWQgYnkgYGNvZGVgIHRoZW4gYGZpbGVuYW1lYC4gVGhlIGBmaWxlbmFtZWAgaXMgcGFydCBvZiB0aGUga2V5IG9uXG4gKiBwdXJwb3NlLCBOT1QgYXMgYSBkZWR1cGUga2V5OiBpdCBpcyBiYWtlZCBpbnRvIHRoZSBjb21waWxlZCBzY3JpcHQncyBzb3VyY2VcbiAqIGF0dHJpYnV0aW9uIGFuZCBzdXJmYWNlcyBpbiBzdGFjayB0cmFjZXMsIHdoZXJlIGByZW1hcEVycm9yU3RhY2tgIGtleXMgb24gaXRcbiAqIHRvIG1hcCBmcmFtZXMgYmFjayB0byB0aGUgdXNlcidzIHNvdXJjZS4gVHdvIHdvcmtmbG93cyBpbiB0aGUgc2FtZSBidW5kbGVcbiAqIHNoYXJlIHRoZSBzYW1lIGBjb2RlYCBidXQgaGF2ZSBkaWZmZXJlbnQgYGZpbGVuYW1lYHMsIHNvIHRoZXkgaW50ZW50aW9uYWxseVxuICogY29tcGlsZSB0byBkaXN0aW5jdCBgU2NyaXB0YHM7IGNvbGxhcHNpbmcgdGhlbSBvbnRvIGEgc2luZ2xlIHNoYXJlZCBgU2NyaXB0YFxuICogd291bGQgbWlzYXR0cmlidXRlIG9uZSB3b3JrZmxvdydzIHN0YWNrIGZyYW1lcyB0byBhbm90aGVyIGZpbGUuIFRoZSBjb3N0IG9mXG4gKiBrZWVwaW5nIHRoZW0gZGlzdGluY3QgaXMgdGhhdCB0aGUgd2hvbGUgYnVuZGxlIGlzIGNvbXBpbGVkIG9uY2UgcGVyIGRpc3RpbmN0XG4gKiBgZmlsZW5hbWVgIChub3Qgb25jZSBwZXIgYnVuZGxlKTsgaW4gcHJhY3RpY2UgdGhhdCBpcyBib3VuZGVkIGJ5IHRoZSBudW1iZXJcbiAqIG9mIHNvdXJjZSBmaWxlcyB0aGF0IGRlZmluZSBhIHdvcmtmbG93LCBhbmQgYmVjYXVzZSBWOCBsYXppbHkgY29tcGlsZXNcbiAqIGZ1bmN0aW9uIGJvZGllcyB0aGUgZHVwbGljYXRlZCB3b3JrIGlzIHRoZSAoY2hlYXApIHRvcC1sZXZlbCBwYXJzZSwgbm90IGZ1bGxcbiAqIHBlci13b3JrZmxvdyBjb2RlZ2VuLlxuICpcbiAqIFdlIHVzZSBhIG5lc3RlZCBNYXAgKGNvZGUgLT4gZmlsZW5hbWUgLT4gU2NyaXB0KSBzbyB0aGF0IGV2aWN0aW5nIGEgYnVuZGxlXG4gKiAoZS5nLiBhIG5ldyBkZXBsb3ltZW50L2hvdC1yZWxvYWQgcHJvZHVjaW5nIGEgZGlmZmVyZW50IGBjb2RlYCkgZHJvcHMgdGhlIG9sZFxuICogY29kZSBzdHJpbmcgYW5kIGFsbCBvZiBpdHMgcGVyLWZpbGVuYW1lIHNjcmlwdHMgdG9nZXRoZXIuXG4gKlxuICogQm91bmRpbmdcbiAqIC0tLS0tLS0tXG4gKiBUaGUgdG9wLWxldmVsIChgY29kZWAta2V5ZWQpIG1hcCBpcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBMUlUgY2FwcGVkIGF0XG4gKiBgTUFYX0JVTkRMRVNgIGVudHJpZXMuIEluIHByb2R1Y3Rpb24gdGhpcyBib3VuZCBpcyBuZXZlciByZWFjaGVkOiBhXG4gKiBkZXBsb3ltZW50IGlzIGl0cyBvd24gcHJvY2VzcyBzZXJ2aW5nIGV4YWN0bHkgb25lIGJ1aWxkLXRpbWUgYnVuZGxlIGxpdGVyYWxcbiAqIChza2V3IHByb3RlY3Rpb24gcnVucyBvbGQgdmVyc2lvbnMgYXMgc2VwYXJhdGUgcHJvY2Vzc2VzKSwgc28gdGhlcmUgaXMgYVxuICogc2luZ2xlIGBjb2RlYCBrZXkgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLiBUaGUgYm91bmQgZXhpc3RzIGZvciBkZXYvd2F0Y2hcbiAqIG1vZGUsIHdoZXJlIHRoZSBkZXYgcm91dGUgcmUtcmVhZHMgYHdvcmtmbG93Q29kZWAgZnJvbSBkaXNrIGFuZCByZS1pbnZva2VzXG4gKiB0aGUgZW50cnlwb2ludCBvbiBldmVyeSBlZGl0OiBlYWNoIGVkaXQgcHJvZHVjZXMgYSBORVcgYnVuZGxlIHN0cmluZywgd2hpY2hcbiAqIHdpdGhvdXQgYSBib3VuZCB3b3VsZCBwaW4gZXZlcnkgaGlzdG9yaWNhbCB2ZXJzaW9uIGZvcmV2ZXIgKH4wLjhNQiBwZXIgZWRpdCxcbiAqIGdyb3dpbmcgbW9ub3RvbmljYWxseSB3aXRoIGVkaXQgY291bnQpLiBUaGUgZGV2IHBhdGggb25seSBldmVyIG5lZWRzIHRoZVxuICogbGF0ZXN0IGJ1bmRsZSwgc28gYW4gTFJVIHRoYXQga2VlcHMgdGhlIGZldyBtb3N0LXJlY2VudCBidW5kbGVzIGFuZCBldmljdHNcbiAqIHRoZSByZXN0IHByZXNlcnZlcyB0aGUgcHJlLWNhY2hlIEdDIGJlaGF2aW91ciB3aGlsZSBzdGlsbCBzZXJ2aW5nIHRoZVxuICogc3RlYWR5LXN0YXRlIHNpbmdsZS1idW5kbGUgY2FzZSBmb3IgZnJlZS4gVGhlIHBlci1gZmlsZW5hbWVgIGlubmVyIG1hcCBpcyBub3RcbiAqIHNlcGFyYXRlbHkgYm91bmRlZDogaXQgaXMgbmF0dXJhbGx5IGJvdW5kZWQgYnkgdGhlIChzbWFsbCkgbnVtYmVyIG9mIHdvcmtmbG93XG4gKiBzb3VyY2UgZmlsZXMgaW4gYSBidW5kbGUgYW5kIGlzIGRyb3BwZWQgd2hvbGVzYWxlIHdoZW4gaXRzIHBhcmVudCBgY29kZWBcbiAqIGVudHJ5IGlzIGV2aWN0ZWQuXG4gKi9cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogY29tcGlsaW5nIGEgYnVuZGxlIGlzIHRoZSBleHBlbnNpdmVcbi8vIHBhcnQgdGhpcyBjYWNoZSBleGlzdHMgdG8gc2tpcCwgYW5kIHBlci1jb3B5IGNhY2hlcyB3b3VsZCBwYXkgaXQgb25jZSBwZXJcbi8vIGJ1bmRsZXIgbGF5ZXIgdGhhdCBjb21waWxlcyBhIHdvcmtmbG93LlxuY29uc3Qgc2NyaXB0cyA9IGdsb2JhbFNpbmdsZXRvbignQHdvcmtmbG93L2NvcmUvL3ZtU2NyaXB0Q2FjaGUnLCAxLCAoKSA9PiAoe1xuICBieUNvZGU6IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTY3JpcHQ+PigpLFxufSkpO1xuXG4vKipcbiAqIE1heCBudW1iZXIgb2YgZGlzdGluY3QgYnVuZGxlIChgY29kZWApIHZlcnNpb25zIHRvIHJldGFpbi4gT25lIGlzIGVub3VnaCBmb3JcbiAqIHByb2R1Y3Rpb247IGEgaGFuZGZ1bCBjb3ZlcnMgcGF0aG9sb2dpY2FsIGRldiBob3QtcmVsb2FkIC8gcmVwZWF0ZWQtcmVidWlsZFxuICogY2h1cm4gd2l0aGluIGEgc2luZ2xlIGxvbmctbGl2ZWQgcHJvY2VzcyAoZS5nLiBhIHdhdGNoIHNlc3Npb24gb3IgYSB0ZXN0XG4gKiBmaWxlKSB3aXRob3V0IHVuYm91bmRlZCBncm93dGguIEtlcHQgZGVsaWJlcmF0ZWx5IHNtYWxsOiB0aGVyZSBpcyBubyB2YWx1ZVxuICogaW4gcmV0YWluaW5nIHN0YWxlIGJ1bmRsZXMsIG9ubHkgYSBtZW1vcnkgY29zdC5cbiAqL1xuY29uc3QgTUFYX0JVTkRMRVMgPSA4O1xuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBwZXItZmlsZW5hbWUgbWFwIGZvciBgY29kZWAsIG1hcmtpbmcgaXQgbW9zdC1yZWNlbnRseS11c2VkLlxuICogUmVsaWVzIG9uIGBNYXBgIHByZXNlcnZpbmcgaW5zZXJ0aW9uIG9yZGVyOiBkZWxldGluZyBhbmQgcmUtaW5zZXJ0aW5nIGFuXG4gKiBleGlzdGluZyBrZXkgbW92ZXMgaXQgdG8gdGhlIGVuZCAobmV3ZXN0KSwgc28gdGhlIGZpcnN0IGtleSBpcyBhbHdheXMgdGhlXG4gKiBsZWFzdC1yZWNlbnRseS11c2VkIGV2aWN0aW9uIGNhbmRpZGF0ZS5cbiAqL1xuZnVuY3Rpb24gdG91Y2hCdW5kbGUoY29kZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2NyaXB0PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJ5RmlsZW5hbWUgPSBzY3JpcHRzLmJ5Q29kZS5nZXQoY29kZSk7XG4gIGlmIChieUZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vIE1vdmUgdG8gdGhlIG1vc3QtcmVjZW50bHktdXNlZCBwb3NpdGlvbiAoZW5kIG9mIGluc2VydGlvbiBvcmRlcikuXG4gIHNjcmlwdHMuYnlDb2RlLmRlbGV0ZShjb2RlKTtcbiAgc2NyaXB0cy5ieUNvZGUuc2V0KGNvZGUsIGJ5RmlsZW5hbWUpO1xuICByZXR1cm4gYnlGaWxlbmFtZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29tcGlsZWQgYHZtLlNjcmlwdGAgZm9yIHRoZSBnaXZlbiB3b3JrZmxvdyBidW5kbGUgY29kZSBhbmRcbiAqIGZpbGVuYW1lLCBjb21waWxpbmcgYW5kIGNhY2hpbmcgaXQgb24gZmlyc3QgdXNlLiBTdWJzZXF1ZW50IGNhbGxzIHdpdGggdGhlXG4gKiBzYW1lIGAoY29kZSwgZmlsZW5hbWUpYCByZXR1cm4gdGhlIGNhY2hlZCBgU2NyaXB0YC5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgYFNjcmlwdGAgaXMgbm90IHlldCBib3VuZCB0byBhbnkgY29udGV4dDsgdGhlIGNhbGxlciBydW5zIGl0XG4gKiBhZ2FpbnN0IGEgc3BlY2lmaWMgVk0gY29udGV4dCB2aWEgYHNjcmlwdC5ydW5JbkNvbnRleHQoY29udGV4dClgLiBUaGlzIGlzXG4gKiBlcXVpdmFsZW50IHRvIGB2bS5ydW5JbkNvbnRleHQoY29kZSwgY29udGV4dCwgeyBmaWxlbmFtZSB9KWAgYnV0IHNraXBzIHRoZVxuICogcmVjb21waWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gIGNvZGU6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZ1xuKTogU2NyaXB0IHtcbiAgbGV0IGJ5RmlsZW5hbWUgPSB0b3VjaEJ1bmRsZShjb2RlKTtcbiAgaWYgKGJ5RmlsZW5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGJ5RmlsZW5hbWUgPSBuZXcgTWFwPHN0cmluZywgU2NyaXB0PigpO1xuICAgIHNjcmlwdHMuYnlDb2RlLnNldChjb2RlLCBieUZpbGVuYW1lKTtcbiAgICAvLyBFdmljdCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBidW5kbGUocykgd2hlbiBvdmVyIHRoZSBjYXAuIE5ldyBidW5kbGVzXG4gICAgLy8gYXJlIGFwcGVuZGVkIGF0IHRoZSBlbmQsIHNvIHRoZSBvbGRlc3QgbGl2ZSBhdCB0aGUgZnJvbnQuXG4gICAgd2hpbGUgKHNjcmlwdHMuYnlDb2RlLnNpemUgPiBNQVhfQlVORExFUykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gc2NyaXB0cy5ieUNvZGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHNjcmlwdHMuYnlDb2RlLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgfVxuICBsZXQgc2NyaXB0ID0gYnlGaWxlbmFtZS5nZXQoZmlsZW5hbWUpO1xuICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzY3JpcHQgPSBuZXcgU2NyaXB0KGNvZGUsIHsgZmlsZW5hbWUgfSk7XG4gICAgYnlGaWxlbmFtZS5zZXQoZmlsZW5hbWUsIHNjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBjYWNoZWQgd29ya2Zsb3ctYnVuZGxlIGBTY3JpcHRgIGFnYWluc3QgYGNvbnRleHRgLiBDb21waWxlcyBhbmRcbiAqIGNhY2hlcyB0aGUgYFNjcmlwdGAgb24gZmlyc3QgdXNlIGZvciB0aGUgZ2l2ZW4gYChjb2RlLCBmaWxlbmFtZSlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gIGNvZGU6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgY29udGV4dDogQ29udGV4dFxuKTogdW5rbm93biB7XG4gIHJldHVybiBnZXRDYWNoZWRXb3JrZmxvd1NjcmlwdChjb2RlLCBmaWxlbmFtZSkucnVuSW5Db250ZXh0KGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENsZWFycyB0aGUgY29tcGlsZWQtc2NyaXB0IGNhY2hlLiBJbnRlbmRlZCBmb3IgdGVzdHMgdGhhdCB3YW50IHRvIGFzc2VydFxuICogY29tcGlsZS12cy1jYWNoZSBiZWhhdmlvdXIgaW4gaXNvbGF0aW9uOyBub3QgdXNlZCBvbiB0aGUgaG90IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhcldvcmtmbG93U2NyaXB0Q2FjaGUoKTogdm9pZCB7XG4gIHNjcmlwdHMuYnlDb2RlLmNsZWFyKCk7XG59XG5cbi8qKlxuICogTnVtYmVyIG9mIGRpc3RpbmN0IGJ1bmRsZSAoYGNvZGVgKSB2ZXJzaW9ucyBjdXJyZW50bHkgcmV0YWluZWQuIEV4cG9zZWQgZm9yXG4gKiB0ZXN0cyBhc3NlcnRpbmcgdGhlIExSVSBib3VuZDsgbm90IHVzZWQgb24gdGhlIGhvdCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dTY3JpcHRDYWNoZVNpemUoKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNjcmlwdHMuYnlDb2RlLnNpemU7XG59XG4iXX0=
|
|
@@ -403,4 +403,4 @@ export function installUint8ArrayBase64(Uint8ArrayCtor) {
|
|
|
403
403
|
});
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWludDhhcnJheS1iYXNlNjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdm0vdWludDhhcnJheS1iYXNlNjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBeUNILDJCQUEyQjtBQUMzQixNQUFNLFlBQVksR0FDaEIsa0VBQWtFLENBQUM7QUFFckUsMEVBQTBFO0FBQzFFLE1BQU0sYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzdDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sQ0FDTCxJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJO1FBQ2IsSUFBSSxLQUFLLElBQUk7UUFDYixJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJLENBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ3JELE9BQU8sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEUsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYSxFQUNiLGdCQUEwQjtJQUUxQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lB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SSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztnQkFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNqQixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLENBQUM7Z0JBRUQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvbHlmaWxsIGZvciB0aGUgVEMzOSBVaW50OEFycmF5IGJhc2U2NC9oZXggcHJvcG9zYWwgKFN0YWdlIDQpLlxuICpcbiAqIEltcGxlbWVudHM6XG4gKiAgLSBVaW50OEFycmF5LnByb3RvdHlwZS50b0Jhc2U2NChbb3B0aW9uc10pXG4gKiAgLSBVaW50OEFycmF5LnByb3RvdHlwZS50b0hleCgpXG4gKiAgLSBVaW50OEFycmF5LmZyb21CYXNlNjQoc3RyaW5nWywgb3B0aW9uc10pXG4gKiAgLSBVaW50OEFycmF5LmZyb21IZXgoc3RyaW5nKVxuICogIC0gVWludDhBcnJheS5wcm90b3R5cGUuc2V0RnJvbUJhc2U2NChzdHJpbmdbLCBvcHRpb25zXSlcbiAqICAtIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldEZyb21IZXgoc3RyaW5nKVxuICpcbiAqIEBzZWUgaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWFycmF5YnVmZmVyLWJhc2U2NC9zcGVjL1xuICovXG5cbi8vIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBwb2x5ZmlsbGVkIG1ldGhvZHMuIFRoZXNlIGFyZSBpbnRlbnRpb25hbGx5XG4vLyBOT1QgYGRlY2xhcmUgZ2xvYmFsYCB0byBhdm9pZCBsZWFraW5nIHR5cGVzIHRvIGhvc3Qtc2lkZSBjb2RlIOKAlCB0aGUgcG9seWZpbGxcbi8vIGlzIG9ubHkgaW5zdGFsbGVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0gY29udGV4dC5cbmludGVyZmFjZSBVaW50OEFycmF5V2l0aEJhc2U2NCBleHRlbmRzIFVpbnQ4QXJyYXkge1xuICB0b0Jhc2U2NChvcHRpb25zPzogeyBhbHBoYWJldD86IHN0cmluZzsgb21pdFBhZGRpbmc/OiBib29sZWFuIH0pOiBzdHJpbmc7XG4gIHRvSGV4KCk6IHN0cmluZztcbiAgc2V0RnJvbUJhc2U2NChcbiAgICBzdHI6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBhbHBoYWJldD86IHN0cmluZzsgbGFzdENodW5rSGFuZGxpbmc/OiBzdHJpbmcgfVxuICApOiB7IHJlYWQ6IG51bWJlcjsgd3JpdHRlbjogbnVtYmVyIH07XG4gIHNldEZyb21IZXgoc3RyOiBzdHJpbmcpOiB7IHJlYWQ6IG51bWJlcjsgd3JpdHRlbjogbnVtYmVyIH07XG59XG5cbmludGVyZmFjZSBVaW50OEFycmF5Q29uc3RydWN0b3JXaXRoQmFzZTY0IGV4dGVuZHMgVWludDhBcnJheUNvbnN0cnVjdG9yIHtcbiAgZnJvbUJhc2U2NChcbiAgICBzdHI6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBhbHBoYWJldD86IHN0cmluZzsgbGFzdENodW5rSGFuZGxpbmc/OiBzdHJpbmcgfVxuICApOiBVaW50OEFycmF5O1xuICBmcm9tSGV4KHN0cjogc3RyaW5nKTogVWludDhBcnJheTtcbn1cblxudHlwZSBCYXNlNjRBbHBoYWJldCA9ICdiYXNlNjQnIHwgJ2Jhc2U2NHVybCc7XG50eXBlIExhc3RDaHVua0hhbmRsaW5nID0gJ2xvb3NlJyB8ICdzdHJpY3QnIHwgJ3N0b3AtYmVmb3JlLXBhcnRpYWwnO1xuXG5pbnRlcmZhY2UgVG9CYXNlNjRPcHRpb25zIHtcbiAgYWxwaGFiZXQ/OiBCYXNlNjRBbHBoYWJldDtcbiAgb21pdFBhZGRpbmc/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRnJvbUJhc2U2NE9wdGlvbnMge1xuICBhbHBoYWJldD86IEJhc2U2NEFscGhhYmV0O1xuICBsYXN0Q2h1bmtIYW5kbGluZz86IExhc3RDaHVua0hhbmRsaW5nO1xufVxuXG5pbnRlcmZhY2UgU2V0RnJvbVJlc3VsdCB7XG4gIHJlYWQ6IG51bWJlcjtcbiAgd3JpdHRlbjogbnVtYmVyO1xufVxuXG4vLyBTdGFuZGFyZCBiYXNlNjQgYWxwaGFiZXRcbmNvbnN0IEJBU0U2NF9DSEFSUyA9XG4gICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuLy8gUmV2ZXJzZSBsb29rdXAgdGFibGU6IGNoYXIgY29kZSAtPiBpbmRleCAoZm9yIHN0YW5kYXJkIGJhc2U2NCBhbHBoYWJldClcbmNvbnN0IEJBU0U2NF9MT09LVVAgPSBuZXcgVWludDhBcnJheSgxMjgpLmZpbGwoMjU1KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQkFTRTY0X0NIQVJTLmxlbmd0aDsgaSsrKSB7XG4gIEJBU0U2NF9MT09LVVBbQkFTRTY0X0NIQVJTLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cblxuLy8gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHBlciBzcGVjOiBUQUIsIExGLCBGRiwgQ1IsIFNQQUNFXG5mdW5jdGlvbiBpc0FzY2lpV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlID09PSAweDA5IHx8XG4gICAgY29kZSA9PT0gMHgwYSB8fFxuICAgIGNvZGUgPT09IDB4MGMgfHxcbiAgICBjb2RlID09PSAweDBkIHx8XG4gICAgY29kZSA9PT0gMHgyMFxuICApO1xufVxuXG5mdW5jdGlvbiBza2lwQXNjaWlXaGl0ZXNwYWNlKHN0cjogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCAmJiBpc0FzY2lpV2hpdGVzcGFjZShzdHIuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NENodW5rKFxuICBjaHVuazogc3RyaW5nLFxuICB0aHJvd09uRXh0cmFCaXRzPzogYm9vbGVhblxuKTogbnVtYmVyW10ge1xuICBjb25zdCBjaHVua0xlbmd0aCA9IGNodW5rLmxlbmd0aDtcbiAgbGV0IHBhZGRlZCA9IGNodW5rO1xuICBpZiAoY2h1bmtMZW5ndGggPT09IDIpIHtcbiAgICBwYWRkZWQgPSBjaHVuayArICdBQSc7XG4gIH0gZWxzZSBpZiAoY2h1bmtMZW5ndGggPT09IDMpIHtcbiAgICBwYWRkZWQgPSBjaHVuayArICdBJztcbiAgfVxuXG4gIC8vIERlY29kZSA0IGJhc2U2NCBjaGFycyB0byAzIGJ5dGVzXG4gIGNvbnN0IGIwID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgwKV07XG4gIGNvbnN0IGIxID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgxKV07XG4gIGNvbnN0IGIyID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgyKV07XG4gIGNvbnN0IGIzID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgzKV07XG5cbiAgY29uc3QgYnl0ZTAgPSAoYjAgPDwgMikgfCAoYjEgPj4gNCk7XG4gIGNvbnN0IGJ5dGUxID0gKChiMSAmIDB4MGYpIDw8IDQpIHwgKGIyID4+IDIpO1xuICBjb25zdCBieXRlMiA9ICgoYjIgJiAweDAzKSA8PCA2KSB8IGIzO1xuXG4gIGlmIChjaHVua0xlbmd0aCA9PT0gMikge1xuICAgIGlmICh0aHJvd09uRXh0cmFCaXRzICYmIGJ5dGUxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0V4dHJhIGJpdHMgaW4gYmFzZTY0IGNodW5rJyk7XG4gICAgfVxuICAgIHJldHVybiBbYnl0ZTBdO1xuICB9XG4gIGlmIChjaHVua0xlbmd0aCA9PT0gMykge1xuICAgIGlmICh0aHJvd09uRXh0cmFCaXRzICYmIGJ5dGUyICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0V4dHJhIGJpdHMgaW4gYmFzZTY0IGNodW5rJyk7XG4gICAgfVxuICAgIHJldHVybiBbYnl0ZTAsIGJ5dGUxXTtcbiAgfVxuICByZXR1cm4gW2J5dGUwLCBieXRlMSwgYnl0ZTJdO1xufVxuXG5pbnRlcmZhY2UgRnJvbUJhc2U2NFJlc3VsdCB7XG4gIHJlYWQ6IG51bWJlcjtcbiAgYnl0ZXM6IG51bWJlcltdO1xuICBlcnJvcjogU3ludGF4RXJyb3IgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBmcm9tQmFzZTY0KFxuICBzdHI6IHN0cmluZyxcbiAgYWxwaGFiZXQ6IEJhc2U2NEFscGhhYmV0LFxuICBsYXN0Q2h1bmtIYW5kbGluZzogTGFzdENodW5rSGFuZGxpbmcsXG4gIG1heExlbmd0aD86IG51bWJlclxuKTogRnJvbUJhc2U2NFJlc3VsdCB7XG4gIGlmIChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIG1heExlbmd0aCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICB9XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyByZWFkOiAwLCBieXRlczogW10sIGVycm9yOiBudWxsIH07XG4gIH1cblxuICBsZXQgcmVhZCA9IDA7XG4gIGNvbnN0IGJ5dGVzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgY2h1bmsgPSAnJztcbiAgbGV0IGNodW5rTGVuZ3RoID0gMDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGluZGV4ID0gc2tpcEFzY2lpV2hpdGVzcGFjZShzdHIsIGluZGV4KTtcblxuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBpZiAoY2h1bmtMZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChsYXN0Q2h1bmtIYW5kbGluZyA9PT0gJ3N0b3AtYmVmb3JlLXBhcnRpYWwnKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcmVhZCwgYnl0ZXMsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RDaHVua0hhbmRsaW5nID09PSAnbG9vc2UnKSB7XG4gICAgICAgICAgaWYgKGNodW5rTGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICByZWFkLFxuICAgICAgICAgICAgICBieXRlcyxcbiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBiYXNlNjQ6IGxvbmUgY2hhcmFjdGVyIGluIGZpbmFsIGNodW5rJ1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnl0ZXMucHVzaCguLi5kZWNvZGVCYXNlNjRDaHVuayhjaHVuaywgZmFsc2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdHJpY3RcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZCxcbiAgICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICAgJ0ludmFsaWQgYmFzZTY0OiBpbmNvbXBsZXRlIGNodW5rIGluIHN0cmljdCBtb2RlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyByZWFkOiBsZW5ndGgsIGJ5dGVzLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIGxldCBjaGFyID0gc3RyW2luZGV4XTtcbiAgICBpbmRleCsrO1xuXG4gICAgaWYgKGNoYXIgPT09ICc9Jykge1xuICAgICAgaWYgKGNodW5rTGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlYWQsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcignSW52YWxpZCBiYXNlNjQ6IHBhZGRpbmcgaW4gdW5leHBlY3RlZCBwbGFjZScpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpbmRleCA9IHNraXBBc2NpaVdoaXRlc3BhY2Uoc3RyLCBpbmRleCk7XG5cbiAgICAgIGlmIChjaHVua0xlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChsYXN0Q2h1bmtIYW5kbGluZyA9PT0gJ3N0b3AtYmVmb3JlLXBhcnRpYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZWFkLCBieXRlcywgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWQsXG4gICAgICAgICAgICBieXRlcyxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgU3ludGF4RXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhbGlkIGJhc2U2NDogbWlzc2luZyBzZWNvbmQgcGFkZGluZyBjaGFyYWN0ZXInXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2hhciA9IHN0cltpbmRleF07XG4gICAgICAgIGlmIChjaGFyID09PSAnPScpIHtcbiAgICAgICAgICBpbmRleCA9IHNraXBBc2NpaVdoaXRlc3BhY2Uoc3RyLCBpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlYWQsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkIGJhc2U2NDogdW5leHBlY3RlZCBjaGFyYWN0ZXJzIGFmdGVyIHBhZGRpbmcnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGhyb3dPbkV4dHJhQml0cyA9IGxhc3RDaHVua0hhbmRsaW5nID09PSAnc3RyaWN0JztcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ5dGVzLnB1c2goLi4uZGVjb2RlQmFzZTY0Q2h1bmsoY2h1bmssIHRocm93T25FeHRyYUJpdHMpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhZCwgYnl0ZXMsIGVycm9yOiBlIGFzIFN5bnRheEVycm9yIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyByZWFkOiBsZW5ndGgsIGJ5dGVzLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIGlmIChhbHBoYWJldCA9PT0gJ2Jhc2U2NHVybCcpIHtcbiAgICAgIGlmIChjaGFyID09PSAnKycgfHwgY2hhciA9PT0gJy8nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVhZCxcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBlcnJvcjogbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgYmFzZTY0dXJsOiB1bmV4cGVjdGVkIGNoYXJhY3RlciAnJHtjaGFyfSdgXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSAnLScpIHtcbiAgICAgICAgY2hhciA9ICcrJztcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ18nKSB7XG4gICAgICAgIGNoYXIgPSAnLyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhcmFjdGVyIGlzIGluIHRoZSBzdGFuZGFyZCBiYXNlNjQgYWxwaGFiZXRcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChjb2RlID49IDEyOCB8fCBCQVNFNjRfTE9PS1VQW2NvZGVdID09PSAyNTUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlYWQsXG4gICAgICAgIGJ5dGVzLFxuICAgICAgICBlcnJvcjogbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGJhc2U2NDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgJyR7c3RyW2luZGV4IC0gMV19J2BcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYWRkaW5nIHRoaXMgY2hhcmFjdGVyIHdvdWxkIGV4Y2VlZCBtYXhMZW5ndGhcbiAgICBjb25zdCByZW1haW5pbmcgPSBtYXhMZW5ndGggLSBieXRlcy5sZW5ndGg7XG4gICAgaWYgKFxuICAgICAgKHJlbWFpbmluZyA9PT0gMSAmJiBjaHVua0xlbmd0aCA9PT0gMikgfHxcbiAgICAgIChyZW1haW5pbmcgPT09IDIgJiYgY2h1bmtMZW5ndGggPT09IDMpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyByZWFkLCBieXRlcywgZXJyb3I6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjaHVuayArPSBjaGFyO1xuICAgIGNodW5rTGVuZ3RoID0gY2h1bmsubGVuZ3RoO1xuXG4gICAgaWYgKGNodW5rTGVuZ3RoID09PSA0KSB7XG4gICAgICBieXRlcy5wdXNoKC4uLmRlY29kZUJhc2U2NENodW5rKGNodW5rKSk7XG4gICAgICBjaHVuayA9ICcnO1xuICAgICAgY2h1bmtMZW5ndGggPSAwO1xuICAgICAgcmVhZCA9IGluZGV4O1xuXG4gICAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhZCwgYnl0ZXMsIGVycm9yOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBGcm9tSGV4UmVzdWx0IHtcbiAgcmVhZDogbnVtYmVyO1xuICBieXRlczogbnVtYmVyW107XG4gIGVycm9yOiBTeW50YXhFcnJvciB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZyb21IZXgoc3RyOiBzdHJpbmcsIG1heExlbmd0aD86IG51bWJlcik6IEZyb21IZXhSZXN1bHQge1xuICBpZiAobWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBtYXhMZW5ndGggPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgfVxuXG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGJ5dGVzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgcmVhZCA9IDA7XG5cbiAgaWYgKGxlbmd0aCAlIDIgIT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZDogMCxcbiAgICAgIGJ5dGVzOiBbXSxcbiAgICAgIGVycm9yOiBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgaGV4OiBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgZXZlbicpLFxuICAgIH07XG4gIH1cblxuICB3aGlsZSAocmVhZCA8IGxlbmd0aCAmJiBieXRlcy5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICBjb25zdCBoZXhpdHMgPSBzdHIuc3Vic3RyaW5nKHJlYWQsIHJlYWQgKyAyKTtcbiAgICBpZiAoIS9eWzAtOWEtZkEtRl17Mn0kLy50ZXN0KGhleGl0cykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlYWQsXG4gICAgICAgIGJ5dGVzLFxuICAgICAgICBlcnJvcjogbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGhleDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gJHtyZWFkfWBcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJlYWQgKz0gMjtcbiAgICBieXRlcy5wdXNoKE51bWJlci5wYXJzZUludChoZXhpdHMsIDE2KSk7XG4gIH1cblxuICByZXR1cm4geyByZWFkLCBieXRlcywgZXJyb3I6IG51bGwgfTtcbn1cblxuZnVuY3Rpb24gdG9CYXNlNjQodWludDg6IFVpbnQ4QXJyYXksIG9wdGlvbnM/OiBUb0Jhc2U2NE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBhbHBoYWJldDogQmFzZTY0QWxwaGFiZXQgPSBvcHRpb25zPy5hbHBoYWJldCA/PyAnYmFzZTY0JztcbiAgaWYgKGFscGhhYmV0ICE9PSAnYmFzZTY0JyAmJiBhbHBoYWJldCAhPT0gJ2Jhc2U2NHVybCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgYEludmFsaWQgYWxwaGFiZXQ6IGV4cGVjdGVkIFwiYmFzZTY0XCIgb3IgXCJiYXNlNjR1cmxcIiwgZ290IFwiJHthbHBoYWJldH1cImBcbiAgICApO1xuICB9XG4gIGNvbnN0IG9taXRQYWRkaW5nID0gQm9vbGVhbihvcHRpb25zPy5vbWl0UGFkZGluZyk7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBjb25zdCBsZW4gPSB1aW50OC5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgIGNvbnN0IGIwID0gdWludDhbaV07XG4gICAgY29uc3QgYjEgPSBpICsgMSA8IGxlbiA/IHVpbnQ4W2kgKyAxXSA6IDA7XG4gICAgY29uc3QgYjIgPSBpICsgMiA8IGxlbiA/IHVpbnQ4W2kgKyAyXSA6IDA7XG5cbiAgICByZXN1bHQgKz0gQkFTRTY0X0NIQVJTWyhiMCA+PiAyKSAmIDB4M2ZdO1xuICAgIHJlc3VsdCArPSBCQVNFNjRfQ0hBUlNbKChiMCAmIDB4MDMpIDw8IDQpIHwgKChiMSA+PiA0KSAmIDB4MGYpXTtcblxuICAgIGlmIChpICsgMSA8IGxlbikge1xuICAgICAgcmVzdWx0ICs9IEJBU0U2NF9DSEFSU1soKGIxICYgMHgwZikgPDwgMikgfCAoKGIyID4+IDYpICYgMHgwMyldO1xuICAgIH0gZWxzZSBpZiAoIW9taXRQYWRkaW5nKSB7XG4gICAgICByZXN1bHQgKz0gJz0nO1xuICAgIH1cblxuICAgIGlmIChpICsgMiA8IGxlbikge1xuICAgICAgcmVzdWx0ICs9IEJBU0U2NF9DSEFSU1tiMiAmIDB4M2ZdO1xuICAgIH0gZWxzZSBpZiAoIW9taXRQYWRkaW5nKSB7XG4gICAgICByZXN1bHQgKz0gJz0nO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbHBoYWJldCA9PT0gJ2Jhc2U2NHVybCcpIHtcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0b0hleCh1aW50ODogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGxldCBvdXQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1aW50OC5sZW5ndGg7IGkrKykge1xuICAgIG91dCArPSB1aW50OFtpXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBVaW50OEFycmF5IGJhc2U2NC9oZXggcG9seWZpbGwgb250byB0aGUgZ2l2ZW5cbiAqIFVpbnQ4QXJyYXkgY29uc3RydWN0b3IgYW5kIHByb3RvdHlwZS4gVGhpcyBpcyBkZXNpZ25lZCB0byBiZVxuICogdXNlZCBpbnNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHQsIG9wZXJhdGluZyBvbiB0aGUgVk0nc1xuICogb3duIFVpbnQ4QXJyYXkgcmF0aGVyIHRoYW4gdGhlIGhvc3Qncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxVaW50OEFycmF5QmFzZTY0KFxuICBVaW50OEFycmF5Q3RvcjogdHlwZW9mIFVpbnQ4QXJyYXlcbik6IHZvaWQge1xuICBjb25zdCBwcm90byA9IFVpbnQ4QXJyYXlDdG9yLnByb3RvdHlwZSBhcyBVaW50OEFycmF5V2l0aEJhc2U2NDtcbiAgY29uc3QgY3RvciA9IFVpbnQ4QXJyYXlDdG9yIGFzIFVpbnQ4QXJyYXlDb25zdHJ1Y3RvcldpdGhCYXNlNjQ7XG5cbiAgLy8gVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQoW29wdGlvbnNdKVxuICBpZiAoIXByb3RvLnRvQmFzZTY0KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAndG9CYXNlNjQnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdG9CYXNlNjRNZXRob2QoXG4gICAgICAgIHRoaXM6IFVpbnQ4QXJyYXksXG4gICAgICAgIG9wdGlvbnM/OiBUb0Jhc2U2NE9wdGlvbnNcbiAgICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBVaW50OEFycmF5Q3RvcikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIFVpbnQ4QXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CYXNlNjQodGhpcywgb3B0aW9ucyk7XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvSGV4KClcbiAgaWYgKCFwcm90by50b0hleCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ3RvSGV4Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSGV4TWV0aG9kKHRoaXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVWludDhBcnJheUN0b3IpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBVaW50OEFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvSGV4KHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVaW50OEFycmF5LnByb3RvdHlwZS5zZXRGcm9tQmFzZTY0KHN0cmluZ1ssIG9wdGlvbnNdKVxuICBpZiAoIXByb3RvLnNldEZyb21CYXNlNjQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzZXRGcm9tQmFzZTY0Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZyb21CYXNlNjRNZXRob2QoXG4gICAgICAgIHRoaXM6IFVpbnQ4QXJyYXksXG4gICAgICAgIHN0cjogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogRnJvbUJhc2U2NE9wdGlvbnNcbiAgICAgICk6IFNldEZyb21SZXN1bHQge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVWludDhBcnJheUN0b3IpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBVaW50OEFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbHBoYWJldDogQmFzZTY0QWxwaGFiZXQgPSBvcHRpb25zPy5hbHBoYWJldCA/PyAnYmFzZTY0JztcbiAgICAgICAgaWYgKGFscGhhYmV0ICE9PSAnYmFzZTY0JyAmJiBhbHBoYWJldCAhPT0gJ2Jhc2U2NHVybCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgYWxwaGFiZXQ6IGV4cGVjdGVkIFwiYmFzZTY0XCIgb3IgXCJiYXNlNjR1cmxcIiwgZ290IFwiJHthbHBoYWJldH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RDaHVua0hhbmRsaW5nOiBMYXN0Q2h1bmtIYW5kbGluZyA9XG4gICAgICAgICAgb3B0aW9ucz8ubGFzdENodW5rSGFuZGxpbmcgPz8gJ2xvb3NlJztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhc3RDaHVua0hhbmRsaW5nICE9PSAnbG9vc2UnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdHJpY3QnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdG9wLWJlZm9yZS1wYXJ0aWFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbGFzdENodW5rSGFuZGxpbmc6IGV4cGVjdGVkIFwibG9vc2VcIiwgXCJzdHJpY3RcIiwgb3IgXCJzdG9wLWJlZm9yZS1wYXJ0aWFsXCIsIGdvdCBcIiR7bGFzdENodW5rSGFuZGxpbmd9XCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZyb21CYXNlNjQoXG4gICAgICAgICAgc3RyLFxuICAgICAgICAgIGFscGhhYmV0LFxuICAgICAgICAgIGxhc3RDaHVua0hhbmRsaW5nLFxuICAgICAgICAgIHRoaXMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gcmVzdWx0LmJ5dGVzO1xuICAgICAgICBjb25zdCB3cml0dGVuID0gYnl0ZXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JpdHRlbjsgaSsrKSB7XG4gICAgICAgICAgdGhpc1tpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJlYWQ6IHJlc3VsdC5yZWFkLCB3cml0dGVuIH07XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldEZyb21IZXgoc3RyaW5nKVxuICBpZiAoIXByb3RvLnNldEZyb21IZXgpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzZXRGcm9tSGV4Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZyb21IZXhNZXRob2QoXG4gICAgICAgIHRoaXM6IFVpbnQ4QXJyYXksXG4gICAgICAgIHN0cjogc3RyaW5nXG4gICAgICApOiBTZXRGcm9tUmVzdWx0IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlDdG9yKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgVWludDhBcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBmcm9tSGV4KHN0ciwgdGhpcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBieXRlcyA9IHJlc3VsdC5ieXRlcztcbiAgICAgICAgY29uc3Qgd3JpdHRlbiA9IGJ5dGVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyaXR0ZW47IGkrKykge1xuICAgICAgICAgIHRoaXNbaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZWFkOiByZXN1bHQucmVhZCwgd3JpdHRlbiB9O1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVaW50OEFycmF5LmZyb21CYXNlNjQoc3RyaW5nWywgb3B0aW9uc10pXG4gIGlmICghY3Rvci5mcm9tQmFzZTY0KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4QXJyYXlDdG9yLCAnZnJvbUJhc2U2NCcsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tQmFzZTY0U3RhdGljKFxuICAgICAgICBzdHI6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IEZyb21CYXNlNjRPcHRpb25zXG4gICAgICApOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbHBoYWJldDogQmFzZTY0QWxwaGFiZXQgPSBvcHRpb25zPy5hbHBoYWJldCA/PyAnYmFzZTY0JztcbiAgICAgICAgaWYgKGFscGhhYmV0ICE9PSAnYmFzZTY0JyAmJiBhbHBoYWJldCAhPT0gJ2Jhc2U2NHVybCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgYWxwaGFiZXQ6IGV4cGVjdGVkIFwiYmFzZTY0XCIgb3IgXCJiYXNlNjR1cmxcIiwgZ290IFwiJHthbHBoYWJldH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RDaHVua0hhbmRsaW5nOiBMYXN0Q2h1bmtIYW5kbGluZyA9XG4gICAgICAgICAgb3B0aW9ucz8ubGFzdENodW5rSGFuZGxpbmcgPz8gJ2xvb3NlJztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhc3RDaHVua0hhbmRsaW5nICE9PSAnbG9vc2UnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdHJpY3QnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdG9wLWJlZm9yZS1wYXJ0aWFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbGFzdENodW5rSGFuZGxpbmc6IGV4cGVjdGVkIFwibG9vc2VcIiwgXCJzdHJpY3RcIiwgb3IgXCJzdG9wLWJlZm9yZS1wYXJ0aWFsXCIsIGdvdCBcIiR7bGFzdENodW5rSGFuZGxpbmd9XCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZyb21CYXNlNjQoc3RyLCBhbHBoYWJldCwgbGFzdENodW5rSGFuZGxpbmcpO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5Q3RvcihyZXN1bHQuYnl0ZXMpO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVaW50OEFycmF5LmZyb21IZXgoc3RyaW5nKVxuICBpZiAoIWN0b3IuZnJvbUhleCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50OEFycmF5Q3RvciwgJ2Zyb21IZXgnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUhleFN0YXRpYyhzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZnJvbUhleChzdHIpO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5Q3RvcihyZXN1bHQuYnl0ZXMpO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
406
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWludDhhcnJheS1iYXNlNjQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdm0vdWludDhhcnJheS1iYXNlNjQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBeUNILDJCQUEyQjtBQUMzQixNQUFNLFlBQVksR0FDaEIsa0VBQWtFLENBQUM7QUFFckUsMEVBQTBFO0FBQzFFLE1BQU0sYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzdDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sQ0FDTCxJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJO1FBQ2IsSUFBSSxLQUFLLElBQUk7UUFDYixJQUFJLEtBQUssSUFBSTtRQUNiLElBQUksS0FBSyxJQUFJLENBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ3JELE9BQU8sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEUsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYSxFQUNiLGdCQUEwQjtJQUUxQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lB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SSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztnQkFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNqQixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLENBQUM7Z0JBRUQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvbHlmaWxsIGZvciB0aGUgVEMzOSBVaW50OEFycmF5IGJhc2U2NC9oZXggcHJvcG9zYWwgKFN0YWdlIDQpLlxuICpcbiAqIEltcGxlbWVudHM6XG4gKiAgLSBVaW50OEFycmF5LnByb3RvdHlwZS50b0Jhc2U2NChbb3B0aW9uc10pXG4gKiAgLSBVaW50OEFycmF5LnByb3RvdHlwZS50b0hleCgpXG4gKiAgLSBVaW50OEFycmF5LmZyb21CYXNlNjQoc3RyaW5nWywgb3B0aW9uc10pXG4gKiAgLSBVaW50OEFycmF5LmZyb21IZXgoc3RyaW5nKVxuICogIC0gVWludDhBcnJheS5wcm90b3R5cGUuc2V0RnJvbUJhc2U2NChzdHJpbmdbLCBvcHRpb25zXSlcbiAqICAtIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldEZyb21IZXgoc3RyaW5nKVxuICpcbiAqIEBzZWUgaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWFycmF5YnVmZmVyLWJhc2U2NC9zcGVjL1xuICovXG5cbi8vIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBwb2x5ZmlsbGVkIG1ldGhvZHMuIFRoZXNlIGFyZSBpbnRlbnRpb25hbGx5XG4vLyBOT1QgYGRlY2xhcmUgZ2xvYmFsYCB0byBhdm9pZCBsZWFraW5nIHR5cGVzIHRvIGhvc3Qtc2lkZSBjb2RlOyB0aGUgcG9seWZpbGxcbi8vIGlzIG9ubHkgaW5zdGFsbGVkIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0gY29udGV4dC5cbmludGVyZmFjZSBVaW50OEFycmF5V2l0aEJhc2U2NCBleHRlbmRzIFVpbnQ4QXJyYXkge1xuICB0b0Jhc2U2NChvcHRpb25zPzogeyBhbHBoYWJldD86IHN0cmluZzsgb21pdFBhZGRpbmc/OiBib29sZWFuIH0pOiBzdHJpbmc7XG4gIHRvSGV4KCk6IHN0cmluZztcbiAgc2V0RnJvbUJhc2U2NChcbiAgICBzdHI6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBhbHBoYWJldD86IHN0cmluZzsgbGFzdENodW5rSGFuZGxpbmc/OiBzdHJpbmcgfVxuICApOiB7IHJlYWQ6IG51bWJlcjsgd3JpdHRlbjogbnVtYmVyIH07XG4gIHNldEZyb21IZXgoc3RyOiBzdHJpbmcpOiB7IHJlYWQ6IG51bWJlcjsgd3JpdHRlbjogbnVtYmVyIH07XG59XG5cbmludGVyZmFjZSBVaW50OEFycmF5Q29uc3RydWN0b3JXaXRoQmFzZTY0IGV4dGVuZHMgVWludDhBcnJheUNvbnN0cnVjdG9yIHtcbiAgZnJvbUJhc2U2NChcbiAgICBzdHI6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBhbHBoYWJldD86IHN0cmluZzsgbGFzdENodW5rSGFuZGxpbmc/OiBzdHJpbmcgfVxuICApOiBVaW50OEFycmF5O1xuICBmcm9tSGV4KHN0cjogc3RyaW5nKTogVWludDhBcnJheTtcbn1cblxudHlwZSBCYXNlNjRBbHBoYWJldCA9ICdiYXNlNjQnIHwgJ2Jhc2U2NHVybCc7XG50eXBlIExhc3RDaHVua0hhbmRsaW5nID0gJ2xvb3NlJyB8ICdzdHJpY3QnIHwgJ3N0b3AtYmVmb3JlLXBhcnRpYWwnO1xuXG5pbnRlcmZhY2UgVG9CYXNlNjRPcHRpb25zIHtcbiAgYWxwaGFiZXQ/OiBCYXNlNjRBbHBoYWJldDtcbiAgb21pdFBhZGRpbmc/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRnJvbUJhc2U2NE9wdGlvbnMge1xuICBhbHBoYWJldD86IEJhc2U2NEFscGhhYmV0O1xuICBsYXN0Q2h1bmtIYW5kbGluZz86IExhc3RDaHVua0hhbmRsaW5nO1xufVxuXG5pbnRlcmZhY2UgU2V0RnJvbVJlc3VsdCB7XG4gIHJlYWQ6IG51bWJlcjtcbiAgd3JpdHRlbjogbnVtYmVyO1xufVxuXG4vLyBTdGFuZGFyZCBiYXNlNjQgYWxwaGFiZXRcbmNvbnN0IEJBU0U2NF9DSEFSUyA9XG4gICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuLy8gUmV2ZXJzZSBsb29rdXAgdGFibGU6IGNoYXIgY29kZSAtPiBpbmRleCAoZm9yIHN0YW5kYXJkIGJhc2U2NCBhbHBoYWJldClcbmNvbnN0IEJBU0U2NF9MT09LVVAgPSBuZXcgVWludDhBcnJheSgxMjgpLmZpbGwoMjU1KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQkFTRTY0X0NIQVJTLmxlbmd0aDsgaSsrKSB7XG4gIEJBU0U2NF9MT09LVVBbQkFTRTY0X0NIQVJTLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cblxuLy8gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHBlciBzcGVjOiBUQUIsIExGLCBGRiwgQ1IsIFNQQUNFXG5mdW5jdGlvbiBpc0FzY2lpV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlID09PSAweDA5IHx8XG4gICAgY29kZSA9PT0gMHgwYSB8fFxuICAgIGNvZGUgPT09IDB4MGMgfHxcbiAgICBjb2RlID09PSAweDBkIHx8XG4gICAgY29kZSA9PT0gMHgyMFxuICApO1xufVxuXG5mdW5jdGlvbiBza2lwQXNjaWlXaGl0ZXNwYWNlKHN0cjogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCAmJiBpc0FzY2lpV2hpdGVzcGFjZShzdHIuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NENodW5rKFxuICBjaHVuazogc3RyaW5nLFxuICB0aHJvd09uRXh0cmFCaXRzPzogYm9vbGVhblxuKTogbnVtYmVyW10ge1xuICBjb25zdCBjaHVua0xlbmd0aCA9IGNodW5rLmxlbmd0aDtcbiAgbGV0IHBhZGRlZCA9IGNodW5rO1xuICBpZiAoY2h1bmtMZW5ndGggPT09IDIpIHtcbiAgICBwYWRkZWQgPSBjaHVuayArICdBQSc7XG4gIH0gZWxzZSBpZiAoY2h1bmtMZW5ndGggPT09IDMpIHtcbiAgICBwYWRkZWQgPSBjaHVuayArICdBJztcbiAgfVxuXG4gIC8vIERlY29kZSA0IGJhc2U2NCBjaGFycyB0byAzIGJ5dGVzXG4gIGNvbnN0IGIwID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgwKV07XG4gIGNvbnN0IGIxID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgxKV07XG4gIGNvbnN0IGIyID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgyKV07XG4gIGNvbnN0IGIzID0gQkFTRTY0X0xPT0tVUFtwYWRkZWQuY2hhckNvZGVBdCgzKV07XG5cbiAgY29uc3QgYnl0ZTAgPSAoYjAgPDwgMikgfCAoYjEgPj4gNCk7XG4gIGNvbnN0IGJ5dGUxID0gKChiMSAmIDB4MGYpIDw8IDQpIHwgKGIyID4+IDIpO1xuICBjb25zdCBieXRlMiA9ICgoYjIgJiAweDAzKSA8PCA2KSB8IGIzO1xuXG4gIGlmIChjaHVua0xlbmd0aCA9PT0gMikge1xuICAgIGlmICh0aHJvd09uRXh0cmFCaXRzICYmIGJ5dGUxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0V4dHJhIGJpdHMgaW4gYmFzZTY0IGNodW5rJyk7XG4gICAgfVxuICAgIHJldHVybiBbYnl0ZTBdO1xuICB9XG4gIGlmIChjaHVua0xlbmd0aCA9PT0gMykge1xuICAgIGlmICh0aHJvd09uRXh0cmFCaXRzICYmIGJ5dGUyICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0V4dHJhIGJpdHMgaW4gYmFzZTY0IGNodW5rJyk7XG4gICAgfVxuICAgIHJldHVybiBbYnl0ZTAsIGJ5dGUxXTtcbiAgfVxuICByZXR1cm4gW2J5dGUwLCBieXRlMSwgYnl0ZTJdO1xufVxuXG5pbnRlcmZhY2UgRnJvbUJhc2U2NFJlc3VsdCB7XG4gIHJlYWQ6IG51bWJlcjtcbiAgYnl0ZXM6IG51bWJlcltdO1xuICBlcnJvcjogU3ludGF4RXJyb3IgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBmcm9tQmFzZTY0KFxuICBzdHI6IHN0cmluZyxcbiAgYWxwaGFiZXQ6IEJhc2U2NEFscGhhYmV0LFxuICBsYXN0Q2h1bmtIYW5kbGluZzogTGFzdENodW5rSGFuZGxpbmcsXG4gIG1heExlbmd0aD86IG51bWJlclxuKTogRnJvbUJhc2U2NFJlc3VsdCB7XG4gIGlmIChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIG1heExlbmd0aCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICB9XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyByZWFkOiAwLCBieXRlczogW10sIGVycm9yOiBudWxsIH07XG4gIH1cblxuICBsZXQgcmVhZCA9IDA7XG4gIGNvbnN0IGJ5dGVzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgY2h1bmsgPSAnJztcbiAgbGV0IGNodW5rTGVuZ3RoID0gMDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGluZGV4ID0gc2tpcEFzY2lpV2hpdGVzcGFjZShzdHIsIGluZGV4KTtcblxuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBpZiAoY2h1bmtMZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChsYXN0Q2h1bmtIYW5kbGluZyA9PT0gJ3N0b3AtYmVmb3JlLXBhcnRpYWwnKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcmVhZCwgYnl0ZXMsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RDaHVua0hhbmRsaW5nID09PSAnbG9vc2UnKSB7XG4gICAgICAgICAgaWYgKGNodW5rTGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICByZWFkLFxuICAgICAgICAgICAgICBieXRlcyxcbiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBiYXNlNjQ6IGxvbmUgY2hhcmFjdGVyIGluIGZpbmFsIGNodW5rJ1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnl0ZXMucHVzaCguLi5kZWNvZGVCYXNlNjRDaHVuayhjaHVuaywgZmFsc2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdHJpY3RcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZCxcbiAgICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICAgJ0ludmFsaWQgYmFzZTY0OiBpbmNvbXBsZXRlIGNodW5rIGluIHN0cmljdCBtb2RlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyByZWFkOiBsZW5ndGgsIGJ5dGVzLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIGxldCBjaGFyID0gc3RyW2luZGV4XTtcbiAgICBpbmRleCsrO1xuXG4gICAgaWYgKGNoYXIgPT09ICc9Jykge1xuICAgICAgaWYgKGNodW5rTGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlYWQsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcignSW52YWxpZCBiYXNlNjQ6IHBhZGRpbmcgaW4gdW5leHBlY3RlZCBwbGFjZScpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpbmRleCA9IHNraXBBc2NpaVdoaXRlc3BhY2Uoc3RyLCBpbmRleCk7XG5cbiAgICAgIGlmIChjaHVua0xlbmd0aCA9PT0gMikge1xuICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChsYXN0Q2h1bmtIYW5kbGluZyA9PT0gJ3N0b3AtYmVmb3JlLXBhcnRpYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZWFkLCBieXRlcywgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWQsXG4gICAgICAgICAgICBieXRlcyxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgU3ludGF4RXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhbGlkIGJhc2U2NDogbWlzc2luZyBzZWNvbmQgcGFkZGluZyBjaGFyYWN0ZXInXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2hhciA9IHN0cltpbmRleF07XG4gICAgICAgIGlmIChjaGFyID09PSAnPScpIHtcbiAgICAgICAgICBpbmRleCA9IHNraXBBc2NpaVdoaXRlc3BhY2Uoc3RyLCBpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlYWQsXG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgZXJyb3I6IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkIGJhc2U2NDogdW5leHBlY3RlZCBjaGFyYWN0ZXJzIGFmdGVyIHBhZGRpbmcnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGhyb3dPbkV4dHJhQml0cyA9IGxhc3RDaHVua0hhbmRsaW5nID09PSAnc3RyaWN0JztcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ5dGVzLnB1c2goLi4uZGVjb2RlQmFzZTY0Q2h1bmsoY2h1bmssIHRocm93T25FeHRyYUJpdHMpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhZCwgYnl0ZXMsIGVycm9yOiBlIGFzIFN5bnRheEVycm9yIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyByZWFkOiBsZW5ndGgsIGJ5dGVzLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIGlmIChhbHBoYWJldCA9PT0gJ2Jhc2U2NHVybCcpIHtcbiAgICAgIGlmIChjaGFyID09PSAnKycgfHwgY2hhciA9PT0gJy8nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVhZCxcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBlcnJvcjogbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgYmFzZTY0dXJsOiB1bmV4cGVjdGVkIGNoYXJhY3RlciAnJHtjaGFyfSdgXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSAnLScpIHtcbiAgICAgICAgY2hhciA9ICcrJztcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ18nKSB7XG4gICAgICAgIGNoYXIgPSAnLyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhcmFjdGVyIGlzIGluIHRoZSBzdGFuZGFyZCBiYXNlNjQgYWxwaGFiZXRcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChjb2RlID49IDEyOCB8fCBCQVNFNjRfTE9PS1VQW2NvZGVdID09PSAyNTUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlYWQsXG4gICAgICAgIGJ5dGVzLFxuICAgICAgICBlcnJvcjogbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGJhc2U2NDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgJyR7c3RyW2luZGV4IC0gMV19J2BcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYWRkaW5nIHRoaXMgY2hhcmFjdGVyIHdvdWxkIGV4Y2VlZCBtYXhMZW5ndGhcbiAgICBjb25zdCByZW1haW5pbmcgPSBtYXhMZW5ndGggLSBieXRlcy5sZW5ndGg7XG4gICAgaWYgKFxuICAgICAgKHJlbWFpbmluZyA9PT0gMSAmJiBjaHVua0xlbmd0aCA9PT0gMikgfHxcbiAgICAgIChyZW1haW5pbmcgPT09IDIgJiYgY2h1bmtMZW5ndGggPT09IDMpXG4gICAgKSB7XG4gICAgICByZXR1cm4geyByZWFkLCBieXRlcywgZXJyb3I6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjaHVuayArPSBjaGFyO1xuICAgIGNodW5rTGVuZ3RoID0gY2h1bmsubGVuZ3RoO1xuXG4gICAgaWYgKGNodW5rTGVuZ3RoID09PSA0KSB7XG4gICAgICBieXRlcy5wdXNoKC4uLmRlY29kZUJhc2U2NENodW5rKGNodW5rKSk7XG4gICAgICBjaHVuayA9ICcnO1xuICAgICAgY2h1bmtMZW5ndGggPSAwO1xuICAgICAgcmVhZCA9IGluZGV4O1xuXG4gICAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhZCwgYnl0ZXMsIGVycm9yOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBGcm9tSGV4UmVzdWx0IHtcbiAgcmVhZDogbnVtYmVyO1xuICBieXRlczogbnVtYmVyW107XG4gIGVycm9yOiBTeW50YXhFcnJvciB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZyb21IZXgoc3RyOiBzdHJpbmcsIG1heExlbmd0aD86IG51bWJlcik6IEZyb21IZXhSZXN1bHQge1xuICBpZiAobWF4TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBtYXhMZW5ndGggPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgfVxuXG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGJ5dGVzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgcmVhZCA9IDA7XG5cbiAgaWYgKGxlbmd0aCAlIDIgIT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZDogMCxcbiAgICAgIGJ5dGVzOiBbXSxcbiAgICAgIGVycm9yOiBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgaGV4OiBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgZXZlbicpLFxuICAgIH07XG4gIH1cblxuICB3aGlsZSAocmVhZCA8IGxlbmd0aCAmJiBieXRlcy5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICBjb25zdCBoZXhpdHMgPSBzdHIuc3Vic3RyaW5nKHJlYWQsIHJlYWQgKyAyKTtcbiAgICBpZiAoIS9eWzAtOWEtZkEtRl17Mn0kLy50ZXN0KGhleGl0cykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlYWQsXG4gICAgICAgIGJ5dGVzLFxuICAgICAgICBlcnJvcjogbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGhleDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gJHtyZWFkfWBcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJlYWQgKz0gMjtcbiAgICBieXRlcy5wdXNoKE51bWJlci5wYXJzZUludChoZXhpdHMsIDE2KSk7XG4gIH1cblxuICByZXR1cm4geyByZWFkLCBieXRlcywgZXJyb3I6IG51bGwgfTtcbn1cblxuZnVuY3Rpb24gdG9CYXNlNjQodWludDg6IFVpbnQ4QXJyYXksIG9wdGlvbnM/OiBUb0Jhc2U2NE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBhbHBoYWJldDogQmFzZTY0QWxwaGFiZXQgPSBvcHRpb25zPy5hbHBoYWJldCA/PyAnYmFzZTY0JztcbiAgaWYgKGFscGhhYmV0ICE9PSAnYmFzZTY0JyAmJiBhbHBoYWJldCAhPT0gJ2Jhc2U2NHVybCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgYEludmFsaWQgYWxwaGFiZXQ6IGV4cGVjdGVkIFwiYmFzZTY0XCIgb3IgXCJiYXNlNjR1cmxcIiwgZ290IFwiJHthbHBoYWJldH1cImBcbiAgICApO1xuICB9XG4gIGNvbnN0IG9taXRQYWRkaW5nID0gQm9vbGVhbihvcHRpb25zPy5vbWl0UGFkZGluZyk7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBjb25zdCBsZW4gPSB1aW50OC5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgIGNvbnN0IGIwID0gdWludDhbaV07XG4gICAgY29uc3QgYjEgPSBpICsgMSA8IGxlbiA/IHVpbnQ4W2kgKyAxXSA6IDA7XG4gICAgY29uc3QgYjIgPSBpICsgMiA8IGxlbiA/IHVpbnQ4W2kgKyAyXSA6IDA7XG5cbiAgICByZXN1bHQgKz0gQkFTRTY0X0NIQVJTWyhiMCA+PiAyKSAmIDB4M2ZdO1xuICAgIHJlc3VsdCArPSBCQVNFNjRfQ0hBUlNbKChiMCAmIDB4MDMpIDw8IDQpIHwgKChiMSA+PiA0KSAmIDB4MGYpXTtcblxuICAgIGlmIChpICsgMSA8IGxlbikge1xuICAgICAgcmVzdWx0ICs9IEJBU0U2NF9DSEFSU1soKGIxICYgMHgwZikgPDwgMikgfCAoKGIyID4+IDYpICYgMHgwMyldO1xuICAgIH0gZWxzZSBpZiAoIW9taXRQYWRkaW5nKSB7XG4gICAgICByZXN1bHQgKz0gJz0nO1xuICAgIH1cblxuICAgIGlmIChpICsgMiA8IGxlbikge1xuICAgICAgcmVzdWx0ICs9IEJBU0U2NF9DSEFSU1tiMiAmIDB4M2ZdO1xuICAgIH0gZWxzZSBpZiAoIW9taXRQYWRkaW5nKSB7XG4gICAgICByZXN1bHQgKz0gJz0nO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbHBoYWJldCA9PT0gJ2Jhc2U2NHVybCcpIHtcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0b0hleCh1aW50ODogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGxldCBvdXQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1aW50OC5sZW5ndGg7IGkrKykge1xuICAgIG91dCArPSB1aW50OFtpXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBVaW50OEFycmF5IGJhc2U2NC9oZXggcG9seWZpbGwgb250byB0aGUgZ2l2ZW5cbiAqIFVpbnQ4QXJyYXkgY29uc3RydWN0b3IgYW5kIHByb3RvdHlwZS4gVGhpcyBpcyBkZXNpZ25lZCB0byBiZVxuICogdXNlZCBpbnNpZGUgdGhlIHdvcmtmbG93IFZNIGNvbnRleHQsIG9wZXJhdGluZyBvbiB0aGUgVk0nc1xuICogb3duIFVpbnQ4QXJyYXkgcmF0aGVyIHRoYW4gdGhlIGhvc3Qncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxVaW50OEFycmF5QmFzZTY0KFxuICBVaW50OEFycmF5Q3RvcjogdHlwZW9mIFVpbnQ4QXJyYXlcbik6IHZvaWQge1xuICBjb25zdCBwcm90byA9IFVpbnQ4QXJyYXlDdG9yLnByb3RvdHlwZSBhcyBVaW50OEFycmF5V2l0aEJhc2U2NDtcbiAgY29uc3QgY3RvciA9IFVpbnQ4QXJyYXlDdG9yIGFzIFVpbnQ4QXJyYXlDb25zdHJ1Y3RvcldpdGhCYXNlNjQ7XG5cbiAgLy8gVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQoW29wdGlvbnNdKVxuICBpZiAoIXByb3RvLnRvQmFzZTY0KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAndG9CYXNlNjQnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdG9CYXNlNjRNZXRob2QoXG4gICAgICAgIHRoaXM6IFVpbnQ4QXJyYXksXG4gICAgICAgIG9wdGlvbnM/OiBUb0Jhc2U2NE9wdGlvbnNcbiAgICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBVaW50OEFycmF5Q3RvcikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIFVpbnQ4QXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CYXNlNjQodGhpcywgb3B0aW9ucyk7XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvSGV4KClcbiAgaWYgKCFwcm90by50b0hleCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ3RvSGV4Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvSGV4TWV0aG9kKHRoaXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVWludDhBcnJheUN0b3IpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBVaW50OEFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvSGV4KHRoaXMpO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVaW50OEFycmF5LnByb3RvdHlwZS5zZXRGcm9tQmFzZTY0KHN0cmluZ1ssIG9wdGlvbnNdKVxuICBpZiAoIXByb3RvLnNldEZyb21CYXNlNjQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzZXRGcm9tQmFzZTY0Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZyb21CYXNlNjRNZXRob2QoXG4gICAgICAgIHRoaXM6IFVpbnQ4QXJyYXksXG4gICAgICAgIHN0cjogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogRnJvbUJhc2U2NE9wdGlvbnNcbiAgICAgICk6IFNldEZyb21SZXN1bHQge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVWludDhBcnJheUN0b3IpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBVaW50OEFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbHBoYWJldDogQmFzZTY0QWxwaGFiZXQgPSBvcHRpb25zPy5hbHBoYWJldCA/PyAnYmFzZTY0JztcbiAgICAgICAgaWYgKGFscGhhYmV0ICE9PSAnYmFzZTY0JyAmJiBhbHBoYWJldCAhPT0gJ2Jhc2U2NHVybCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgYWxwaGFiZXQ6IGV4cGVjdGVkIFwiYmFzZTY0XCIgb3IgXCJiYXNlNjR1cmxcIiwgZ290IFwiJHthbHBoYWJldH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RDaHVua0hhbmRsaW5nOiBMYXN0Q2h1bmtIYW5kbGluZyA9XG4gICAgICAgICAgb3B0aW9ucz8ubGFzdENodW5rSGFuZGxpbmcgPz8gJ2xvb3NlJztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhc3RDaHVua0hhbmRsaW5nICE9PSAnbG9vc2UnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdHJpY3QnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdG9wLWJlZm9yZS1wYXJ0aWFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbGFzdENodW5rSGFuZGxpbmc6IGV4cGVjdGVkIFwibG9vc2VcIiwgXCJzdHJpY3RcIiwgb3IgXCJzdG9wLWJlZm9yZS1wYXJ0aWFsXCIsIGdvdCBcIiR7bGFzdENodW5rSGFuZGxpbmd9XCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZyb21CYXNlNjQoXG4gICAgICAgICAgc3RyLFxuICAgICAgICAgIGFscGhhYmV0LFxuICAgICAgICAgIGxhc3RDaHVua0hhbmRsaW5nLFxuICAgICAgICAgIHRoaXMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gcmVzdWx0LmJ5dGVzO1xuICAgICAgICBjb25zdCB3cml0dGVuID0gYnl0ZXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JpdHRlbjsgaSsrKSB7XG4gICAgICAgICAgdGhpc1tpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJlYWQ6IHJlc3VsdC5yZWFkLCB3cml0dGVuIH07XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldEZyb21IZXgoc3RyaW5nKVxuICBpZiAoIXByb3RvLnNldEZyb21IZXgpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzZXRGcm9tSGV4Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZyb21IZXhNZXRob2QoXG4gICAgICAgIHRoaXM6IFVpbnQ4QXJyYXksXG4gICAgICAgIHN0cjogc3RyaW5nXG4gICAgICApOiBTZXRGcm9tUmVzdWx0IHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlDdG9yKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgVWludDhBcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBmcm9tSGV4KHN0ciwgdGhpcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBieXRlcyA9IHJlc3VsdC5ieXRlcztcbiAgICAgICAgY29uc3Qgd3JpdHRlbiA9IGJ5dGVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyaXR0ZW47IGkrKykge1xuICAgICAgICAgIHRoaXNbaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZWFkOiByZXN1bHQucmVhZCwgd3JpdHRlbiB9O1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVaW50OEFycmF5LmZyb21CYXNlNjQoc3RyaW5nWywgb3B0aW9uc10pXG4gIGlmICghY3Rvci5mcm9tQmFzZTY0KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4QXJyYXlDdG9yLCAnZnJvbUJhc2U2NCcsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tQmFzZTY0U3RhdGljKFxuICAgICAgICBzdHI6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IEZyb21CYXNlNjRPcHRpb25zXG4gICAgICApOiBVaW50OEFycmF5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbHBoYWJldDogQmFzZTY0QWxwaGFiZXQgPSBvcHRpb25zPy5hbHBoYWJldCA/PyAnYmFzZTY0JztcbiAgICAgICAgaWYgKGFscGhhYmV0ICE9PSAnYmFzZTY0JyAmJiBhbHBoYWJldCAhPT0gJ2Jhc2U2NHVybCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgYWxwaGFiZXQ6IGV4cGVjdGVkIFwiYmFzZTY0XCIgb3IgXCJiYXNlNjR1cmxcIiwgZ290IFwiJHthbHBoYWJldH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RDaHVua0hhbmRsaW5nOiBMYXN0Q2h1bmtIYW5kbGluZyA9XG4gICAgICAgICAgb3B0aW9ucz8ubGFzdENodW5rSGFuZGxpbmcgPz8gJ2xvb3NlJztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhc3RDaHVua0hhbmRsaW5nICE9PSAnbG9vc2UnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdHJpY3QnICYmXG4gICAgICAgICAgbGFzdENodW5rSGFuZGxpbmcgIT09ICdzdG9wLWJlZm9yZS1wYXJ0aWFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgbGFzdENodW5rSGFuZGxpbmc6IGV4cGVjdGVkIFwibG9vc2VcIiwgXCJzdHJpY3RcIiwgb3IgXCJzdG9wLWJlZm9yZS1wYXJ0aWFsXCIsIGdvdCBcIiR7bGFzdENodW5rSGFuZGxpbmd9XCJgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZyb21CYXNlNjQoc3RyLCBhbHBoYWJldCwgbGFzdENodW5rSGFuZGxpbmcpO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5Q3RvcihyZXN1bHQuYnl0ZXMpO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBVaW50OEFycmF5LmZyb21IZXgoc3RyaW5nKVxuICBpZiAoIWN0b3IuZnJvbUhleCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShVaW50OEFycmF5Q3RvciwgJ2Zyb21IZXgnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUhleFN0YXRpYyhzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZnJvbUhleChzdHIpO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5Q3RvcihyZXN1bHQuYnl0ZXMpO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -23,7 +23,7 @@ export declare class WorkflowAbortSignal {
|
|
|
23
23
|
/**
|
|
24
24
|
* @internal Sets aborted state and fires listeners.
|
|
25
25
|
* Called by abort() on first-run, or by the events consumer on replay.
|
|
26
|
-
* Idempotent
|
|
26
|
+
* Idempotent: second call is a no-op.
|
|
27
27
|
*/
|
|
28
28
|
_setAborted(reason?: unknown): void;
|
|
29
29
|
addEventListener(type: string, listener: () => void): void;
|
|
@@ -38,7 +38,7 @@ export class WorkflowAbortSignal {
|
|
|
38
38
|
/**
|
|
39
39
|
* @internal Sets aborted state and fires listeners.
|
|
40
40
|
* Called by abort() on first-run, or by the events consumer on replay.
|
|
41
|
-
* Idempotent
|
|
41
|
+
* Idempotent: second call is a no-op.
|
|
42
42
|
*/
|
|
43
43
|
_setAborted(reason) {
|
|
44
44
|
if (this.aborted)
|
|
@@ -141,20 +141,20 @@ export function createCreateAbortController(ctx) {
|
|
|
141
141
|
// The abort was recorded in the event log (from a previous run's
|
|
142
142
|
// abort() call, or from a step/external abort). Update signal
|
|
143
143
|
// state and fire listeners at this deterministic point in the
|
|
144
|
-
// promiseQueue
|
|
144
|
+
// promiseQueue, the same ordering as hook payload delivery.
|
|
145
145
|
//
|
|
146
146
|
// The payload is the dehydrated form written by the suspension
|
|
147
147
|
// handler (a Uint8Array, possibly encrypted). Hydrate it via the
|
|
148
148
|
// same machinery as regular hook payloads (workflow/hook.ts:117)
|
|
149
149
|
// so the reason round-trips with full type fidelity. Reading the
|
|
150
|
-
// raw payload here is a bug
|
|
150
|
+
// raw payload here is a bug: it's not a plain object after
|
|
151
151
|
// dehydration, so `'reason' in payload` is false and reason
|
|
152
152
|
// ends up undefined on replay.
|
|
153
153
|
const rawPayload = event.eventData?.payload;
|
|
154
154
|
// An abort is a branch-deciding delivery: `_setAborted` fires the
|
|
155
155
|
// signal's listeners, and a listener is free to invoke a step and
|
|
156
156
|
// draw a ULID. So it registers in the delivery-barrier registry as a
|
|
157
|
-
// 'hook'
|
|
157
|
+
// 'hook' (which is exactly what the event is) so that wait, hook
|
|
158
158
|
// and step deliveries order against it by event-log position rather
|
|
159
159
|
// than by whose hydration finished first. It is always ARMED: unlike
|
|
160
160
|
// a buffered user hook payload, nothing about its delivery waits on
|
|
@@ -163,7 +163,7 @@ export function createCreateAbortController(ctx) {
|
|
|
163
163
|
// Resolving straight off the queue slot was sufficient only while
|
|
164
164
|
// every other delivery also resolved from its slot. Step results no
|
|
165
165
|
// longer do (see step.ts), so an abort whose slot ran while a
|
|
166
|
-
// log-earlier step sat behind a barrier would overtake it
|
|
166
|
+
// log-earlier step sat behind a barrier would overtake it; see
|
|
167
167
|
// `delivery-barrier-coverage.test.ts`.
|
|
168
168
|
//
|
|
169
169
|
// The deferral is captured HERE, at event-consumption time, for the
|
|
@@ -177,8 +177,8 @@ export function createCreateAbortController(ctx) {
|
|
|
177
177
|
// results (step.ts) and hook payloads (workflow/hook.ts) do. The
|
|
178
178
|
// suspension handler dehydrates queued step arguments only once
|
|
179
179
|
// `scheduleWhenIdle` observes `pendingDeliveries === 0`. Without
|
|
180
|
-
// this counter, a step dispatched right after the abort
|
|
181
|
-
// that receives `controller.signal`
|
|
180
|
+
// this counter, a step dispatched right after the abort (e.g. one
|
|
181
|
+
// that receives `controller.signal`) can have its arguments
|
|
182
182
|
// serialized while the abort is still in flight behind
|
|
183
183
|
// `await hydrateStepReturnValue`, capturing `signal.aborted === false`
|
|
184
184
|
// (and a missing reason). Bumping the counter holds the suspension
|
|
@@ -187,7 +187,7 @@ export function createCreateAbortController(ctx) {
|
|
|
187
187
|
//
|
|
188
188
|
// It is released inside the slot, before the detached deferral, so
|
|
189
189
|
// `scheduleWhenIdle` can still reach idle and retire the barriers
|
|
190
|
-
// that deferral may be waiting on
|
|
190
|
+
// that deferral may be waiting on, the same shape as the hook and
|
|
191
191
|
// step paths.
|
|
192
192
|
ctx.pendingDeliveries++;
|
|
193
193
|
ctx.promiseQueue = ctx.promiseQueue.then(async () => {
|
|
@@ -205,7 +205,7 @@ export function createCreateAbortController(ctx) {
|
|
|
205
205
|
}
|
|
206
206
|
catch {
|
|
207
207
|
// Best-effort: if hydration fails, fall back to undefined
|
|
208
|
-
// reason. The signal still aborts; the user
|
|
208
|
+
// reason. The signal still aborts; the user won't see
|
|
209
209
|
// the original reason. Matches WorkflowAbortSignal's spec
|
|
210
210
|
// fallback (DOMException AbortError).
|
|
211
211
|
}
|
|
@@ -215,7 +215,7 @@ export function createCreateAbortController(ctx) {
|
|
|
215
215
|
ctx.pendingDeliveries--;
|
|
216
216
|
}
|
|
217
217
|
// Detached, like the other deliveries: `awaitEarlierDeliveries`
|
|
218
|
-
// may be waiting on a delivery this
|
|
218
|
+
// may be waiting on a delivery this queue itself drives, and
|
|
219
219
|
// blocking a slot on that would deadlock the queue.
|
|
220
220
|
void earlierDelivered.then(() => {
|
|
221
221
|
barrier.markDelivered();
|
|
@@ -275,7 +275,7 @@ export function createAbortSignalStatics() {
|
|
|
275
275
|
return composite;
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
|
-
// Listen to each signal
|
|
278
|
+
// Listen to each signal; first one to abort wins. Track listeners so
|
|
279
279
|
// we can remove them after the composite aborts; otherwise the closures
|
|
280
280
|
// (capturing `composite`) prevent GC for any input signal that outlives
|
|
281
281
|
// the composite (e.g. a long-lived external controller).
|
|
@@ -309,4 +309,4 @@ export function createAbortSignalStatics() {
|
|
|
309
309
|
},
|
|
310
310
|
};
|
|
311
311
|
}
|
|
312
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvcnQtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQVksU0FBUyxDQUFDO0lBRW5CLENBQUMsaUJBQWlCLENBQUMsQ0FBUztJQUM1QixDQUFDLGdCQUFnQixDQUFDLENBQVM7SUFFcEMsVUFBVSxHQUFzQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFpRCxJQUFJLENBQUM7SUFFOUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFxRDtRQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksVUFBa0IsRUFBRSxTQUFpQjtRQUMvQyxJQUFJLENBQUMsaUJB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bUJBQW1CLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztZQUVGLEtBQUssTUFBTSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO29CQUFFLFNBQVM7Z0JBQ3ZDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO2dCQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLElBQUksS0FBSyxDQUNiLGdFQUFnRTtnQkFDOUQsK0NBQStDO2dCQUMvQyxvREFBb0QsQ0FDdkQsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheURpdmVyZ2VuY2VFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgQUJPUlRfSE9PS19UT0tFTiwgQUJPUlRfU1RSRUFNX05BTUUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWQgfSBmcm9tICcuLi91dGlsLmpzJztcblxuLyoqXG4gKiBBIGxpZ2h0d2VpZ2h0IEFib3J0U2lnbmFsIGltcGxlbWVudGF0aW9uIGZvciB0aGUgd29ya2Zsb3cgVk0gY29udGV4dC5cbiAqXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCBsaXN0ZW5lcnMgYXJlIHVwZGF0ZWQgaW4gdHdvIHNjZW5hcmlvczpcbiAqIDEuIE9uIGZpcnN0LXJ1bjogd2hlbiBgYWJvcnQoKWAgaXMgY2FsbGVkIGluIHRoZSB3b3JrZmxvdyBjb2RlXG4gKiAyLiBPbiByZXBsYXk6IHdoZW4gdGhlIGV2ZW50cyBjb25zdW1lciBwcm9jZXNzZXMgdGhlIGBob29rX3JlY2VpdmVkYFxuICogICAgZXZlbnQgKGNoYWluZWQgdGhyb3VnaCBwcm9taXNlUXVldWUgZm9yIGRldGVybWluaXN0aWMgb3JkZXJpbmcpXG4gKlxuICogT24gcmVwbGF5LCBgYWJvcnQoKWAgaW4gdGhlIHdvcmtmbG93IGNvZGUgYmVjb21lcyBhIG5vLW9wIHNpbmNlXG4gKiBgX3NldEFib3J0ZWRgIHdhcyBhbHJlYWR5IGNhbGxlZCBieSB0aGUgZXZlbnRzIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dBYm9ydFNpZ25hbCB7XG4gIGFib3J0ZWQgPSBmYWxzZTtcbiAgcmVhc29uOiB1bmtub3duID0gdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IFtBQk9SVF9TVFJFQU1fTkFNRV06IHN0cmluZztcbiAgcmVhZG9ubHkgW0FCT1JUX0hPT0tfVE9LRU5dOiBzdHJpbmc7XG5cbiAgI2xpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcbiAgI29uYWJvcnQ6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBnZXQgb25hYm9ydCgpOiAoKHRoaXM6IFdvcmtmbG93QWJvcnRTaWduYWwpID0+IHZvaWQpIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI29uYWJvcnQ7XG4gIH1cblxuICBzZXQgb25hYm9ydChoYW5kbGVyOiAoKHRoaXM6IFdvcmtmbG93QWJvcnRTaWduYWwpID0+IHZvaWQpIHwgbnVsbCkge1xuICAgIHRoaXMuI29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkge1xuICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbU5hbWU6IHN0cmluZywgaG9va1Rva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgdGhpc1tBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgU2V0cyBhYm9ydGVkIHN0YXRlIGFuZCBmaXJlcyBsaXN0ZW5lcnMuXG4gICAqIENhbGxlZCBieSBhYm9ydCgpIG9uIGZpcnN0LXJ1biwgb3IgYnkgdGhlIGV2ZW50cyBjb25zdW1lciBvbiByZXBsYXkuXG4gICAqIElkZW1wb3RlbnQg4oCUIHNlY29uZCBjYWxsIGlzIGEgbm8tb3AuXG4gICAqL1xuICBfc2V0QWJvcnRlZChyZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgaWYgKHRoaXMuI29uYWJvcnQpIHtcbiAgICAgIHRoaXMuI29uYWJvcnQuY2FsbCh0aGlzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICAgIHRoaXMuI2xpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgIT09ICdhYm9ydCcpIHJldHVybjtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICAvLyBGaXJlIHN5bmNocm9ub3VzbHksIG5vdCBvbiBhIG1pY3JvdGFzay4gTmF0aXZlIEFib3J0U2lnbmFsIGZpcmVzIG9uIGFcbiAgICAgIC8vIG1pY3JvdGFzayBwZXIgc3BlYywgYnV0IGluc2lkZSB0aGUgd29ya2Zsb3cgVk0gd2UgZGVsaWJlcmF0ZWx5IGRpdmVyZ2VcbiAgICAgIC8vIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheTogbGlzdGVuZXIgb3JkZXJpbmcgbXVzdCBiZSB0aWVkIHRvIHRoZVxuICAgICAgLy8gb3JjaGVzdHJhdG9yJ3Mgc3luYyBleGVjdXRpb24gcGF0aCwgbm90IHRvIG1pY3JvdGFzayBzY2hlZHVsaW5nLlxuICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgIT09ICdhYm9ydCcpIHJldHVybjtcbiAgICB0aGlzLiNsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsICE9PSBsaXN0ZW5lcik7XG4gIH1cblxuICB0aHJvd0lmQWJvcnRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyAoXG4gICAgICAgIHRoaXMucmVhc29uID8/XG4gICAgICAgIG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgd29ya2Zsb3ctY29udGV4dCBgQWJvcnRDb250cm9sbGVyYCBjbGFzcyB0aGF0IHVzZXMgaG9va3MgZm9yXG4gKiBkdXJhYmxlIHN0YXRlIGFuZCBzdHJlYW1zIGZvciByZWFsLXRpbWUgc3RlcCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgYGNyZWF0ZUNyZWF0ZUhvb2soKWAgaW4gYHdvcmtmbG93L2hvb2sudHNgOlxuICogLSBSZWdpc3RlcnMgYSBob29rIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSBvbiBjb25zdHJ1Y3Rpb25cbiAqIC0gU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIGNvbnN1bWVyIGZvciBob29rX2NyZWF0ZWQvaG9va19yZWNlaXZlZCBldmVudHNcbiAqIC0gYGFib3J0KClgIGNhbGxzIGBfc2V0QWJvcnRlZGAgKyBtYXJrcyB0aGUgaG9vayBmb3IgcmVzdW1wdGlvblxuICogLSBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIHByb2Nlc3NlcyB0aGUgYWJvcnQgKGNyZWF0ZXMgZXZlbnQgKyB3cml0ZXMgc3RyZWFtKVxuICogLSBPbiByZXBsYXksIHRoZSBldmVudHMgY29uc3VtZXIgY2FsbHMgYF9zZXRBYm9ydGVkYCB3aGVuIGhvb2tfcmVjZWl2ZWRcbiAqICAgaXMgcHJvY2Vzc2VkLCBhbmQgYGFib3J0KClgIGluIHRoZSB3b3JrZmxvdyBjb2RlIGJlY29tZXMgYSBuby1vcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBjbGFzcyBXb3JrZmxvd0Fib3J0Q29udHJvbGxlciB7XG4gICAgcmVhZG9ubHkgc2lnbmFsOiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICAgIHJlYWRvbmx5IFtBQk9SVF9TVFJFQU1fTkFNRV06IHN0cmluZztcbiAgICByZWFkb25seSBbQUJPUlRfSE9PS19UT0tFTl06IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgY29uc3QgaWQgPSBjdHguZ2VuZXJhdGVVbGlkKCk7XG4gICAgICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgICBjb25zdCBob29rVG9rZW4gPSBgYWJydF8ke2lkfWA7XG5cbiAgICAgIHRoaXNbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIHRoaXNbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGFuIGludGVybmFsIHN5c3RlbSBob29rIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZS5cbiAgICAgIC8vIGlzU3lzdGVtIHByZXZlbnRzIHRva2VuIG5hbWVzcGFjZSBjb25mbGljdHMgd2l0aCB1c2VyIGhvb2tzLlxuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgICB0eXBlOiAnaG9vaycsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rVG9rZW4sXG4gICAgICAgIGlzV2ViaG9vazogZmFsc2UsXG4gICAgICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byBldmVudHMgZm9yIHRoaXMgaG9vaydzIGxpZmVjeWNsZVxuICAgICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50VG9rZW4gPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAmJiAndG9rZW4nIGluIGV2ZW50LmV2ZW50RGF0YVxuICAgICAgICAgICAgPyBldmVudC5ldmVudERhdGEudG9rZW5cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgZXZlbnRUb2tlbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBldmVudFRva2VuICE9PSB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IGFib3J0IGhvb2sgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gdG9rZW4gXCIke2V2ZW50VG9rZW59XCIsIGJ1dCB0aGUgY3VycmVudCBhYm9ydCBob29rIGV4cGVjdHMgXCIke3RoaXNbQUJPUlRfSE9PS19UT0tFTl19XCJgLFxuICAgICAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAgIC8vIFRoZSBhYm9ydCB3YXMgcmVjb3JkZWQgaW4gdGhlIGV2ZW50IGxvZyAoZnJvbSBhIHByZXZpb3VzIHJ1bidzXG4gICAgICAgICAgLy8gYWJvcnQoKSBjYWxsLCBvciBmcm9tIGEgc3RlcC9leHRlcm5hbCBhYm9ydCkuIFVwZGF0ZSBzaWduYWxcbiAgICAgICAgICAvLyBzdGF0ZSBhbmQgZmlyZSBsaXN0ZW5lcnMgYXQgdGhpcyBkZXRlcm1pbmlzdGljIHBvaW50IGluIHRoZVxuICAgICAgICAgIC8vIHByb21pc2VRdWV1ZSDigJQgc2FtZSBvcmRlcmluZyBhcyBob29rIHBheWxvYWQgZGVsaXZlcnkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgZGVoeWRyYXRlZCBmb3JtIHdyaXR0ZW4gYnkgdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAvLyBoYW5kbGVyIChhIFVpbnQ4QXJyYXksIHBvc3NpYmx5IGVuY3J5cHRlZCkuIEh5ZHJhdGUgaXQgdmlhIHRoZVxuICAgICAgICAgIC8vIHNhbWUgbWFjaGluZXJ5IGFzIHJlZ3VsYXIgaG9vayBwYXlsb2FkcyAod29ya2Zsb3cvaG9vay50czoxMTcpXG4gICAgICAgICAgLy8gc28gdGhlIHJlYXNvbiByb3VuZC10cmlwcyB3aXRoIGZ1bGwgdHlwZSBmaWRlbGl0eS4gUmVhZGluZyB0aGVcbiAgICAgICAgICAvLyByYXcgcGF5bG9hZCBoZXJlIGlzIGEgYnVnIOKAlCBpdCdzIG5vdCBhIHBsYWluIG9iamVjdCBhZnRlclxuICAgICAgICAgIC8vIGRlaHlkcmF0aW9uLCBzbyBgJ3JlYXNvbicgaW4gcGF5bG9hZGAgaXMgZmFsc2UgYW5kIHJlYXNvblxuICAgICAgICAgIC8vIGVuZHMgdXAgdW5kZWZpbmVkIG9uIHJlcGxheS5cbiAgICAgICAgICBjb25zdCByYXdQYXlsb2FkID0gZXZlbnQuZXZlbnREYXRhPy5wYXlsb2FkO1xuICAgICAgICAgIC8vIEFuIGFib3J0IGlzIGEgYnJhbmNoLWRlY2lkaW5nIGRlbGl2ZXJ5OiBgX3NldEFib3J0ZWRgIGZpcmVzIHRoZVxuICAgICAgICAgIC8vIHNpZ25hbCdzIGxpc3RlbmVycywgYW5kIGEgbGlzdGVuZXIgaXMgZnJlZSB0byBpbnZva2UgYSBzdGVwIGFuZFxuICAgICAgICAgIC8vIGRyYXcgYSBVTElELiBTbyBpdCByZWdpc3RlcnMgaW4gdGhlIGRlbGl2ZXJ5LWJhcnJpZXIgcmVnaXN0cnkgYXMgYVxuICAgICAgICAgIC8vICdob29rJyDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBldmVudCBpcyDigJQgc28gdGhhdCB3YWl0LCBob29rXG4gICAgICAgICAgLy8gYW5kIHN0ZXAgZGVsaXZlcmllcyBvcmRlciBhZ2FpbnN0IGl0IGJ5IGV2ZW50LWxvZyBwb3NpdGlvbiByYXRoZXJcbiAgICAgICAgICAvLyB0aGFuIGJ5IHdob3NlIGh5ZHJhdGlvbiBmaW5pc2hlZCBmaXJzdC4gSXQgaXMgYWx3YXlzIEFSTUVEOiB1bmxpa2VcbiAgICAgICAgICAvLyBhIGJ1ZmZlcmVkIHVzZXIgaG9vayBwYXlsb2FkLCBub3RoaW5nIGFib3V0IGl0cyBkZWxpdmVyeSB3YWl0cyBvblxuICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgYXNraW5nIGZvciBpdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFJlc29sdmluZyBzdHJhaWdodCBvZmYgdGhlIHF1ZXVlIHNsb3Qgd2FzIHN1ZmZpY2llbnQgb25seSB3aGlsZVxuICAgICAgICAgIC8vIGV2ZXJ5IG90aGVyIGRlbGl2ZXJ5IGFsc28gcmVzb2x2ZWQgZnJvbSBpdHMgc2xvdC4gU3RlcCByZXN1bHRzIG5vXG4gICAgICAgICAgLy8gbG9uZ2VyIGRvIChzZWUgc3RlcC50cyksIHNvIGFuIGFib3J0IHdob3NlIHNsb3QgcmFuIHdoaWxlIGFcbiAgICAgICAgICAvLyBsb2ctZWFybGllciBzdGVwIHNhdCBiZWhpbmQgYSBiYXJyaWVyIHdvdWxkIG92ZXJ0YWtlIGl0IOKAlCBzZWVcbiAgICAgICAgICAvLyBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBkZWZlcnJhbCBpcyBjYXB0dXJlZCBIRVJFLCBhdCBldmVudC1jb25zdW1wdGlvbiB0aW1lLCBmb3IgdGhlXG4gICAgICAgICAgLy8gc2FtZSB0d28gcmVhc29ucyBzcGVsbGVkIG91dCBpbiBzdGVwLnRzOiB0aGUgc2V0IG9mIGVhcmxpZXJcbiAgICAgICAgICAvLyBkZWxpdmVyaWVzIHN0YXlzIGEgZnVuY3Rpb24gb2YgbG9nIHBvc2l0aW9uIGFsb25lLCBhbmQgYmFycmllcnNcbiAgICAgICAgICAvLyB0aGF0IHJldGlyZSBiZWZvcmUgdGhpcyBzbG90IHJ1bnMgYXJlIHN0aWxsIHNlZW4uXG4gICAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IGN0eC5ldmVudHNDb25zdW1lci5ldmVudEluZGV4O1xuICAgICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICdob29rJyk7XG4gICAgICAgICAgY29uc3QgZWFybGllckRlbGl2ZXJlZCA9IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICAgJ2hvb2snXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBY2NvdW50IHRoaXMgYWJvcnQgYXMgYSBwZW5kaW5nIGRlbGl2ZXJ5LCBleGFjdGx5IGxpa2Ugc3RlcFxuICAgICAgICAgIC8vIHJlc3VsdHMgKHN0ZXAudHMpIGFuZCBob29rIHBheWxvYWRzICh3b3JrZmxvdy9ob29rLnRzKSBkby4gVGhlXG4gICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlaHlkcmF0ZXMgcXVldWVkIHN0ZXAgYXJndW1lbnRzIG9ubHkgb25jZVxuICAgICAgICAgIC8vIGBzY2hlZHVsZVdoZW5JZGxlYCBvYnNlcnZlcyBgcGVuZGluZ0RlbGl2ZXJpZXMgPT09IDBgLiBXaXRob3V0XG4gICAgICAgICAgLy8gdGhpcyBjb3VudGVyLCBhIHN0ZXAgZGlzcGF0Y2hlZCByaWdodCBhZnRlciB0aGUgYWJvcnQg4oCUIGUuZy4gb25lXG4gICAgICAgICAgLy8gdGhhdCByZWNlaXZlcyBgY29udHJvbGxlci5zaWduYWxgIOKAlCBjYW4gaGF2ZSBpdHMgYXJndW1lbnRzXG4gICAgICAgICAgLy8gc2VyaWFsaXplZCB3aGlsZSB0aGUgYWJvcnQgaXMgc3RpbGwgaW4gZmxpZ2h0IGJlaGluZFxuICAgICAgICAgIC8vIGBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlYCwgY2FwdHVyaW5nIGBzaWduYWwuYWJvcnRlZCA9PT0gZmFsc2VgXG4gICAgICAgICAgLy8gKGFuZCBhIG1pc3NpbmcgcmVhc29uKS4gQnVtcGluZyB0aGUgY291bnRlciBob2xkcyB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgIC8vIHVudGlsIGBfc2V0QWJvcnRlZGAgaGFzIGxhbmRlZCwgc28gZG93bnN0cmVhbSBzZXJpYWxpemF0aW9uIGlzXG4gICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyByZWdhcmRsZXNzIG9mIHJlYXNvbi1oeWRyYXRpb24gKGRlY3J5cHRpb24pIGxhdGVuY3kuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJdCBpcyByZWxlYXNlZCBpbnNpZGUgdGhlIHNsb3QsIGJlZm9yZSB0aGUgZGV0YWNoZWQgZGVmZXJyYWwsIHNvXG4gICAgICAgICAgLy8gYHNjaGVkdWxlV2hlbklkbGVgIGNhbiBzdGlsbCByZWFjaCBpZGxlIGFuZCByZXRpcmUgdGhlIGJhcnJpZXJzXG4gICAgICAgICAgLy8gdGhhdCBkZWZlcnJhbCBtYXkgYmUgd2FpdGluZyBvbiDigJQgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGhvb2sgYW5kXG4gICAgICAgICAgLy8gc3RlcCBwYXRocy5cbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByZWFzb246IHVua25vd247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAocmF3UGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3R4LnJlcGxheVBheWxvYWRDYWNoZS5wcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgJ3BheWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHJhd1BheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gKGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHJhd1BheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRcbiAgICAgICAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBoeWRyYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaHlkcmF0ZWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICdyZWFzb24nIGluIGh5ZHJhdGVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gaHlkcmF0ZWQucmVhc29uO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBmYWlscywgZmFsbCBiYWNrIHRvIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgLy8gcmVhc29uLiBUaGUgc2lnbmFsIHN0aWxsIGFib3J0czsgdGhlIHVzZXIganVzdCB3b24ndCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCByZWFzb24uIE1hdGNoZXMgV29ya2Zsb3dBYm9ydFNpZ25hbCdzIHNwZWNcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIChET01FeGNlcHRpb24gQWJvcnRFcnJvcikuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERldGFjaGVkLCBsaWtlIHRoZSBvdGhlciBkZWxpdmVyaWVzOiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2BcbiAgICAgICAgICAgIC8vIG1heSBiZSB3YWl0aW5nIG9uIGEgZGVsaXZlcnkgdGhpcyB2ZXJ5IHF1ZXVlIGRyaXZlcywgYW5kXG4gICAgICAgICAgICAvLyBibG9ja2luZyBhIHNsb3Qgb24gdGhhdCB3b3VsZCBkZWFkbG9jayB0aGUgcXVldWUuXG4gICAgICAgICAgICB2b2lkIGVhcmxpZXJEZWxpdmVyZWQudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGJhcnJpZXIubWFya0RlbGl2ZXJlZCgpO1xuICAgICAgICAgICAgICB0aGlzLnNpZ25hbC5fc2V0QWJvcnRlZChyZWFzb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgaGFuZGxlcnMgY2FuIG9ic2VydmUgdGhlIHNhbWUgcGVuZGluZyBhYm9ydCByZXF1ZXN0IGFuZFxuICAgICAgICAgIC8vIGR1cmFibHkgcmVjb3JkIGl0IGJlZm9yZSByZXBsYXkgcmVtb3ZlcyB0aGUgcXVldWUgaXRlbS4gQWJvcnQgaXNcbiAgICAgICAgICAvLyBpZGVtcG90ZW50LCBzbyBjb25zdW1lIGxhdGVyIG1hdGNoaW5nIHJlY2VpcHRzIGFzIG5vLW9wcyBpbnN0ZWFkXG4gICAgICAgICAgLy8gb2Ygc3VyZmFjaW5nIGEgY29ycnVwdGVkIGV2ZW50IGxvZyBhZnRlciB0aGUgZmlyc3QgcmVjZWlwdC5cbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWJvcnQocmVhc29uPzogdW5rbm93bik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuc2lnbmFsLmFib3J0ZWQpIHJldHVybjsgLy8gbm8tb3AgKGFscmVhZHkgYWJvcnRlZCwgZS5nLiBmcm9tIHJlcGxheSlcblxuICAgICAgLy8gVXBkYXRlIHNpZ25hbCBzdGF0ZSBhbmQgZmlyZSBsaXN0ZW5lcnMgc3luY2hyb25vdXNseVxuICAgICAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcblxuICAgICAgLy8gTWFyayB0aGUgaG9vayBmb3IgcmVzdW1wdGlvbiBzbyB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIHJlY29yZHNcbiAgICAgIC8vIHRoZSBhYm9ydCBpbiB0aGUgZXZlbnQgbG9nIGFuZCB3cml0ZXMgdGhlIHN0cmVhbSBwYWNrZXQuXG4gICAgICBmb3IgKGNvbnN0IFssIGl0ZW1dIG9mIGN0eC5pbnZvY2F0aW9uc1F1ZXVlKSB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdob29rJyAmJiBpdGVtLnRva2VuID09PSB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dKSB7XG4gICAgICAgICAgaXRlbS5hYm9ydFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgICAgaXRlbS5hYm9ydFJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgd29ya2Zsb3ctY29udGV4dCBgQWJvcnRTaWduYWxgIG9iamVjdCB3aXRoIHN0YXRpYyBtZXRob2RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJvcnRTaWduYWxTdGF0aWNzKCk6IHtcbiAgYWJvcnQ6IChyZWFzb24/OiB1bmtub3duKSA9PiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICBhbnk6IChcbiAgICBzaWduYWxzOiBJdGVyYWJsZTx7XG4gICAgICBhYm9ydGVkOiBib29sZWFuO1xuICAgICAgcmVhc29uPzogdW5rbm93bjtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbiAgICB9PlxuICApID0+IFdvcmtmbG93QWJvcnRTaWduYWw7XG4gIHRpbWVvdXQ6ICgpID0+IG5ldmVyO1xufSB7XG4gIHJldHVybiB7XG4gICAgYWJvcnQocmVhc29uPzogdW5rbm93bik6IFdvcmtmbG93QWJvcnRTaWduYWwge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoJycsICcnKTtcbiAgICAgIHNpZ25hbC5fc2V0QWJvcnRlZChcbiAgICAgICAgcmVhc29uID8/IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduYWw7XG4gICAgfSxcblxuICAgIGFueShcbiAgICAgIHNpZ25hbHM6IEl0ZXJhYmxlPHtcbiAgICAgICAgYWJvcnRlZDogYm9vbGVhbjtcbiAgICAgICAgcmVhc29uPzogdW5rbm93bjtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG4gICAgICB9PlxuICAgICk6IFdvcmtmbG93QWJvcnRTaWduYWwge1xuICAgICAgY29uc3QgY29tcG9zaXRlID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoJycsICcnKTtcblxuICAgICAgLy8gTWF0ZXJpYWxpemUgdGhlIGl0ZXJhYmxlIG9uY2UuIE5hdGl2ZSBBYm9ydFNpZ25hbC5hbnkgZG9lcyB0aGUgc2FtZTpcbiAgICAgIC8vIHNpbmdsZS1zaG90IGl0ZXJhYmxlcyAoZS5nLiBnZW5lcmF0b3JzKSB3b3VsZCBvdGhlcndpc2UgcHJvZHVjZSB6ZXJvXG4gICAgICAvLyBlbnRyaWVzIG9uIHRoZSBzZWNvbmQgcGFzcyBiZWxvdy5cbiAgICAgIGNvbnN0IGFyciA9IEFycmF5LmZyb20oc2lnbmFscyk7XG5cbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGFycikge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBjb21wb3NpdGUuX3NldEFib3J0ZWQoc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gdG8gZWFjaCBzaWduYWwg4oCUIGZpcnN0IG9uZSB0byBhYm9ydCB3aW5zLiBUcmFjayBsaXN0ZW5lcnMgc29cbiAgICAgIC8vIHdlIGNhbiByZW1vdmUgdGhlbSBhZnRlciB0aGUgY29tcG9zaXRlIGFib3J0czsgb3RoZXJ3aXNlIHRoZSBjbG9zdXJlc1xuICAgICAgLy8gKGNhcHR1cmluZyBgY29tcG9zaXRlYCkgcHJldmVudCBHQyBmb3IgYW55IGlucHV0IHNpZ25hbCB0aGF0IG91dGxpdmVzXG4gICAgICAvLyB0aGUgY29tcG9zaXRlIChlLmcuIGEgbG9uZy1saXZlZCBleHRlcm5hbCBjb250cm9sbGVyKS5cbiAgICAgIGNvbnN0IGxpc3RlbmVyczogQXJyYXk8e1xuICAgICAgICBzaWduYWw6ICh0eXBlb2YgYXJyKVtudW1iZXJdO1xuICAgICAgICBsaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgICAgIH0+ID0gW107XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgc2lnbmFsLCBsaXN0ZW5lciB9IG9mIGxpc3RlbmVycykge1xuICAgICAgICAgIGlmIChzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGFycikge1xuICAgICAgICBpZiAoIXNpZ25hbC5hZGRFdmVudExpc3RlbmVyKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb21wb3NpdGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goeyBzaWduYWwsIGxpc3RlbmVyIH0pO1xuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfSxcblxuICAgIHRpbWVvdXQoKTogbmV2ZXIge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWJvcnRTaWduYWwudGltZW91dCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiAnICtcbiAgICAgICAgICAnVXNlIHNsZWVwKCkgd2l0aCBhbiBBYm9ydENvbnRyb2xsZXIgaW5zdGVhZC4gJyArXG4gICAgICAgICAgJ1NlZTogL2RvY3MvZXJyb3JzL2Fib3J0LXNpZ25hbC10aW1lb3V0LWluLXdvcmtmbG93J1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvcnQtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQVksU0FBUyxDQUFDO0lBRW5CLENBQUMsaUJBQWlCLENBQUMsQ0FBUztJQUM1QixDQUFDLGdCQUFnQixDQUFDLENBQVM7SUFFcEMsVUFBVSxHQUFzQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFpRCxJQUFJLENBQUM7SUFFOUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFxRDtRQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksVUFBa0IsRUFBRSxTQUFpQjtRQUMvQyxJQUFJLENBQUMsaUJB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bUJBQW1CLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztZQUVGLEtBQUssTUFBTSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO29CQUFFLFNBQVM7Z0JBQ3ZDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO2dCQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLElBQUksS0FBSyxDQUNiLGdFQUFnRTtnQkFDOUQsK0NBQStDO2dCQUMvQyxvREFBb0QsQ0FDdkQsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheURpdmVyZ2VuY2VFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgQUJPUlRfSE9PS19UT0tFTiwgQUJPUlRfU1RSRUFNX05BTUUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCB7IGdldEFib3J0U3RyZWFtSWQgfSBmcm9tICcuLi91dGlsLmpzJztcblxuLyoqXG4gKiBBIGxpZ2h0d2VpZ2h0IEFib3J0U2lnbmFsIGltcGxlbWVudGF0aW9uIGZvciB0aGUgd29ya2Zsb3cgVk0gY29udGV4dC5cbiAqXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCBsaXN0ZW5lcnMgYXJlIHVwZGF0ZWQgaW4gdHdvIHNjZW5hcmlvczpcbiAqIDEuIE9uIGZpcnN0LXJ1bjogd2hlbiBgYWJvcnQoKWAgaXMgY2FsbGVkIGluIHRoZSB3b3JrZmxvdyBjb2RlXG4gKiAyLiBPbiByZXBsYXk6IHdoZW4gdGhlIGV2ZW50cyBjb25zdW1lciBwcm9jZXNzZXMgdGhlIGBob29rX3JlY2VpdmVkYFxuICogICAgZXZlbnQgKGNoYWluZWQgdGhyb3VnaCBwcm9taXNlUXVldWUgZm9yIGRldGVybWluaXN0aWMgb3JkZXJpbmcpXG4gKlxuICogT24gcmVwbGF5LCBgYWJvcnQoKWAgaW4gdGhlIHdvcmtmbG93IGNvZGUgYmVjb21lcyBhIG5vLW9wIHNpbmNlXG4gKiBgX3NldEFib3J0ZWRgIHdhcyBhbHJlYWR5IGNhbGxlZCBieSB0aGUgZXZlbnRzIGNvbnN1bWVyLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dBYm9ydFNpZ25hbCB7XG4gIGFib3J0ZWQgPSBmYWxzZTtcbiAgcmVhc29uOiB1bmtub3duID0gdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IFtBQk9SVF9TVFJFQU1fTkFNRV06IHN0cmluZztcbiAgcmVhZG9ubHkgW0FCT1JUX0hPT0tfVE9LRU5dOiBzdHJpbmc7XG5cbiAgI2xpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcbiAgI29uYWJvcnQ6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBnZXQgb25hYm9ydCgpOiAoKHRoaXM6IFdvcmtmbG93QWJvcnRTaWduYWwpID0+IHZvaWQpIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI29uYWJvcnQ7XG4gIH1cblxuICBzZXQgb25hYm9ydChoYW5kbGVyOiAoKHRoaXM6IFdvcmtmbG93QWJvcnRTaWduYWwpID0+IHZvaWQpIHwgbnVsbCkge1xuICAgIHRoaXMuI29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkge1xuICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbU5hbWU6IHN0cmluZywgaG9va1Rva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzW0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gICAgdGhpc1tBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgU2V0cyBhYm9ydGVkIHN0YXRlIGFuZCBmaXJlcyBsaXN0ZW5lcnMuXG4gICAqIENhbGxlZCBieSBhYm9ydCgpIG9uIGZpcnN0LXJ1biwgb3IgYnkgdGhlIGV2ZW50cyBjb25zdW1lciBvbiByZXBsYXkuXG4gICAqIElkZW1wb3RlbnQ6IHNlY29uZCBjYWxsIGlzIGEgbm8tb3AuXG4gICAqL1xuICBfc2V0QWJvcnRlZChyZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgaWYgKHRoaXMuI29uYWJvcnQpIHtcbiAgICAgIHRoaXMuI29uYWJvcnQuY2FsbCh0aGlzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICAgIHRoaXMuI2xpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgIT09ICdhYm9ydCcpIHJldHVybjtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICAvLyBGaXJlIHN5bmNocm9ub3VzbHksIG5vdCBvbiBhIG1pY3JvdGFzay4gTmF0aXZlIEFib3J0U2lnbmFsIGZpcmVzIG9uIGFcbiAgICAgIC8vIG1pY3JvdGFzayBwZXIgc3BlYywgYnV0IGluc2lkZSB0aGUgd29ya2Zsb3cgVk0gd2UgZGVsaWJlcmF0ZWx5IGRpdmVyZ2VcbiAgICAgIC8vIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheTogbGlzdGVuZXIgb3JkZXJpbmcgbXVzdCBiZSB0aWVkIHRvIHRoZVxuICAgICAgLy8gb3JjaGVzdHJhdG9yJ3Mgc3luYyBleGVjdXRpb24gcGF0aCwgbm90IHRvIG1pY3JvdGFzayBzY2hlZHVsaW5nLlxuICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgIT09ICdhYm9ydCcpIHJldHVybjtcbiAgICB0aGlzLiNsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsICE9PSBsaXN0ZW5lcik7XG4gIH1cblxuICB0aHJvd0lmQWJvcnRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyAoXG4gICAgICAgIHRoaXMucmVhc29uID8/XG4gICAgICAgIG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgd29ya2Zsb3ctY29udGV4dCBgQWJvcnRDb250cm9sbGVyYCBjbGFzcyB0aGF0IHVzZXMgaG9va3MgZm9yXG4gKiBkdXJhYmxlIHN0YXRlIGFuZCBzdHJlYW1zIGZvciByZWFsLXRpbWUgc3RlcCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgYGNyZWF0ZUNyZWF0ZUhvb2soKWAgaW4gYHdvcmtmbG93L2hvb2sudHNgOlxuICogLSBSZWdpc3RlcnMgYSBob29rIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSBvbiBjb25zdHJ1Y3Rpb25cbiAqIC0gU3Vic2NyaWJlcyB0byB0aGUgZXZlbnRzIGNvbnN1bWVyIGZvciBob29rX2NyZWF0ZWQvaG9va19yZWNlaXZlZCBldmVudHNcbiAqIC0gYGFib3J0KClgIGNhbGxzIGBfc2V0QWJvcnRlZGAgKyBtYXJrcyB0aGUgaG9vayBmb3IgcmVzdW1wdGlvblxuICogLSBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIHByb2Nlc3NlcyB0aGUgYWJvcnQgKGNyZWF0ZXMgZXZlbnQgKyB3cml0ZXMgc3RyZWFtKVxuICogLSBPbiByZXBsYXksIHRoZSBldmVudHMgY29uc3VtZXIgY2FsbHMgYF9zZXRBYm9ydGVkYCB3aGVuIGhvb2tfcmVjZWl2ZWRcbiAqICAgaXMgcHJvY2Vzc2VkLCBhbmQgYGFib3J0KClgIGluIHRoZSB3b3JrZmxvdyBjb2RlIGJlY29tZXMgYSBuby1vcFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBjbGFzcyBXb3JrZmxvd0Fib3J0Q29udHJvbGxlciB7XG4gICAgcmVhZG9ubHkgc2lnbmFsOiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICAgIHJlYWRvbmx5IFtBQk9SVF9TVFJFQU1fTkFNRV06IHN0cmluZztcbiAgICByZWFkb25seSBbQUJPUlRfSE9PS19UT0tFTl06IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgY29uc3QgaWQgPSBjdHguZ2VuZXJhdGVVbGlkKCk7XG4gICAgICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0QWJvcnRTdHJlYW1JZChpZCk7XG4gICAgICBjb25zdCBob29rVG9rZW4gPSBgYWJydF8ke2lkfWA7XG5cbiAgICAgIHRoaXNbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICAgIHRoaXNbQUJPUlRfSE9PS19UT0tFTl0gPSBob29rVG9rZW47XG4gICAgICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGFuIGludGVybmFsIHN5c3RlbSBob29rIGluIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZS5cbiAgICAgIC8vIGlzU3lzdGVtIHByZXZlbnRzIHRva2VuIG5hbWVzcGFjZSBjb25mbGljdHMgd2l0aCB1c2VyIGhvb2tzLlxuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBob29rXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgICB0eXBlOiAnaG9vaycsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rVG9rZW4sXG4gICAgICAgIGlzV2ViaG9vazogZmFsc2UsXG4gICAgICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byBldmVudHMgZm9yIHRoaXMgaG9vaydzIGxpZmVjeWNsZVxuICAgICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50VG9rZW4gPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAmJiAndG9rZW4nIGluIGV2ZW50LmV2ZW50RGF0YVxuICAgICAgICAgICAgPyBldmVudC5ldmVudERhdGEudG9rZW5cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgZXZlbnRUb2tlbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBldmVudFRva2VuICE9PSB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dXG4gICAgICAgICkge1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IGFib3J0IGhvb2sgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gdG9rZW4gXCIke2V2ZW50VG9rZW59XCIsIGJ1dCB0aGUgY3VycmVudCBhYm9ydCBob29rIGV4cGVjdHMgXCIke3RoaXNbQUJPUlRfSE9PS19UT0tFTl19XCJgLFxuICAgICAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAgIC8vIFRoZSBhYm9ydCB3YXMgcmVjb3JkZWQgaW4gdGhlIGV2ZW50IGxvZyAoZnJvbSBhIHByZXZpb3VzIHJ1bidzXG4gICAgICAgICAgLy8gYWJvcnQoKSBjYWxsLCBvciBmcm9tIGEgc3RlcC9leHRlcm5hbCBhYm9ydCkuIFVwZGF0ZSBzaWduYWxcbiAgICAgICAgICAvLyBzdGF0ZSBhbmQgZmlyZSBsaXN0ZW5lcnMgYXQgdGhpcyBkZXRlcm1pbmlzdGljIHBvaW50IGluIHRoZVxuICAgICAgICAgIC8vIHByb21pc2VRdWV1ZSwgdGhlIHNhbWUgb3JkZXJpbmcgYXMgaG9vayBwYXlsb2FkIGRlbGl2ZXJ5LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhlIHBheWxvYWQgaXMgdGhlIGRlaHlkcmF0ZWQgZm9ybSB3cml0dGVuIGJ5IHRoZSBzdXNwZW5zaW9uXG4gICAgICAgICAgLy8gaGFuZGxlciAoYSBVaW50OEFycmF5LCBwb3NzaWJseSBlbmNyeXB0ZWQpLiBIeWRyYXRlIGl0IHZpYSB0aGVcbiAgICAgICAgICAvLyBzYW1lIG1hY2hpbmVyeSBhcyByZWd1bGFyIGhvb2sgcGF5bG9hZHMgKHdvcmtmbG93L2hvb2sudHM6MTE3KVxuICAgICAgICAgIC8vIHNvIHRoZSByZWFzb24gcm91bmQtdHJpcHMgd2l0aCBmdWxsIHR5cGUgZmlkZWxpdHkuIFJlYWRpbmcgdGhlXG4gICAgICAgICAgLy8gcmF3IHBheWxvYWQgaGVyZSBpcyBhIGJ1ZzogaXQncyBub3QgYSBwbGFpbiBvYmplY3QgYWZ0ZXJcbiAgICAgICAgICAvLyBkZWh5ZHJhdGlvbiwgc28gYCdyZWFzb24nIGluIHBheWxvYWRgIGlzIGZhbHNlIGFuZCByZWFzb25cbiAgICAgICAgICAvLyBlbmRzIHVwIHVuZGVmaW5lZCBvbiByZXBsYXkuXG4gICAgICAgICAgY29uc3QgcmF3UGF5bG9hZCA9IGV2ZW50LmV2ZW50RGF0YT8ucGF5bG9hZDtcbiAgICAgICAgICAvLyBBbiBhYm9ydCBpcyBhIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeTogYF9zZXRBYm9ydGVkYCBmaXJlcyB0aGVcbiAgICAgICAgICAvLyBzaWduYWwncyBsaXN0ZW5lcnMsIGFuZCBhIGxpc3RlbmVyIGlzIGZyZWUgdG8gaW52b2tlIGEgc3RlcCBhbmRcbiAgICAgICAgICAvLyBkcmF3IGEgVUxJRC4gU28gaXQgcmVnaXN0ZXJzIGluIHRoZSBkZWxpdmVyeS1iYXJyaWVyIHJlZ2lzdHJ5IGFzIGFcbiAgICAgICAgICAvLyAnaG9vaycgKHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGUgZXZlbnQgaXMpIHNvIHRoYXQgd2FpdCwgaG9va1xuICAgICAgICAgIC8vIGFuZCBzdGVwIGRlbGl2ZXJpZXMgb3JkZXIgYWdhaW5zdCBpdCBieSBldmVudC1sb2cgcG9zaXRpb24gcmF0aGVyXG4gICAgICAgICAgLy8gdGhhbiBieSB3aG9zZSBoeWRyYXRpb24gZmluaXNoZWQgZmlyc3QuIEl0IGlzIGFsd2F5cyBBUk1FRDogdW5saWtlXG4gICAgICAgICAgLy8gYSBidWZmZXJlZCB1c2VyIGhvb2sgcGF5bG9hZCwgbm90aGluZyBhYm91dCBpdHMgZGVsaXZlcnkgd2FpdHMgb25cbiAgICAgICAgICAvLyB3b3JrZmxvdyBjb2RlIGFza2luZyBmb3IgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBSZXNvbHZpbmcgc3RyYWlnaHQgb2ZmIHRoZSBxdWV1ZSBzbG90IHdhcyBzdWZmaWNpZW50IG9ubHkgd2hpbGVcbiAgICAgICAgICAvLyBldmVyeSBvdGhlciBkZWxpdmVyeSBhbHNvIHJlc29sdmVkIGZyb20gaXRzIHNsb3QuIFN0ZXAgcmVzdWx0cyBub1xuICAgICAgICAgIC8vIGxvbmdlciBkbyAoc2VlIHN0ZXAudHMpLCBzbyBhbiBhYm9ydCB3aG9zZSBzbG90IHJhbiB3aGlsZSBhXG4gICAgICAgICAgLy8gbG9nLWVhcmxpZXIgc3RlcCBzYXQgYmVoaW5kIGEgYmFycmllciB3b3VsZCBvdmVydGFrZSBpdDsgc2VlXG4gICAgICAgICAgLy8gYGRlbGl2ZXJ5LWJhcnJpZXItY292ZXJhZ2UudGVzdC50c2AuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgZGVmZXJyYWwgaXMgY2FwdHVyZWQgSEVSRSwgYXQgZXZlbnQtY29uc3VtcHRpb24gdGltZSwgZm9yIHRoZVxuICAgICAgICAgIC8vIHNhbWUgdHdvIHJlYXNvbnMgc3BlbGxlZCBvdXQgaW4gc3RlcC50czogdGhlIHNldCBvZiBlYXJsaWVyXG4gICAgICAgICAgLy8gZGVsaXZlcmllcyBzdGF5cyBhIGZ1bmN0aW9uIG9mIGxvZyBwb3NpdGlvbiBhbG9uZSwgYW5kIGJhcnJpZXJzXG4gICAgICAgICAgLy8gdGhhdCByZXRpcmUgYmVmb3JlIHRoaXMgc2xvdCBydW5zIGFyZSBzdGlsbCBzZWVuLlxuICAgICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgICBjb25zdCBiYXJyaWVyID0gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoY3R4LCBldmVudEluZGV4LCAnaG9vaycpO1xuICAgICAgICAgIGNvbnN0IGVhcmxpZXJEZWxpdmVyZWQgPSBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAgICdob29rJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQWNjb3VudCB0aGlzIGFib3J0IGFzIGEgcGVuZGluZyBkZWxpdmVyeSwgZXhhY3RseSBsaWtlIHN0ZXBcbiAgICAgICAgICAvLyByZXN1bHRzIChzdGVwLnRzKSBhbmQgaG9vayBwYXlsb2FkcyAod29ya2Zsb3cvaG9vay50cykgZG8uIFRoZVxuICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWh5ZHJhdGVzIHF1ZXVlZCBzdGVwIGFyZ3VtZW50cyBvbmx5IG9uY2VcbiAgICAgICAgICAvLyBgc2NoZWR1bGVXaGVuSWRsZWAgb2JzZXJ2ZXMgYHBlbmRpbmdEZWxpdmVyaWVzID09PSAwYC4gV2l0aG91dFxuICAgICAgICAgIC8vIHRoaXMgY291bnRlciwgYSBzdGVwIGRpc3BhdGNoZWQgcmlnaHQgYWZ0ZXIgdGhlIGFib3J0IChlLmcuIG9uZVxuICAgICAgICAgIC8vIHRoYXQgcmVjZWl2ZXMgYGNvbnRyb2xsZXIuc2lnbmFsYCkgY2FuIGhhdmUgaXRzIGFyZ3VtZW50c1xuICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgd2hpbGUgdGhlIGFib3J0IGlzIHN0aWxsIGluIGZsaWdodCBiZWhpbmRcbiAgICAgICAgICAvLyBgYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZWAsIGNhcHR1cmluZyBgc2lnbmFsLmFib3J0ZWQgPT09IGZhbHNlYFxuICAgICAgICAgIC8vIChhbmQgYSBtaXNzaW5nIHJlYXNvbikuIEJ1bXBpbmcgdGhlIGNvdW50ZXIgaG9sZHMgdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAvLyB1bnRpbCBgX3NldEFib3J0ZWRgIGhhcyBsYW5kZWQsIHNvIGRvd25zdHJlYW0gc2VyaWFsaXphdGlvbiBpc1xuICAgICAgICAgIC8vIGRldGVybWluaXN0aWMgcmVnYXJkbGVzcyBvZiByZWFzb24taHlkcmF0aW9uIChkZWNyeXB0aW9uKSBsYXRlbmN5LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSXQgaXMgcmVsZWFzZWQgaW5zaWRlIHRoZSBzbG90LCBiZWZvcmUgdGhlIGRldGFjaGVkIGRlZmVycmFsLCBzb1xuICAgICAgICAgIC8vIGBzY2hlZHVsZVdoZW5JZGxlYCBjYW4gc3RpbGwgcmVhY2ggaWRsZSBhbmQgcmV0aXJlIHRoZSBiYXJyaWVyc1xuICAgICAgICAgIC8vIHRoYXQgZGVmZXJyYWwgbWF5IGJlIHdhaXRpbmcgb24sIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBob29rIGFuZFxuICAgICAgICAgIC8vIHN0ZXAgcGF0aHMuXG4gICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzKys7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVhc29uOiB1bmtub3duO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKHJhd1BheWxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcmVwYXJlZCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGN0eC5yZXBsYXlQYXlsb2FkQ2FjaGUucHJlcGFyZUV2ZW50UGF5bG9hZChcbiAgICAgICAgICAgICAgICAgICAgICBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICdwYXlsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICByYXdQYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBoeWRyYXRlZCA9IChhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByYXdQYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICAgICApKSBhcyB7IHJlYXNvbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGh5ZHJhdGVkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAncmVhc29uJyBpbiBoeWRyYXRlZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IGh5ZHJhdGVkLnJlYXNvbjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiBpZiBoeWRyYXRpb24gZmFpbHMsIGZhbGwgYmFjayB0byB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlYXNvbi4gVGhlIHNpZ25hbCBzdGlsbCBhYm9ydHM7IHRoZSB1c2VyIHdvbid0IHNlZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHJlYXNvbi4gTWF0Y2hlcyBXb3JrZmxvd0Fib3J0U2lnbmFsJ3Mgc3BlY1xuICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgKERPTUV4Y2VwdGlvbiBBYm9ydEVycm9yKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRGV0YWNoZWQsIGxpa2UgdGhlIG90aGVyIGRlbGl2ZXJpZXM6IGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYFxuICAgICAgICAgICAgLy8gbWF5IGJlIHdhaXRpbmcgb24gYSBkZWxpdmVyeSB0aGlzIHF1ZXVlIGl0c2VsZiBkcml2ZXMsIGFuZFxuICAgICAgICAgICAgLy8gYmxvY2tpbmcgYSBzbG90IG9uIHRoYXQgd291bGQgZGVhZGxvY2sgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgdm9pZCBlYXJsaWVyRGVsaXZlcmVkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgICAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIC8vIE11bHRpcGxlIGhhbmRsZXJzIGNhbiBvYnNlcnZlIHRoZSBzYW1lIHBlbmRpbmcgYWJvcnQgcmVxdWVzdCBhbmRcbiAgICAgICAgICAvLyBkdXJhYmx5IHJlY29yZCBpdCBiZWZvcmUgcmVwbGF5IHJlbW92ZXMgdGhlIHF1ZXVlIGl0ZW0uIEFib3J0IGlzXG4gICAgICAgICAgLy8gaWRlbXBvdGVudCwgc28gY29uc3VtZSBsYXRlciBtYXRjaGluZyByZWNlaXB0cyBhcyBuby1vcHMgaW5zdGVhZFxuICAgICAgICAgIC8vIG9mIHN1cmZhY2luZyBhIGNvcnJ1cHRlZCBldmVudCBsb2cgYWZ0ZXIgdGhlIGZpcnN0IHJlY2VpcHQuXG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFib3J0KHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47IC8vIG5vLW9wIChhbHJlYWR5IGFib3J0ZWQsIGUuZy4gZnJvbSByZXBsYXkpXG5cbiAgICAgIC8vIFVwZGF0ZSBzaWduYWwgc3RhdGUgYW5kIGZpcmUgbGlzdGVuZXJzIHN5bmNocm9ub3VzbHlcbiAgICAgIHRoaXMuc2lnbmFsLl9zZXRBYm9ydGVkKHJlYXNvbik7XG5cbiAgICAgIC8vIE1hcmsgdGhlIGhvb2sgZm9yIHJlc3VtcHRpb24gc28gdGhlIHN1c3BlbnNpb24gaGFuZGxlciByZWNvcmRzXG4gICAgICAvLyB0aGUgYWJvcnQgaW4gdGhlIGV2ZW50IGxvZyBhbmQgd3JpdGVzIHRoZSBzdHJlYW0gcGFja2V0LlxuICAgICAgZm9yIChjb25zdCBbLCBpdGVtXSBvZiBjdHguaW52b2NhdGlvbnNRdWV1ZSkge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnaG9vaycgJiYgaXRlbS50b2tlbiA9PT0gdGhpc1tBQk9SVF9IT09LX1RPS0VOXSkge1xuICAgICAgICAgIGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGl0ZW0uYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHdvcmtmbG93LWNvbnRleHQgYEFib3J0U2lnbmFsYCBvYmplY3Qgd2l0aCBzdGF0aWMgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcygpOiB7XG4gIGFib3J0OiAocmVhc29uPzogdW5rbm93bikgPT4gV29ya2Zsb3dBYm9ydFNpZ25hbDtcbiAgYW55OiAoXG4gICAgc2lnbmFsczogSXRlcmFibGU8e1xuICAgICAgYWJvcnRlZDogYm9vbGVhbjtcbiAgICAgIHJlYXNvbj86IHVua25vd247XG4gICAgICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG4gICAgfT5cbiAgKSA9PiBXb3JrZmxvd0Fib3J0U2lnbmFsO1xuICB0aW1lb3V0OiAoKSA9PiBuZXZlcjtcbn0ge1xuICByZXR1cm4ge1xuICAgIGFib3J0KHJlYXNvbj86IHVua25vd24pOiBXb3JrZmxvd0Fib3J0U2lnbmFsIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKCcnLCAnJyk7XG4gICAgICBzaWduYWwuX3NldEFib3J0ZWQoXG4gICAgICAgIHJlYXNvbiA/PyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJylcbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmFsO1xuICAgIH0sXG5cbiAgICBhbnkoXG4gICAgICBzaWduYWxzOiBJdGVyYWJsZTx7XG4gICAgICAgIGFib3J0ZWQ6IGJvb2xlYW47XG4gICAgICAgIHJlYXNvbj86IHVua25vd247XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuICAgICAgfT5cbiAgICApOiBXb3JrZmxvd0Fib3J0U2lnbmFsIHtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKCcnLCAnJyk7XG5cbiAgICAgIC8vIE1hdGVyaWFsaXplIHRoZSBpdGVyYWJsZSBvbmNlLiBOYXRpdmUgQWJvcnRTaWduYWwuYW55IGRvZXMgdGhlIHNhbWU6XG4gICAgICAvLyBzaW5nbGUtc2hvdCBpdGVyYWJsZXMgKGUuZy4gZ2VuZXJhdG9ycykgd291bGQgb3RoZXJ3aXNlIHByb2R1Y2UgemVyb1xuICAgICAgLy8gZW50cmllcyBvbiB0aGUgc2Vjb25kIHBhc3MgYmVsb3cuXG4gICAgICBjb25zdCBhcnIgPSBBcnJheS5mcm9tKHNpZ25hbHMpO1xuXG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBhcnIpIHtcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIHRvIGVhY2ggc2lnbmFsOyBmaXJzdCBvbmUgdG8gYWJvcnQgd2lucy4gVHJhY2sgbGlzdGVuZXJzIHNvXG4gICAgICAvLyB3ZSBjYW4gcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhlIGNvbXBvc2l0ZSBhYm9ydHM7IG90aGVyd2lzZSB0aGUgY2xvc3VyZXNcbiAgICAgIC8vIChjYXB0dXJpbmcgYGNvbXBvc2l0ZWApIHByZXZlbnQgR0MgZm9yIGFueSBpbnB1dCBzaWduYWwgdGhhdCBvdXRsaXZlc1xuICAgICAgLy8gdGhlIGNvbXBvc2l0ZSAoZS5nLiBhIGxvbmctbGl2ZWQgZXh0ZXJuYWwgY29udHJvbGxlcikuXG4gICAgICBjb25zdCBsaXN0ZW5lcnM6IEFycmF5PHtcbiAgICAgICAgc2lnbmFsOiAodHlwZW9mIGFycilbbnVtYmVyXTtcbiAgICAgICAgbGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gICAgICB9PiA9IFtdO1xuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHNpZ25hbCwgbGlzdGVuZXIgfSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBhcnIpIHtcbiAgICAgICAgaWYgKCFzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcikgY29udGludWU7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgIGlmICghY29tcG9zaXRlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChzaWduYWwucmVhc29uKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHsgc2lnbmFsLCBsaXN0ZW5lciB9KTtcbiAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH0sXG5cbiAgICB0aW1lb3V0KCk6IG5ldmVyIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Fib3J0U2lnbmFsLnRpbWVvdXQoKSBpcyBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gJyArXG4gICAgICAgICAgJ1VzZSBzbGVlcCgpIHdpdGggYW4gQWJvcnRDb250cm9sbGVyIGluc3RlYWQuICcgK1xuICAgICAgICAgICdTZWU6IC9kb2NzL2Vycm9ycy9hYm9ydC1zaWduYWwtdGltZW91dC1pbi13b3JrZmxvdydcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|