@workflow/core 5.0.0-beta.4 → 5.0.0-beta.41
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/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +33 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +71 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +109 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +149 -0
- package/dist/create-hook.d.ts +62 -4
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +189 -0
- package/dist/encryption.d.ts +37 -3
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +97 -31
- package/dist/events-consumer.d.ts +147 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +444 -43
- package/dist/flushable-stream.d.ts +65 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +131 -18
- package/dist/global.d.ts +37 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +246 -8
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +345 -9
- package/dist/replay-payload-cache.d.ts +68 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +160 -0
- package/dist/runtime/compute-instance.d.ts +12 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +13 -0
- package/dist/runtime/constants.d.ts +251 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +425 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +327 -10
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +586 -40
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1437 -0
- package/dist/runtime/quickjs-runtime.d.ts +228 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2372 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2098 -0
- package/dist/runtime/replay-budget.d.ts +89 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +27 -4
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +452 -76
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +8 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +62 -15
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +119 -13
- package/dist/runtime/start.d.ts +70 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +313 -60
- package/dist/runtime/step-executor.d.ts +177 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +946 -0
- package/dist/runtime/step-latency.d.ts +197 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +207 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +69 -0
- package/dist/runtime/suspension-handler.d.ts +109 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +486 -140
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +20 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +32 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +101 -26
- package/dist/runtime.d.ts +17 -12
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3135 -328
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +105 -0
- package/dist/serialization/codec.d.ts +125 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +134 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +186 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/hardened.d.ts +155 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +523 -0
- package/dist/serialization/index.d.ts +20 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +73 -0
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +579 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +478 -0
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +104 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +273 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +35 -0
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +71 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +60 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +276 -56
- package/dist/serialization.d.ts +374 -221
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2300 -783
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +148 -10
- package/dist/step/context-storage.d.ts +61 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +71 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +225 -29
- package/dist/symbols.d.ts +54 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +55 -1
- package/dist/telemetry/semantic-conventions.d.ts +265 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +190 -1
- package/dist/telemetry.d.ts +73 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +153 -16
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +85 -14
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +312 -0
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +302 -36
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +57 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +79 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +831 -553
- package/docs/api-reference/create-hook.mdx +79 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +8 -4
- package/docs/api-reference/index.mdx +3 -0
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +243 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +79 -2
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +21 -17
- package/docs/how-it-works/encryption.mdx +5 -5
- package/docs/how-it-works/event-sourcing.mdx +17 -9
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +31 -13
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -678
package/dist/runtime/start.js
CHANGED
|
@@ -1,19 +1,71 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { isLegacySpecVersion, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT,
|
|
1
|
+
import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
|
|
2
|
+
import { workflowDisplayName } from '@workflow/utils/parse-name';
|
|
3
|
+
import { HOOK_RESUME_INPUT_VERSION, isLegacySpecVersion, PARENT_RUN_ID_ATTRIBUTE, ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
|
|
4
4
|
import { monotonicFactory } from 'ulid';
|
|
5
|
+
import { normalizeAttributeChanges } from '../attribute-changes.js';
|
|
6
|
+
import { getRunCapabilities } from '../capabilities.js';
|
|
7
|
+
import { isRetryableWorldError } from '../classify-error.js';
|
|
5
8
|
import { importKey } from '../encryption.js';
|
|
6
9
|
import { runtimeLogger } from '../logger.js';
|
|
7
|
-
import {
|
|
10
|
+
import { bytesToBase64, decodeRunPublicKey, deriveRunKeyPair, } from '../sealed-box.js';
|
|
11
|
+
import { dehydrateWorkflowArguments, SerializationFormat, sealTo, } from '../serialization.js';
|
|
12
|
+
import { contextStorage } from '../step/context-storage.js';
|
|
8
13
|
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
9
14
|
import { serializeTraceCarrier, trace } from '../telemetry.js';
|
|
10
|
-
import { waitedUntil } from '../util.js';
|
|
11
15
|
import { version as workflowCoreVersion } from '../version.js';
|
|
12
|
-
import {
|
|
16
|
+
import { getWorldLazy } from './get-world-lazy.js';
|
|
17
|
+
import { getWorkflowQueueName, healthCheck } from './helpers.js';
|
|
13
18
|
import { Run } from './run.js';
|
|
14
|
-
import {
|
|
19
|
+
import { getWorkflowVmFromEnv } from './vm-mode.js';
|
|
20
|
+
import { safeWaitUntil, waitedUntil } from './wait-until.js';
|
|
21
|
+
import { assertWorldSupportsRuntimeProtocol } from './world-compatibility.js';
|
|
22
|
+
/**
|
|
23
|
+
* Timeout for the cross-deployment capability probe done before
|
|
24
|
+
* dehydrating workflow arguments. Kept tight on purpose: the probe is
|
|
25
|
+
* an optimization (it lets the caller emit the framed byte-stream wire
|
|
26
|
+
* format when the target supports it), and the fallback on timeout is
|
|
27
|
+
* the legacy raw format which always works. Long delays here would just
|
|
28
|
+
* make `start({ deploymentId: ... })` slower for users whose target
|
|
29
|
+
* deployments don't recognize the health check at all.
|
|
30
|
+
*/
|
|
31
|
+
const CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS = 2_000;
|
|
15
32
|
/** ULID generator for client-side runId generation */
|
|
16
33
|
const ulid = monotonicFactory();
|
|
34
|
+
/**
|
|
35
|
+
* Cross-run lineage for a run being started from inside another run.
|
|
36
|
+
*
|
|
37
|
+
* The ambient step context carries the parent run id and the root of its
|
|
38
|
+
* lineage; the runtime fills both from the run it already has loaded, so this
|
|
39
|
+
* is a pure context read with no I/O. The new run records `$parentRunId` (the
|
|
40
|
+
* edge) and inherits the parent's `$rootRunId` (the parent itself when it is a
|
|
41
|
+
* root), so a daisy chain or fan-out of any depth groups under one root id.
|
|
42
|
+
* Returns `undefined` for a top-level `start()`, which has no context, so
|
|
43
|
+
* standalone runs carry no lineage.
|
|
44
|
+
*/
|
|
45
|
+
function resolveLineageAttributes() {
|
|
46
|
+
const store = contextStorage.getStore();
|
|
47
|
+
const parentRunId = store?.workflowMetadata?.workflowRunId;
|
|
48
|
+
if (!parentRunId)
|
|
49
|
+
return undefined;
|
|
50
|
+
return {
|
|
51
|
+
[ROOT_RUN_ID_ATTRIBUTE]: store.rootRunId ?? parentRunId,
|
|
52
|
+
[PARENT_RUN_ID_ATTRIBUTE]: parentRunId,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// `deploymentId: 'latest'` is a no-op in Worlds without atomic deployments.
|
|
56
|
+
// The warning that explains this only needs to fire once per process: a
|
|
57
|
+
// workflow that hardcodes 'latest' for its Vercel deployment would otherwise
|
|
58
|
+
// log it on every local/Postgres run, flooding tight dev loops.
|
|
59
|
+
let hasWarnedLatestNoOp = false;
|
|
60
|
+
/**
|
|
61
|
+
* Reset the `deploymentId: 'latest'` no-op warn-once guard. Test-only —
|
|
62
|
+
* exported so unit tests can exercise the warn path across `start()` calls.
|
|
63
|
+
*
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
export function _resetLatestNoOpWarnForTests() {
|
|
67
|
+
hasWarnedLatestNoOp = false;
|
|
68
|
+
}
|
|
17
69
|
export async function start(workflow, argsOrOptions, options) {
|
|
18
70
|
'use step';
|
|
19
71
|
return await waitedUntil(() => {
|
|
@@ -22,7 +74,8 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
22
74
|
if (!workflowName) {
|
|
23
75
|
throw new WorkflowRuntimeError(`'start' received an invalid workflow function. Ensure the Workflow SDK is configured correctly and the function includes a 'use workflow' directive.`, { slug: 'start-invalid-workflow-function' });
|
|
24
76
|
}
|
|
25
|
-
|
|
77
|
+
const spanName = `workflow.start ${workflowDisplayName(workflowName)}`;
|
|
78
|
+
return trace(spanName, async (span) => {
|
|
26
79
|
span?.setAttributes({
|
|
27
80
|
...Attribute.WorkflowName(workflowName),
|
|
28
81
|
...Attribute.WorkflowOperation('start'),
|
|
@@ -38,31 +91,155 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
38
91
|
span?.setAttributes({
|
|
39
92
|
...Attribute.WorkflowArgumentsCount(args.length),
|
|
40
93
|
});
|
|
41
|
-
const world = opts
|
|
42
|
-
|
|
94
|
+
const world = opts.world ?? (await getWorldLazy());
|
|
95
|
+
assertWorldSupportsRuntimeProtocol(world);
|
|
96
|
+
const currentDeploymentId = await world.getDeploymentId();
|
|
97
|
+
let deploymentId = opts.deploymentId ?? currentDeploymentId;
|
|
43
98
|
// When 'latest' is requested, resolve the actual latest deployment ID
|
|
44
99
|
// for the current deployment's environment (same production target or
|
|
45
100
|
// same git branch for preview deployments).
|
|
101
|
+
//
|
|
102
|
+
// Resolving 'latest' only means something in worlds with atomic,
|
|
103
|
+
// immutable deployments (e.g. Vercel), which implement
|
|
104
|
+
// resolveLatestDeploymentId(). Worlds without that concept (local dev,
|
|
105
|
+
// self-hosted Postgres) have nothing to resolve between, so rather than
|
|
106
|
+
// fail a run that works fine on Vercel, we warn and fall back to the
|
|
107
|
+
// current deployment — making 'latest' an effective no-op there.
|
|
46
108
|
if (deploymentId === 'latest') {
|
|
47
|
-
if (
|
|
48
|
-
|
|
109
|
+
if (world.resolveLatestDeploymentId) {
|
|
110
|
+
deploymentId = await world.resolveLatestDeploymentId();
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Warn once per process — see hasWarnedLatestNoOp above.
|
|
114
|
+
if (!hasWarnedLatestNoOp) {
|
|
115
|
+
hasWarnedLatestNoOp = true;
|
|
116
|
+
runtimeLogger.warn("deploymentId: 'latest' has no effect in this world and was ignored. " +
|
|
117
|
+
'It is only supported by worlds with atomic deployments, such as Vercel. ' +
|
|
118
|
+
'The run will target the current deployment.', { currentDeploymentId });
|
|
119
|
+
}
|
|
120
|
+
deploymentId = currentDeploymentId;
|
|
49
121
|
}
|
|
50
|
-
deploymentId = await world.resolveLatestDeploymentId();
|
|
51
122
|
}
|
|
52
|
-
|
|
123
|
+
// Decide whether to write byte streams in the framed wire format.
|
|
124
|
+
// For same-deployment starts (the common case) we know the target is
|
|
125
|
+
// running this same SDK version, so framing is safe. For cross-
|
|
126
|
+
// deployment starts (explicit deploymentId or 'latest' that resolves
|
|
127
|
+
// to a different deployment) we probe the target via healthCheck to
|
|
128
|
+
// learn its workflow-core version, then derive the capability. The
|
|
129
|
+
// probe has a tight timeout — on miss/failure we fall back to the
|
|
130
|
+
// legacy raw byte format, which is universally readable.
|
|
131
|
+
//
|
|
132
|
+
// Worlds that don't expose the `streams` API (e.g. minimal test
|
|
133
|
+
// mocks) can't service health checks, so we skip the probe for them.
|
|
53
134
|
// Generate runId client-side so we have it before serialization
|
|
54
|
-
// (required for future E2E encryption where runId is part of the
|
|
55
|
-
|
|
135
|
+
// (required for future E2E encryption where runId is part of the
|
|
136
|
+
// encryption context). When the World provides a `createRunId()`
|
|
137
|
+
// implementation, use it so worlds can embed implementation-specific
|
|
138
|
+
// metadata (e.g., region) into the ID, forwarding the full options
|
|
139
|
+
// bag so worlds can read whichever fields they recognise; otherwise
|
|
140
|
+
// fall back to a standard monotonic ULID.
|
|
141
|
+
const runId = `wrun_${world.createRunId
|
|
142
|
+
? world.createRunId(opts)
|
|
143
|
+
: ulid()}`;
|
|
144
|
+
let framedByteStreams;
|
|
145
|
+
let targetSupportsCompression;
|
|
146
|
+
// The consumer's hook-resume protocol version, stamped onto the new run
|
|
147
|
+
// so a later `resumeHook()` gates its parallel path on the deployment
|
|
148
|
+
// that will actually consume the queue message. `undefined` means "could
|
|
149
|
+
// not attest" and fails the gate closed.
|
|
150
|
+
let targetHookResumeInputVersion;
|
|
151
|
+
// Public key of the target run, when the capability probe was able to
|
|
152
|
+
// supply one (cross-deployment only).
|
|
153
|
+
let probedRunPublicKey;
|
|
154
|
+
if (deploymentId === currentDeploymentId) {
|
|
155
|
+
framedByteStreams = true;
|
|
156
|
+
targetSupportsCompression = true;
|
|
157
|
+
// Same deployment: this process is the consumer, so its own constant
|
|
158
|
+
// is authoritative.
|
|
159
|
+
targetHookResumeInputVersion = HOOK_RESUME_INPUT_VERSION;
|
|
160
|
+
}
|
|
161
|
+
else if (typeof world.streams?.get !== 'function') {
|
|
162
|
+
framedByteStreams = false;
|
|
163
|
+
targetSupportsCompression = false;
|
|
164
|
+
// No probe channel to the target — cannot attest the consumer honors
|
|
165
|
+
// `hookInput`, so leave the marker off (fail closed to sequential).
|
|
166
|
+
targetHookResumeInputVersion = undefined;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Ask for this run's public key while we're here. The probe already
|
|
170
|
+
// blocks `start()` on every cross-deployment call, and the responder
|
|
171
|
+
// executes inside the target deployment where the key material is
|
|
172
|
+
// local — so the key comes back for free on a response we are
|
|
173
|
+
// already awaiting, and we can skip the key-lookup API request
|
|
174
|
+
// entirely. Best-effort: on timeout or an older target, no key comes
|
|
175
|
+
// back and we fall through to the regular lookup below.
|
|
176
|
+
const probe = await healthCheck(world, {
|
|
177
|
+
deploymentId,
|
|
178
|
+
runId,
|
|
179
|
+
timeout: CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS,
|
|
180
|
+
namespace: opts.namespace,
|
|
181
|
+
}).catch(() => undefined);
|
|
182
|
+
probedRunPublicKey = probe?.encryptionPublicKey;
|
|
183
|
+
const capabilities = getRunCapabilities(probe?.workflowCoreVersion);
|
|
184
|
+
framedByteStreams = capabilities.framedByteStreams;
|
|
185
|
+
targetSupportsCompression = capabilities.supportedFormats.has(SerializationFormat.GZIP);
|
|
186
|
+
// The responder runs inside the target deployment, so its
|
|
187
|
+
// `hookResumeInputVersion` reflects the consumer. Undefined on an
|
|
188
|
+
// older target or a probe timeout — leaving the marker off.
|
|
189
|
+
targetHookResumeInputVersion = probe?.hookResumeInputVersion;
|
|
190
|
+
}
|
|
191
|
+
const ops = [];
|
|
56
192
|
// Serialize current trace context to propagate across queue boundary
|
|
57
193
|
const traceCarrier = await serializeTraceCarrier();
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
// specVersion > their SPEC_VERSION_CURRENT via requiresNewerWorld().
|
|
62
|
-
const specVersion = opts.specVersion ??
|
|
63
|
-
world.specVersion ??
|
|
64
|
-
SPEC_VERSION_SUPPORTS_EVENT_SOURCING;
|
|
194
|
+
// Default new runs to the configured world's spec version. The world
|
|
195
|
+
// itself has already been checked against this runtime's spec version.
|
|
196
|
+
const specVersion = opts.specVersion ?? world.specVersion;
|
|
65
197
|
const v1Compat = isLegacySpecVersion(specVersion);
|
|
198
|
+
const allowReservedAttributes = opts.allowReservedAttributes === true;
|
|
199
|
+
let attributes;
|
|
200
|
+
if (opts.attributes && Object.keys(opts.attributes).length > 0) {
|
|
201
|
+
if (specVersion < SPEC_VERSION_SUPPORTS_ATTRIBUTES) {
|
|
202
|
+
throw new WorkflowRuntimeError('Initial workflow attributes require a World that supports spec version 4 or later.');
|
|
203
|
+
}
|
|
204
|
+
// `normalizeAttributeChanges` treats `undefined` as "remove this
|
|
205
|
+
// key", which is meaningless at creation time — reject it up front
|
|
206
|
+
// so JS callers get a clear error instead of a downstream schema
|
|
207
|
+
// failure (the types already forbid non-string values).
|
|
208
|
+
for (const [key, value] of Object.entries(opts.attributes)) {
|
|
209
|
+
if (typeof value !== 'string') {
|
|
210
|
+
throw new WorkflowRuntimeError(`Initial workflow attribute ${JSON.stringify(key)} must be a string value.`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const changes = normalizeAttributeChanges(opts.attributes, {
|
|
214
|
+
allowReservedAttributes,
|
|
215
|
+
});
|
|
216
|
+
attributes = Object.fromEntries(changes.map(({ key, value }) => [key, value]));
|
|
217
|
+
}
|
|
218
|
+
// Cross-run lineage: the reserved keys ride on the run's existing
|
|
219
|
+
// attributes, so they add no extra write. Caller attributes are spread
|
|
220
|
+
// last, so a caller with allowReservedAttributes can deliberately
|
|
221
|
+
// re-parent.
|
|
222
|
+
const lineage = specVersion >= SPEC_VERSION_SUPPORTS_ATTRIBUTES
|
|
223
|
+
? resolveLineageAttributes()
|
|
224
|
+
: undefined;
|
|
225
|
+
const runAttributes = lineage
|
|
226
|
+
? { ...lineage, ...attributes }
|
|
227
|
+
: attributes;
|
|
228
|
+
// Shared by the run_created event and the resilient-start queue input.
|
|
229
|
+
const attributeSeed = runAttributes
|
|
230
|
+
? {
|
|
231
|
+
attributes: runAttributes,
|
|
232
|
+
...(allowReservedAttributes || lineage != null
|
|
233
|
+
? { allowReservedAttributes: true }
|
|
234
|
+
: {}),
|
|
235
|
+
}
|
|
236
|
+
: {};
|
|
237
|
+
// `replayedFromRunId` is a foreign key to the source run; reject anything
|
|
238
|
+
// that isn't a real run ID so the lineage link can't point at garbage.
|
|
239
|
+
if (opts.replayedFromRunId !== undefined &&
|
|
240
|
+
!workflowRunIdSchema.safeParse(opts.replayedFromRunId).success) {
|
|
241
|
+
throw new WorkflowRuntimeError(`replayedFromRunId must be a run ID (wrun_<ulid>); received ${JSON.stringify(String(opts.replayedFromRunId).slice(0, 64))}.`);
|
|
242
|
+
}
|
|
66
243
|
// Resolve encryption key for the new run. The runId has already been
|
|
67
244
|
// generated above (client-generated ULID) and will be used for both
|
|
68
245
|
// key derivation and the run_created event. The World implementation
|
|
@@ -70,18 +247,95 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
70
247
|
// deploymentId (not just the raw opts) so the World can use it for
|
|
71
248
|
// key resolution even when deploymentId was inferred from the environment
|
|
72
249
|
// rather than explicitly provided in opts (e.g., in e2e test runners).
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
250
|
+
// Resolve how to encrypt the workflow arguments.
|
|
251
|
+
//
|
|
252
|
+
// Preferred: the capability probe already told us this run's public
|
|
253
|
+
// key, so seal to it. That skips `getEncryptionKeyForRun`, which for a
|
|
254
|
+
// cross-deployment start is a `run-key` API request — the last one left
|
|
255
|
+
// on this path. It is also a privilege reduction: the caller ends up
|
|
256
|
+
// able to write the arguments but not read them back, whereas fetching
|
|
257
|
+
// the symmetric key grants full read access to a run it merely
|
|
258
|
+
// launched.
|
|
259
|
+
const probedPublicKey = decodeRunPublicKey(probedRunPublicKey);
|
|
260
|
+
let encryptionKey;
|
|
261
|
+
let encryptionPublicKey;
|
|
262
|
+
if (probedPublicKey) {
|
|
263
|
+
encryptionKey = sealTo(probedPublicKey);
|
|
264
|
+
encryptionPublicKey = probedRunPublicKey;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const rawKey = await world.getEncryptionKeyForRun?.(runId, {
|
|
268
|
+
...opts,
|
|
269
|
+
deploymentId,
|
|
270
|
+
});
|
|
271
|
+
encryptionKey = rawKey ? await importKey(rawKey) : undefined;
|
|
272
|
+
// Publish the run's X25519 public key so that cross-run writers (a
|
|
273
|
+
// hook resumption from another deployment, a sibling writing into a
|
|
274
|
+
// forwarded stream) can seal payloads *to* this run without holding
|
|
275
|
+
// its symmetric key.
|
|
276
|
+
//
|
|
277
|
+
// Presence of this field is the writer-side gate for sealed
|
|
278
|
+
// envelopes, so it must only be stamped when this runtime could
|
|
279
|
+
// itself open one. That holds by construction here: derivation and
|
|
280
|
+
// `encp` dispatch live in the same package, so any core that can
|
|
281
|
+
// stamp can also open. Runs are pinned to their creating deployment,
|
|
282
|
+
// so the capability this attests to is still accurate at resume time.
|
|
283
|
+
encryptionPublicKey = rawKey
|
|
284
|
+
? bytesToBase64((await deriveRunKeyPair(rawKey)).publicKey)
|
|
285
|
+
: undefined;
|
|
286
|
+
}
|
|
78
287
|
// Create run via run_created event (event-sourced architecture)
|
|
79
288
|
// Pass client-generated runId - server will accept and use it
|
|
80
|
-
|
|
289
|
+
// Compress workflow arguments only when the run itself is marked as
|
|
290
|
+
// possibly containing compressed payloads (specVersion >= 5) AND the
|
|
291
|
+
// target deployment can decode them (same-deployment, or probed
|
|
292
|
+
// capability for cross-deployment starts).
|
|
293
|
+
const compression = targetSupportsCompression &&
|
|
294
|
+
specVersion >= SPEC_VERSION_SUPPORTS_COMPRESSION;
|
|
295
|
+
const workflowArguments = await dehydrateWorkflowArguments(args, runId, encryptionKey, ops, globalThis, v1Compat, framedByteStreams, compression);
|
|
296
|
+
// The environment this caller's own `run_created` write is attributed
|
|
297
|
+
// to. Stamped into the queue message's `runInput` (NOT into
|
|
298
|
+
// `run_created`, whose tenant the backend already knows) so the
|
|
299
|
+
// deployment that consumes the message can tell whether the run it is
|
|
300
|
+
// being asked to resiliently create was created against a different
|
|
301
|
+
// environment than its own.
|
|
302
|
+
//
|
|
303
|
+
// The two writes below go to different places by different routes:
|
|
304
|
+
// `events.create` is attributed to THIS client's tenant, while the queue
|
|
305
|
+
// message is pinned to a deploymentId. When those disagree — a
|
|
306
|
+
// production-credentialed client pinning a preview deployment — the
|
|
307
|
+
// preview consumer can't find the run in its own tenant, falls back to
|
|
308
|
+
// resilient start, and re-creates it: one client-minted run id, two
|
|
309
|
+
// environments, the production copy pending forever and the preview copy
|
|
310
|
+
// executing. Worlds with a single tenant return undefined and the field
|
|
311
|
+
// is simply absent.
|
|
312
|
+
const creatorEnvironment = world.getEnvironment?.();
|
|
313
|
+
// If WORKFLOW_VM is set on the client starting the run, stamp the
|
|
314
|
+
// engine choice into the run's executionContext so the run keeps
|
|
315
|
+
// executing on the engine it started on (the same deployment can
|
|
316
|
+
// serve both VM engines). Unknown values throw — see
|
|
317
|
+
// getWorkflowVmFromEnv().
|
|
318
|
+
const workflowVm = getWorkflowVmFromEnv();
|
|
81
319
|
const executionContext = {
|
|
82
320
|
traceCarrier,
|
|
83
321
|
workflowCoreVersion,
|
|
84
322
|
features: { encryption: !!encryptionKey },
|
|
323
|
+
// Attest that the *consumer* deployment's runtime re-ensures a
|
|
324
|
+
// `hook_received` event from a queue message's `hookInput` on replay.
|
|
325
|
+
// A resume of this run reads the marker (mirrored onto the hook's
|
|
326
|
+
// resumeContext by the server) to decide whether the parallel fast
|
|
327
|
+
// path is safe. For a cross-deployment start the consumer is the
|
|
328
|
+
// target deployment, so we stamp the *target's* value carried back on
|
|
329
|
+
// the health-check probe — never the caller's. Omitted when we could
|
|
330
|
+
// not attest the target (older target, timeout, or no probe channel),
|
|
331
|
+
// which fails the resume gate closed to the sequential path.
|
|
332
|
+
...(targetHookResumeInputVersion !== undefined
|
|
333
|
+
? { hookResumeInputVersion: targetHookResumeInputVersion }
|
|
334
|
+
: {}),
|
|
335
|
+
...(workflowVm ? { workflowVm } : {}),
|
|
336
|
+
...(opts.replayedFromRunId
|
|
337
|
+
? { replayedFromRunId: opts.replayedFromRunId }
|
|
338
|
+
: {}),
|
|
85
339
|
};
|
|
86
340
|
// Call events.create (run_created) and queue in parallel.
|
|
87
341
|
// If events.create fails with 429/5xx, the run was still accepted
|
|
@@ -95,9 +349,11 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
95
349
|
workflowName: workflowName,
|
|
96
350
|
input: workflowArguments,
|
|
97
351
|
executionContext,
|
|
352
|
+
...(encryptionPublicKey ? { encryptionPublicKey } : {}),
|
|
353
|
+
...attributeSeed,
|
|
98
354
|
},
|
|
99
355
|
}, { v1Compat }),
|
|
100
|
-
world.queue(getWorkflowQueueName(workflowName), {
|
|
356
|
+
world.queue(getWorkflowQueueName(workflowName, opts.namespace), {
|
|
101
357
|
runId,
|
|
102
358
|
traceCarrier,
|
|
103
359
|
...(specVersion >= SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT
|
|
@@ -108,12 +364,22 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
108
364
|
workflowName,
|
|
109
365
|
specVersion,
|
|
110
366
|
executionContext,
|
|
367
|
+
...(encryptionPublicKey ? { encryptionPublicKey } : {}),
|
|
368
|
+
...(creatorEnvironment !== undefined
|
|
369
|
+
? { environment: creatorEnvironment }
|
|
370
|
+
: {}),
|
|
371
|
+
...attributeSeed,
|
|
111
372
|
},
|
|
112
373
|
}
|
|
113
374
|
: {}),
|
|
114
375
|
}, {
|
|
115
376
|
deploymentId,
|
|
116
377
|
specVersion,
|
|
378
|
+
// Forward any caller-supplied region hint so worlds with
|
|
379
|
+
// per-region queue routing (e.g. world-vercel) can target the
|
|
380
|
+
// matching queue. Worlds without a regional dimension ignore
|
|
381
|
+
// this field.
|
|
382
|
+
...(opts.region !== undefined ? { region: opts.region } : {}),
|
|
117
383
|
}),
|
|
118
384
|
]);
|
|
119
385
|
// Queue failure is always fatal — the run was not enqueued
|
|
@@ -130,10 +396,11 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
130
396
|
// + run_started call completes faster. We expect this to be <=1% of cases.
|
|
131
397
|
// In this case, we can safely return.
|
|
132
398
|
}
|
|
133
|
-
else if (
|
|
134
|
-
// 429 (ThrottleError)
|
|
135
|
-
// are retryable — the run was accepted via the
|
|
136
|
-
// will be re-tried by the runtime when it calls
|
|
399
|
+
else if (isRetryableWorldError(err)) {
|
|
400
|
+
// 429 (ThrottleError), 5xx, and transient transport failures
|
|
401
|
+
// (TRANSPORT/TIMEOUT) are retryable — the run was accepted via the
|
|
402
|
+
// queue and creation will be re-tried by the runtime when it calls
|
|
403
|
+
// run_started.
|
|
137
404
|
resilientStart = true;
|
|
138
405
|
runtimeLogger.warn('Run creation event failed, but the run was accepted via the queue. ' +
|
|
139
406
|
'The run_created event will be re-tried async by the runtime.', { workflowRunId: runId, error: err.message });
|
|
@@ -144,26 +411,25 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
144
411
|
}
|
|
145
412
|
else {
|
|
146
413
|
const result = runCreatedResult.value;
|
|
147
|
-
// Assert that the run was created
|
|
148
|
-
if (!result.run) {
|
|
149
|
-
throw new WorkflowRuntimeError("Missing 'run' in server response for 'run_created' event");
|
|
150
|
-
}
|
|
151
414
|
// Verify server accepted our runId
|
|
152
415
|
if (!v1Compat && result.run.runId !== runId) {
|
|
153
416
|
throw new WorkflowRuntimeError(`Server returned different runId than requested: expected ${runId}, got ${result.run.runId}`);
|
|
154
417
|
}
|
|
155
418
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
419
|
+
// These argument-stream ops are flushed in the background; the promise
|
|
420
|
+
// handed to waitUntil must never reject (an unconsumed waitUntil
|
|
421
|
+
// rejection crashes the process as unhandledRejection), so unexpected
|
|
422
|
+
// failures are logged instead.
|
|
423
|
+
safeWaitUntil(Promise.all(ops), (err) => {
|
|
424
|
+
runtimeLogger.warn('Background flush of workflow argument streams failed', {
|
|
425
|
+
workflowRunId: runId,
|
|
426
|
+
error: err instanceof Error ? err.message : String(err),
|
|
427
|
+
});
|
|
428
|
+
});
|
|
162
429
|
span?.setAttributes({
|
|
163
430
|
...Attribute.WorkflowRunId(runId),
|
|
164
431
|
...Attribute.DeploymentId(deploymentId),
|
|
165
|
-
...(runCreatedResult.status === 'fulfilled'
|
|
166
|
-
runCreatedResult.value.run
|
|
432
|
+
...(runCreatedResult.status === 'fulfilled'
|
|
167
433
|
? Attribute.WorkflowRunStatus(runCreatedResult.value.run.status)
|
|
168
434
|
: {}),
|
|
169
435
|
});
|
|
@@ -171,17 +437,4 @@ export async function start(workflow, argsOrOptions, options) {
|
|
|
171
437
|
});
|
|
172
438
|
});
|
|
173
439
|
}
|
|
174
|
-
/**
|
|
175
|
-
* Checks if an error from events.create (run_created) is retryable,
|
|
176
|
-
* meaning the queue can re-try creation later via the run_started path.
|
|
177
|
-
* - ThrottleError (429): rate limited, will succeed later
|
|
178
|
-
* - WorkflowWorldError with status >= 500: server error, will succeed later
|
|
179
|
-
*/
|
|
180
|
-
function isRetryableStartError(err) {
|
|
181
|
-
if (ThrottleError.is(err))
|
|
182
|
-
return true;
|
|
183
|
-
if (WorkflowWorldError.is(err) && err.status && err.status >= 500)
|
|
184
|
-
return true;
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsMENBQTBDLEVBQzFDLG9DQUFvQyxHQUNyQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0QyxzREFBc0Q7QUFDdEQsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztBQXlGaEMsTUFBTSxDQUFDLEtBQUssVUFBVSxLQUFLLENBQ3pCLFFBQTZELEVBQzdELGFBQW9DLEVB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QyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHO1FBQy9ELE9BQU8sSUFBSSxDQUFDO0lBQ2QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdFVudGlsIH0gZnJvbSAnQHZlcmNlbC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgVGhyb3R0bGVFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW52b2tlUGF5bG9hZCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfRVZFTlRfU09VUkNJTkcsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgd2FpdGVkVW50aWwgfSBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3dvcmxkLmpzJztcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBjdXJyZW50bHkgYSBWZXJjZWwtc3BlY2lmaWMgZmVhdHVyZS5cbiAgICpcbiAgICogKipOb3RlOioqIFdoZW4gYGRlcGxveW1lbnRJZGAgaXMgcHJvdmlkZWQsIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIGJlY29tZSBgdW5rbm93bmBcbiAgICogc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSB0eXBlcyB3aWxsIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgZGVwbG95bWVudElkOiAnbGF0ZXN0JyB8IChzdHJpbmcgJiB7fSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICBkZXBsb3ltZW50SWQ/OiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXJ0T3B0aW9ucyA9XG4gIHwgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuICB8IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dGdW5jdGlvbjxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSAoXG4gIC4uLmFyZ3M6IFRBcmdzXG4pID0+IFByb21pc2U8VFJlc3VsdD47XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1ldGFkYXRhIG9mIGEgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93TWV0YWRhdGEgPSB7IHdvcmtmbG93SWQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24gdG8gc3RhcnQuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3cgKG9wdGlvbmFsKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3b3JrZmxvdyBydW4gKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcnVuIElEIGZvciB0aGUgbmV3bHkgc3RhcnRlZCB3b3JrZmxvdyBpbnZvY2F0aW9uLlxuICovXG4vLyBPdmVybG9hZHMgd2l0aCBkZXBsb3ltZW50SWQgLSBhcmdzIGFuZCByZXR1cm4gdHlwZSBiZWNvbWUgdW5rbm93blxuLy8gVXNlcyBnZW5lcmljcyBzbyB0eXBlZCB3b3JrZmxvd3MgYXJlIGFzc2lnbmFibGUgKGF2b2lkcyBjb250cmF2YXJpYW5jZSBpc3N1ZXMpLFxuLy8gYnV0IHRoZSByZXR1cm4gdHlwZSBhbmQgYXJncyBhcmUgc3RpbGwgdW5rbm93biBzaW5jZSB0aGUgZGVwbG95ZWQgdmVyc2lvbiBtYXkgZGlmZmVyLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogdW5rbm93bltdLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG4vLyBPdmVybG9hZHMgd2l0aG91dCBkZXBsb3ltZW50SWQgLSBwcmVzZXJ2ZSB0eXBlIGluZmVyZW5jZVxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogVEFyZ3MsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnc09yT3B0aW9ucz86IFRBcmdzIHwgU3RhcnRPcHRpb25zLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zXG4pIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgZmllbGQgaXMgYWRkZWQgYnkgb3VyIGNsaWVudCB0cmFuc2Zvcm1cbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSB3b3JrZmxvdz8ud29ya2Zsb3dJZDtcblxuICAgIGlmICghd29ya2Zsb3dOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGAnc3RhcnQnIHJlY2VpdmVkIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24uIEVuc3VyZSB0aGUgV29ya2Zsb3cgU0RLIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24gaW5jbHVkZXMgYSAndXNlIHdvcmtmbG93JyBkaXJlY3RpdmUuYCxcbiAgICAgICAgeyBzbHVnOiAnc3RhcnQtaW52YWxpZC13b3JrZmxvdy1mdW5jdGlvbicgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2UoYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dOYW1lfWAsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gICAgICB9KTtcblxuICAgICAgbGV0IGFyZ3M6IFNlcmlhbGl6YWJsZVtdID0gW107XG4gICAgICBsZXQgb3B0czogU3RhcnRPcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NPck9wdGlvbnMpKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzT3JPcHRpb25zIGFzIFNlcmlhbGl6YWJsZVtdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnc09yT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NPck9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChhcmdzLmxlbmd0aCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBvcHRzPy53b3JsZCA/PyAoYXdhaXQgZ2V0V29ybGQoKSk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gKGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpKTtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICghd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIFwiZGVwbG95bWVudElkICdsYXRlc3QnIHJlcXVpcmVzIGEgV29ybGQgdGhhdCBpbXBsZW1lbnRzIHJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlIGVuY3J5cHRpb24gY29udGV4dClcbiAgICAgIGNvbnN0IHJ1bklkID0gYHdydW5fJHt1bGlkKCl9YDtcblxuICAgICAgLy8gU2VyaWFsaXplIGN1cnJlbnQgdHJhY2UgY29udGV4dCB0byBwcm9wYWdhdGUgYWNyb3NzIHF1ZXVlIGJvdW5kYXJ5XG4gICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTtcblxuICAgICAgLy8gVXNlIHdvcmxkLWRlY2xhcmVkIHNwZWNWZXJzaW9uIHdoZW4gYXZhaWxhYmxlIChvdXIgd29ybGRzIHNldCB0aGlzKSxcbiAgICAgIC8vIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIHNhZmUgYmFzZWxpbmUgdGhhdCBjb21tdW5pdHkgd29ybGRzIGhhbmRsZS5cbiAgICAgIC8vIENvbW11bml0eSB3b3JsZHMgYnVpbHQgYWdhaW5zdCBvbGRlciBAd29ya2Zsb3cvd29ybGQgcmVqZWN0IHJ1bnMgd2l0aFxuICAgICAgLy8gc3BlY1ZlcnNpb24gPiB0aGVpciBTUEVDX1ZFUlNJT05fQ1VSUkVOVCB2aWEgcmVxdWlyZXNOZXdlcldvcmxkKCkuXG4gICAgICBjb25zdCBzcGVjVmVyc2lvbiA9XG4gICAgICAgIG9wdHMuc3BlY1ZlcnNpb24gPz9cbiAgICAgICAgd29ybGQuc3BlY1ZlcnNpb24gPz9cbiAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0VWRU5UX1NPVVJDSU5HO1xuICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKHNwZWNWZXJzaW9uKTtcblxuICAgICAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIG5ldyBydW4uIFRoZSBydW5JZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAvLyBnZW5lcmF0ZWQgYWJvdmUgKGNsaWVudC1nZW5lcmF0ZWQgVUxJRCkgYW5kIHdpbGwgYmUgdXNlZCBmb3IgYm90aFxuICAgICAgLy8ga2V5IGRlcml2YXRpb24gYW5kIHRoZSBydW5fY3JlYXRlZCBldmVudC4gVGhlIFdvcmxkIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyB1c2VzIHRoZSBydW5JZCBmb3IgcGVyLXJ1biBIS0RGIGtleSBkZXJpdmF0aW9uLiBXZSBwYXNzIHRoZSByZXNvbHZlZFxuICAgICAgLy8gZGVwbG95bWVudElkIChub3QganVzdCB0aGUgcmF3IG9wdHMpIHNvIHRoZSBXb3JsZCBjYW4gdXNlIGl0IGZvclxuICAgICAgLy8ga2V5IHJlc29sdXRpb24gZXZlbiB3aGVuIGRlcGxveW1lbnRJZCB3YXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gb3B0cyAoZS5nLiwgaW4gZTJlIHRlc3QgcnVubmVycykuXG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuSWQsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICBjb25zdCB3b3JrZmxvd0FyZ3VtZW50cyA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgb3BzLFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICB2MUNvbXBhdFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZXZlbnRzLmNyZWF0ZSAocnVuX2NyZWF0ZWQpIGFuZCBxdWV1ZSBpbiBwYXJhbGxlbC5cbiAgICAgIC8vIElmIGV2ZW50cy5jcmVhdGUgZmFpbHMgd2l0aCA0MjkvNXh4LCB0aGUgcnVuIHdhcyBzdGlsbCBhY2NlcHRlZFxuICAgICAgLy8gdmlhIHRoZSBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS5cbiAgICAgIGNvbnN0IFtydW5DcmVhdGVkUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICApLFxuICAgICAgICB3b3JsZC5xdWV1ZShcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWwg4oCUIHRoZSBydW4gd2FzIG5vdCBlbnF1ZXVlZFxuICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBldmVudHMuY3JlYXRlIHJlc3VsdFxuICAgICAgbGV0IHJlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG4gICAgICBpZiAocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3QgZXJyID0gcnVuQ3JlYXRlZFJlc3VsdC5yZWFzb247XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyA0MDk6IFRoZSBydW4gYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIGhhcHBlbiBpbiBleHRyZW1lIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gdGhlIHJ1biBjcmVhdGlvbiBjYWxsIGdldHMgYSBjb2xkIHN0YXJ0IG9yIG90aGVyIHNsb3dkb3duLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gKyBydW5fc3RhcnRlZCBjYWxsIGNvbXBsZXRlcyBmYXN0ZXIuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIDw9MSUgb2YgY2FzZXMuXG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc2FmZWx5IHJldHVybi5cbiAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVN0YXJ0RXJyb3IoZXJyKSkge1xuICAgICAgICAgIC8vIDQyOSAoVGhyb3R0bGVFcnJvcikgYW5kIDV4eCAoV29ya2Zsb3dXb3JsZEVycm9yIHdpdGggc3RhdHVzID49IDUwMClcbiAgICAgICAgICAvLyBhcmUgcmV0cnlhYmxlIOKAlCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvblxuICAgICAgICAgIC8vIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxscyBydW5fc3RhcnRlZC5cbiAgICAgICAgICByZXNpbGllbnRTdGFydCA9IHRydWU7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgJ1J1biBjcmVhdGlvbiBldmVudCBmYWlsZWQsIGJ1dCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlIHF1ZXVlLiAnICtcbiAgICAgICAgICAgICAgJ1RoZSBydW5fY3JlYXRlZCBldmVudCB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLicsXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBlcnJvcjogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBydW5DcmVhdGVkUmVzdWx0LnZhbHVlO1xuICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcnVuIHdhcyBjcmVhdGVkXG4gICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIFwiTWlzc2luZyAncnVuJyBpbiBzZXJ2ZXIgcmVzcG9uc2UgZm9yICdydW5fY3JlYXRlZCcgZXZlbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgc2VydmVyIGFjY2VwdGVkIG91ciBydW5JZFxuICAgICAgICBpZiAoIXYxQ29tcGF0ICYmIHJlc3VsdC5ydW4ucnVuSWQgIT09IHJ1bklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgYFNlcnZlciByZXR1cm5lZCBkaWZmZXJlbnQgcnVuSWQgdGhhbiByZXF1ZXN0ZWQ6IGV4cGVjdGVkICR7cnVuSWR9LCBnb3QgJHtyZXN1bHQucnVuLnJ1bklkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdhaXRVbnRpbChcbiAgICAgICAgUHJvbWlzZS5hbGwob3BzKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGV4cGVjdGVkIGNsaWVudCBkaXNjb25uZWN0IGVycm9ycyAoZS5nLiwgYnJvd3NlciByZWZyZXNoIGR1cmluZyBzdHJlYW1pbmcpXG4gICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgIGVycj8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8IGVycj8ubmFtZSA9PT0gJ1Jlc3BvbnNlQWJvcnRlZCc7XG4gICAgICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHRocm93IGVycjtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJlxuICAgICAgICBydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1blxuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVycm9yIGZyb20gZXZlbnRzLmNyZWF0ZSAocnVuX2NyZWF0ZWQpIGlzIHJldHJ5YWJsZSxcbiAqIG1lYW5pbmcgdGhlIHF1ZXVlIGNhbiByZS10cnkgY3JlYXRpb24gbGF0ZXIgdmlhIHRoZSBydW5fc3RhcnRlZCBwYXRoLlxuICogLSBUaHJvdHRsZUVycm9yICg0MjkpOiByYXRlIGxpbWl0ZWQsIHdpbGwgc3VjY2VlZCBsYXRlclxuICogLSBXb3JrZmxvd1dvcmxkRXJyb3Igd2l0aCBzdGF0dXMgPj0gNTAwOiBzZXJ2ZXIgZXJyb3IsIHdpbGwgc3VjY2VlZCBsYXRlclxuICovXG5mdW5jdGlvbiBpc1JldHJ5YWJsZVN0YXJ0RXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChUaHJvdHRsZUVycm9yLmlzKGVycikpIHJldHVybiB0cnVlO1xuICBpZiAoV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikgJiYgZXJyLnN0YXR1cyAmJiBlcnIuc3RhdHVzID49IDUwMClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
|
|
440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGdDQUFnQyxFQUNoQywwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1CQUFtQixHQUNwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FDakIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsMEJBQTBCLEVBRTFCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSw0Q0FBNEMsR0FBRyxLQUFLLENBQUM7QUFFM0Qsc0RBQXNEO0FBQ3RELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsd0JBQXdCO0lBQy9CLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4QyxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDO0lBQzNELElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFbkMsT0FBTztRQUNMLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxJQUFJLFdBQVc7UUFDdkQsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFdBQVc7S0FDdkMsQ0FBQztBQUNKLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsd0VBQXdFO0FBQ3hFLDZFQUE2RTtBQUM3RSxnRUFBZ0U7QUFDaEUsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFFaEM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCO0lBQzFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUM5QixDQUFDO0FBMkpELE1BQU0sQ0FBQyxLQUFLLFVBQVUsS0FBSyxDQUN6QixRQUE2RCxFQUM3RCxhQUFvQyxFQUNwQyxPQUFzQjtJQUV0QixVQUFVLENBQUM7SUFDWCxPQUFPLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUM1QiwrREFBK0Q7UUFDL0QsTUFBTSxZQUFZLEdBQUcsUUFBUSxFQUFFLFVBQVUsQ0FBQztRQUUxQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixzSkFBc0osRUFDdEosRUFBRSxJQUFJLEVBQUUsaUNBQWlDLEVBQUUsQ0FDNUMsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUN2RSxPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3BDLElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQzthQUN4QyxDQUFDLENBQUM7WUFFSCxJQUFJLElBQUksR0FBbUIsRUFBRSxDQUFDO1lBQzlCLElBQUksSUFBSSxHQUFpQixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ3ZDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsYUFBK0IsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdDLElBQUksR0FBRyxhQUFhLENBQUM7WUFDdkIsQ0FBQztZQUVELElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDakQsQ0FBQyxDQUFDO1lBRUgsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNuRCxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksbUJBQW1CLENBQUM7WUFFNUQsc0VBQXNFO1lBQ3RFLHNFQUFzRTtZQUN0RSw0Q0FBNEM7WUFDNUMsRUFBRTtZQUNGLGlFQUFpRTtZQUNqRSx1REFBdUQ7WUFDdkQsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSxxRUFBcUU7WUFDckUsaUVBQWlFO1lBQ2pFLElBQUksWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixJQUFJLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO29CQUNwQyxZQUFZLEdBQUcsTUFBTSxLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDekQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHlEQUF5RDtvQkFDekQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7d0JBQ3pCLG1CQUFtQixHQUFHLElBQUksQ0FBQzt3QkFDM0IsYUFBYSxDQUFDLElBQUksQ0FDaEIsc0VBQXNFOzRCQUNwRSwwRUFBMEU7NEJBQzFFLDZDQUE2QyxFQUMvQyxFQUFFLG1CQUFtQixFQUFFLENBQ3hCLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxZQUFZLEdBQUcsbUJBQW1CLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBRUQsa0VBQWtFO1lBQ2xFLHFFQUFxRTtZQUNyRSxnRUFBZ0U7WUFDaEUscUVBQXFFO1lBQ3JFLG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUsa0VBQWtFO1lBQ2xFLHlEQUF5RDtZQUN6RCxFQUFFO1lBQ0YsZ0VBQWdFO1lBQ2hFLHFFQUFxRTtZQUNyRSxnRUFBZ0U7WUFDaEUsaUVBQWlFO1lBQ2pFLGlFQUFpRTtZQUNqRSxxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSwwQ0FBMEM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsUUFDWixLQUFLLENBQUMsV0FBVztnQkFDZixDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUF5QyxDQUFDO2dCQUM5RCxDQUFDLENBQUMsSUFBSSxFQUNWLEVBQUUsQ0FBQztZQUVILElBQUksaUJBQTBCLENBQUM7WUFDL0IsSUFBSSx5QkFBa0MsQ0FBQztZQUN2Qyx3RUFBd0U7WUFDeEUsc0VBQXNFO1lBQ3RFLHlFQUF5RTtZQUN6RSx5Q0FBeUM7WUFDekMsSUFBSSw0QkFBZ0QsQ0FBQztZQUNyRCxzRUFBc0U7WUFDdEUsc0NBQXNDO1lBQ3RDLElBQUksa0JBQXNDLENBQUM7WUFDM0MsSUFBSSxZQUFZLEtBQUssbUJBQW1CLEVBQUUsQ0FBQztnQkFDekMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dCQUN6Qix5QkFBeUIsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLHFFQUFxRTtnQkFDckUsb0JBQW9CO2dCQUNwQiw0QkFBNEIsR0FBRyx5QkFBeUIsQ0FBQztZQUMzRCxDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDcEQsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUMxQix5QkFBeUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLHFFQUFxRTtnQkFDckUsb0VBQW9FO2dCQUNwRSw0QkFBNEIsR0FBRyxTQUFTLENBQUM7WUFDM0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLG9FQUFvRTtnQkFDcEUscUVBQXFFO2dCQUNyRSxrRUFBa0U7Z0JBQ2xFLDhEQUE4RDtnQkFDOUQsK0RBQStEO2dCQUMvRCxxRUFBcUU7Z0JBQ3JFLHdEQUF3RDtnQkFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUMsS0FBSyxFQUFFO29CQUNyQyxZQUFZO29CQUNaLEtBQUs7b0JBQ0wsT0FBTyxFQUFFLDRDQUE0QztvQkFDckQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2lCQUMxQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQixrQkFBa0IsR0FBRyxLQUFLLEVBQUUsbUJBQW1CLENBQUM7Z0JBQ2hELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNwRSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUM7Z0JBQ25ELHlCQUF5QixHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQzNELG1CQUFtQixDQUFDLElBQUksQ0FDekIsQ0FBQztnQkFDRiwwREFBMEQ7Z0JBQzFELGtFQUFrRTtnQkFDbEUsNERBQTREO2dCQUM1RCw0QkFBNEIsR0FBRyxLQUFLLEVBQUUsc0JBQXNCLENBQUM7WUFDL0QsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFvQixFQUFFLENBQUM7WUFFaEMscUVBQXFFO1lBQ3JFLE1BQU0sWUFBWSxHQUFHLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztZQUVuRCxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUMxRCxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLENBQUM7WUFDdEUsSUFBSSxVQUE4QyxDQUFDO1lBQ25ELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELElBQUksV0FBVyxHQUFHLGdDQUFnQyxFQUFFLENBQUM7b0JBQ25ELE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsb0ZBQW9GLENBQ3JGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxpRUFBaUU7Z0JBQ2pFLG1FQUFtRTtnQkFDbkUsaUVBQWlFO2dCQUNqRSx3REFBd0Q7Z0JBQ3hELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUMzRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUM5QixNQUFNLElBQUksb0JBQW9CLENBQzVCLDhCQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FDNUUsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDekQsdUJBQXVCO2lCQUN4QixDQUFDLENBQUM7Z0JBQ0gsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBZSxDQUFDLENBQUMsQ0FDeEQsQ0FBQztZQUNKLENBQUM7WUFFRCxrRUFBa0U7WUFDbEUsdUVBQXVFO1lBQ3ZFLGtFQUFrRTtZQUNsRSxhQUFhO1lBQ2IsTUFBTSxPQUFPLEdBQ1gsV0FBVyxJQUFJLGdDQUFnQztnQkFDN0MsQ0FBQyxDQUFDLHdCQUF3QixFQUFFO2dCQUM1QixDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLE1BQU0sYUFBYSxHQUFHLE9BQU87Z0JBQzNCLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsVUFBVSxFQUFFO2dCQUMvQixDQUFDLENBQUMsVUFBVSxDQUFDO1lBRWYsdUVBQXVFO1lBQ3ZFLE1BQU0sYUFBYSxHQUFHLGFBQWE7Z0JBQ2pDLENBQUMsQ0FBQztvQkFDRSxVQUFVLEVBQUUsYUFBYTtvQkFDekIsR0FBRyxDQUFDLHVCQUF1QixJQUFJLE9BQU8sSUFBSSxJQUFJO3dCQUM1QyxDQUFDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxJQUFhLEVBQUU7d0JBQzVDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ1I7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVQLDBFQUEwRTtZQUMxRSx1RUFBdUU7WUFDdkUsSUFDRSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUztnQkFDcEMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxFQUM5RCxDQUFDO2dCQUNELE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsOERBQThELElBQUksQ0FBQyxTQUFTLENBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUM1QyxHQUFHLENBQ0wsQ0FBQztZQUNKLENBQUM7WUFFRCxxRUFBcUU7WUFDckUsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsbUVBQW1FO1lBQ25FLDBFQUEwRTtZQUMxRSx1RUFBdUU7WUFDdkUsaURBQWlEO1lBQ2pELEVBQUU7WUFDRixvRUFBb0U7WUFDcEUsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLCtEQUErRDtZQUMvRCxZQUFZO1lBQ1osTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUUvRCxJQUFJLGFBQXFDLENBQUM7WUFDMUMsSUFBSSxtQkFBdUMsQ0FBQztZQUU1QyxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN4QyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztZQUMzQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLEVBQUU7b0JBQ3pELEdBQUcsSUFBSTtvQkFDUCxZQUFZO2lCQUNiLENBQUMsQ0FBQztnQkFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUU3RCxtRUFBbUU7Z0JBQ25FLG9FQUFvRTtnQkFDcEUsb0VBQW9FO2dCQUNwRSxxQkFBcUI7Z0JBQ3JCLEVBQUU7Z0JBQ0YsNERBQTREO2dCQUM1RCxnRUFBZ0U7Z0JBQ2hFLG1FQUFtRTtnQkFDbkUsaUVBQWlFO2dCQUNqRSxxRUFBcUU7Z0JBQ3JFLHNFQUFzRTtnQkFDdEUsbUJBQW1CLEdBQUcsTUFBTTtvQkFDMUIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQzNELENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsQ0FBQztZQUVELGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSxnRUFBZ0U7WUFDaEUsMkNBQTJDO1lBQzNDLE1BQU0sV0FBVyxHQUNmLHlCQUF5QjtnQkFDekIsV0FBVyxJQUFJLGlDQUFpQyxDQUFDO1lBQ25ELE1BQU0saUJBQWlCLEdBQUcsTUFBTSwwQkFBMEIsQ0FDeEQsSUFBSSxFQUNKLEtBQUssRUFDTCxhQUFhLEVBQ2IsR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFdBQVcsQ0FDWixDQUFDO1lBRUYsc0VBQXNFO1lBQ3RFLDREQUE0RDtZQUM1RCxnRUFBZ0U7WUFDaEUsc0VBQXNFO1lBQ3RFLG9FQUFvRTtZQUNwRSw0QkFBNEI7WUFDNUIsRUFBRTtZQUNGLG1FQUFtRTtZQUNuRSx5RUFBeUU7WUFDekUsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSx1RUFBdUU7WUFDdkUsb0VBQW9FO1lBQ3BFLHlFQUF5RTtZQUN6RSx3RUFBd0U7WUFDeEUsb0JBQW9CO1lBQ3BCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFFcEQsa0VBQWtFO1lBQ2xFLGlFQUFpRTtZQUNqRSxpRUFBaUU7WUFDakUscURBQXFEO1lBQ3JELDBCQUEwQjtZQUMxQixNQUFNLFVBQVUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1lBRTFDLE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLFlBQVk7Z0JBQ1osbUJBQW1CO2dCQUNuQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRTtnQkFDekMsK0RBQStEO2dCQUMvRCxzRUFBc0U7Z0JBQ3RFLGtFQUFrRTtnQkFDbEUsbUVBQW1FO2dCQUNuRSxpRUFBaUU7Z0JBQ2pFLHNFQUFzRTtnQkFDdEUscUVBQXFFO2dCQUNyRSxzRUFBc0U7Z0JBQ3RFLDZEQUE2RDtnQkFDN0QsR0FBRyxDQUFDLDRCQUE0QixLQUFLLFNBQVM7b0JBQzVDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFO29CQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7b0JBQ3hCLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUM7WUFFRiwwREFBMEQ7WUFDMUQsa0VBQWtFO1lBQ2xFLG9FQUFvRTtZQUNwRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUMvRCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDakIsS0FBSyxFQUNMO29CQUNFLFNBQVMsRUFBRSxhQUFhO29CQUN4QixXQUFXO29CQUNYLFNBQVMsRUFBRTt3QkFDVCxZQUFZLEVBQUUsWUFBWTt3QkFDMUIsWUFBWSxFQUFFLFlBQVk7d0JBQzFCLEtBQUssRUFBRSxpQkFBaUI7d0JBQ3hCLGdCQUFnQjt3QkFDaEIsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkQsR0FBRyxhQUFhO3FCQUNqQjtpQkFDRixFQUNELEVBQUUsUUFBUSxFQUFFLENBQ2I7Z0JBQ0QsS0FBSyxDQUFDLEtBQUssQ0FDVCxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUNsRDtvQkFDRSxLQUFLO29CQUNMLFlBQVk7b0JBQ1osR0FBRyxDQUFDLFdBQVcsSUFBSSwwQ0FBMEM7d0JBQzNELENBQUMsQ0FBQzs0QkFDRSxRQUFRLEVBQUU7Z0NBQ1IsS0FBSyxFQUFFLGlCQUFpQjtnQ0FDeEIsWUFBWTtnQ0FDWixZQUFZO2dDQUNaLFdBQVc7Z0NBQ1gsZ0JBQWdCO2dDQUNoQixHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUN2RCxHQUFHLENBQUMsa0JBQWtCLEtBQUssU0FBUztvQ0FDbEMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFO29DQUNyQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNQLEdBQUcsYUFBYTs2QkFDakI7eUJBQ0Y7d0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDd0IsRUFDakM7b0JBQ0UsWUFBWTtvQkFDWixXQUFXO29CQUNYLHlEQUF5RDtvQkFDekQsOERBQThEO29CQUM5RCw2REFBNkQ7b0JBQzdELGNBQWM7b0JBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDOUQsQ0FDRjthQUNGLENBQUMsQ0FBQztZQUVILDJEQUEyRDtZQUMzRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUMzQixDQUFDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2dCQUNwQyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNoQyxzRUFBc0U7b0JBQ3RFLDJFQUEyRTtvQkFDM0UsMkVBQTJFO29CQUMzRSxzQ0FBc0M7Z0JBQ3hDLENBQUM7cUJBQU0sSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0Qyw2REFBNkQ7b0JBQzdELG1FQUFtRTtvQkFDbkUsbUVBQW1FO29CQUNuRSxlQUFlO29CQUNmLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLHFFQUFxRTt3QkFDbkUsOERBQThELEVBQ2hFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUM3QyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztnQkFDdEMsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUM1QyxNQUFNLElBQUksb0JBQW9CLENBQzVCLDREQUE0RCxLQUFLLFNBQVMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FDN0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELHVFQUF1RTtZQUN2RSxpRUFBaUU7WUFDakUsc0VBQXNFO1lBQ3RFLCtCQUErQjtZQUMvQixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QyxhQUFhLENBQUMsSUFBSSxDQUNoQixzREFBc0QsRUFDdEQ7b0JBQ0UsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssV0FBVztvQkFDekMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxHQUFHLENBQVUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB3b3JrZmxvd0Rpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFBBUkVOVF9SVU5fSURfQVRUUklCVVRFLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgd29ya2Zsb3dSdW5JZFNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMgfSBmcm9tICcuLi9hdHRyaWJ1dGUtY2hhbmdlcy5qcyc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBieXRlc1RvQmFzZTY0LFxuICBkZWNvZGVSdW5QdWJsaWNLZXksXG4gIGRlcml2ZVJ1bktleVBhaXIsXG59IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgc2VhbFRvLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSwgaGVhbHRoQ2hlY2sgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dWbUZyb21FbnYgfSBmcm9tICcuL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbi8qKlxuICogVGltZW91dCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnQgY2FwYWJpbGl0eSBwcm9iZSBkb25lIGJlZm9yZVxuICogZGVoeWRyYXRpbmcgd29ya2Zsb3cgYXJndW1lbnRzLiBLZXB0IHRpZ2h0IG9uIHB1cnBvc2U6IHRoZSBwcm9iZSBpc1xuICogYW4gb3B0aW1pemF0aW9uIChpdCBsZXRzIHRoZSBjYWxsZXIgZW1pdCB0aGUgZnJhbWVkIGJ5dGUtc3RyZWFtIHdpcmVcbiAqIGZvcm1hdCB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgaXQpLCBhbmQgdGhlIGZhbGxiYWNrIG9uIHRpbWVvdXQgaXNcbiAqIHRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGljaCBhbHdheXMgd29ya3MuIExvbmcgZGVsYXlzIGhlcmUgd291bGQganVzdFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIENyb3NzLXJ1biBsaW5lYWdlIGZvciBhIHJ1biBiZWluZyBzdGFydGVkIGZyb20gaW5zaWRlIGFub3RoZXIgcnVuLlxuICpcbiAqIFRoZSBhbWJpZW50IHN0ZXAgY29udGV4dCBjYXJyaWVzIHRoZSBwYXJlbnQgcnVuIGlkIGFuZCB0aGUgcm9vdCBvZiBpdHNcbiAqIGxpbmVhZ2U7IHRoZSBydW50aW1lIGZpbGxzIGJvdGggZnJvbSB0aGUgcnVuIGl0IGFscmVhZHkgaGFzIGxvYWRlZCwgc28gdGhpc1xuICogaXMgYSBwdXJlIGNvbnRleHQgcmVhZCB3aXRoIG5vIEkvTy4gVGhlIG5ldyBydW4gcmVjb3JkcyBgJHBhcmVudFJ1bklkYCAodGhlXG4gKiBlZGdlKSBhbmQgaW5oZXJpdHMgdGhlIHBhcmVudCdzIGAkcm9vdFJ1bklkYCAodGhlIHBhcmVudCBpdHNlbGYgd2hlbiBpdCBpcyBhXG4gKiByb290KSwgc28gYSBkYWlzeSBjaGFpbiBvciBmYW4tb3V0IG9mIGFueSBkZXB0aCBncm91cHMgdW5kZXIgb25lIHJvb3QgaWQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhIHRvcC1sZXZlbCBgc3RhcnQoKWAsIHdoaWNoIGhhcyBubyBjb250ZXh0LCBzb1xuICogc3RhbmRhbG9uZSBydW5zIGNhcnJ5IG5vIGxpbmVhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMaW5lYWdlQXR0cmlidXRlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RvcmUgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICBjb25zdCBwYXJlbnRSdW5JZCA9IHN0b3JlPy53b3JrZmxvd01ldGFkYXRhPy53b3JrZmxvd1J1bklkO1xuICBpZiAoIXBhcmVudFJ1bklkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgW1JPT1RfUlVOX0lEX0FUVFJJQlVURV06IHN0b3JlLnJvb3RSdW5JZCA/PyBwYXJlbnRSdW5JZCxcbiAgICBbUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEVdOiBwYXJlbnRSdW5JZCxcbiAgfTtcbn1cblxuLy8gYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIGlzIGEgbm8tb3AgaW4gV29ybGRzIHdpdGhvdXQgYXRvbWljIGRlcGxveW1lbnRzLlxuLy8gVGhlIHdhcm5pbmcgdGhhdCBleHBsYWlucyB0aGlzIG9ubHkgbmVlZHMgdG8gZmlyZSBvbmNlIHBlciBwcm9jZXNzOiBhXG4vLyB3b3JrZmxvdyB0aGF0IGhhcmRjb2RlcyAnbGF0ZXN0JyBmb3IgaXRzIFZlcmNlbCBkZXBsb3ltZW50IHdvdWxkIG90aGVyd2lzZVxuLy8gbG9nIGl0IG9uIGV2ZXJ5IGxvY2FsL1Bvc3RncmVzIHJ1biwgZmxvb2RpbmcgdGlnaHQgZGV2IGxvb3BzLlxubGV0IGhhc1dhcm5lZExhdGVzdE5vT3AgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXNldCB0aGUgYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIG5vLW9wIHdhcm4tb25jZSBndWFyZC4gVGVzdC1vbmx5IOKAlFxuICogZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW4gZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCBhY3Jvc3MgYHN0YXJ0KClgIGNhbGxzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TGF0ZXN0Tm9PcFdhcm5Gb3JUZXN0cygpOiB2b2lkIHtcbiAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByZWdpb24gaWRlbnRpZmllciBmb3IgdGhlIG5ldyBydW4uIEN1cnJlbnRseSBjb25zdW1lZCBvbmx5XG4gICAqIGJ5IGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCwgd2hpY2ggZW1iZWRzIHRoZSByZWdpb24gaW50byB0aGUgdGFnZ2VkXG4gICAqIHJ1biBJRCBhbmQgcm91dGVzIHRoZSBpbml0aWFsIHdvcmtmbG93IG1lc3NhZ2UgdG8gdGhlIG1hdGNoaW5nXG4gICAqIHJlZ2lvbmFsIHF1ZXVlLiBXaGVuIG9taXR0ZWQsIHRoZSB3b3JsZCBmYWxscyBiYWNrIHRvIGl0cyBvd25cbiAgICogZGVmYXVsdCAoZm9yIGB3b3JsZC12ZXJjZWxgOiB0aGUgYFZFUkNFTF9SRUdJT05gIGVudmlyb25tZW50XG4gICAqIHZhcmlhYmxlLCB0aGVuIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IHJlZ2lvbiBgaWFkMWAg4oCUIGEgY29uY3JldGUsXG4gICAqIHJvdXRhYmxlIHJlZ2lvbiBpcyBhbHdheXMgY2hvc2VuKS5cbiAgICpcbiAgICogV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlIHRoaXMgZmllbGQuXG4gICAqL1xuICByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsYWludGV4dCBhdHRyaWJ1dGVzIHRvIHNlZWQgb24gdGhlIHJ1biBhcyBpdCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIG5hdGl2ZS1hdHRyaWJ1dGVzIHJ1bnMgKHNwZWMgdmVyc2lvbiA0IGFuZCBsYXRlcikuXG4gICAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGVybWl0IHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIGluIGBhdHRyaWJ1dGVzYC4gVGhlIGAkYCBuYW1lc3BhY2VcbiAgICogaXMgcmVzZXJ2ZWQgZm9yIGZyYW1ld29yay9saWJyYXJ5IGNvZGUgYnVpbHQgb24gdG9wIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBTREsgKHRlbGVtZXRyeSwgYWdlbnQgbWV0YWRhdGEsIHBsYXRmb3JtLWVtaXR0ZWQgdGFncywgZXRjLik7IHVzZXJcbiAgICogY29kZSBNVVNUIE5PVCB3cml0ZSBrZXlzIGluIGl0LCBhbmQgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc29cbiAgICogYWNjaWRlbnRhbCBjb2xsaXNpb25zIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gU2FtZSBzZW1hbnRpY3MgYXNcbiAgICogdGhlIGBzZXRBdHRyaWJ1dGVzYCBvcHRpb24gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIGV4aXN0aW5nIHJ1biB0aGlzIHJ1biBpcyBiZWluZyByZXBsYXllZCBmcm9tLCBpZiBhbnkuXG4gICAqXG4gICAqIFJlY29yZGVkIG9uIHRoZSBuZXcgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHRgIGFzIGByZXBsYXllZEZyb21SdW5JZGAgc29cbiAgICogdG9vbGluZyAoZS5nLiB0aGUgZGFzaGJvYXJkIHJ1bnMgbGlzdCkgY2FuIHNob3cgdGhhdCBhIHJ1biBvcmlnaW5hdGVkIGFzXG4gICAqIGEgcmVwbGF5IGFuZCBsaW5rIGJhY2sgdG8gaXRzIHNvdXJjZS4gU2V0IGF1dG9tYXRpY2FsbHkgYnlcbiAgICoge0BsaW5rIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nfTsgdGhlcmUncyB1c3VhbGx5IG5vIHJlYXNvbiB0byBwYXNzIGl0XG4gICAqIGRpcmVjdGx5LlxuICAgKlxuICAgKiBNdXN0IGJlIGEgcnVuIElEOiBgd3J1bl9gIGZvbGxvd2VkIGJ5IGEgMjYtY2hhciBVTElELiBJdCdzIGEgZm9yZWlnbiBrZXlcbiAgICogdG8gdGhlIHNvdXJjZSBydW4sIHNvIGBzdGFydCgpYCB2YWxpZGF0ZXMgdGhlIGV4YWN0IHNoYXBlIGFuZCByZWplY3RzXG4gICAqIGFueXRoaW5nIGVsc2UgcmF0aGVyIHRoYW4gcGVyc2lzdCBhIGxpbmVhZ2UgbGluayB0aGF0IHBvaW50cyBhdCBnYXJiYWdlLlxuICAgKi9cbiAgcmVwbGF5ZWRGcm9tUnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50LiBTY29wZXMgdGhlIHdvcmtmbG93IHF1ZXVlXG4gICAqIHRvcGljIHRvIGBfX3tuYW1lc3BhY2V9X3drZl93b3JrZmxvd18qYCAoZS5nLiBgJ2V2ZSdgKSBpbnN0ZWFkIG9mIHRoZVxuICAgKiBkZWZhdWx0IGBfX3drZl93b3JrZmxvd18qYCwgYW5kIGlzIGFsc28gdXNlZCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnRcbiAgICogY2FwYWJpbGl0eSBwcm9iZS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBXaXRoaW4gYSBkZXBsb3ltZW50IHRoZSBlbnYgZmFsbGJhY2sgaXMgY29ycmVjdC4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzXG4gICAqIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZCByZXBsYXlpbmcgYSBydW4pIG11c3QgcGFzcyB0aGVcbiAgICogVEFSR0VUIGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseTogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpblxuICAgKiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgcnVuIGVucXVldWVkIHRvIGEgdG9waWMgdGhlIHRhcmdldCBoYXMgbm9cbiAgICogY29uc3VtZXIgZm9yIGlzIG5ldmVyIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBJRCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiB3aGVuIGRlcGxveWluZyB0byBWZXJjZWwuXG4gICAqXG4gICAqIFNldCB0byBgJ2xhdGVzdCdgIHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGUgbW9zdCByZWNlbnQgZGVwbG95bWVudFxuICAgKiBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3IgZ2l0IGJyYW5jaCkuXG4gICAqIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aXRoIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzXG4gICAqIChjdXJyZW50bHkgVmVyY2VsKS4gSW4gb3RoZXIgd29ybGRzIChsb2NhbCBkZXYsIFBvc3RncmVzKSB0aGVyZSBpcyBub1xuICAgKiBub3Rpb24gb2YgbXVsdGlwbGUgZGVwbG95bWVudHMgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyBgJ2xhdGVzdCdgIGhhcyBub1xuICAgKiBlZmZlY3Qg4oCUIGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoZSBydW4gdGFyZ2V0cyB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAqKk5vdGU6KiogV2hlbiBgZGVwbG95bWVudElkYCBpcyBwcm92aWRlZCwgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYmVjb21lIGB1bmtub3duYFxuICAgKiBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIHR5cGVzIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqL1xuICBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIHwgKHN0cmluZyAmIHt9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIGRlcGxveW1lbnRJZD86IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhcnRPcHRpb25zID1cbiAgfCBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4gIHwgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9IChcbiAgLi4uYXJnczogVEFyZ3NcbikgPT4gUHJvbWlzZTxUUmVzdWx0PjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgb2YgYSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSA9IHsgd29ya2Zsb3dJZDogc3RyaW5nIH07XG5cbi8qKlxuICogU3RhcnRzIGEgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbiB0byBzdGFydC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3b3JrZmxvdyAob3B0aW9uYWwpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IHJ1biAob3B0aW9uYWwpLlxuICogQHJldHVybnMgVGhlIHVuaXF1ZSBydW4gSUQgZm9yIHRoZSBuZXdseSBzdGFydGVkIHdvcmtmbG93IGludm9jYXRpb24uXG4gKi9cbi8vIE92ZXJsb2FkcyB3aXRoIGRlcGxveW1lbnRJZCAtIGFyZ3MgYW5kIHJldHVybiB0eXBlIGJlY29tZSB1bmtub3duXG4vLyBVc2VzIGdlbmVyaWNzIHNvIHR5cGVkIHdvcmtmbG93cyBhcmUgYXNzaWduYWJsZSAoYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyksXG4vLyBidXQgdGhlIHJldHVybiB0eXBlIGFuZCBhcmdzIGFyZSBzdGlsbCB1bmtub3duIHNpbmNlIHRoZSBkZXBsb3llZCB2ZXJzaW9uIG1heSBkaWZmZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiB1bmtub3duW10sXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbi8vIE92ZXJsb2FkcyB3aXRob3V0IGRlcGxveW1lbnRJZCAtIHByZXNlcnZlIHR5cGUgaW5mZXJlbmNlXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiBUQXJncyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzT3JPcHRpb25zPzogVEFyZ3MgfCBTdGFydE9wdGlvbnMsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNcbikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBmaWVsZCBpcyBhZGRlZCBieSBvdXIgY2xpZW50IHRyYW5zZm9ybVxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93Py53b3JrZmxvd0lkO1xuXG4gICAgaWYgKCF3b3JrZmxvd05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYCdzdGFydCcgcmVjZWl2ZWQgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbi4gRW5zdXJlIHRoZSBXb3JrZmxvdyBTREsgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgYW5kIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZS5gLFxuICAgICAgICB7IHNsdWc6ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW5OYW1lID0gYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWA7XG4gICAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cy53b3JsZCA/PyAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpO1xuICAgICAgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCh3b3JsZCk7XG4gICAgICBjb25zdCBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gY3VycmVudERlcGxveW1lbnRJZDtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBSZXNvbHZpbmcgJ2xhdGVzdCcgb25seSBtZWFucyBzb21ldGhpbmcgaW4gd29ybGRzIHdpdGggYXRvbWljLFxuICAgICAgLy8gaW1tdXRhYmxlIGRlcGxveW1lbnRzIChlLmcuIFZlcmNlbCksIHdoaWNoIGltcGxlbWVudFxuICAgICAgLy8gcmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpLiBXb3JsZHMgd2l0aG91dCB0aGF0IGNvbmNlcHQgKGxvY2FsIGRldixcbiAgICAgIC8vIHNlbGYtaG9zdGVkIFBvc3RncmVzKSBoYXZlIG5vdGhpbmcgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyByYXRoZXIgdGhhblxuICAgICAgLy8gZmFpbCBhIHJ1biB0aGF0IHdvcmtzIGZpbmUgb24gVmVyY2VsLCB3ZSB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBjdXJyZW50IGRlcGxveW1lbnQg4oCUIG1ha2luZyAnbGF0ZXN0JyBhbiBlZmZlY3RpdmUgbm8tb3AgdGhlcmUuXG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICBpZiAod29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXYXJuIG9uY2UgcGVyIHByb2Nlc3Mg4oCUIHNlZSBoYXNXYXJuZWRMYXRlc3ROb09wIGFib3ZlLlxuICAgICAgICAgIGlmICghaGFzV2FybmVkTGF0ZXN0Tm9PcCkge1xuICAgICAgICAgICAgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IHRydWU7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIFwiZGVwbG95bWVudElkOiAnbGF0ZXN0JyBoYXMgbm8gZWZmZWN0IGluIHRoaXMgd29ybGQgYW5kIHdhcyBpZ25vcmVkLiBcIiArXG4gICAgICAgICAgICAgICAgJ0l0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHdvcmxkcyB3aXRoIGF0b21pYyBkZXBsb3ltZW50cywgc3VjaCBhcyBWZXJjZWwuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgcnVuIHdpbGwgdGFyZ2V0IHRoZSBjdXJyZW50IGRlcGxveW1lbnQuJyxcbiAgICAgICAgICAgICAgeyBjdXJyZW50RGVwbG95bWVudElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGN1cnJlbnREZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgYnl0ZSBzdHJlYW1zIGluIHRoZSBmcmFtZWQgd2lyZSBmb3JtYXQuXG4gICAgICAvLyBGb3Igc2FtZS1kZXBsb3ltZW50IHN0YXJ0cyAodGhlIGNvbW1vbiBjYXNlKSB3ZSBrbm93IHRoZSB0YXJnZXQgaXNcbiAgICAgIC8vIHJ1bm5pbmcgdGhpcyBzYW1lIFNESyB2ZXJzaW9uLCBzbyBmcmFtaW5nIGlzIHNhZmUuIEZvciBjcm9zcy1cbiAgICAgIC8vIGRlcGxveW1lbnQgc3RhcnRzIChleHBsaWNpdCBkZXBsb3ltZW50SWQgb3IgJ2xhdGVzdCcgdGhhdCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBkaWZmZXJlbnQgZGVwbG95bWVudCkgd2UgcHJvYmUgdGhlIHRhcmdldCB2aWEgaGVhbHRoQ2hlY2sgdG9cbiAgICAgIC8vIGxlYXJuIGl0cyB3b3JrZmxvdy1jb3JlIHZlcnNpb24sIHRoZW4gZGVyaXZlIHRoZSBjYXBhYmlsaXR5LiBUaGVcbiAgICAgIC8vIHByb2JlIGhhcyBhIHRpZ2h0IHRpbWVvdXQg4oCUIG9uIG1pc3MvZmFpbHVyZSB3ZSBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBsZWdhY3kgcmF3IGJ5dGUgZm9ybWF0LCB3aGljaCBpcyB1bml2ZXJzYWxseSByZWFkYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBXb3JsZHMgdGhhdCBkb24ndCBleHBvc2UgdGhlIGBzdHJlYW1zYCBBUEkgKGUuZy4gbWluaW1hbCB0ZXN0XG4gICAgICAvLyBtb2NrcykgY2FuJ3Qgc2VydmljZSBoZWFsdGggY2hlY2tzLCBzbyB3ZSBza2lwIHRoZSBwcm9iZSBmb3IgdGhlbS5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlXG4gICAgICAvLyBlbmNyeXB0aW9uIGNvbnRleHQpLiBXaGVuIHRoZSBXb3JsZCBwcm92aWRlcyBhIGBjcmVhdGVSdW5JZCgpYFxuICAgICAgLy8gaW1wbGVtZW50YXRpb24sIHVzZSBpdCBzbyB3b3JsZHMgY2FuIGVtYmVkIGltcGxlbWVudGF0aW9uLXNwZWNpZmljXG4gICAgICAvLyBtZXRhZGF0YSAoZS5nLiwgcmVnaW9uKSBpbnRvIHRoZSBJRCwgZm9yd2FyZGluZyB0aGUgZnVsbCBvcHRpb25zXG4gICAgICAvLyBiYWcgc28gd29ybGRzIGNhbiByZWFkIHdoaWNoZXZlciBmaWVsZHMgdGhleSByZWNvZ25pc2U7IG90aGVyd2lzZVxuICAgICAgLy8gZmFsbCBiYWNrIHRvIGEgc3RhbmRhcmQgbW9ub3RvbmljIFVMSUQuXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7XG4gICAgICAgIHdvcmxkLmNyZWF0ZVJ1bklkXG4gICAgICAgICAgPyB3b3JsZC5jcmVhdGVSdW5JZChvcHRzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PilcbiAgICAgICAgICA6IHVsaWQoKVxuICAgICAgfWA7XG5cbiAgICAgIGxldCBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbiAgICAgIGxldCB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uOiBib29sZWFuO1xuICAgICAgLy8gVGhlIGNvbnN1bWVyJ3MgaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiwgc3RhbXBlZCBvbnRvIHRoZSBuZXcgcnVuXG4gICAgICAvLyBzbyBhIGxhdGVyIGByZXN1bWVIb29rKClgIGdhdGVzIGl0cyBwYXJhbGxlbCBwYXRoIG9uIHRoZSBkZXBsb3ltZW50XG4gICAgICAvLyB0aGF0IHdpbGwgYWN0dWFsbHkgY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZS4gYHVuZGVmaW5lZGAgbWVhbnMgXCJjb3VsZFxuICAgICAgLy8gbm90IGF0dGVzdFwiIGFuZCBmYWlscyB0aGUgZ2F0ZSBjbG9zZWQuXG4gICAgICBsZXQgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gUHVibGljIGtleSBvZiB0aGUgdGFyZ2V0IHJ1biwgd2hlbiB0aGUgY2FwYWJpbGl0eSBwcm9iZSB3YXMgYWJsZSB0b1xuICAgICAgLy8gc3VwcGx5IG9uZSAoY3Jvc3MtZGVwbG95bWVudCBvbmx5KS5cbiAgICAgIGxldCBwcm9iZWRSdW5QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09IGN1cnJlbnREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSB0cnVlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgLy8gU2FtZSBkZXBsb3ltZW50OiB0aGlzIHByb2Nlc3MgaXMgdGhlIGNvbnN1bWVyLCBzbyBpdHMgb3duIGNvbnN0YW50XG4gICAgICAgIC8vIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd29ybGQuc3RyZWFtcz8uZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgLy8gTm8gcHJvYmUgY2hhbm5lbCB0byB0aGUgdGFyZ2V0IOKAlCBjYW5ub3QgYXR0ZXN0IHRoZSBjb25zdW1lciBob25vcnNcbiAgICAgICAgLy8gYGhvb2tJbnB1dGAsIHNvIGxlYXZlIHRoZSBtYXJrZXIgb2ZmIChmYWlsIGNsb3NlZCB0byBzZXF1ZW50aWFsKS5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFzayBmb3IgdGhpcyBydW4ncyBwdWJsaWMga2V5IHdoaWxlIHdlJ3JlIGhlcmUuIFRoZSBwcm9iZSBhbHJlYWR5XG4gICAgICAgIC8vIGJsb2NrcyBgc3RhcnQoKWAgb24gZXZlcnkgY3Jvc3MtZGVwbG95bWVudCBjYWxsLCBhbmQgdGhlIHJlc3BvbmRlclxuICAgICAgICAvLyBleGVjdXRlcyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50IHdoZXJlIHRoZSBrZXkgbWF0ZXJpYWwgaXNcbiAgICAgICAgLy8gbG9jYWwg4oCUIHNvIHRoZSBrZXkgY29tZXMgYmFjayBmb3IgZnJlZSBvbiBhIHJlc3BvbnNlIHdlIGFyZVxuICAgICAgICAvLyBhbHJlYWR5IGF3YWl0aW5nLCBhbmQgd2UgY2FuIHNraXAgdGhlIGtleS1sb29rdXAgQVBJIHJlcXVlc3RcbiAgICAgICAgLy8gZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBvbiB0aW1lb3V0IG9yIGFuIG9sZGVyIHRhcmdldCwgbm8ga2V5IGNvbWVzXG4gICAgICAgIC8vIGJhY2sgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBsb29rdXAgYmVsb3cuXG4gICAgICAgIGNvbnN0IHByb2JlID0gYXdhaXQgaGVhbHRoQ2hlY2sod29ybGQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdGltZW91dDogQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMsXG4gICAgICAgICAgbmFtZXNwYWNlOiBvcHRzLm5hbWVzcGFjZSxcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgcHJvYmVkUnVuUHVibGljS2V5ID0gcHJvYmU/LmVuY3J5cHRpb25QdWJsaWNLZXk7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvbik7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUFxuICAgICAgICApO1xuICAgICAgICAvLyBUaGUgcmVzcG9uZGVyIHJ1bnMgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gaXRzXG4gICAgICAgIC8vIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCByZWZsZWN0cyB0aGUgY29uc3VtZXIuIFVuZGVmaW5lZCBvbiBhblxuICAgICAgICAvLyBvbGRlciB0YXJnZXQgb3IgYSBwcm9iZSB0aW1lb3V0IOKAlCBsZWF2aW5nIHRoZSBtYXJrZXIgb2ZmLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcHJvYmU/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIERlZmF1bHQgbmV3IHJ1bnMgdG8gdGhlIGNvbmZpZ3VyZWQgd29ybGQncyBzcGVjIHZlcnNpb24uIFRoZSB3b3JsZFxuICAgICAgLy8gaXRzZWxmIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBhZ2FpbnN0IHRoaXMgcnVudGltZSdzIHNwZWMgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHNwZWNWZXJzaW9uID0gb3B0cy5zcGVjVmVyc2lvbiA/PyB3b3JsZC5zcGVjVmVyc2lvbjtcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG4gICAgICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdHMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gICAgICBsZXQgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRzLmF0dHJpYnV0ZXMgJiYgT2JqZWN0LmtleXMob3B0cy5hdHRyaWJ1dGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzcGVjVmVyc2lvbiA8IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgJ0luaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlcyByZXF1aXJlIGEgV29ybGQgdGhhdCBzdXBwb3J0cyBzcGVjIHZlcnNpb24gNCBvciBsYXRlci4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlc2AgdHJlYXRzIGB1bmRlZmluZWRgIGFzIFwicmVtb3ZlIHRoaXNcbiAgICAgICAgLy8ga2V5XCIsIHdoaWNoIGlzIG1lYW5pbmdsZXNzIGF0IGNyZWF0aW9uIHRpbWUg4oCUIHJlamVjdCBpdCB1cCBmcm9udFxuICAgICAgICAvLyBzbyBKUyBjYWxsZXJzIGdldCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2YgYSBkb3duc3RyZWFtIHNjaGVtYVxuICAgICAgICAvLyBmYWlsdXJlICh0aGUgdHlwZXMgYWxyZWFkeSBmb3JiaWQgbm9uLXN0cmluZyB2YWx1ZXMpLlxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLmF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEluaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gbXVzdCBiZSBhIHN0cmluZyB2YWx1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhvcHRzLmF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgY2hhbmdlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiBba2V5LCB2YWx1ZSBhcyBzdHJpbmddKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcm9zcy1ydW4gbGluZWFnZTogdGhlIHJlc2VydmVkIGtleXMgcmlkZSBvbiB0aGUgcnVuJ3MgZXhpc3RpbmdcbiAgICAgIC8vIGF0dHJpYnV0ZXMsIHNvIHRoZXkgYWRkIG5vIGV4dHJhIHdyaXRlLiBDYWxsZXIgYXR0cmlidXRlcyBhcmUgc3ByZWFkXG4gICAgICAvLyBsYXN0LCBzbyBhIGNhbGxlciB3aXRoIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIGNhbiBkZWxpYmVyYXRlbHlcbiAgICAgIC8vIHJlLXBhcmVudC5cbiAgICAgIGNvbnN0IGxpbmVhZ2UgPVxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFU1xuICAgICAgICAgID8gcmVzb2x2ZUxpbmVhZ2VBdHRyaWJ1dGVzKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJ1bkF0dHJpYnV0ZXMgPSBsaW5lYWdlXG4gICAgICAgID8geyAuLi5saW5lYWdlLCAuLi5hdHRyaWJ1dGVzIH1cbiAgICAgICAgOiBhdHRyaWJ1dGVzO1xuXG4gICAgICAvLyBTaGFyZWQgYnkgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50IGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlIGlucHV0LlxuICAgICAgY29uc3QgYXR0cmlidXRlU2VlZCA9IHJ1bkF0dHJpYnV0ZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5BdHRyaWJ1dGVzLFxuICAgICAgICAgICAgLi4uKGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIHx8IGxpbmVhZ2UgIT0gbnVsbFxuICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgYXMgY29uc3QgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICAgIC8vIGByZXBsYXllZEZyb21SdW5JZGAgaXMgYSBmb3JlaWduIGtleSB0byB0aGUgc291cmNlIHJ1bjsgcmVqZWN0IGFueXRoaW5nXG4gICAgICAvLyB0aGF0IGlzbid0IGEgcmVhbCBydW4gSUQgc28gdGhlIGxpbmVhZ2UgbGluayBjYW4ndCBwb2ludCBhdCBnYXJiYWdlLlxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLnJlcGxheWVkRnJvbVJ1bklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXdvcmtmbG93UnVuSWRTY2hlbWEuc2FmZVBhcnNlKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnN1Y2Nlc3NcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYHJlcGxheWVkRnJvbVJ1bklkIG11c3QgYmUgYSBydW4gSUQgKHdydW5fPHVsaWQ+KTsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFN0cmluZyhvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zbGljZSgwLCA2NClcbiAgICAgICAgICApfS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzLlxuICAgICAgLy9cbiAgICAgIC8vIFByZWZlcnJlZDogdGhlIGNhcGFiaWxpdHkgcHJvYmUgYWxyZWFkeSB0b2xkIHVzIHRoaXMgcnVuJ3MgcHVibGljXG4gICAgICAvLyBrZXksIHNvIHNlYWwgdG8gaXQuIFRoYXQgc2tpcHMgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gLCB3aGljaCBmb3IgYVxuICAgICAgLy8gY3Jvc3MtZGVwbG95bWVudCBzdGFydCBpcyBhIGBydW4ta2V5YCBBUEkgcmVxdWVzdCDigJQgdGhlIGxhc3Qgb25lIGxlZnRcbiAgICAgIC8vIG9uIHRoaXMgcGF0aC4gSXQgaXMgYWxzbyBhIHByaXZpbGVnZSByZWR1Y3Rpb246IHRoZSBjYWxsZXIgZW5kcyB1cFxuICAgICAgLy8gYWJsZSB0byB3cml0ZSB0aGUgYXJndW1lbnRzIGJ1dCBub3QgcmVhZCB0aGVtIGJhY2ssIHdoZXJlYXMgZmV0Y2hpbmdcbiAgICAgIC8vIHRoZSBzeW1tZXRyaWMga2V5IGdyYW50cyBmdWxsIHJlYWQgYWNjZXNzIHRvIGEgcnVuIGl0IG1lcmVseVxuICAgICAgLy8gbGF1bmNoZWQuXG4gICAgICBjb25zdCBwcm9iZWRQdWJsaWNLZXkgPSBkZWNvZGVSdW5QdWJsaWNLZXkocHJvYmVkUnVuUHVibGljS2V5KTtcblxuICAgICAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAocHJvYmVkUHVibGljS2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBzZWFsVG8ocHJvYmVkUHVibGljS2V5KTtcbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHByb2JlZFJ1blB1YmxpY0tleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5JZCwge1xuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICB9KTtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFB1Ymxpc2ggdGhlIHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IHNvIHRoYXQgY3Jvc3MtcnVuIHdyaXRlcnMgKGFcbiAgICAgICAgLy8gaG9vayByZXN1bXB0aW9uIGZyb20gYW5vdGhlciBkZXBsb3ltZW50LCBhIHNpYmxpbmcgd3JpdGluZyBpbnRvIGFcbiAgICAgICAgLy8gZm9yd2FyZGVkIHN0cmVhbSkgY2FuIHNlYWwgcGF5bG9hZHMgKnRvKiB0aGlzIHJ1biB3aXRob3V0IGhvbGRpbmdcbiAgICAgICAgLy8gaXRzIHN5bW1ldHJpYyBrZXkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFByZXNlbmNlIG9mIHRoaXMgZmllbGQgaXMgdGhlIHdyaXRlci1zaWRlIGdhdGUgZm9yIHNlYWxlZFxuICAgICAgICAvLyBlbnZlbG9wZXMsIHNvIGl0IG11c3Qgb25seSBiZSBzdGFtcGVkIHdoZW4gdGhpcyBydW50aW1lIGNvdWxkXG4gICAgICAgIC8vIGl0c2VsZiBvcGVuIG9uZS4gVGhhdCBob2xkcyBieSBjb25zdHJ1Y3Rpb24gaGVyZTogZGVyaXZhdGlvbiBhbmRcbiAgICAgICAgLy8gYGVuY3BgIGRpc3BhdGNoIGxpdmUgaW4gdGhlIHNhbWUgcGFja2FnZSwgc28gYW55IGNvcmUgdGhhdCBjYW5cbiAgICAgICAgLy8gc3RhbXAgY2FuIGFsc28gb3Blbi4gUnVucyBhcmUgcGlubmVkIHRvIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsXG4gICAgICAgIC8vIHNvIHRoZSBjYXBhYmlsaXR5IHRoaXMgYXR0ZXN0cyB0byBpcyBzdGlsbCBhY2N1cmF0ZSBhdCByZXN1bWUgdGltZS5cbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHJhd0tleVxuICAgICAgICAgID8gYnl0ZXNUb0Jhc2U2NCgoYXdhaXQgZGVyaXZlUnVuS2V5UGFpcihyYXdLZXkpKS5wdWJsaWNLZXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICAvLyBDb21wcmVzcyB3b3JrZmxvdyBhcmd1bWVudHMgb25seSB3aGVuIHRoZSBydW4gaXRzZWxmIGlzIG1hcmtlZCBhc1xuICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkQgdGhlXG4gICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCBjYW4gZGVjb2RlIHRoZW0gKHNhbWUtZGVwbG95bWVudCwgb3IgcHJvYmVkXG4gICAgICAvLyBjYXBhYmlsaXR5IGZvciBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0cykuXG4gICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gJiZcbiAgICAgICAgc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBjb21wcmVzc2lvblxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGVudmlyb25tZW50IHRoaXMgY2FsbGVyJ3Mgb3duIGBydW5fY3JlYXRlZGAgd3JpdGUgaXMgYXR0cmlidXRlZFxuICAgICAgLy8gdG8uIFN0YW1wZWQgaW50byB0aGUgcXVldWUgbWVzc2FnZSdzIGBydW5JbnB1dGAgKE5PVCBpbnRvXG4gICAgICAvLyBgcnVuX2NyZWF0ZWRgLCB3aG9zZSB0ZW5hbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBrbm93cykgc28gdGhlXG4gICAgICAvLyBkZXBsb3ltZW50IHRoYXQgY29uc3VtZXMgdGhlIG1lc3NhZ2UgY2FuIHRlbGwgd2hldGhlciB0aGUgcnVuIGl0IGlzXG4gICAgICAvLyBiZWluZyBhc2tlZCB0byByZXNpbGllbnRseSBjcmVhdGUgd2FzIGNyZWF0ZWQgYWdhaW5zdCBhIGRpZmZlcmVudFxuICAgICAgLy8gZW52aXJvbm1lbnQgdGhhbiBpdHMgb3duLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB0d28gd3JpdGVzIGJlbG93IGdvIHRvIGRpZmZlcmVudCBwbGFjZXMgYnkgZGlmZmVyZW50IHJvdXRlczpcbiAgICAgIC8vIGBldmVudHMuY3JlYXRlYCBpcyBhdHRyaWJ1dGVkIHRvIFRISVMgY2xpZW50J3MgdGVuYW50LCB3aGlsZSB0aGUgcXVldWVcbiAgICAgIC8vIG1lc3NhZ2UgaXMgcGlubmVkIHRvIGEgZGVwbG95bWVudElkLiBXaGVuIHRob3NlIGRpc2FncmVlIOKAlCBhXG4gICAgICAvLyBwcm9kdWN0aW9uLWNyZWRlbnRpYWxlZCBjbGllbnQgcGlubmluZyBhIHByZXZpZXcgZGVwbG95bWVudCDigJQgdGhlXG4gICAgICAvLyBwcmV2aWV3IGNvbnN1bWVyIGNhbid0IGZpbmQgdGhlIHJ1biBpbiBpdHMgb3duIHRlbmFudCwgZmFsbHMgYmFjayB0b1xuICAgICAgLy8gcmVzaWxpZW50IHN0YXJ0LCBhbmQgcmUtY3JlYXRlcyBpdDogb25lIGNsaWVudC1taW50ZWQgcnVuIGlkLCB0d29cbiAgICAgIC8vIGVudmlyb25tZW50cywgdGhlIHByb2R1Y3Rpb24gY29weSBwZW5kaW5nIGZvcmV2ZXIgYW5kIHRoZSBwcmV2aWV3IGNvcHlcbiAgICAgIC8vIGV4ZWN1dGluZy4gV29ybGRzIHdpdGggYSBzaW5nbGUgdGVuYW50IHJldHVybiB1bmRlZmluZWQgYW5kIHRoZSBmaWVsZFxuICAgICAgLy8gaXMgc2ltcGx5IGFic2VudC5cbiAgICAgIGNvbnN0IGNyZWF0b3JFbnZpcm9ubWVudCA9IHdvcmxkLmdldEVudmlyb25tZW50Py4oKTtcblxuICAgICAgLy8gSWYgV09SS0ZMT1dfVk0gaXMgc2V0IG9uIHRoZSBjbGllbnQgc3RhcnRpbmcgdGhlIHJ1biwgc3RhbXAgdGhlXG4gICAgICAvLyBlbmdpbmUgY2hvaWNlIGludG8gdGhlIHJ1bidzIGV4ZWN1dGlvbkNvbnRleHQgc28gdGhlIHJ1biBrZWVwc1xuICAgICAgLy8gZXhlY3V0aW5nIG9uIHRoZSBlbmdpbmUgaXQgc3RhcnRlZCBvbiAodGhlIHNhbWUgZGVwbG95bWVudCBjYW5cbiAgICAgIC8vIHNlcnZlIGJvdGggVk0gZW5naW5lcykuIFVua25vd24gdmFsdWVzIHRocm93IOKAlCBzZWVcbiAgICAgIC8vIGdldFdvcmtmbG93Vm1Gcm9tRW52KCkuXG4gICAgICBjb25zdCB3b3JrZmxvd1ZtID0gZ2V0V29ya2Zsb3dWbUZyb21FbnYoKTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICB3b3JrZmxvd0NvcmVWZXJzaW9uLFxuICAgICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICAgICAgLy8gQXR0ZXN0IHRoYXQgdGhlICpjb25zdW1lciogZGVwbG95bWVudCdzIHJ1bnRpbWUgcmUtZW5zdXJlcyBhXG4gICAgICAgIC8vIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIGEgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgIG9uIHJlcGxheS5cbiAgICAgICAgLy8gQSByZXN1bWUgb2YgdGhpcyBydW4gcmVhZHMgdGhlIG1hcmtlciAobWlycm9yZWQgb250byB0aGUgaG9vaydzXG4gICAgICAgIC8vIHJlc3VtZUNvbnRleHQgYnkgdGhlIHNlcnZlcikgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHBhcmFsbGVsIGZhc3RcbiAgICAgICAgLy8gcGF0aCBpcyBzYWZlLiBGb3IgYSBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IHRoZSBjb25zdW1lciBpcyB0aGVcbiAgICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHdlIHN0YW1wIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIGNhcnJpZWQgYmFjayBvblxuICAgICAgICAvLyB0aGUgaGVhbHRoLWNoZWNrIHByb2JlIOKAlCBuZXZlciB0aGUgY2FsbGVyJ3MuIE9taXR0ZWQgd2hlbiB3ZSBjb3VsZFxuICAgICAgICAvLyBub3QgYXR0ZXN0IHRoZSB0YXJnZXQgKG9sZGVyIHRhcmdldCwgdGltZW91dCwgb3Igbm8gcHJvYmUgY2hhbm5lbCksXG4gICAgICAgIC8vIHdoaWNoIGZhaWxzIHRoZSByZXN1bWUgZ2F0ZSBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgLi4uKHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHdvcmtmbG93Vm0gPyB7IHdvcmtmbG93Vm0gfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWRcbiAgICAgICAgICA/IHsgcmVwbGF5ZWRGcm9tUnVuSWQ6IG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgb3B0cy5uYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oY3JlYXRvckVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA/IHsgZW52aXJvbm1lbnQ6IGNyZWF0b3JFbnZpcm9ubWVudCB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgLy8gRm9yd2FyZCBhbnkgY2FsbGVyLXN1cHBsaWVkIHJlZ2lvbiBoaW50IHNvIHdvcmxkcyB3aXRoXG4gICAgICAgICAgICAvLyBwZXItcmVnaW9uIHF1ZXVlIHJvdXRpbmcgKGUuZy4gd29ybGQtdmVyY2VsKSBjYW4gdGFyZ2V0IHRoZVxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcXVldWUuIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZVxuICAgICAgICAgICAgLy8gdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIC4uLihvcHRzLnJlZ2lvbiAhPT0gdW5kZWZpbmVkID8geyByZWdpb246IG9wdHMucmVnaW9uIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIOKAlCB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlIOKAlCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|