@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- 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 +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -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 +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- 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 +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -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 +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -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 +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- 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 +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -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 +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +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 +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -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 +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- 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 +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- 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 +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- 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.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- 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 +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- 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.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- 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 +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- 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/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +107 -0
- 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 +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- 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 +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- 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 +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- 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 +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- 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 -776
package/dist/flushable-stream.js
CHANGED
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
import { WorkflowRuntimeError } from '@workflow/errors';
|
|
2
2
|
import { withResolvers } from '@workflow/utils';
|
|
3
|
+
import { envNumber } from '@workflow/world/env-config';
|
|
4
|
+
import { STREAM_DRAIN_SYMBOL } from './symbols.js';
|
|
5
|
+
/**
|
|
6
|
+
* Flow-control knob: upper bound on chunks read-but-not-yet-durably-written
|
|
7
|
+
* while coalescing. Once this many chunks are outstanding the producer stops
|
|
8
|
+
* reading until the consumer drains a batch, so a fast producer paired with a
|
|
9
|
+
* slow server can't grow the in-memory queue without bound. Override:
|
|
10
|
+
* `WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS`.
|
|
11
|
+
*
|
|
12
|
+
* This is deliberately distinct from the per-request batch caps below: this
|
|
13
|
+
* bounds how much is *buffered*, those bound how much goes out in one
|
|
14
|
+
* `writeMulti`. Raising this must never let a single request exceed a wire
|
|
15
|
+
* limit, since batch sizing enforces that independently.
|
|
16
|
+
*/
|
|
17
|
+
export const MAX_INFLIGHT_CHUNKS = 1000;
|
|
18
|
+
export const getMaxInflightChunks = () => envNumber('WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS', MAX_INFLIGHT_CHUNKS, {
|
|
19
|
+
integer: true,
|
|
20
|
+
min: 1,
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Wire limit: maximum number of chunks in a single coalesced `writeMulti`.
|
|
24
|
+
* The server enforces a per-multi-write chunk cap (1,000 today); a batch is
|
|
25
|
+
* split at this bound so it can never be rejected wholesale, independently of
|
|
26
|
+
* the backpressure knob above. Override: `WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH`.
|
|
27
|
+
*/
|
|
28
|
+
export const MAX_CHUNKS_PER_BATCH = 1000;
|
|
29
|
+
export const getMaxChunksPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH', MAX_CHUNKS_PER_BATCH, {
|
|
30
|
+
integer: true,
|
|
31
|
+
min: 1,
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Wire limit: maximum cumulative bytes in a single coalesced `writeMulti`.
|
|
35
|
+
* Chunk *count* alone is not enough: 1,000 small chunks are ~100KB but 1,000
|
|
36
|
+
* file-sized chunks can be hundreds of MB, which platform request-body limits
|
|
37
|
+
* reject long before the count cap matters. A batch is split once adding the
|
|
38
|
+
* next chunk would exceed this (a single chunk larger than the cap still goes
|
|
39
|
+
* out alone). Default 1 MiB. Override: `WORKFLOW_STREAM_MAX_BYTES_PER_BATCH`.
|
|
40
|
+
*/
|
|
41
|
+
export const MAX_BYTES_PER_BATCH = 1024 * 1024;
|
|
42
|
+
export const getMaxBytesPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_BYTES_PER_BATCH', MAX_BYTES_PER_BATCH, {
|
|
43
|
+
integer: true,
|
|
44
|
+
min: 1,
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Buffer bound (bytes) for the server writable's group-commit buffer, the
|
|
48
|
+
* byte-denominated counterpart of {@link MAX_INFLIGHT_CHUNKS}. `write()`
|
|
49
|
+
* blocks once this much data is buffered-but-not-durable, so a fast producer
|
|
50
|
+
* of large chunks can't grow client memory without bound. Default 8 MiB
|
|
51
|
+
* (eight request-sized groups). Override: `WORKFLOW_STREAM_MAX_BUFFERED_BYTES`.
|
|
52
|
+
*/
|
|
53
|
+
export const MAX_BUFFERED_BYTES = 8 * 1024 * 1024;
|
|
54
|
+
export const getMaxBufferedBytes = () => envNumber('WORKFLOW_STREAM_MAX_BUFFERED_BYTES', MAX_BUFFERED_BYTES, {
|
|
55
|
+
integer: true,
|
|
56
|
+
min: 1,
|
|
57
|
+
});
|
|
3
58
|
/**
|
|
4
59
|
* Polling interval (in ms) for lock release detection.
|
|
5
60
|
*
|
|
@@ -13,19 +68,31 @@ import { withResolvers } from '@workflow/utils';
|
|
|
13
68
|
* after each step body returns, so a coarser interval (the previous 100ms)
|
|
14
69
|
* adds visible per-step latency to streaming workflows. With a uniformly
|
|
15
70
|
* distributed offset between step return and the next tick, the expected
|
|
16
|
-
* wait is half the interval
|
|
71
|
+
* wait is half the interval, so 10ms means ~5ms average wait per step
|
|
17
72
|
* instead of ~50ms. The per-tick work is `writable.locked` plus a
|
|
18
73
|
* `getWriter()`/`releaseLock()` probe, both microsecond-scale; 10× more
|
|
19
74
|
* ticks during a stream's lifetime is not measurable in practice.
|
|
20
75
|
*/
|
|
21
76
|
export const LOCK_POLL_INTERVAL_MS = 10;
|
|
77
|
+
/** Effective lock-poll interval. Override: `WORKFLOW_LOCK_POLL_INTERVAL_MS`. */
|
|
78
|
+
const getLockPollIntervalMs = () => envNumber('WORKFLOW_LOCK_POLL_INTERVAL_MS', LOCK_POLL_INTERVAL_MS, {
|
|
79
|
+
integer: true,
|
|
80
|
+
min: 1,
|
|
81
|
+
});
|
|
22
82
|
export function createFlushableState() {
|
|
23
|
-
|
|
83
|
+
const state = {
|
|
24
84
|
...withResolvers(),
|
|
25
85
|
pendingOps: 0,
|
|
86
|
+
producedFrames: 0,
|
|
87
|
+
acceptedFrames: 0,
|
|
88
|
+
frameWaiters: [],
|
|
26
89
|
doneResolved: false,
|
|
27
90
|
streamEnded: false,
|
|
28
91
|
};
|
|
92
|
+
// The runtime awaits this promise after user code returns. Observe early
|
|
93
|
+
// stream failures now so they do not become unhandled rejections first.
|
|
94
|
+
state.promise.catch(() => { });
|
|
95
|
+
return state;
|
|
29
96
|
}
|
|
30
97
|
/**
|
|
31
98
|
* Checks if a WritableStream is unlocked (user released lock) vs closed.
|
|
@@ -82,6 +149,167 @@ function isReadableUnlockedNotClosed(readable) {
|
|
|
82
149
|
}
|
|
83
150
|
return true;
|
|
84
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Settle the flushable completion after the sink's durability barrier.
|
|
154
|
+
*
|
|
155
|
+
* Lock release means the producer is done *writing*; with a group-commit
|
|
156
|
+
* sink, accepted chunks may still be client-buffered or in a request that is
|
|
157
|
+
* in flight. Awaiting the barrier here keeps the completion's meaning
|
|
158
|
+
* ("everything written so far is durable") identical to the pre-batching
|
|
159
|
+
* behavior where each write() was individually durable.
|
|
160
|
+
*/
|
|
161
|
+
function resolveAfterDrain(state) {
|
|
162
|
+
const barrier = state.drainBarrier;
|
|
163
|
+
if (!barrier) {
|
|
164
|
+
state.resolve();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
barrier().then(() => state.resolve(), (err) => state.reject(err));
|
|
168
|
+
}
|
|
169
|
+
/** Record a frame synchronously when its producer emits it into this pipe. */
|
|
170
|
+
function markFlushableFrameProduced(state) {
|
|
171
|
+
state.producedFrames++;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Capture a step-end producer watermark, wait until the pipe has handed every
|
|
175
|
+
* frame through that watermark to its sink, then await the sink's durability
|
|
176
|
+
* barrier. Unlike {@link FlushableStreamState.promise}, this never waits for a
|
|
177
|
+
* user writer lock to be released.
|
|
178
|
+
*/
|
|
179
|
+
export async function drainFlushableSnapshot(state) {
|
|
180
|
+
const drainBeforeThrow = async (error) => {
|
|
181
|
+
// A later frame can fail after an earlier frame was early-acked by the
|
|
182
|
+
// group-commit sink. Keep the earlier accepted prefix durable before
|
|
183
|
+
// surfacing the producer error, matching flushablePipe's failure path.
|
|
184
|
+
await state.drainBarrier?.().catch(() => { });
|
|
185
|
+
throw error;
|
|
186
|
+
};
|
|
187
|
+
const target = state.producedFrames;
|
|
188
|
+
if (state.acceptedFrames < target) {
|
|
189
|
+
if (state.pipeError !== undefined) {
|
|
190
|
+
return drainBeforeThrow(state.pipeError);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
await new Promise((resolve, reject) => {
|
|
194
|
+
state.frameWaiters.push({ target, resolve, reject });
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return drainBeforeThrow(error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (state.pipeError !== undefined) {
|
|
202
|
+
return drainBeforeThrow(state.pipeError);
|
|
203
|
+
}
|
|
204
|
+
await state.drainBarrier?.();
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Mark byte-stream chunks at the producer side of a flushable pipe. Serialized
|
|
208
|
+
* streams should instead use `getSerializeStream`'s synchronous output hook.
|
|
209
|
+
*/
|
|
210
|
+
/**
|
|
211
|
+
* Wrap the user-facing producer boundary of a flushable writable. A completed
|
|
212
|
+
* write through this handle has a sequence number before step-end snapshots,
|
|
213
|
+
* while the original writable remains the input to the serialization pipe.
|
|
214
|
+
*/
|
|
215
|
+
export function trackFlushableWritable(writable, state, WritableStreamConstructor = WritableStream) {
|
|
216
|
+
const targetWriter = writable.getWriter();
|
|
217
|
+
const checkpoint = Symbol('workflow-stream-release-checkpoint');
|
|
218
|
+
let trackedController;
|
|
219
|
+
const tracked = new WritableStreamConstructor({
|
|
220
|
+
start(controller) {
|
|
221
|
+
trackedController = controller;
|
|
222
|
+
},
|
|
223
|
+
async write(chunk) {
|
|
224
|
+
if (chunk === checkpoint)
|
|
225
|
+
return;
|
|
226
|
+
markFlushableFrameProduced(state);
|
|
227
|
+
await targetWriter.write(chunk);
|
|
228
|
+
},
|
|
229
|
+
async close() {
|
|
230
|
+
state.userWritableClosing = true;
|
|
231
|
+
try {
|
|
232
|
+
await targetWriter.close();
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
targetWriter.releaseLock();
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
async abort(reason) {
|
|
239
|
+
try {
|
|
240
|
+
await targetWriter.abort(reason);
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
targetWriter.releaseLock();
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
// A downstream sink can fail after its early-acknowledged write has already
|
|
248
|
+
// resolved. Forward that terminal error into the public writable even while
|
|
249
|
+
// its producer is idle, so native pipeTo() rejects and cancels its source.
|
|
250
|
+
targetWriter.closed.catch((error) => {
|
|
251
|
+
trackedController.error(error);
|
|
252
|
+
});
|
|
253
|
+
let settlement;
|
|
254
|
+
state.settleReleasedWrites = () => {
|
|
255
|
+
state.releaseSettlementArmed = true;
|
|
256
|
+
if (settlement)
|
|
257
|
+
return settlement;
|
|
258
|
+
if (tracked.locked)
|
|
259
|
+
return Promise.resolve(false);
|
|
260
|
+
if (state.userWritableClosing) {
|
|
261
|
+
settlement = state.promise.then(() => true);
|
|
262
|
+
return settlement;
|
|
263
|
+
}
|
|
264
|
+
let checkpointWriter;
|
|
265
|
+
try {
|
|
266
|
+
checkpointWriter = tracked.getWriter();
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// Closed/errored streams settle through the pipe's normal completion.
|
|
270
|
+
return Promise.resolve(false);
|
|
271
|
+
}
|
|
272
|
+
settlement = (async () => {
|
|
273
|
+
try {
|
|
274
|
+
// Native writable ordering puts this behind writes queued by the
|
|
275
|
+
// released writer, including write promises it did not await.
|
|
276
|
+
try {
|
|
277
|
+
await checkpointWriter.write(checkpoint);
|
|
278
|
+
}
|
|
279
|
+
catch (checkpointError) {
|
|
280
|
+
// A close can move from requested to terminal between getWriter()
|
|
281
|
+
// and write(). Its normal pipe completion already drains the sink;
|
|
282
|
+
// an errored pipe rejects here with its actual failure instead.
|
|
283
|
+
try {
|
|
284
|
+
await state.promise;
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
catch (pipeError) {
|
|
288
|
+
throw pipeError ?? checkpointError;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
await drainFlushableSnapshot(state);
|
|
292
|
+
if (!state.doneResolved) {
|
|
293
|
+
state.doneResolved = true;
|
|
294
|
+
state.resolve();
|
|
295
|
+
}
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
if (!state.doneResolved) {
|
|
300
|
+
state.doneResolved = true;
|
|
301
|
+
state.reject(error);
|
|
302
|
+
}
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
checkpointWriter.releaseLock();
|
|
307
|
+
}
|
|
308
|
+
})();
|
|
309
|
+
return settlement;
|
|
310
|
+
};
|
|
311
|
+
return tracked;
|
|
312
|
+
}
|
|
85
313
|
/**
|
|
86
314
|
* Polls a WritableStream to check if the user has released their lock.
|
|
87
315
|
* Resolves the done promise when lock is released and no pending ops remain.
|
|
@@ -104,14 +332,25 @@ export function pollWritableLock(writable, state) {
|
|
|
104
332
|
state.writablePollingInterval = undefined;
|
|
105
333
|
return;
|
|
106
334
|
}
|
|
335
|
+
if (state.settleReleasedWrites) {
|
|
336
|
+
if ((!state.deferReleaseSettlement || state.releaseSettlementArmed) &&
|
|
337
|
+
!writable.locked) {
|
|
338
|
+
clearInterval(intervalId);
|
|
339
|
+
state.writablePollingInterval = undefined;
|
|
340
|
+
void state.settleReleasedWrites().catch(() => {
|
|
341
|
+
// Failure is surfaced through state.promise.
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
107
346
|
// Check if lock is released (not closed) and no pending ops
|
|
108
347
|
if (isWritableUnlockedNotClosed(writable) && state.pendingOps === 0) {
|
|
109
348
|
state.doneResolved = true;
|
|
110
|
-
state.resolve();
|
|
111
349
|
clearInterval(intervalId);
|
|
112
350
|
state.writablePollingInterval = undefined;
|
|
351
|
+
resolveAfterDrain(state);
|
|
113
352
|
}
|
|
114
|
-
},
|
|
353
|
+
}, getLockPollIntervalMs());
|
|
115
354
|
state.writablePollingInterval = intervalId;
|
|
116
355
|
}
|
|
117
356
|
/**
|
|
@@ -139,11 +378,11 @@ export function pollReadableLock(readable, state) {
|
|
|
139
378
|
// Check if lock is released (not closed) and no pending ops
|
|
140
379
|
if (isReadableUnlockedNotClosed(readable) && state.pendingOps === 0) {
|
|
141
380
|
state.doneResolved = true;
|
|
142
|
-
state.resolve();
|
|
143
381
|
clearInterval(intervalId);
|
|
144
382
|
state.readablePollingInterval = undefined;
|
|
383
|
+
resolveAfterDrain(state);
|
|
145
384
|
}
|
|
146
|
-
},
|
|
385
|
+
}, getLockPollIntervalMs());
|
|
147
386
|
state.readablePollingInterval = intervalId;
|
|
148
387
|
}
|
|
149
388
|
/**
|
|
@@ -157,7 +396,29 @@ export function pollReadableLock(readable, state) {
|
|
|
157
396
|
* @param state - The flushable state tracker
|
|
158
397
|
* @returns Promise that resolves when stream ends (not when done promise resolves)
|
|
159
398
|
*/
|
|
160
|
-
export
|
|
399
|
+
export function flushablePipe(source, sink, state) {
|
|
400
|
+
// Batching lives in the sink (`WorkflowServerWritableStream` group-commits
|
|
401
|
+
// its buffer), so this pipe is a plain per-chunk pump regardless of path:
|
|
402
|
+
// its only responsibilities are lock-release completion and durability
|
|
403
|
+
// tracking. Group-commit sinks ack write() on buffer entry; adopt their
|
|
404
|
+
// durability barrier so the lock-release completion still means
|
|
405
|
+
// "everything written is durable" (see resolveAfterDrain).
|
|
406
|
+
const drain = sink[STREAM_DRAIN_SYMBOL];
|
|
407
|
+
if (typeof drain === 'function') {
|
|
408
|
+
state.drainBarrier = drain;
|
|
409
|
+
}
|
|
410
|
+
return flushablePipePerChunk(source, sink, state);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* The pump behind {@link flushablePipe}: awaits each `writer.write()` before
|
|
414
|
+
* reading the next chunk. Against a group-commit sink, write() acks on buffer
|
|
415
|
+
* entry, so this loop feeds the sink as fast as the producer emits (bounded
|
|
416
|
+
* by the sink's buffer bound) and batching happens inside the sink; against a
|
|
417
|
+
* plain sink each write is individually durable, as before. The source-done
|
|
418
|
+
* path closes the sink, which drains it, so completion always implies
|
|
419
|
+
* durability.
|
|
420
|
+
*/
|
|
421
|
+
async function flushablePipePerChunk(source, sink, state) {
|
|
161
422
|
const reader = source.getReader();
|
|
162
423
|
const writer = sink.getWriter();
|
|
163
424
|
let cancelReason;
|
|
@@ -167,8 +428,8 @@ export async function flushablePipe(source, sink, state) {
|
|
|
167
428
|
if (state.streamEnded) {
|
|
168
429
|
return;
|
|
169
430
|
}
|
|
170
|
-
// Read from source
|
|
171
|
-
// The important
|
|
431
|
+
// Read from the source. Don't count this as a pending operation because
|
|
432
|
+
// reads wait for data. The important operations are writes to the sink.
|
|
172
433
|
const readResult = await Promise.race([
|
|
173
434
|
reader.read(),
|
|
174
435
|
writer.closed.then(() => {
|
|
@@ -194,6 +455,11 @@ export async function flushablePipe(source, sink, state) {
|
|
|
194
455
|
state.pendingOps++;
|
|
195
456
|
try {
|
|
196
457
|
await writer.write(readResult.value);
|
|
458
|
+
state.acceptedFrames++;
|
|
459
|
+
const ready = state.frameWaiters.filter((waiter) => waiter.target <= state.acceptedFrames);
|
|
460
|
+
state.frameWaiters = state.frameWaiters.filter((waiter) => waiter.target > state.acceptedFrames);
|
|
461
|
+
for (const waiter of ready)
|
|
462
|
+
waiter.resolve();
|
|
197
463
|
}
|
|
198
464
|
finally {
|
|
199
465
|
state.pendingOps--;
|
|
@@ -202,7 +468,21 @@ export async function flushablePipe(source, sink, state) {
|
|
|
202
468
|
}
|
|
203
469
|
catch (err) {
|
|
204
470
|
state.streamEnded = true;
|
|
471
|
+
state.pipeError = err;
|
|
205
472
|
cancelReason = err;
|
|
473
|
+
const frameWaiters = state.frameWaiters;
|
|
474
|
+
state.frameWaiters = [];
|
|
475
|
+
for (const waiter of frameWaiters)
|
|
476
|
+
waiter.reject(err);
|
|
477
|
+
// Against an early-ack sink, chunks can still be buffered or in flight
|
|
478
|
+
// when the pipe fails (pendingOps only counts un-acked writes). Deliver
|
|
479
|
+
// that accepted prefix before settling the failure: once the state
|
|
480
|
+
// rejects, the step may persist its failure and the invocation finish,
|
|
481
|
+
// and anything still client-side would be lost. The original pipe error
|
|
482
|
+
// stays primary, since a drain failure is already sticky on the sink.
|
|
483
|
+
if (state.drainBarrier) {
|
|
484
|
+
await state.drainBarrier().catch(() => { });
|
|
485
|
+
}
|
|
206
486
|
if (!state.doneResolved) {
|
|
207
487
|
state.doneResolved = true;
|
|
208
488
|
state.reject(err);
|
|
@@ -217,11 +497,11 @@ export async function flushablePipe(source, sink, state) {
|
|
|
217
497
|
finally {
|
|
218
498
|
// Cancel the upstream reader so the source knows to stop generating data.
|
|
219
499
|
// Uses cancelReason (set in the catch block) so the source receives context
|
|
220
|
-
// about why it was
|
|
500
|
+
// about why it was canceled. On normal completion cancelReason is undefined,
|
|
221
501
|
// which is a harmless no-op on an already-done reader.
|
|
222
502
|
reader.cancel(cancelReason).catch(() => { });
|
|
223
503
|
reader.releaseLock();
|
|
224
504
|
writer.releaseLock();
|
|
225
505
|
}
|
|
226
506
|
}
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0U7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBNkJ4QyxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU87UUFDTCxHQUFHLGFBQWEsRUFBUTtRQUN4QixVQUFVLEVBQUUsQ0FBQztRQUNiLFlBQVksRUFBRSxLQUFLO1FBQ25CLFdBQVcsRUFBRSxLQUFLO0tBQ25CLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFFBQXdCO0lBQzNELElBQUksUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsQyxJQUFJLE1BQStDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gseUVBQXlFO1FBQ3pFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHNFQUFzRTtRQUN0RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsZ0VBQWdFO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxRQUF3QjtJQUMzRCxJQUFJLFFBQVEsQ0FBQyxNQUFN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QUMsVUFBVSxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUMxQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRCwrREFBK0Q7UUFDL0QsNEVBQTRFO1FBQzVFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsNkNBQTZDO1FBQzdDLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztZQUFTLENBQUM7UUFDVCwwRUFBMEU7UUFDMUUsNEVBQTRFO1FBQzVFLDhFQUE4RTtRQUM5RSx1REFBdUQ7UUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFByb21pc2VXaXRoUmVzb2x2ZXJzLCB3aXRoUmVzb2x2ZXJzIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcblxuLyoqXG4gKiBQb2xsaW5nIGludGVydmFsIChpbiBtcykgZm9yIGxvY2sgcmVsZWFzZSBkZXRlY3Rpb24uXG4gKlxuICogVGhlIFdlYiBTdHJlYW1zIEFQSSBkb2VzIG5vdCBleHBvc2UgYW4gZXZlbnQgZm9yIFwibG9jayByZWxlYXNlZCBidXQgc3RyZWFtXG4gKiBzdGlsbCBvcGVuXCI7IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIHRoYXQgc3RhdGUgYnkgcGVyaW9kaWNhbGx5IGF0dGVtcHRpbmdcbiAqIHRvIGFjcXVpcmUgYSByZWFkZXIvd3JpdGVyLiBGb3IgdGhhdCByZWFzb24gd2UgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBhXG4gKiBmdWxseSBldmVudC1kcml2ZW4gYXBwcm9hY2ggaGVyZS5cbiAqXG4gKiAxMG1zIGlzIGNob3NlbiBzbyB0aGUgcG9sbGluZyB0aWNrIGFsbW9zdCBuZXZlciBzaXRzIG9uIHRoZSBjcml0aWNhbCBwYXRoOlxuICogdGhlIFYyIHN0ZXAtZXhlY3V0b3IncyBgb3BzU2V0dGxlZGAgcmFjZSB3YWl0cyBmb3IgdGhpcyBzdGF0ZSB0byByZXNvbHZlXG4gKiBhZnRlciBlYWNoIHN0ZXAgYm9keSByZXR1cm5zLCBzbyBhIGNvYXJzZXIgaW50ZXJ2YWwgKHRoZSBwcmV2aW91cyAxMDBtcylcbiAqIGFkZHMgdmlzaWJsZSBwZXItc3RlcCBsYXRlbmN5IHRvIHN0cmVhbWluZyB3b3JrZmxvd3MuIFdpdGggYSB1bmlmb3JtbHlcbiAqIGRpc3RyaWJ1dGVkIG9mZnNldCBiZXR3ZWVuIHN0ZXAgcmV0dXJuIGFuZCB0aGUgbmV4dCB0aWNrLCB0aGUgZXhwZWN0ZWRcbiAqIHdhaXQgaXMgaGFsZiB0aGUgaW50ZXJ2YWwg4oCUIHNvIDEwbXMgbWVhbnMgfjVtcyBhdmVyYWdlIHdhaXQgcGVyIHN0ZXBcbiAqIGluc3RlYWQgb2YgfjUwbXMuIFRoZSBwZXItdGljayB3b3JrIGlzIGB3cml0YWJsZS5sb2NrZWRgIHBsdXMgYVxuICogYGdldFdyaXRlcigpYC9gcmVsZWFzZUxvY2soKWAgcHJvYmUsIGJvdGggbWljcm9zZWNvbmQtc2NhbGU7IDEww5cgbW9yZVxuICogdGlja3MgZHVyaW5nIGEgc3RyZWFtJ3MgbGlmZXRpbWUgaXMgbm90IG1lYXN1cmFibGUgaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqXG4gKiBTdGF0ZSB0cmFja2VyIGZvciBmbHVzaGFibGUgc3RyZWFtIG9wZXJhdGlvbnMuXG4gKiBSZXNvbHZlcyB3aGVuIGVpdGhlcjpcbiAqIDEuIFN0cmVhbSBjb21wbGV0ZXMgKGNsb3NlL2Vycm9yKSwgT1JcbiAqIDIuIExvY2sgaXMgcmVsZWFzZWQgQU5EIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGZsdXNoZWRcbiAqXG4gKiBOb3RlOiBgZG9uZVJlc29sdmVkYCBhbmQgYHN0cmVhbUVuZGVkYCBhcmUgc2VwYXJhdGU6XG4gKiAtIGBkb25lUmVzb2x2ZWRgOiBUaGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKHN0ZXAgY2FuIGNvbXBsZXRlKVxuICogLSBgc3RyZWFtRW5kZWRgOiBUaGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkXG4gKlxuICogT25jZSBgZG9uZVJlc29sdmVkYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGBkb25lYCBwcm9taXNlIHdpbGwgbm90IHJlc29sdmVcbiAqIGFnYWluLiBSZS1hY3F1aXJpbmcgbG9ja3MgYWZ0ZXIgcmVsZWFzZSBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgd2F5IHRvXG4gKiB0cmlnZ2VyIGFkZGl0aW9uYWwgY29tcGxldGlvbiBzaWduYWxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmx1c2hhYmxlU3RyZWFtU3RhdGUgZXh0ZW5kcyBQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPiB7XG4gIC8qKiBOdW1iZXIgb2Ygd3JpdGUgb3BlcmF0aW9ucyBjdXJyZW50bHkgaW4gZmxpZ2h0IHRvIHRoZSBzZXJ2ZXIgKi9cbiAgcGVuZGluZ09wczogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKi9cbiAgZG9uZVJlc29sdmVkOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkICovXG4gIHN0cmVhbUVuZGVkOiBib29sZWFuO1xuICAvKiogSW50ZXJ2YWwgSUQgZm9yIHdyaXRhYmxlIGxvY2sgcG9sbGluZyAoaWYgYWN0aXZlKSAqL1xuICB3cml0YWJsZVBvbGxpbmdJbnRlcnZhbD86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgLyoqIEludGVydmFsIElEIGZvciByZWFkYWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgcmVhZGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4ud2l0aFJlc29sdmVyczx2b2lkPigpLFxuICAgIHBlbmRpbmdPcHM6IDAsXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgV3JpdGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICogV2hlbiBhIHN0cmVhbSBpcyBjbG9zZWQsIC5sb2NrZWQgaXMgZmFsc2UgYnV0IGdldFdyaXRlcigpIHRocm93cy5cbiAqIFdlIG9ubHkgd2FudCB0byByZXNvbHZlIHZpYSBwb2xsaW5nIHdoZW4gdGhlIHN0cmVhbSBpcyB1bmxvY2tlZCwgbm90IGNsb3NlZC5cbiAqIElmIGNsb3NlZCwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICovXG5mdW5jdGlvbiBpc1dyaXRhYmxlVW5sb2NrZWROb3RDbG9zZWQod3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmICh3cml0YWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd3JpdGVyOiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgd3JpdGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRXcml0ZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBSZWFkYWJsZVN0cmVhbSBpcyB1bmxvY2tlZCAodXNlciByZWxlYXNlZCBsb2NrKSB2cyBjbG9zZWQuXG4gKi9cbmZ1bmN0aW9uIGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZTogUmVhZGFibGVTdHJlYW0pOiBib29sZWFuIHtcbiAgaWYgKHJlYWRhYmxlLmxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gYWNxdWlyZSByZWFkZXIgLSBpZiBzdWNjZXNzZnVsLCBzdHJlYW0gaXMgdW5sb2NrZWQgKG5vdCBjbG9zZWQpXG4gICAgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGdldFJlYWRlcigpIHRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkL2Vycm9yZWQgLSBsZXQgcHVtcCBoYW5kbGUgaXRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiByZWxlYXNlTG9jaygpIHRocm93cyBmb3IgYW55IHJlYXNvbiwgY29uc2VydmF0aXZlbHkgdHJlYXQgdGhlXG4gICAgLy8gc3RyZWFtIGFzIGNsb3NlZC9lcnJvcmVkIHNvIGNhbGxlcnMgZG9uJ3QgYXNzdW1lIGl0J3Mgc2FmZSB0byB1c2UuXG4gICAgLy8gVGhlIHB1bXAgd2lsbCBvYnNlcnZlIHRoZSBmYWlsdXJlIHZpYSB0aGUgc3RyZWFtJ3MgZW5kIHN0YXRlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgV3JpdGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFdyaXRhYmxlTG9jayhcbiAgd3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzV3JpdGFibGVVbmxvY2tlZE5vdENsb3NlZCh3cml0YWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIExPQ0tfUE9MTF9JTlRFUlZBTF9NUyk7XG5cbiAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgUmVhZGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFJlYWRhYmxlTG9jayhcbiAgcmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIExPQ0tfUE9MTF9JTlRFUlZBTF9NUyk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHNvdXJjZSAtIGRvbid0IGNvdW50IGFzIHBlbmRpbmcgb3Agc2luY2Ugd2UncmUganVzdCB3YWl0aW5nIGZvciBkYXRhXG4gICAgICAvLyBUaGUgaW1wb3J0YW50IG9wcyBhcmUgd3JpdGVzIHRvIHRoZSBzaW5rIChzZXJ2ZXIpXG4gICAgICBjb25zdCByZWFkUmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgd3JpdGVyLmNsb3NlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZCAoZS5nLiwgZHVlIHRvIGVycm9yIGluIGFub3RoZXIgcGF0aCkgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICAgIGlmIChzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWFkUmVzdWx0LmRvbmUpIHtcbiAgICAgICAgLy8gU291cmNlIHN0cmVhbSBjb21wbGV0ZWQgLSBjbG9zZSBzaW5rIGFuZCByZXNvbHZlXG4gICAgICAgIHN0YXRlLnN0cmVhbUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgIC8vIFJlc29sdmUgZG9uZSBwcm9taXNlIGlmIG5vdCBhbHJlYWR5IHJlc29sdmVkXG4gICAgICAgIGlmICghc3RhdGUuZG9uZVJlc29sdmVkKSB7XG4gICAgICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB3cml0ZSBhcyBhIHBlbmRpbmcgb3AgLSB0aGlzIGlzIHdoYXQgd2UgbmVlZCB0byBmbHVzaFxuICAgICAgc3RhdGUucGVuZGluZ09wcysrO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHJlYWRSZXN1bHQudmFsdWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUucGVuZGluZ09wcy0tO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgIGNhbmNlbFJlYXNvbiA9IGVycjtcbiAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgZXJyb3IgdGhyb3VnaCBmbHVzaGFibGVQaXBlJ3Mgb3duIHByb21pc2UgYXMgd2VsbC5cbiAgICAvLyBDYWxsZXJzIHRoYXQgcmVseSBvbiB0aGUgRmx1c2hhYmxlU3RyZWFtU3RhdGUgc2hvdWxkIHVzZSBgc3RhdGUucHJvbWlzZWAsXG4gICAgLy8gd2hpbGUgb3RoZXIgY2FsbGVycyBtYXkgZGVwZW5kIG9uIHRoaXMgcmVqZWN0aW9uLiBTb21lIGtub3duIGNhbGxlcnNcbiAgICAvLyBleHBsaWNpdGx5IGlnbm9yZSB0aGlzIHJlamVjdGlvbiAoYC5jYXRjaCgoKSA9PiB7fSlgKSBhbmQgcmVseSBzb2xlbHlcbiAgICAvLyBvbiBgc3RhdGUucmVqZWN0KGVycilgIGZvciBlcnJvciBoYW5kbGluZy5cbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2FuY2VsIHRoZSB1cHN0cmVhbSByZWFkZXIgc28gdGhlIHNvdXJjZSBrbm93cyB0byBzdG9wIGdlbmVyYXRpbmcgZGF0YS5cbiAgICAvLyBVc2VzIGNhbmNlbFJlYXNvbiAoc2V0IGluIHRoZSBjYXRjaCBibG9jaykgc28gdGhlIHNvdXJjZSByZWNlaXZlcyBjb250ZXh0XG4gICAgLy8gYWJvdXQgd2h5IGl0IHdhcyBjYW5jZWxsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
|
|
507
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVNuRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHNDQUFzQyxFQUFFLG9CQUFvQixFQUFFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7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dUU7UUFDdkUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLHNFQUFzRTtRQUN0RSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0QsK0RBQStEO1FBQy9ELDRFQUE0RTtRQUM1RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLDZDQUE2QztRQUM3QyxNQUFNLEdBQUcsQ0FBQztJQUNaLENBQUM7WUFBUyxDQUFDO1FBQ1QsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsdURBQXVEO1FBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgdHlwZSBQcm9taXNlV2l0aFJlc29sdmVycywgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQvZW52LWNvbmZpZyc7XG5pbXBvcnQgeyBTVFJFQU1fRFJBSU5fU1lNQk9MIH0gZnJvbSAnLi9zeW1ib2xzLmpzJztcblxuLyoqXG4gKiBBIGR1cmFiaWxpdHkgYmFycmllciBhIHNpbmsgbWF5IGV4cG9zZSB1bmRlciB7QGxpbmsgU1RSRUFNX0RSQUlOX1NZTUJPTH06XG4gKiByZXNvbHZlcyBvbmNlIGV2ZXJ5IGNodW5rIHRoZSBzaW5rIGhhcyBhY2NlcHRlZCBpcyBkdXJhYmx5IHdyaXR0ZW4sIHJlamVjdHNcbiAqIGlmIGFueSBzZXJ2ZXIgd3JpdGUgZmFpbGVkLiBTZWUgYFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW1gLlxuICovXG50eXBlIERyYWluQmFycmllciA9ICgpID0+IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogRmxvdy1jb250cm9sIGtub2I6IHVwcGVyIGJvdW5kIG9uIGNodW5rcyByZWFkLWJ1dC1ub3QteWV0LWR1cmFibHktd3JpdHRlblxuICogd2hpbGUgY29hbGVzY2luZy4gT25jZSB0aGlzIG1hbnkgY2h1bmtzIGFyZSBvdXRzdGFuZGluZyB0aGUgcHJvZHVjZXIgc3RvcHNcbiAqIHJlYWRpbmcgdW50aWwgdGhlIGNvbnN1bWVyIGRyYWlucyBhIGJhdGNoLCBzbyBhIGZhc3QgcHJvZHVjZXIgcGFpcmVkIHdpdGggYVxuICogc2xvdyBzZXJ2ZXIgY2FuJ3QgZ3JvdyB0aGUgaW4tbWVtb3J5IHF1ZXVlIHdpdGhvdXQgYm91bmQuIE92ZXJyaWRlOlxuICogYFdPUktGTE9XX1NUUkVBTV9NQVhfSU5GTElHSFRfQ0hVTktTYC5cbiAqXG4gKiBUaGlzIGlzIGRlbGliZXJhdGVseSBkaXN0aW5jdCBmcm9tIHRoZSBwZXItcmVxdWVzdCBiYXRjaCBjYXBzIGJlbG93OiB0aGlzXG4gKiBib3VuZHMgaG93IG11Y2ggaXMgKmJ1ZmZlcmVkKiwgdGhvc2UgYm91bmQgaG93IG11Y2ggZ29lcyBvdXQgaW4gb25lXG4gKiBgd3JpdGVNdWx0aWAuIFJhaXNpbmcgdGhpcyBtdXN0IG5ldmVyIGxldCBhIHNpbmdsZSByZXF1ZXN0IGV4Y2VlZCBhIHdpcmVcbiAqIGxpbWl0LCBzaW5jZSBiYXRjaCBzaXppbmcgZW5mb3JjZXMgdGhhdCBpbmRlcGVuZGVudGx5LlxuICovXG5leHBvcnQgY29uc3QgTUFYX0lORkxJR0hUX0NIVU5LUyA9IDEwMDA7XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhJbmZsaWdodENodW5rcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LUycsIE1BWF9JTkZMSUdIVF9DSFVOS1MsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogV2lyZSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2YgY2h1bmtzIGluIGEgc2luZ2xlIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuXG4gKiBUaGUgc2VydmVyIGVuZm9yY2VzIGEgcGVyLW11bHRpLXdyaXRlIGNodW5rIGNhcCAoMSwwMDAgdG9kYXkpOyBhIGJhdGNoIGlzXG4gKiBzcGxpdCBhdCB0aGlzIGJvdW5kIHNvIGl0IGNhbiBuZXZlciBiZSByZWplY3RlZCB3aG9sZXNhbGUsIGluZGVwZW5kZW50bHkgb2ZcbiAqIHRoZSBiYWNrcHJlc3N1cmUga25vYiBhYm92ZS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0NIVU5LU19QRVJfQkFUQ0ggPSAxMDAwO1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q2h1bmtzUGVyQmF0Y2ggPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9DSFVOS1NfUEVSX0JBVENIJywgTUFYX0NIVU5LU19QRVJfQkFUQ0gsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogV2lyZSBsaW1pdDogbWF4aW11bSBjdW11bGF0aXZlIGJ5dGVzIGluIGEgc2luZ2xlIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuXG4gKiBDaHVuayAqY291bnQqIGFsb25lIGlzIG5vdCBlbm91Z2g6IDEsMDAwIHNtYWxsIGNodW5rcyBhcmUgfjEwMEtCIGJ1dCAxLDAwMFxuICogZmlsZS1zaXplZCBjaHVua3MgY2FuIGJlIGh1bmRyZWRzIG9mIE1CLCB3aGljaCBwbGF0Zm9ybSByZXF1ZXN0LWJvZHkgbGltaXRzXG4gKiByZWplY3QgbG9uZyBiZWZvcmUgdGhlIGNvdW50IGNhcCBtYXR0ZXJzLiBBIGJhdGNoIGlzIHNwbGl0IG9uY2UgYWRkaW5nIHRoZVxuICogbmV4dCBjaHVuayB3b3VsZCBleGNlZWQgdGhpcyAoYSBzaW5nbGUgY2h1bmsgbGFyZ2VyIHRoYW4gdGhlIGNhcCBzdGlsbCBnb2VzXG4gKiBvdXQgYWxvbmUpLiBEZWZhdWx0IDEgTWlCLiBPdmVycmlkZTogYFdPUktGTE9XX1NUUkVBTV9NQVhfQllURVNfUEVSX0JBVENIYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CWVRFU19QRVJfQkFUQ0ggPSAxMDI0ICogMTAyNDtcblxuZXhwb3J0IGNvbnN0IGdldE1heEJ5dGVzUGVyQmF0Y2ggPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9CWVRFU19QRVJfQkFUQ0gnLCBNQVhfQllURVNfUEVSX0JBVENILCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIEJ1ZmZlciBib3VuZCAoYnl0ZXMpIGZvciB0aGUgc2VydmVyIHdyaXRhYmxlJ3MgZ3JvdXAtY29tbWl0IGJ1ZmZlciwgdGhlXG4gKiBieXRlLWRlbm9taW5hdGVkIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBNQVhfSU5GTElHSFRfQ0hVTktTfS4gYHdyaXRlKClgXG4gKiBibG9ja3Mgb25jZSB0aGlzIG11Y2ggZGF0YSBpcyBidWZmZXJlZC1idXQtbm90LWR1cmFibGUsIHNvIGEgZmFzdCBwcm9kdWNlclxuICogb2YgbGFyZ2UgY2h1bmtzIGNhbid0IGdyb3cgY2xpZW50IG1lbW9yeSB3aXRob3V0IGJvdW5kLiBEZWZhdWx0IDggTWlCXG4gKiAoZWlnaHQgcmVxdWVzdC1zaXplZCBncm91cHMpLiBPdmVycmlkZTogYFdPUktGTE9XX1NUUkVBTV9NQVhfQlVGRkVSRURfQllURVNgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JVRkZFUkVEX0JZVEVTID0gOCAqIDEwMjQgKiAxMDI0O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4QnVmZmVyZWRCeXRlcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0JVRkZFUkVEX0JZVEVTJywgTUFYX0JVRkZFUkVEX0JZVEVTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFBvbGxpbmcgaW50ZXJ2YWwgKGluIG1zKSBmb3IgbG9jayByZWxlYXNlIGRldGVjdGlvbi5cbiAqXG4gKiBUaGUgV2ViIFN0cmVhbXMgQVBJIGRvZXMgbm90IGV4cG9zZSBhbiBldmVudCBmb3IgXCJsb2NrIHJlbGVhc2VkIGJ1dCBzdHJlYW1cbiAqIHN0aWxsIG9wZW5cIjsgd2UgY2FuIG9ubHkgZGlzdGluZ3Vpc2ggdGhhdCBzdGF0ZSBieSBwZXJpb2RpY2FsbHkgYXR0ZW1wdGluZ1xuICogdG8gYWNxdWlyZSBhIHJlYWRlci93cml0ZXIuIEZvciB0aGF0IHJlYXNvbiB3ZSB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGFcbiAqIGZ1bGx5IGV2ZW50LWRyaXZlbiBhcHByb2FjaCBoZXJlLlxuICpcbiAqIDEwbXMgaXMgY2hvc2VuIHNvIHRoZSBwb2xsaW5nIHRpY2sgYWxtb3N0IG5ldmVyIHNpdHMgb24gdGhlIGNyaXRpY2FsIHBhdGg6XG4gKiB0aGUgVjIgc3RlcC1leGVjdXRvcidzIGBvcHNTZXR0bGVkYCByYWNlIHdhaXRzIGZvciB0aGlzIHN0YXRlIHRvIHJlc29sdmVcbiAqIGFmdGVyIGVhY2ggc3RlcCBib2R5IHJldHVybnMsIHNvIGEgY29hcnNlciBpbnRlcnZhbCAodGhlIHByZXZpb3VzIDEwMG1zKVxuICogYWRkcyB2aXNpYmxlIHBlci1zdGVwIGxhdGVuY3kgdG8gc3RyZWFtaW5nIHdvcmtmbG93cy4gV2l0aCBhIHVuaWZvcm1seVxuICogZGlzdHJpYnV0ZWQgb2Zmc2V0IGJldHdlZW4gc3RlcCByZXR1cm4gYW5kIHRoZSBuZXh0IHRpY2ssIHRoZSBleHBlY3RlZFxuICogd2FpdCBpcyBoYWxmIHRoZSBpbnRlcnZhbCwgc28gMTBtcyBtZWFucyB+NW1zIGF2ZXJhZ2Ugd2FpdCBwZXIgc3RlcFxuICogaW5zdGVhZCBvZiB+NTBtcy4gVGhlIHBlci10aWNrIHdvcmsgaXMgYHdyaXRhYmxlLmxvY2tlZGAgcGx1cyBhXG4gKiBgZ2V0V3JpdGVyKClgL2ByZWxlYXNlTG9jaygpYCBwcm9iZSwgYm90aCBtaWNyb3NlY29uZC1zY2FsZTsgMTDDlyBtb3JlXG4gKiB0aWNrcyBkdXJpbmcgYSBzdHJlYW0ncyBsaWZldGltZSBpcyBub3QgbWVhc3VyYWJsZSBpbiBwcmFjdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9NUyA9IDEwO1xuXG4vKiogRWZmZWN0aXZlIGxvY2stcG9sbCBpbnRlcnZhbC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19MT0NLX1BPTExfSU5URVJWQUxfTVNgLiAqL1xuY29uc3QgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX0xPQ0tfUE9MTF9JTlRFUlZBTF9NUycsIExPQ0tfUE9MTF9JTlRFUlZBTF9NUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBTdGF0ZSB0cmFja2VyIGZvciBmbHVzaGFibGUgc3RyZWFtIG9wZXJhdGlvbnMuXG4gKiBSZXNvbHZlcyB3aGVuIGVpdGhlcjpcbiAqIDEuIFN0cmVhbSBjb21wbGV0ZXMgKGNsb3NlL2Vycm9yKSwgT1JcbiAqIDIuIExvY2sgaXMgcmVsZWFzZWQgQU5EIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGZsdXNoZWRcbiAqXG4gKiBOb3RlOiBgZG9uZVJlc29sdmVkYCBhbmQgYHN0cmVhbUVuZGVkYCBhcmUgc2VwYXJhdGU6XG4gKiAtIGBkb25lUmVzb2x2ZWRgOiBUaGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKHN0ZXAgY2FuIGNvbXBsZXRlKVxuICogLSBgc3RyZWFtRW5kZWRgOiBUaGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkXG4gKlxuICogT25jZSBgZG9uZVJlc29sdmVkYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGBkb25lYCBwcm9taXNlIHdpbGwgbm90IHJlc29sdmVcbiAqIGFnYWluLiBSZS1hY3F1aXJpbmcgbG9ja3MgYWZ0ZXIgcmVsZWFzZSBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgd2F5IHRvXG4gKiB0cmlnZ2VyIGFkZGl0aW9uYWwgY29tcGxldGlvbiBzaWduYWxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmx1c2hhYmxlU3RyZWFtU3RhdGUgZXh0ZW5kcyBQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPiB7XG4gIC8qKiBOdW1iZXIgb2Ygd3JpdGUgb3BlcmF0aW9ucyBjdXJyZW50bHkgaW4gZmxpZ2h0IHRvIHRoZSBzZXJ2ZXIgKi9cbiAgcGVuZGluZ09wczogbnVtYmVyO1xuICAvKiogRnJhbWVzIGVtaXR0ZWQgYnkgdGhpcyBwaXBlJ3MgcHJvZHVjZXIuICovXG4gIHByb2R1Y2VkRnJhbWVzOiBudW1iZXI7XG4gIC8qKiBQcm9kdWNlZCBmcmFtZXMgYWNjZXB0ZWQgYnkgdGhpcyBwaXBlJ3Mgc2luay4gKi9cbiAgYWNjZXB0ZWRGcmFtZXM6IG51bWJlcjtcbiAgLyoqIFRlcm1pbmFsIHBpcGUgZXJyb3IsIHJldGFpbmVkIGZvciBzbmFwc2hvdHMgcmVnaXN0ZXJlZCBhZnRlciBmYWlsdXJlLiAqL1xuICBwaXBlRXJyb3I/OiB1bmtub3duO1xuICAvKipcbiAgICogSWYgdGhlIHVzZXItZmFjaW5nIHdyaXRhYmxlIGlzIHVubG9ja2VkLCBlbnF1ZXVlIGFuIG9yZGVyZWQgY2hlY2twb2ludCBhbmRcbiAgICogZHVyYWJseSBkcmFpbiBldmVyeSB3cml0ZSBhaGVhZCBvZiBpdC4gUmV0dXJucyBmYWxzZSB3aGlsZSBhIHdyaXRlciByZW1haW5zXG4gICAqIGxvY2tlZCwgc28gbG9jay1oZWxkIHN0cmVhbXMgbmV2ZXIgYmxvY2sgc3RlcCBjb21wbGV0aW9uLlxuICAgKi9cbiAgc2V0dGxlUmVsZWFzZWRXcml0ZXM/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogV2hldGhlciByZWxlYXNlIHNldHRsZW1lbnQgd2FpdHMgZm9yIGV4cGxpY2l0IHN0ZXAtZW5kIGFybWluZy4gKi9cbiAgZGVmZXJSZWxlYXNlU2V0dGxlbWVudD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHN0ZXAtZW5kIHByb2Nlc3NpbmcgaGFzIGFybWVkIHJlbGVhc2VkLXdyaXRlciBzZXR0bGVtZW50LiAqL1xuICByZWxlYXNlU2V0dGxlbWVudEFybWVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXItZmFjaW5nIHdyaXRhYmxlIGhhcyBiZWd1biBhIG5vcm1hbCBjbG9zZS4gKi9cbiAgdXNlcldyaXRhYmxlQ2xvc2luZz86IGJvb2xlYW47XG4gIC8qKiBTdGVwLWVuZCBzbmFwc2hvdCB3YWl0ZXJzIGJsb2NrZWQgdW50aWwgdGhlaXIgdGFyZ2V0IHJlYWNoZXMgdGhlIHNpbmsuICovXG4gIGZyYW1lV2FpdGVyczogQXJyYXk8e1xuICAgIHRhcmdldDogbnVtYmVyO1xuICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG4gIH0+O1xuICAvKiogV2hldGhlciB0aGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKi9cbiAgZG9uZVJlc29sdmVkOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkICovXG4gIHN0cmVhbUVuZGVkOiBib29sZWFuO1xuICAvKiogSW50ZXJ2YWwgSUQgZm9yIHdyaXRhYmxlIGxvY2sgcG9sbGluZyAoaWYgYWN0aXZlKSAqL1xuICB3cml0YWJsZVBvbGxpbmdJbnRlcnZhbD86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgLyoqIEludGVydmFsIElEIGZvciByZWFkYWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgcmVhZGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIC8qKlxuICAgKiBEdXJhYmlsaXR5IGJhcnJpZXIgb2YgdGhlIHBpcGUncyBzaW5rLCB3aGVuIGl0IGFja3Mgd3JpdGVzIG9uIGJ1ZmZlclxuICAgKiBlbnRyeSAoc2VlIHtAbGluayBTVFJFQU1fRFJBSU5fU1lNQk9MfSkuIExvY2stcmVsZWFzZSBjb21wbGV0aW9uIGF3YWl0c1xuICAgKiB0aGlzIGJlZm9yZSByZXNvbHZpbmcgc28gYHBlbmRpbmdPcHMgPT09IDBgIChmYXN0LCBidWZmZXJlZCBhY2tzKSBjYW4ndFxuICAgKiBjb21wbGV0ZSBhIHN0ZXAgd2hpbGUgZGF0YSBpcyBzdGlsbCBjbGllbnQtc2lkZS5cbiAgICovXG4gIGRyYWluQmFycmllcj86IERyYWluQmFycmllcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk6IEZsdXNoYWJsZVN0cmVhbVN0YXRlIHtcbiAgY29uc3Qgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlID0ge1xuICAgIC4uLndpdGhSZXNvbHZlcnM8dm9pZD4oKSxcbiAgICBwZW5kaW5nT3BzOiAwLFxuICAgIHByb2R1Y2VkRnJhbWVzOiAwLFxuICAgIGFjY2VwdGVkRnJhbWVzOiAwLFxuICAgIGZyYW1lV2FpdGVyczogW10sXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG5cbiAgLy8gVGhlIHJ1bnRpbWUgYXdhaXRzIHRoaXMgcHJvbWlzZSBhZnRlciB1c2VyIGNvZGUgcmV0dXJucy4gT2JzZXJ2ZSBlYXJseVxuICAvLyBzdHJlYW0gZmFpbHVyZXMgbm93IHNvIHRoZXkgZG8gbm90IGJlY29tZSB1bmhhbmRsZWQgcmVqZWN0aW9ucyBmaXJzdC5cbiAgc3RhdGUucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFdyaXRhYmxlU3RyZWFtIGlzIHVubG9ja2VkICh1c2VyIHJlbGVhc2VkIGxvY2spIHZzIGNsb3NlZC5cbiAqIFdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLCAubG9ja2VkIGlzIGZhbHNlIGJ1dCBnZXRXcml0ZXIoKSB0aHJvd3MuXG4gKiBXZSBvbmx5IHdhbnQgdG8gcmVzb2x2ZSB2aWEgcG9sbGluZyB3aGVuIHRoZSBzdHJlYW0gaXMgdW5sb2NrZWQsIG5vdCBjbG9zZWQuXG4gKiBJZiBjbG9zZWQsIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSk6IGJvb2xlYW4ge1xuICBpZiAod3JpdGFibGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbGV0IHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBhY3F1aXJlIHdyaXRlciAtIGlmIHN1Y2Nlc3NmdWwsIHN0cmVhbSBpcyB1bmxvY2tlZCAobm90IGNsb3NlZClcbiAgICB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZ2V0V3JpdGVyKCkgdGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQvZXJyb3JlZCAtIGxldCBwdW1wIGhhbmRsZSBpdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHJlbGVhc2VMb2NrKCkgdGhyb3dzIGZvciBhbnkgcmVhc29uLCBjb25zZXJ2YXRpdmVseSB0cmVhdCB0aGVcbiAgICAvLyBzdHJlYW0gYXMgY2xvc2VkL2Vycm9yZWQgc28gY2FsbGVycyBkb24ndCBhc3N1bWUgaXQncyBzYWZlIHRvIHVzZS5cbiAgICAvLyBUaGUgcHVtcCB3aWxsIG9ic2VydmUgdGhlIGZhaWx1cmUgdmlhIHRoZSBzdHJlYW0ncyBlbmQgc3RhdGUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgUmVhZGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmIChyZWFkYWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgcmVhZGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRSZWFkZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBTZXR0bGUgdGhlIGZsdXNoYWJsZSBjb21wbGV0aW9uIGFmdGVyIHRoZSBzaW5rJ3MgZHVyYWJpbGl0eSBiYXJyaWVyLlxuICpcbiAqIExvY2sgcmVsZWFzZSBtZWFucyB0aGUgcHJvZHVjZXIgaXMgZG9uZSAqd3JpdGluZyo7IHdpdGggYSBncm91cC1jb21taXRcbiAqIHNpbmssIGFjY2VwdGVkIGNodW5rcyBtYXkgc3RpbGwgYmUgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGEgcmVxdWVzdCB0aGF0IGlzXG4gKiBpbiBmbGlnaHQuIEF3YWl0aW5nIHRoZSBiYXJyaWVyIGhlcmUga2VlcHMgdGhlIGNvbXBsZXRpb24ncyBtZWFuaW5nXG4gKiAoXCJldmVyeXRoaW5nIHdyaXR0ZW4gc28gZmFyIGlzIGR1cmFibGVcIikgaWRlbnRpY2FsIHRvIHRoZSBwcmUtYmF0Y2hpbmdcbiAqIGJlaGF2aW9yIHdoZXJlIGVhY2ggd3JpdGUoKSB3YXMgaW5kaXZpZHVhbGx5IGR1cmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBZnRlckRyYWluKHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSk6IHZvaWQge1xuICBjb25zdCBiYXJyaWVyID0gc3RhdGUuZHJhaW5CYXJyaWVyO1xuICBpZiAoIWJhcnJpZXIpIHtcbiAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJhcnJpZXIoKS50aGVuKFxuICAgICgpID0+IHN0YXRlLnJlc29sdmUoKSxcbiAgICAoZXJyKSA9PiBzdGF0ZS5yZWplY3QoZXJyKVxuICApO1xufVxuXG4vKiogUmVjb3JkIGEgZnJhbWUgc3luY2hyb25vdXNseSB3aGVuIGl0cyBwcm9kdWNlciBlbWl0cyBpdCBpbnRvIHRoaXMgcGlwZS4gKi9cbmZ1bmN0aW9uIG1hcmtGbHVzaGFibGVGcmFtZVByb2R1Y2VkKHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSk6IHZvaWQge1xuICBzdGF0ZS5wcm9kdWNlZEZyYW1lcysrO1xufVxuXG4vKipcbiAqIENhcHR1cmUgYSBzdGVwLWVuZCBwcm9kdWNlciB3YXRlcm1hcmssIHdhaXQgdW50aWwgdGhlIHBpcGUgaGFzIGhhbmRlZCBldmVyeVxuICogZnJhbWUgdGhyb3VnaCB0aGF0IHdhdGVybWFyayB0byBpdHMgc2luaywgdGhlbiBhd2FpdCB0aGUgc2luaydzIGR1cmFiaWxpdHlcbiAqIGJhcnJpZXIuIFVubGlrZSB7QGxpbmsgRmx1c2hhYmxlU3RyZWFtU3RhdGUucHJvbWlzZX0sIHRoaXMgbmV2ZXIgd2FpdHMgZm9yIGFcbiAqIHVzZXIgd3JpdGVyIGxvY2sgdG8gYmUgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkcmFpbkZsdXNoYWJsZVNuYXBzaG90KFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkcmFpbkJlZm9yZVRocm93ID0gYXN5bmMgKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTxuZXZlcj4gPT4ge1xuICAgIC8vIEEgbGF0ZXIgZnJhbWUgY2FuIGZhaWwgYWZ0ZXIgYW4gZWFybGllciBmcmFtZSB3YXMgZWFybHktYWNrZWQgYnkgdGhlXG4gICAgLy8gZ3JvdXAtY29tbWl0IHNpbmsuIEtlZXAgdGhlIGVhcmxpZXIgYWNjZXB0ZWQgcHJlZml4IGR1cmFibGUgYmVmb3JlXG4gICAgLy8gc3VyZmFjaW5nIHRoZSBwcm9kdWNlciBlcnJvciwgbWF0Y2hpbmcgZmx1c2hhYmxlUGlwZSdzIGZhaWx1cmUgcGF0aC5cbiAgICBhd2FpdCBzdGF0ZS5kcmFpbkJhcnJpZXI/LigpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfTtcblxuICBjb25zdCB0YXJnZXQgPSBzdGF0ZS5wcm9kdWNlZEZyYW1lcztcbiAgaWYgKHN0YXRlLmFjY2VwdGVkRnJhbWVzIDwgdGFyZ2V0KSB7XG4gICAgaWYgKHN0YXRlLnBpcGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZHJhaW5CZWZvcmVUaHJvdyhzdGF0ZS5waXBlRXJyb3IpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzdGF0ZS5mcmFtZVdhaXRlcnMucHVzaCh7IHRhcmdldCwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBkcmFpbkJlZm9yZVRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXRlLnBpcGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRyYWluQmVmb3JlVGhyb3coc3RhdGUucGlwZUVycm9yKTtcbiAgfVxuICBhd2FpdCBzdGF0ZS5kcmFpbkJhcnJpZXI/LigpO1xufVxuXG4vKipcbiAqIE1hcmsgYnl0ZS1zdHJlYW0gY2h1bmtzIGF0IHRoZSBwcm9kdWNlciBzaWRlIG9mIGEgZmx1c2hhYmxlIHBpcGUuIFNlcmlhbGl6ZWRcbiAqIHN0cmVhbXMgc2hvdWxkIGluc3RlYWQgdXNlIGBnZXRTZXJpYWxpemVTdHJlYW1gJ3Mgc3luY2hyb25vdXMgb3V0cHV0IGhvb2suXG4gKi9cbi8qKlxuICogV3JhcCB0aGUgdXNlci1mYWNpbmcgcHJvZHVjZXIgYm91bmRhcnkgb2YgYSBmbHVzaGFibGUgd3JpdGFibGUuIEEgY29tcGxldGVkXG4gKiB3cml0ZSB0aHJvdWdoIHRoaXMgaGFuZGxlIGhhcyBhIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgc3RlcC1lbmQgc25hcHNob3RzLFxuICogd2hpbGUgdGhlIG9yaWdpbmFsIHdyaXRhYmxlIHJlbWFpbnMgdGhlIGlucHV0IHRvIHRoZSBzZXJpYWxpemF0aW9uIHBpcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFja0ZsdXNoYWJsZVdyaXRhYmxlPFQ+KFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW08VD4sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSxcbiAgV3JpdGFibGVTdHJlYW1Db25zdHJ1Y3RvcjogdHlwZW9mIFdyaXRhYmxlU3RyZWFtID0gV3JpdGFibGVTdHJlYW1cbik6IFdyaXRhYmxlU3RyZWFtPFQ+IHtcbiAgY29uc3QgdGFyZ2V0V3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gIGNvbnN0IGNoZWNrcG9pbnQgPSBTeW1ib2woJ3dvcmtmbG93LXN0cmVhbS1yZWxlYXNlLWNoZWNrcG9pbnQnKTtcbiAgbGV0IHRyYWNrZWRDb250cm9sbGVyOiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xuICBjb25zdCB0cmFja2VkID0gbmV3IFdyaXRhYmxlU3RyZWFtQ29uc3RydWN0b3Ioe1xuICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyYWNrZWRDb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHdyaXRlKGNodW5rKSB7XG4gICAgICBpZiAoY2h1bmsgPT09IGNoZWNrcG9pbnQpIHJldHVybjtcbiAgICAgIG1hcmtGbHVzaGFibGVGcmFtZVByb2R1Y2VkKHN0YXRlKTtcbiAgICAgIGF3YWl0IHRhcmdldFdyaXRlci53cml0ZShjaHVuayk7XG4gICAgfSxcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIHN0YXRlLnVzZXJXcml0YWJsZUNsb3NpbmcgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGFyZ2V0V3JpdGVyLmNsb3NlKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0YXJnZXRXcml0ZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGFib3J0KHJlYXNvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGFyZ2V0V3JpdGVyLmFib3J0KHJlYXNvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0YXJnZXRXcml0ZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KSBhcyBXcml0YWJsZVN0cmVhbTxUPjtcblxuICAvLyBBIGRvd25zdHJlYW0gc2luayBjYW4gZmFpbCBhZnRlciBpdHMgZWFybHktYWNrbm93bGVkZ2VkIHdyaXRlIGhhcyBhbHJlYWR5XG4gIC8vIHJlc29sdmVkLiBGb3J3YXJkIHRoYXQgdGVybWluYWwgZXJyb3IgaW50byB0aGUgcHVibGljIHdyaXRhYmxlIGV2ZW4gd2hpbGVcbiAgLy8gaXRzIHByb2R1Y2VyIGlzIGlkbGUsIHNvIG5hdGl2ZSBwaXBlVG8oKSByZWplY3RzIGFuZCBjYW5jZWxzIGl0cyBzb3VyY2UuXG4gIHRhcmdldFdyaXRlci5jbG9zZWQuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgdHJhY2tlZENvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICB9KTtcblxuICBsZXQgc2V0dGxlbWVudDogUHJvbWlzZTxib29sZWFuPiB8IHVuZGVmaW5lZDtcbiAgc3RhdGUuc2V0dGxlUmVsZWFzZWRXcml0ZXMgPSAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgc3RhdGUucmVsZWFzZVNldHRsZW1lbnRBcm1lZCA9IHRydWU7XG4gICAgaWYgKHNldHRsZW1lbnQpIHJldHVybiBzZXR0bGVtZW50O1xuICAgIGlmICh0cmFja2VkLmxvY2tlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgaWYgKHN0YXRlLnVzZXJXcml0YWJsZUNsb3NpbmcpIHtcbiAgICAgIHNldHRsZW1lbnQgPSBzdGF0ZS5wcm9taXNlLnRoZW4oKCkgPT4gdHJ1ZSk7XG4gICAgICByZXR1cm4gc2V0dGxlbWVudDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2twb2ludFdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyPFQ+O1xuICAgIHRyeSB7XG4gICAgICBjaGVja3BvaW50V3JpdGVyID0gdHJhY2tlZC5nZXRXcml0ZXIoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENsb3NlZC9lcnJvcmVkIHN0cmVhbXMgc2V0dGxlIHRocm91Z2ggdGhlIHBpcGUncyBub3JtYWwgY29tcGxldGlvbi5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH1cblxuICAgIHNldHRsZW1lbnQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gTmF0aXZlIHdyaXRhYmxlIG9yZGVyaW5nIHB1dHMgdGhpcyBiZWhpbmQgd3JpdGVzIHF1ZXVlZCBieSB0aGVcbiAgICAgICAgLy8gcmVsZWFzZWQgd3JpdGVyLCBpbmNsdWRpbmcgd3JpdGUgcHJvbWlzZXMgaXQgZGlkIG5vdCBhd2FpdC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjaGVja3BvaW50V3JpdGVyLndyaXRlKGNoZWNrcG9pbnQgYXMgVCk7XG4gICAgICAgIH0gY2F0Y2ggKGNoZWNrcG9pbnRFcnJvcikge1xuICAgICAgICAgIC8vIEEgY2xvc2UgY2FuIG1vdmUgZnJvbSByZXF1ZXN0ZWQgdG8gdGVybWluYWwgYmV0d2VlbiBnZXRXcml0ZXIoKVxuICAgICAgICAgIC8vIGFuZCB3cml0ZSgpLiBJdHMgbm9ybWFsIHBpcGUgY29tcGxldGlvbiBhbHJlYWR5IGRyYWlucyB0aGUgc2luaztcbiAgICAgICAgICAvLyBhbiBlcnJvcmVkIHBpcGUgcmVqZWN0cyBoZXJlIHdpdGggaXRzIGFjdHVhbCBmYWlsdXJlIGluc3RlYWQuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHN0YXRlLnByb21pc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChwaXBlRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHBpcGVFcnJvciA/PyBjaGVja3BvaW50RXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGRyYWluRmx1c2hhYmxlU25hcHNob3Qoc3RhdGUpO1xuICAgICAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjaGVja3BvaW50V3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gc2V0dGxlbWVudDtcbiAgfTtcblxuICByZXR1cm4gdHJhY2tlZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFdyaXRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxXcml0YWJsZUxvY2soXG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXR0bGVSZWxlYXNlZFdyaXRlcykge1xuICAgICAgaWYgKFxuICAgICAgICAoIXN0YXRlLmRlZmVyUmVsZWFzZVNldHRsZW1lbnQgfHwgc3RhdGUucmVsZWFzZVNldHRsZW1lbnRBcm1lZCkgJiZcbiAgICAgICAgIXdyaXRhYmxlLmxvY2tlZFxuICAgICAgKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgICB2b2lkIHN0YXRlLnNldHRsZVJlbGVhc2VkV3JpdGVzKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEZhaWx1cmUgaXMgc3VyZmFjZWQgdGhyb3VnaCBzdGF0ZS5wcm9taXNlLlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBsb2NrIGlzIHJlbGVhc2VkIChub3QgY2xvc2VkKSBhbmQgbm8gcGVuZGluZyBvcHNcbiAgICBpZiAoaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlKSAmJiBzdGF0ZS5wZW5kaW5nT3BzID09PSAwKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGUpO1xuICAgIH1cbiAgfSwgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zKCkpO1xuXG4gIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gaW50ZXJ2YWxJZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFJlYWRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxSZWFkYWJsZUxvY2soXG4gIHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlQWZ0ZXJEcmFpbihzdGF0ZSk7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCYXRjaGluZyBsaXZlcyBpbiB0aGUgc2luayAoYFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW1gIGdyb3VwLWNvbW1pdHNcbiAgLy8gaXRzIGJ1ZmZlciksIHNvIHRoaXMgcGlwZSBpcyBhIHBsYWluIHBlci1jaHVuayBwdW1wIHJlZ2FyZGxlc3Mgb2YgcGF0aDpcbiAgLy8gaXRzIG9ubHkgcmVzcG9uc2liaWxpdGllcyBhcmUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYW5kIGR1cmFiaWxpdHlcbiAgLy8gdHJhY2tpbmcuIEdyb3VwLWNvbW1pdCBzaW5rcyBhY2sgd3JpdGUoKSBvbiBidWZmZXIgZW50cnk7IGFkb3B0IHRoZWlyXG4gIC8vIGR1cmFiaWxpdHkgYmFycmllciBzbyB0aGUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gc3RpbGwgbWVhbnNcbiAgLy8gXCJldmVyeXRoaW5nIHdyaXR0ZW4gaXMgZHVyYWJsZVwiIChzZWUgcmVzb2x2ZUFmdGVyRHJhaW4pLlxuICBjb25zdCBkcmFpbiA9IChzaW5rIGFzIHsgW1NUUkVBTV9EUkFJTl9TWU1CT0xdPzogRHJhaW5CYXJyaWVyIH0pW1xuICAgIFNUUkVBTV9EUkFJTl9TWU1CT0xcbiAgXTtcbiAgaWYgKHR5cGVvZiBkcmFpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0YXRlLmRyYWluQmFycmllciA9IGRyYWluO1xuICB9XG4gIHJldHVybiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoc291cmNlLCBzaW5rLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogVGhlIHB1bXAgYmVoaW5kIHtAbGluayBmbHVzaGFibGVQaXBlfTogYXdhaXRzIGVhY2ggYHdyaXRlci53cml0ZSgpYCBiZWZvcmVcbiAqIHJlYWRpbmcgdGhlIG5leHQgY2h1bmsuIEFnYWluc3QgYSBncm91cC1jb21taXQgc2luaywgd3JpdGUoKSBhY2tzIG9uIGJ1ZmZlclxuICogZW50cnksIHNvIHRoaXMgbG9vcCBmZWVkcyB0aGUgc2luayBhcyBmYXN0IGFzIHRoZSBwcm9kdWNlciBlbWl0cyAoYm91bmRlZFxuICogYnkgdGhlIHNpbmsncyBidWZmZXIgYm91bmQpIGFuZCBiYXRjaGluZyBoYXBwZW5zIGluc2lkZSB0aGUgc2luazsgYWdhaW5zdCBhXG4gKiBwbGFpbiBzaW5rIGVhY2ggd3JpdGUgaXMgaW5kaXZpZHVhbGx5IGR1cmFibGUsIGFzIGJlZm9yZS4gVGhlIHNvdXJjZS1kb25lXG4gKiBwYXRoIGNsb3NlcyB0aGUgc2luaywgd2hpY2ggZHJhaW5zIGl0LCBzbyBjb21wbGV0aW9uIGFsd2F5cyBpbXBsaWVzXG4gKiBkdXJhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb3VyY2UuIERvbid0IGNvdW50IHRoaXMgYXMgYSBwZW5kaW5nIG9wZXJhdGlvbiBiZWNhdXNlXG4gICAgICAvLyByZWFkcyB3YWl0IGZvciBkYXRhLiBUaGUgaW1wb3J0YW50IG9wZXJhdGlvbnMgYXJlIHdyaXRlcyB0byB0aGUgc2luay5cbiAgICAgIGNvbnN0IHJlYWRSZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICB3cml0ZXIuY2xvc2VkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkIChlLmcuLCBkdWUgdG8gZXJyb3IgaW4gYW5vdGhlciBwYXRoKSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWRSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBTb3VyY2Ugc3RyZWFtIGNvbXBsZXRlZCAtIGNsb3NlIHNpbmsgYW5kIHJlc29sdmVcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgLy8gUmVzb2x2ZSBkb25lIHByb21pc2UgaWYgbm90IGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHdyaXRlIGFzIGEgcGVuZGluZyBvcCAtIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGZsdXNoXG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVhZFJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHN0YXRlLmFjY2VwdGVkRnJhbWVzKys7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0gc3RhdGUuZnJhbWVXYWl0ZXJzLmZpbHRlcihcbiAgICAgICAgICAod2FpdGVyKSA9PiB3YWl0ZXIudGFyZ2V0IDw9IHN0YXRlLmFjY2VwdGVkRnJhbWVzXG4gICAgICAgICk7XG4gICAgICAgIHN0YXRlLmZyYW1lV2FpdGVycyA9IHN0YXRlLmZyYW1lV2FpdGVycy5maWx0ZXIoXG4gICAgICAgICAgKHdhaXRlcikgPT4gd2FpdGVyLnRhcmdldCA+IHN0YXRlLmFjY2VwdGVkRnJhbWVzXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3Qgd2FpdGVyIG9mIHJlYWR5KSB3YWl0ZXIucmVzb2x2ZSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUucGVuZGluZ09wcy0tO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgIHN0YXRlLnBpcGVFcnJvciA9IGVycjtcbiAgICBjYW5jZWxSZWFzb24gPSBlcnI7XG4gICAgY29uc3QgZnJhbWVXYWl0ZXJzID0gc3RhdGUuZnJhbWVXYWl0ZXJzO1xuICAgIHN0YXRlLmZyYW1lV2FpdGVycyA9IFtdO1xuICAgIGZvciAoY29uc3Qgd2FpdGVyIG9mIGZyYW1lV2FpdGVycykgd2FpdGVyLnJlamVjdChlcnIpO1xuICAgIC8vIEFnYWluc3QgYW4gZWFybHktYWNrIHNpbmssIGNodW5rcyBjYW4gc3RpbGwgYmUgYnVmZmVyZWQgb3IgaW4gZmxpZ2h0XG4gICAgLy8gd2hlbiB0aGUgcGlwZSBmYWlscyAocGVuZGluZ09wcyBvbmx5IGNvdW50cyB1bi1hY2tlZCB3cml0ZXMpLiBEZWxpdmVyXG4gICAgLy8gdGhhdCBhY2NlcHRlZCBwcmVmaXggYmVmb3JlIHNldHRsaW5nIHRoZSBmYWlsdXJlOiBvbmNlIHRoZSBzdGF0ZVxuICAgIC8vIHJlamVjdHMsIHRoZSBzdGVwIG1heSBwZXJzaXN0IGl0cyBmYWlsdXJlIGFuZCB0aGUgaW52b2NhdGlvbiBmaW5pc2gsXG4gICAgLy8gYW5kIGFueXRoaW5nIHN0aWxsIGNsaWVudC1zaWRlIHdvdWxkIGJlIGxvc3QuIFRoZSBvcmlnaW5hbCBwaXBlIGVycm9yXG4gICAgLy8gc3RheXMgcHJpbWFyeSwgc2luY2UgYSBkcmFpbiBmYWlsdXJlIGlzIGFscmVhZHkgc3RpY2t5IG9uIHRoZSBzaW5rLlxuICAgIGlmIChzdGF0ZS5kcmFpbkJhcnJpZXIpIHtcbiAgICAgIGF3YWl0IHN0YXRlLmRyYWluQmFycmllcigpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gICAgLy8gUHJvcGFnYXRlIGVycm9yIHRocm91Z2ggZmx1c2hhYmxlUGlwZSdzIG93biBwcm9taXNlIGFzIHdlbGwuXG4gICAgLy8gQ2FsbGVycyB0aGF0IHJlbHkgb24gdGhlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIHNob3VsZCB1c2UgYHN0YXRlLnByb21pc2VgLFxuICAgIC8vIHdoaWxlIG90aGVyIGNhbGxlcnMgbWF5IGRlcGVuZCBvbiB0aGlzIHJlamVjdGlvbi4gU29tZSBrbm93biBjYWxsZXJzXG4gICAgLy8gZXhwbGljaXRseSBpZ25vcmUgdGhpcyByZWplY3Rpb24gKGAuY2F0Y2goKCkgPT4ge30pYCkgYW5kIHJlbHkgc29sZWx5XG4gICAgLy8gb24gYHN0YXRlLnJlamVjdChlcnIpYCBmb3IgZXJyb3IgaGFuZGxpbmcuXG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENhbmNlbCB0aGUgdXBzdHJlYW0gcmVhZGVyIHNvIHRoZSBzb3VyY2Uga25vd3MgdG8gc3RvcCBnZW5lcmF0aW5nIGRhdGEuXG4gICAgLy8gVXNlcyBjYW5jZWxSZWFzb24gKHNldCBpbiB0aGUgY2F0Y2ggYmxvY2spIHNvIHRoZSBzb3VyY2UgcmVjZWl2ZXMgY29udGV4dFxuICAgIC8vIGFib3V0IHdoeSBpdCB3YXMgY2FuY2VsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/global.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AttributeChange } from '@workflow/world';
|
|
1
2
|
import type { Serializable } from './schemas.js';
|
|
2
3
|
export interface StepInvocationQueueItem {
|
|
3
4
|
type: 'step';
|
|
@@ -7,13 +8,37 @@ export interface StepInvocationQueueItem {
|
|
|
7
8
|
closureVars?: Record<string, Serializable>;
|
|
8
9
|
thisVal?: Serializable;
|
|
9
10
|
hasCreatedEvent?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Inline step ownership, derived from the step's LATEST `step_started`
|
|
13
|
+
* during replay: the queue message ID stamped by the invocation running
|
|
14
|
+
* the step inline, or undefined when the latest start was unstamped (a
|
|
15
|
+
* retry attempt driven by a queued step message, or an older runtime).
|
|
16
|
+
* Latest start wins: an unstamped bare start clears a previous stamp; an
|
|
17
|
+
* owner-recovery re-stamped start restores it.
|
|
18
|
+
*/
|
|
19
|
+
ownerMessageId?: string;
|
|
20
|
+
/**
|
|
21
|
+
* `createdAt` (ms) of the step's latest observed `step_started`. Anchors
|
|
22
|
+
* the ownership lease: `leaseRemaining = lastStartedAt + lease − now`.
|
|
23
|
+
*/
|
|
24
|
+
lastStartedAt?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Whether a `step_retrying` was observed for this step. From that point
|
|
27
|
+
* the step is queue-owned (the delayed retry handoff or replay requeue),
|
|
28
|
+
* so inline ownership is permanently lapsed for this correlation ID.
|
|
29
|
+
*/
|
|
30
|
+
sawRetrying?: boolean;
|
|
10
31
|
}
|
|
11
32
|
export interface HookInvocationQueueItem {
|
|
12
33
|
type: 'hook';
|
|
13
34
|
correlationId: string;
|
|
14
35
|
token: string;
|
|
36
|
+
/** Earliest time the token can be reused after the run ends. */
|
|
37
|
+
tokenRetentionUntil?: Date;
|
|
15
38
|
metadata?: Serializable;
|
|
16
39
|
hasCreatedEvent?: boolean;
|
|
40
|
+
/** Whether the workflow is awaiting `hook.getConflict()` for this hook */
|
|
41
|
+
hasConflictAwaiter?: boolean;
|
|
17
42
|
disposed?: boolean;
|
|
18
43
|
isWebhook?: boolean;
|
|
19
44
|
isSystem?: boolean;
|
|
@@ -26,7 +51,13 @@ export interface WaitInvocationQueueItem {
|
|
|
26
51
|
resumeAt: Date;
|
|
27
52
|
hasCreatedEvent?: boolean;
|
|
28
53
|
}
|
|
29
|
-
export
|
|
54
|
+
export interface AttributeInvocationQueueItem {
|
|
55
|
+
type: 'attribute';
|
|
56
|
+
correlationId: string;
|
|
57
|
+
changes: AttributeChange[];
|
|
58
|
+
allowReservedAttributes?: true;
|
|
59
|
+
}
|
|
60
|
+
export type QueueItem = StepInvocationQueueItem | HookInvocationQueueItem | WaitInvocationQueueItem | AttributeInvocationQueueItem;
|
|
30
61
|
/**
|
|
31
62
|
* An error that is thrown when one or more operations (steps/hooks/etc.) are called but do
|
|
32
63
|
* not yet have corresponding entries in the event log. The workflow
|
|
@@ -34,14 +65,17 @@ export type QueueItem = StepInvocationQueueItem | HookInvocationQueueItem | Wait
|
|
|
34
65
|
* onto the queue.
|
|
35
66
|
*/
|
|
36
67
|
export declare class WorkflowSuspension extends Error {
|
|
68
|
+
items: QueueItem[];
|
|
69
|
+
/** @deprecated Use `items` instead. */
|
|
37
70
|
steps: QueueItem[];
|
|
38
71
|
globalThis: typeof globalThis;
|
|
39
72
|
stepCount: number;
|
|
40
73
|
hookCount: number;
|
|
41
74
|
waitCount: number;
|
|
75
|
+
attributeCount: number;
|
|
42
76
|
hookDisposedCount: number;
|
|
43
77
|
abortCount: number;
|
|
44
|
-
constructor(
|
|
78
|
+
constructor(itemsInput: Map<string, QueueItem>, global: typeof globalThis);
|
|
45
79
|
static is(value: unknown): value is WorkflowSuspension;
|
|
46
80
|
}
|
|
47
81
|
export declare function ENOTSUP(): never;
|
package/dist/global.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,SAAS,GACjB,uBAAuB,GACvB,uBAAuB,GACvB,uBAAuB,GACvB,4BAA4B,CAAC;AAEjC;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,uCAAuC;IACvC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;gBAEP,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,UAAU;IAwFzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;CAGvD;AAED,wBAAgB,OAAO,IAAI,KAAK,CAI/B"}
|