@workflow/core 5.0.0-beta.40 → 5.0.0-beta.42

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.
Files changed (82) hide show
  1. package/dist/events-consumer.d.ts +224 -6
  2. package/dist/events-consumer.d.ts.map +1 -1
  3. package/dist/events-consumer.js +497 -50
  4. package/dist/private.d.ts +87 -18
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +118 -47
  7. package/dist/runtime/constants.d.ts +50 -1
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +59 -3
  10. package/dist/runtime/helpers.d.ts +212 -70
  11. package/dist/runtime/helpers.d.ts.map +1 -1
  12. package/dist/runtime/helpers.js +275 -86
  13. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -1
  14. package/dist/runtime/quickjs-assets.generated.js +2 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts +8 -9
  16. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  17. package/dist/runtime/quickjs-entrypoint.js +172 -41
  18. package/dist/runtime/quickjs-runtime.d.ts +36 -1
  19. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  20. package/dist/runtime/quickjs-runtime.js +613 -185
  21. package/dist/runtime/quickjs-serde.d.ts +107 -0
  22. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  23. package/dist/runtime/quickjs-serde.js +2098 -0
  24. package/dist/runtime/replay-budget.d.ts +13 -14
  25. package/dist/runtime/replay-budget.d.ts.map +1 -1
  26. package/dist/runtime/replay-budget.js +20 -73
  27. package/dist/runtime/resume-hook.d.ts.map +1 -1
  28. package/dist/runtime/resume-hook.js +57 -13
  29. package/dist/runtime/resume-latency.d.ts +143 -0
  30. package/dist/runtime/resume-latency.d.ts.map +1 -0
  31. package/dist/runtime/resume-latency.js +153 -0
  32. package/dist/runtime/runs.d.ts.map +1 -1
  33. package/dist/runtime/runs.js +3 -4
  34. package/dist/runtime/start.js +2 -7
  35. package/dist/runtime/step-executor.d.ts +27 -12
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +105 -15
  38. package/dist/runtime/suspension-handler.d.ts +46 -8
  39. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  40. package/dist/runtime/suspension-handler.js +173 -15
  41. package/dist/runtime/world-compatibility.d.ts +16 -0
  42. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  43. package/dist/runtime/world-compatibility.js +26 -5
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +911 -524
  46. package/dist/serialization/codec-devalue-vm.d.ts +7 -0
  47. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -1
  48. package/dist/serialization/codec-devalue-vm.js +12 -1
  49. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  50. package/dist/serialization/codec-devalue.js +15 -4
  51. package/dist/serialization/workflow-vm.d.ts +8 -3
  52. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  53. package/dist/serialization/workflow-vm.js +9 -4
  54. package/dist/serialization.d.ts.map +1 -1
  55. package/dist/serialization.js +8 -3
  56. package/dist/step.js +2 -2
  57. package/dist/telemetry/semantic-conventions.d.ts +104 -0
  58. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  59. package/dist/telemetry/semantic-conventions.js +84 -1
  60. package/dist/test-support/orchestrator-context.d.ts +25 -0
  61. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  62. package/dist/test-support/orchestrator-context.js +91 -0
  63. package/dist/version.d.ts +1 -1
  64. package/dist/version.js +2 -2
  65. package/dist/vm/index.d.ts.map +1 -1
  66. package/dist/vm/index.js +9 -6
  67. package/dist/workflow/abort-controller.d.ts.map +1 -1
  68. package/dist/workflow/abort-controller.js +4 -6
  69. package/dist/workflow/attribute-dispatcher.js +2 -2
  70. package/dist/workflow/hook.js +2 -2
  71. package/dist/workflow/sleep.js +2 -2
  72. package/dist/workflow.d.ts +10 -0
  73. package/dist/workflow.d.ts.map +1 -1
  74. package/dist/workflow.js +94 -20
  75. package/docs/how-it-works/event-sourcing.mdx +11 -3
  76. package/package.json +7 -7
  77. package/dist/correlation-id.d.ts +0 -109
  78. package/dist/correlation-id.d.ts.map +0 -1
  79. package/dist/correlation-id.js +0 -139
  80. package/dist/serialization/vm-bundle-entry.d.ts +0 -12
  81. package/dist/serialization/vm-bundle-entry.d.ts.map +0 -1
  82. package/dist/serialization/vm-bundle-entry.js +0 -58
@@ -260,7 +260,7 @@ On Vercel, `requestId` is the platform request ID when available. Other worlds a
260
260
 
261
261
  ## Entity IDs
262
262
 
263
- All entities in the Workflow SDK use a consistent ID format: a 4-character prefix followed by an underscore and a [ULID](https://github.com/ulid/spec) (Universally Unique Lexicographically Sortable Identifier).
263
+ All entities in the Workflow SDK use a consistent ID format: a 4-character prefix followed by an underscore and a fixed-width body. For every entity except events, that body is a [ULID](https://github.com/ulid/spec) (Universally Unique Lexicographically Sortable Identifier). An event's body is its slot number, described below.
264
264
 
265
265
  | Entity | Prefix | Example |
266
266
  |--------|--------|---------|
@@ -268,11 +268,19 @@ All entities in the Workflow SDK use a consistent ID format: a 4-character prefi
268
268
  | Step | `step_` | `step_01HXYZ123ABC456DEF789GHJ` |
269
269
  | Hook | `hook_` | `hook_01HXYZ123ABC456DEF789GHJ` |
270
270
  | Wait | `wait_` | `wait_01HXYZ123ABC456DEF789GHJ` |
271
- | Event | `evnt_` | `evnt_01HXYZ123ABC456DEF789GHJ` |
271
+ | Event | `evnt_` | `evnt_00000000000000000000000042` (slot 42) |
272
272
  | Stream | `strm_` | `strm_01HXYZ123ABC456DEF789GHJ` |
273
273
 
274
274
  **Why this format?**
275
275
 
276
276
  - **Prefixes enable introspection**: Given any ID, you can immediately identify what type of entity it refers to. This makes debugging, logging, and cross-referencing entities across the system straightforward.
277
277
 
278
- - **ULIDs enable chronological ordering**: Unlike UUIDs, ULIDs encode a timestamp in their first 48 bits, making them lexicographically sortable by creation time. This property is essential for the event log—events are always stored and retrieved in the correct chronological order simply by sorting their IDs.
278
+ - **Fixed-width bodies enable ordering**: Unlike UUIDs, these bodies sort lexicographically in creation order, so the event log is stored and retrieved in the correct order by sorting IDs alone. Slot numbers get that from counting at a fixed width, which makes string order the same as numeric order. ULIDs get it from the timestamp in their first 48 bits, which also makes a ULID's creation time recoverable from the ID itself.
279
+
280
+ ### Event IDs
281
+
282
+ An event ID is a **slot number**: the event's 1-based position in the run's event log, zero-padded to the same width as a ULID. The world assigns it when the event is published, so two writers racing to append never claim the same position and a rejected write leaves no gap behind. Slots are dense, and unique only within a run, so an event ID identifies an event only when paired with its `runId`.
283
+
284
+ Density is what lets a reader tell a complete log from an incomplete one by its length alone. A replay that loads a log with a position missing below the highest one it can see cannot tell an event that was never written from one it failed to read, so it fails the run with [`CORRUPTED_EVENT_LOG`](/docs/errors/corrupted-event-log) rather than replay across the hole. See [`WORKFLOW_SLOT_GAP_CHECK`](/docs/configuration/runtime-tuning#workflow_slot_gap_check).
285
+
286
+ A slot ID carries no timestamp. Zero-padded decimal digits are a subset of the ULID alphabet, so a slot ID passes ULID validation and sorts correctly, but decoding its first 48 bits yields the Unix epoch instead of a creation time. Read `createdAt` on the event when you need to know when it was written, and don't decode the time from an `evnt_` ID you get back from an API, a log line, or a cursor.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/core",
3
- "version": "5.0.0-beta.40",
3
+ "version": "5.0.0-beta.42",
4
4
  "description": "Core runtime and engine for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -89,17 +89,17 @@
89
89
  "devalue": "5.9.0",
90
90
  "ms": "2.1.3",
91
91
  "nanoid": "5.1.6",
92
- "quickjs-wasi": "3.1.0",
92
+ "quickjs-wasi": "3.4.0",
93
93
  "seedrandom": "3.0.5",
94
94
  "semver": "7.7.4",
95
95
  "ulid": "~3.0.1",
96
96
  "zod": "~4.3.6",
97
- "@workflow/errors": "5.0.0-beta.16",
97
+ "@workflow/errors": "5.0.0-beta.17",
98
98
  "@workflow/serde": "5.0.0-beta.2",
99
99
  "@workflow/utils": "5.0.0-beta.8",
100
- "@workflow/world": "5.0.0-beta.25",
101
- "@workflow/world-local": "5.0.0-beta.34",
102
- "@workflow/world-vercel": "5.0.0-beta.36"
100
+ "@workflow/world": "5.0.0-beta.27",
101
+ "@workflow/world-local": "5.0.0-beta.36",
102
+ "@workflow/world-vercel": "5.0.0-beta.38"
103
103
  },
104
104
  "devDependencies": {
105
105
  "@opentelemetry/api": "1.9.0",
@@ -124,7 +124,7 @@
124
124
  }
125
125
  },
126
126
  "scripts": {
127
- "build": "genversion --es6 src/version.ts && node scripts/build-vm-serde-bundle.js && node scripts/build-quickjs-assets.js && tsc",
127
+ "build": "genversion --es6 src/version.ts && node scripts/build-quickjs-assets.js && tsc",
128
128
  "dev": "genversion --es6 src/version.ts && tsc --watch",
129
129
  "clean": "tsc --build --clean && rm -rf dist src/version.ts docs ||:",
130
130
  "test": "cross-env WORKFLOW_TARGET_WORLD=local vitest run src",
@@ -1,109 +0,0 @@
1
- /**
2
- * Correlation-id generation for the entity families a replay can create.
3
- *
4
- * Correlation ids are minted by the workflow VM and are the server's identity
5
- * gate: a conditional create on the id is what makes a duplicate write from a
6
- * second live replay idempotent instead of additive. That only works if two
7
- * replays of the same run mint the same id for the same entity.
8
- *
9
- * Historically every id was the Nth draw of *one* monotonic ULID sequence per
10
- * run, shared by steps, waits, hooks, attribute writes, abort controllers and
11
- * stream ids alike. Every id was therefore an ordinal over the whole run, and a
12
- * single extra draw of any kind renumbered every entity of every kind after it.
13
- * Two replays that agreed about every step but disagreed about one `sleep()`
14
- * would mint different ids for all subsequent steps, so their writes appended
15
- * side by side instead of colliding, and the settled log ended up holding two
16
- * names for one logical step. Only one of them can be consumed on the next
17
- * replay; the other is fatal (`onUnconsumedEvent`).
18
- *
19
- * Per-kind sources narrow that coupling to one kind at a time: each family
20
- * draws from its own independent incrementing sequence, so a disagreement about
21
- * how many hooks or sleeps were created no longer renames steps.
22
- *
23
- * Ids stay syntactically valid ULIDs (10 Crockford characters of
24
- * `fixedTimestamp` plus 16 of body), because correlation ids are validated as
25
- * prefixed 26-char ULIDs by the backend, and they stay monotonic *within* a
26
- * kind, because `hooks.list` is ordered by hook id.
27
- *
28
- * Monotonicity is per kind, and two kinds mint `hook_` ids (`hook` and
29
- * `abortHook`), so listing order is only creation order *within* each of them.
30
- * No world filters system hooks out of a listing, so a run that constructs an
31
- * abort controller and also creates its own hooks lists that system hook at a
32
- * position decided by its kind's hash rather than at its creation position.
33
- * Order among the user's own hooks is unaffected.
34
- *
35
- * This does not make ids independent of *ordinal position within their own
36
- * kind*: two replays that disagree about how many steps ran still mint
37
- * different ids for the next step. That is a narrower failure than the shared
38
- * sequence's, not an eliminated one.
39
- */
40
- /** Entity families that draw correlation ids, each from its own sequence. */
41
- export type CorrelationIdKind =
42
- /** `step_` ids, one per step invocation. */
43
- 'step'
44
- /** `wait_` ids, one per `sleep()`. */
45
- | 'wait'
46
- /** `hook_` ids for hooks created by workflow code. */
47
- | 'hook'
48
- /** `attr_` ids, one per attribute write. */
49
- | 'attr'
50
- /**
51
- * The abort controller's own id, which becomes its stream name and hook
52
- * token. Separate from `hook` so constructing an abort controller does not
53
- * renumber later user hooks.
54
- */
55
- | 'abort'
56
- /** `hook_` ids for the internal system hook backing an abort controller. */
57
- | 'abortHook'
58
- /**
59
- * Ids minted during serialization (`STABLE_ULID`): stream names, and an abort
60
- * holder's stream name and `abrt_` hook token when it reaches serialization
61
- * without an identity yet (`reduceAbortWithListener`), which is why `abort`
62
- * above is not the only mint path for an abort identity. Not correlation ids,
63
- * but they drew from the same shared sequence, so a workflow that serialized
64
- * a stream renumbered every entity created after it.
65
- */
66
- | 'stream';
67
- /** Mints the ULID body of a correlation id for one entity family. */
68
- export type CorrelationIdGenerator = (kind: CorrelationIdKind) => string;
69
- /**
70
- * Builds a replay's correlation-id generator.
71
- *
72
- * `perKind: false` returns the run's single shared monotonic sequence and
73
- * ignores the kind entirely, so both schemes go through one call path and the
74
- * flag is the only difference between them.
75
- */
76
- export declare function createCorrelationIdGenerator(options: {
77
- /**
78
- * The run's replay-stable seed. Must not vary between replays of one run, and
79
- * must differ between runs, or two runs would mint identical ids.
80
- */
81
- seed: string;
82
- fixedTimestamp: number;
83
- /** The run's shared monotonic sequence, used as-is when `perKind` is false. */
84
- positional: () => string;
85
- perKind: boolean;
86
- }): CorrelationIdGenerator;
87
- /** Length of a ULID, exported so tests need not restate it. */
88
- export declare const CORRELATION_ID_LENGTH: number;
89
- /**
90
- * Whether each entity family draws correlation ids from its own sequence rather
91
- * than from one sequence shared by the whole run. Off unless opted in, so an SDK
92
- * upgrade alone never moves a run between schemes.
93
- *
94
- * The invariant either way: a run must replay under the scheme that minted its
95
- * ids. A replay under the other scheme mints ids its own earlier events do not
96
- * carry, so it can consume none of them and fails the run. Two things can break
97
- * it, and both are about turning the flag on rather than about upgrading:
98
- *
99
- * - Enabling it while runs are in flight. On Vercel, skew protection keeps a run
100
- * on the deployment that started it, so a run only ever sees the value baked
101
- * into its own deployment. Elsewhere (world-postgres, world-local, a
102
- * self-hosted process) nothing pins a run to the code that started it, so
103
- * enable it during a quiet window.
104
- * - A rolling deploy that leaves both values live, which puts two schemes on one
105
- * run concurrently — the side-by-side append this whole mechanism exists to
106
- * avoid. Roll the value out to the whole fleet at once.
107
- */
108
- export declare function isPerKindCorrelationIdsEnabled(): boolean;
109
- //# sourceMappingURL=correlation-id.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"correlation-id.d.ts","sourceRoot":"","sources":["../src/correlation-id.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,iBAAiB;AAC3B,4CAA4C;AAC1C,MAAM;AACR,sCAAsC;GACpC,MAAM;AACR,sDAAsD;GACpD,MAAM;AACR,4CAA4C;GAC1C,MAAM;AACR;;;;GAIG;GACD,OAAO;AACT,4EAA4E;GAC1E,WAAW;AACb;;;;;;;GAOG;GACD,QAAQ,CAAC;AAEb,qEAAqE;AACrE,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC;AAoGzE;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,sBAAsB,CAmBzB;AAED,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,QAA0B,CAAC;AAE7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD"}
@@ -1,139 +0,0 @@
1
- import { encodeTime, incrementBase32 } from 'ulid';
2
- const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
3
- /** Number of Crockford characters in a ULID's random component. */
4
- const BODY_CHARS = 16;
5
- /** Number of Crockford characters in a ULID's timestamp component. */
6
- const TIME_CHARS = 10;
7
- function mul32(a, b) {
8
- return Math.imul(a, b) >>> 0;
9
- }
10
- function rotl32(value, shift) {
11
- return ((value << shift) | (value >>> (32 - shift))) >>> 0;
12
- }
13
- /** MurmurHash3's 32-bit finalizer. */
14
- function fmix32(input) {
15
- let h = input >>> 0;
16
- h = (h ^ (h >>> 16)) >>> 0;
17
- h = mul32(h, 0x85ebca6b);
18
- h = (h ^ (h >>> 13)) >>> 0;
19
- h = mul32(h, 0xc2b2ae35);
20
- return (h ^ (h >>> 16)) >>> 0;
21
- }
22
- /**
23
- * Deterministic 128-bit hash of a string, as four 32-bit lanes.
24
- *
25
- * A MurmurHash3-style mixer over UTF-16 code units, rotating which lane absorbs
26
- * each unit and diffusing across lanes at the end. Only determinism and
27
- * diffusion matter here: this is not a cryptographic hash, claims no
28
- * bit-compatibility with any reference implementation, and must not be used for
29
- * anything that outlives a deployment's replays.
30
- */
31
- function hash128(input) {
32
- const lanes = [
33
- 0x9e3779b1, 0x85ebca77, 0xc2b2ae3d, 0x27d4eb2f,
34
- ];
35
- for (let i = 0; i < input.length; i++) {
36
- let k = input.charCodeAt(i) >>> 0;
37
- k = mul32(k, 0xcc9e2d51);
38
- k = rotl32(k, 15);
39
- k = mul32(k, 0x1b873593);
40
- const lane = i & 3;
41
- let h = (lanes[lane] ^ k) >>> 0;
42
- h = rotl32(h, 13);
43
- lanes[lane] = (mul32(h, 5) + 0xe6546b64) >>> 0;
44
- }
45
- lanes[0] = (lanes[0] ^ input.length) >>> 0;
46
- // Two passes so every lane depends on every other lane.
47
- for (let pass = 0; pass < 2; pass++) {
48
- for (let lane = 0; lane < 4; lane++) {
49
- const previous = lanes[(lane + 3) & 3];
50
- lanes[lane] = fmix32((lanes[lane] ^ previous) >>> 0);
51
- }
52
- }
53
- return lanes;
54
- }
55
- /**
56
- * Derives a kind's starting body: 80 bits of a 128-bit hash as 16 Crockford
57
- * characters, most significant first.
58
- *
59
- * The leading character is confined to the alphabet's lower half so the body
60
- * starts below half of the 80-bit space. `incrementBase32` throws on overflow,
61
- * and without this a base that happened to land near `Z…Z` would make overflow
62
- * reachable after few draws rather than after 2^79 of them.
63
- */
64
- function deriveBody(seed, kind) {
65
- const lanes = hash128(`${seed} correlation-kind ${kind}`);
66
- const bytes = [
67
- (lanes[0] >>> 24) & 0xff,
68
- (lanes[0] >>> 16) & 0xff,
69
- (lanes[0] >>> 8) & 0xff,
70
- lanes[0] & 0xff,
71
- (lanes[1] >>> 24) & 0xff,
72
- (lanes[1] >>> 16) & 0xff,
73
- (lanes[1] >>> 8) & 0xff,
74
- lanes[1] & 0xff,
75
- (lanes[2] >>> 24) & 0xff,
76
- (lanes[2] >>> 16) & 0xff,
77
- ];
78
- let body = '';
79
- let accumulator = 0;
80
- let bits = 0;
81
- for (const byte of bytes) {
82
- accumulator = ((accumulator << 8) | byte) >>> 0;
83
- bits += 8;
84
- while (bits >= 5) {
85
- const index = (accumulator >>> (bits - 5)) & 31;
86
- body += CROCKFORD[body.length === 0 ? index & 15 : index];
87
- bits -= 5;
88
- }
89
- }
90
- return body;
91
- }
92
- /**
93
- * Builds a replay's correlation-id generator.
94
- *
95
- * `perKind: false` returns the run's single shared monotonic sequence and
96
- * ignores the kind entirely, so both schemes go through one call path and the
97
- * flag is the only difference between them.
98
- */
99
- export function createCorrelationIdGenerator(options) {
100
- const { seed, fixedTimestamp, positional, perKind } = options;
101
- if (!perKind) {
102
- return positional;
103
- }
104
- const time = encodeTime(fixedTimestamp, TIME_CHARS);
105
- const bodies = new Map();
106
- return (kind) => {
107
- const previous = bodies.get(kind);
108
- const body = previous === undefined
109
- ? deriveBody(seed, kind)
110
- : incrementBase32(previous);
111
- bodies.set(kind, body);
112
- return `${time}${body}`;
113
- };
114
- }
115
- /** Length of a ULID, exported so tests need not restate it. */
116
- export const CORRELATION_ID_LENGTH = TIME_CHARS + BODY_CHARS;
117
- /**
118
- * Whether each entity family draws correlation ids from its own sequence rather
119
- * than from one sequence shared by the whole run. Off unless opted in, so an SDK
120
- * upgrade alone never moves a run between schemes.
121
- *
122
- * The invariant either way: a run must replay under the scheme that minted its
123
- * ids. A replay under the other scheme mints ids its own earlier events do not
124
- * carry, so it can consume none of them and fails the run. Two things can break
125
- * it, and both are about turning the flag on rather than about upgrading:
126
- *
127
- * - Enabling it while runs are in flight. On Vercel, skew protection keeps a run
128
- * on the deployment that started it, so a run only ever sees the value baked
129
- * into its own deployment. Elsewhere (world-postgres, world-local, a
130
- * self-hosted process) nothing pins a run to the code that started it, so
131
- * enable it during a quiet window.
132
- * - A rolling deploy that leaves both values live, which puts two schemes on one
133
- * run concurrently — the side-by-side append this whole mechanism exists to
134
- * avoid. Roll the value out to the whole fleet at once.
135
- */
136
- export function isPerKindCorrelationIdsEnabled() {
137
- return process.env.WORKFLOW_PER_KIND_CORRELATION_IDS === '1';
138
- }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ycmVsYXRpb24taWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29ycmVsYXRpb24taWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUF5RW5ELE1BQU0sU0FBUyxHQUFHLGtDQUFrQyxDQUFDO0FBRXJELG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFFdEIsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUV0QixTQUFTLEtBQUssQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDMUMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELHNDQUFzQztBQUN0QyxTQUFTLE1BQU0sQ0FBQyxLQUFhO0lBQzNCLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6QixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsT0FBTyxDQUFDLEtBQWE7SUFDNUIsTUFBTSxLQUFLLEdBQXFDO1FBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7S0FDL0MsQ0FBQztJQUNGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLHdEQUF3RDtJQUN4RCxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBdUI7SUFDdkQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRCxNQUFNLEtBQUssR0FBRztRQUNaLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUk7UUFDeEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSTtRQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJO1FBQ3ZCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO1FBQ2YsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSTtRQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJO1FBQ3hCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUk7UUFDdkIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7UUFDZixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJO1FBQ3hCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUk7S0FDekIsQ0FBQztJQUNGLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNkLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ1YsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEQsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUFDLE9BVTVDO0lBQ0MsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUU5RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztJQUVwRCxPQUFPLENBQUMsSUFBdUIsRUFBRSxFQUFFO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQ1IsUUFBUSxLQUFLLFNBQVM7WUFDcEIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkIsT0FBTyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFFN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSw4QkFBOEI7SUFDNUMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxLQUFLLEdBQUcsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZW5jb2RlVGltZSwgaW5jcmVtZW50QmFzZTMyIH0gZnJvbSAndWxpZCc7XG5cbi8qKlxuICogQ29ycmVsYXRpb24taWQgZ2VuZXJhdGlvbiBmb3IgdGhlIGVudGl0eSBmYW1pbGllcyBhIHJlcGxheSBjYW4gY3JlYXRlLlxuICpcbiAqIENvcnJlbGF0aW9uIGlkcyBhcmUgbWludGVkIGJ5IHRoZSB3b3JrZmxvdyBWTSBhbmQgYXJlIHRoZSBzZXJ2ZXIncyBpZGVudGl0eVxuICogZ2F0ZTogYSBjb25kaXRpb25hbCBjcmVhdGUgb24gdGhlIGlkIGlzIHdoYXQgbWFrZXMgYSBkdXBsaWNhdGUgd3JpdGUgZnJvbSBhXG4gKiBzZWNvbmQgbGl2ZSByZXBsYXkgaWRlbXBvdGVudCBpbnN0ZWFkIG9mIGFkZGl0aXZlLiBUaGF0IG9ubHkgd29ya3MgaWYgdHdvXG4gKiByZXBsYXlzIG9mIHRoZSBzYW1lIHJ1biBtaW50IHRoZSBzYW1lIGlkIGZvciB0aGUgc2FtZSBlbnRpdHkuXG4gKlxuICogSGlzdG9yaWNhbGx5IGV2ZXJ5IGlkIHdhcyB0aGUgTnRoIGRyYXcgb2YgKm9uZSogbW9ub3RvbmljIFVMSUQgc2VxdWVuY2UgcGVyXG4gKiBydW4sIHNoYXJlZCBieSBzdGVwcywgd2FpdHMsIGhvb2tzLCBhdHRyaWJ1dGUgd3JpdGVzLCBhYm9ydCBjb250cm9sbGVycyBhbmRcbiAqIHN0cmVhbSBpZHMgYWxpa2UuIEV2ZXJ5IGlkIHdhcyB0aGVyZWZvcmUgYW4gb3JkaW5hbCBvdmVyIHRoZSB3aG9sZSBydW4sIGFuZCBhXG4gKiBzaW5nbGUgZXh0cmEgZHJhdyBvZiBhbnkga2luZCByZW51bWJlcmVkIGV2ZXJ5IGVudGl0eSBvZiBldmVyeSBraW5kIGFmdGVyIGl0LlxuICogVHdvIHJlcGxheXMgdGhhdCBhZ3JlZWQgYWJvdXQgZXZlcnkgc3RlcCBidXQgZGlzYWdyZWVkIGFib3V0IG9uZSBgc2xlZXAoKWBcbiAqIHdvdWxkIG1pbnQgZGlmZmVyZW50IGlkcyBmb3IgYWxsIHN1YnNlcXVlbnQgc3RlcHMsIHNvIHRoZWlyIHdyaXRlcyBhcHBlbmRlZFxuICogc2lkZSBieSBzaWRlIGluc3RlYWQgb2YgY29sbGlkaW5nLCBhbmQgdGhlIHNldHRsZWQgbG9nIGVuZGVkIHVwIGhvbGRpbmcgdHdvXG4gKiBuYW1lcyBmb3Igb25lIGxvZ2ljYWwgc3RlcC4gT25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29uc3VtZWQgb24gdGhlIG5leHRcbiAqIHJlcGxheTsgdGhlIG90aGVyIGlzIGZhdGFsIChgb25VbmNvbnN1bWVkRXZlbnRgKS5cbiAqXG4gKiBQZXIta2luZCBzb3VyY2VzIG5hcnJvdyB0aGF0IGNvdXBsaW5nIHRvIG9uZSBraW5kIGF0IGEgdGltZTogZWFjaCBmYW1pbHlcbiAqIGRyYXdzIGZyb20gaXRzIG93biBpbmRlcGVuZGVudCBpbmNyZW1lbnRpbmcgc2VxdWVuY2UsIHNvIGEgZGlzYWdyZWVtZW50IGFib3V0XG4gKiBob3cgbWFueSBob29rcyBvciBzbGVlcHMgd2VyZSBjcmVhdGVkIG5vIGxvbmdlciByZW5hbWVzIHN0ZXBzLlxuICpcbiAqIElkcyBzdGF5IHN5bnRhY3RpY2FsbHkgdmFsaWQgVUxJRHMgKDEwIENyb2NrZm9yZCBjaGFyYWN0ZXJzIG9mXG4gKiBgZml4ZWRUaW1lc3RhbXBgIHBsdXMgMTYgb2YgYm9keSksIGJlY2F1c2UgY29ycmVsYXRpb24gaWRzIGFyZSB2YWxpZGF0ZWQgYXNcbiAqIHByZWZpeGVkIDI2LWNoYXIgVUxJRHMgYnkgdGhlIGJhY2tlbmQsIGFuZCB0aGV5IHN0YXkgbW9ub3RvbmljICp3aXRoaW4qIGFcbiAqIGtpbmQsIGJlY2F1c2UgYGhvb2tzLmxpc3RgIGlzIG9yZGVyZWQgYnkgaG9vayBpZC5cbiAqXG4gKiBNb25vdG9uaWNpdHkgaXMgcGVyIGtpbmQsIGFuZCB0d28ga2luZHMgbWludCBgaG9va19gIGlkcyAoYGhvb2tgIGFuZFxuICogYGFib3J0SG9va2ApLCBzbyBsaXN0aW5nIG9yZGVyIGlzIG9ubHkgY3JlYXRpb24gb3JkZXIgKndpdGhpbiogZWFjaCBvZiB0aGVtLlxuICogTm8gd29ybGQgZmlsdGVycyBzeXN0ZW0gaG9va3Mgb3V0IG9mIGEgbGlzdGluZywgc28gYSBydW4gdGhhdCBjb25zdHJ1Y3RzIGFuXG4gKiBhYm9ydCBjb250cm9sbGVyIGFuZCBhbHNvIGNyZWF0ZXMgaXRzIG93biBob29rcyBsaXN0cyB0aGF0IHN5c3RlbSBob29rIGF0IGFcbiAqIHBvc2l0aW9uIGRlY2lkZWQgYnkgaXRzIGtpbmQncyBoYXNoIHJhdGhlciB0aGFuIGF0IGl0cyBjcmVhdGlvbiBwb3NpdGlvbi5cbiAqIE9yZGVyIGFtb25nIHRoZSB1c2VyJ3Mgb3duIGhvb2tzIGlzIHVuYWZmZWN0ZWQuXG4gKlxuICogVGhpcyBkb2VzIG5vdCBtYWtlIGlkcyBpbmRlcGVuZGVudCBvZiAqb3JkaW5hbCBwb3NpdGlvbiB3aXRoaW4gdGhlaXIgb3duXG4gKiBraW5kKjogdHdvIHJlcGxheXMgdGhhdCBkaXNhZ3JlZSBhYm91dCBob3cgbWFueSBzdGVwcyByYW4gc3RpbGwgbWludFxuICogZGlmZmVyZW50IGlkcyBmb3IgdGhlIG5leHQgc3RlcC4gVGhhdCBpcyBhIG5hcnJvd2VyIGZhaWx1cmUgdGhhbiB0aGUgc2hhcmVkXG4gKiBzZXF1ZW5jZSdzLCBub3QgYW4gZWxpbWluYXRlZCBvbmUuXG4gKi9cblxuLyoqIEVudGl0eSBmYW1pbGllcyB0aGF0IGRyYXcgY29ycmVsYXRpb24gaWRzLCBlYWNoIGZyb20gaXRzIG93biBzZXF1ZW5jZS4gKi9cbmV4cG9ydCB0eXBlIENvcnJlbGF0aW9uSWRLaW5kID1cbiAgLyoqIGBzdGVwX2AgaWRzLCBvbmUgcGVyIHN0ZXAgaW52b2NhdGlvbi4gKi9cbiAgfCAnc3RlcCdcbiAgLyoqIGB3YWl0X2AgaWRzLCBvbmUgcGVyIGBzbGVlcCgpYC4gKi9cbiAgfCAnd2FpdCdcbiAgLyoqIGBob29rX2AgaWRzIGZvciBob29rcyBjcmVhdGVkIGJ5IHdvcmtmbG93IGNvZGUuICovXG4gIHwgJ2hvb2snXG4gIC8qKiBgYXR0cl9gIGlkcywgb25lIHBlciBhdHRyaWJ1dGUgd3JpdGUuICovXG4gIHwgJ2F0dHInXG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgY29udHJvbGxlcidzIG93biBpZCwgd2hpY2ggYmVjb21lcyBpdHMgc3RyZWFtIG5hbWUgYW5kIGhvb2tcbiAgICogdG9rZW4uIFNlcGFyYXRlIGZyb20gYGhvb2tgIHNvIGNvbnN0cnVjdGluZyBhbiBhYm9ydCBjb250cm9sbGVyIGRvZXMgbm90XG4gICAqIHJlbnVtYmVyIGxhdGVyIHVzZXIgaG9va3MuXG4gICAqL1xuICB8ICdhYm9ydCdcbiAgLyoqIGBob29rX2AgaWRzIGZvciB0aGUgaW50ZXJuYWwgc3lzdGVtIGhvb2sgYmFja2luZyBhbiBhYm9ydCBjb250cm9sbGVyLiAqL1xuICB8ICdhYm9ydEhvb2snXG4gIC8qKlxuICAgKiBJZHMgbWludGVkIGR1cmluZyBzZXJpYWxpemF0aW9uIChgU1RBQkxFX1VMSURgKTogc3RyZWFtIG5hbWVzLCBhbmQgYW4gYWJvcnRcbiAgICogaG9sZGVyJ3Mgc3RyZWFtIG5hbWUgYW5kIGBhYnJ0X2AgaG9vayB0b2tlbiB3aGVuIGl0IHJlYWNoZXMgc2VyaWFsaXphdGlvblxuICAgKiB3aXRob3V0IGFuIGlkZW50aXR5IHlldCAoYHJlZHVjZUFib3J0V2l0aExpc3RlbmVyYCksIHdoaWNoIGlzIHdoeSBgYWJvcnRgXG4gICAqIGFib3ZlIGlzIG5vdCB0aGUgb25seSBtaW50IHBhdGggZm9yIGFuIGFib3J0IGlkZW50aXR5LiBOb3QgY29ycmVsYXRpb24gaWRzLFxuICAgKiBidXQgdGhleSBkcmV3IGZyb20gdGhlIHNhbWUgc2hhcmVkIHNlcXVlbmNlLCBzbyBhIHdvcmtmbG93IHRoYXQgc2VyaWFsaXplZFxuICAgKiBhIHN0cmVhbSByZW51bWJlcmVkIGV2ZXJ5IGVudGl0eSBjcmVhdGVkIGFmdGVyIGl0LlxuICAgKi9cbiAgfCAnc3RyZWFtJztcblxuLyoqIE1pbnRzIHRoZSBVTElEIGJvZHkgb2YgYSBjb3JyZWxhdGlvbiBpZCBmb3Igb25lIGVudGl0eSBmYW1pbHkuICovXG5leHBvcnQgdHlwZSBDb3JyZWxhdGlvbklkR2VuZXJhdG9yID0gKGtpbmQ6IENvcnJlbGF0aW9uSWRLaW5kKSA9PiBzdHJpbmc7XG5cbmNvbnN0IENST0NLRk9SRCA9ICcwMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWic7XG5cbi8qKiBOdW1iZXIgb2YgQ3JvY2tmb3JkIGNoYXJhY3RlcnMgaW4gYSBVTElEJ3MgcmFuZG9tIGNvbXBvbmVudC4gKi9cbmNvbnN0IEJPRFlfQ0hBUlMgPSAxNjtcblxuLyoqIE51bWJlciBvZiBDcm9ja2ZvcmQgY2hhcmFjdGVycyBpbiBhIFVMSUQncyB0aW1lc3RhbXAgY29tcG9uZW50LiAqL1xuY29uc3QgVElNRV9DSEFSUyA9IDEwO1xuXG5mdW5jdGlvbiBtdWwzMihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmltdWwoYSwgYikgPj4+IDA7XG59XG5cbmZ1bmN0aW9uIHJvdGwzMih2YWx1ZTogbnVtYmVyLCBzaGlmdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuICgodmFsdWUgPDwgc2hpZnQpIHwgKHZhbHVlID4+PiAoMzIgLSBzaGlmdCkpKSA+Pj4gMDtcbn1cblxuLyoqIE11cm11ckhhc2gzJ3MgMzItYml0IGZpbmFsaXplci4gKi9cbmZ1bmN0aW9uIGZtaXgzMihpbnB1dDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGggPSBpbnB1dCA+Pj4gMDtcbiAgaCA9IChoIF4gKGggPj4+IDE2KSkgPj4+IDA7XG4gIGggPSBtdWwzMihoLCAweDg1ZWJjYTZiKTtcbiAgaCA9IChoIF4gKGggPj4+IDEzKSkgPj4+IDA7XG4gIGggPSBtdWwzMihoLCAweGMyYjJhZTM1KTtcbiAgcmV0dXJuIChoIF4gKGggPj4+IDE2KSkgPj4+IDA7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYyAxMjgtYml0IGhhc2ggb2YgYSBzdHJpbmcsIGFzIGZvdXIgMzItYml0IGxhbmVzLlxuICpcbiAqIEEgTXVybXVySGFzaDMtc3R5bGUgbWl4ZXIgb3ZlciBVVEYtMTYgY29kZSB1bml0cywgcm90YXRpbmcgd2hpY2ggbGFuZSBhYnNvcmJzXG4gKiBlYWNoIHVuaXQgYW5kIGRpZmZ1c2luZyBhY3Jvc3MgbGFuZXMgYXQgdGhlIGVuZC4gT25seSBkZXRlcm1pbmlzbSBhbmRcbiAqIGRpZmZ1c2lvbiBtYXR0ZXIgaGVyZTogdGhpcyBpcyBub3QgYSBjcnlwdG9ncmFwaGljIGhhc2gsIGNsYWltcyBub1xuICogYml0LWNvbXBhdGliaWxpdHkgd2l0aCBhbnkgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCBhbmQgbXVzdCBub3QgYmUgdXNlZCBmb3JcbiAqIGFueXRoaW5nIHRoYXQgb3V0bGl2ZXMgYSBkZXBsb3ltZW50J3MgcmVwbGF5cy5cbiAqL1xuZnVuY3Rpb24gaGFzaDEyOChpbnB1dDogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBsYW5lczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgMHg5ZTM3NzliMSwgMHg4NWViY2E3NywgMHhjMmIyYWUzZCwgMHgyN2Q0ZWIyZixcbiAgXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGxldCBrID0gaW5wdXQuY2hhckNvZGVBdChpKSA+Pj4gMDtcbiAgICBrID0gbXVsMzIoaywgMHhjYzllMmQ1MSk7XG4gICAgayA9IHJvdGwzMihrLCAxNSk7XG4gICAgayA9IG11bDMyKGssIDB4MWI4NzM1OTMpO1xuICAgIGNvbnN0IGxhbmUgPSBpICYgMztcbiAgICBsZXQgaCA9IChsYW5lc1tsYW5lXSBeIGspID4+PiAwO1xuICAgIGggPSByb3RsMzIoaCwgMTMpO1xuICAgIGxhbmVzW2xhbmVdID0gKG11bDMyKGgsIDUpICsgMHhlNjU0NmI2NCkgPj4+IDA7XG4gIH1cbiAgbGFuZXNbMF0gPSAobGFuZXNbMF0gXiBpbnB1dC5sZW5ndGgpID4+PiAwO1xuICAvLyBUd28gcGFzc2VzIHNvIGV2ZXJ5IGxhbmUgZGVwZW5kcyBvbiBldmVyeSBvdGhlciBsYW5lLlxuICBmb3IgKGxldCBwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykge1xuICAgIGZvciAobGV0IGxhbmUgPSAwOyBsYW5lIDwgNDsgbGFuZSsrKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGxhbmVzWyhsYW5lICsgMykgJiAzXTtcbiAgICAgIGxhbmVzW2xhbmVdID0gZm1peDMyKChsYW5lc1tsYW5lXSBeIHByZXZpb3VzKSA+Pj4gMCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYW5lcztcbn1cblxuLyoqXG4gKiBEZXJpdmVzIGEga2luZCdzIHN0YXJ0aW5nIGJvZHk6IDgwIGJpdHMgb2YgYSAxMjgtYml0IGhhc2ggYXMgMTYgQ3JvY2tmb3JkXG4gKiBjaGFyYWN0ZXJzLCBtb3N0IHNpZ25pZmljYW50IGZpcnN0LlxuICpcbiAqIFRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBjb25maW5lZCB0byB0aGUgYWxwaGFiZXQncyBsb3dlciBoYWxmIHNvIHRoZSBib2R5XG4gKiBzdGFydHMgYmVsb3cgaGFsZiBvZiB0aGUgODAtYml0IHNwYWNlLiBgaW5jcmVtZW50QmFzZTMyYCB0aHJvd3Mgb24gb3ZlcmZsb3csXG4gKiBhbmQgd2l0aG91dCB0aGlzIGEgYmFzZSB0aGF0IGhhcHBlbmVkIHRvIGxhbmQgbmVhciBgWuKAplpgIHdvdWxkIG1ha2Ugb3ZlcmZsb3dcbiAqIHJlYWNoYWJsZSBhZnRlciBmZXcgZHJhd3MgcmF0aGVyIHRoYW4gYWZ0ZXIgMl43OSBvZiB0aGVtLlxuICovXG5mdW5jdGlvbiBkZXJpdmVCb2R5KHNlZWQ6IHN0cmluZywga2luZDogQ29ycmVsYXRpb25JZEtpbmQpOiBzdHJpbmcge1xuICBjb25zdCBsYW5lcyA9IGhhc2gxMjgoYCR7c2VlZH0gY29ycmVsYXRpb24ta2luZCAke2tpbmR9YCk7XG4gIGNvbnN0IGJ5dGVzID0gW1xuICAgIChsYW5lc1swXSA+Pj4gMjQpICYgMHhmZixcbiAgICAobGFuZXNbMF0gPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGxhbmVzWzBdID4+PiA4KSAmIDB4ZmYsXG4gICAgbGFuZXNbMF0gJiAweGZmLFxuICAgIChsYW5lc1sxXSA+Pj4gMjQpICYgMHhmZixcbiAgICAobGFuZXNbMV0gPj4+IDE2KSAmIDB4ZmYsXG4gICAgKGxhbmVzWzFdID4+PiA4KSAmIDB4ZmYsXG4gICAgbGFuZXNbMV0gJiAweGZmLFxuICAgIChsYW5lc1syXSA+Pj4gMjQpICYgMHhmZixcbiAgICAobGFuZXNbMl0gPj4+IDE2KSAmIDB4ZmYsXG4gIF07XG4gIGxldCBib2R5ID0gJyc7XG4gIGxldCBhY2N1bXVsYXRvciA9IDA7XG4gIGxldCBiaXRzID0gMDtcbiAgZm9yIChjb25zdCBieXRlIG9mIGJ5dGVzKSB7XG4gICAgYWNjdW11bGF0b3IgPSAoKGFjY3VtdWxhdG9yIDw8IDgpIHwgYnl0ZSkgPj4+IDA7XG4gICAgYml0cyArPSA4O1xuICAgIHdoaWxlIChiaXRzID49IDUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGFjY3VtdWxhdG9yID4+PiAoYml0cyAtIDUpKSAmIDMxO1xuICAgICAgYm9keSArPSBDUk9DS0ZPUkRbYm9keS5sZW5ndGggPT09IDAgPyBpbmRleCAmIDE1IDogaW5kZXhdO1xuICAgICAgYml0cyAtPSA1O1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm9keTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSByZXBsYXkncyBjb3JyZWxhdGlvbi1pZCBnZW5lcmF0b3IuXG4gKlxuICogYHBlcktpbmQ6IGZhbHNlYCByZXR1cm5zIHRoZSBydW4ncyBzaW5nbGUgc2hhcmVkIG1vbm90b25pYyBzZXF1ZW5jZSBhbmRcbiAqIGlnbm9yZXMgdGhlIGtpbmQgZW50aXJlbHksIHNvIGJvdGggc2NoZW1lcyBnbyB0aHJvdWdoIG9uZSBjYWxsIHBhdGggYW5kIHRoZVxuICogZmxhZyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcnJlbGF0aW9uSWRHZW5lcmF0b3Iob3B0aW9uczoge1xuICAvKipcbiAgICogVGhlIHJ1bidzIHJlcGxheS1zdGFibGUgc2VlZC4gTXVzdCBub3QgdmFyeSBiZXR3ZWVuIHJlcGxheXMgb2Ygb25lIHJ1biwgYW5kXG4gICAqIG11c3QgZGlmZmVyIGJldHdlZW4gcnVucywgb3IgdHdvIHJ1bnMgd291bGQgbWludCBpZGVudGljYWwgaWRzLlxuICAgKi9cbiAgc2VlZDogc3RyaW5nO1xuICBmaXhlZFRpbWVzdGFtcDogbnVtYmVyO1xuICAvKiogVGhlIHJ1bidzIHNoYXJlZCBtb25vdG9uaWMgc2VxdWVuY2UsIHVzZWQgYXMtaXMgd2hlbiBgcGVyS2luZGAgaXMgZmFsc2UuICovXG4gIHBvc2l0aW9uYWw6ICgpID0+IHN0cmluZztcbiAgcGVyS2luZDogYm9vbGVhbjtcbn0pOiBDb3JyZWxhdGlvbklkR2VuZXJhdG9yIHtcbiAgY29uc3QgeyBzZWVkLCBmaXhlZFRpbWVzdGFtcCwgcG9zaXRpb25hbCwgcGVyS2luZCB9ID0gb3B0aW9ucztcblxuICBpZiAoIXBlcktpbmQpIHtcbiAgICByZXR1cm4gcG9zaXRpb25hbDtcbiAgfVxuXG4gIGNvbnN0IHRpbWUgPSBlbmNvZGVUaW1lKGZpeGVkVGltZXN0YW1wLCBUSU1FX0NIQVJTKTtcbiAgY29uc3QgYm9kaWVzID0gbmV3IE1hcDxDb3JyZWxhdGlvbklkS2luZCwgc3RyaW5nPigpO1xuXG4gIHJldHVybiAoa2luZDogQ29ycmVsYXRpb25JZEtpbmQpID0+IHtcbiAgICBjb25zdCBwcmV2aW91cyA9IGJvZGllcy5nZXQoa2luZCk7XG4gICAgY29uc3QgYm9keSA9XG4gICAgICBwcmV2aW91cyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gZGVyaXZlQm9keShzZWVkLCBraW5kKVxuICAgICAgICA6IGluY3JlbWVudEJhc2UzMihwcmV2aW91cyk7XG4gICAgYm9kaWVzLnNldChraW5kLCBib2R5KTtcbiAgICByZXR1cm4gYCR7dGltZX0ke2JvZHl9YDtcbiAgfTtcbn1cblxuLyoqIExlbmd0aCBvZiBhIFVMSUQsIGV4cG9ydGVkIHNvIHRlc3RzIG5lZWQgbm90IHJlc3RhdGUgaXQuICovXG5leHBvcnQgY29uc3QgQ09SUkVMQVRJT05fSURfTEVOR1RIID0gVElNRV9DSEFSUyArIEJPRFlfQ0hBUlM7XG5cbi8qKlxuICogV2hldGhlciBlYWNoIGVudGl0eSBmYW1pbHkgZHJhd3MgY29ycmVsYXRpb24gaWRzIGZyb20gaXRzIG93biBzZXF1ZW5jZSByYXRoZXJcbiAqIHRoYW4gZnJvbSBvbmUgc2VxdWVuY2Ugc2hhcmVkIGJ5IHRoZSB3aG9sZSBydW4uIE9mZiB1bmxlc3Mgb3B0ZWQgaW4sIHNvIGFuIFNES1xuICogdXBncmFkZSBhbG9uZSBuZXZlciBtb3ZlcyBhIHJ1biBiZXR3ZWVuIHNjaGVtZXMuXG4gKlxuICogVGhlIGludmFyaWFudCBlaXRoZXIgd2F5OiBhIHJ1biBtdXN0IHJlcGxheSB1bmRlciB0aGUgc2NoZW1lIHRoYXQgbWludGVkIGl0c1xuICogaWRzLiBBIHJlcGxheSB1bmRlciB0aGUgb3RoZXIgc2NoZW1lIG1pbnRzIGlkcyBpdHMgb3duIGVhcmxpZXIgZXZlbnRzIGRvIG5vdFxuICogY2FycnksIHNvIGl0IGNhbiBjb25zdW1lIG5vbmUgb2YgdGhlbSBhbmQgZmFpbHMgdGhlIHJ1bi4gVHdvIHRoaW5ncyBjYW4gYnJlYWtcbiAqIGl0LCBhbmQgYm90aCBhcmUgYWJvdXQgdHVybmluZyB0aGUgZmxhZyBvbiByYXRoZXIgdGhhbiBhYm91dCB1cGdyYWRpbmc6XG4gKlxuICogLSBFbmFibGluZyBpdCB3aGlsZSBydW5zIGFyZSBpbiBmbGlnaHQuIE9uIFZlcmNlbCwgc2tldyBwcm90ZWN0aW9uIGtlZXBzIGEgcnVuXG4gKiAgIG9uIHRoZSBkZXBsb3ltZW50IHRoYXQgc3RhcnRlZCBpdCwgc28gYSBydW4gb25seSBldmVyIHNlZXMgdGhlIHZhbHVlIGJha2VkXG4gKiAgIGludG8gaXRzIG93biBkZXBsb3ltZW50LiBFbHNld2hlcmUgKHdvcmxkLXBvc3RncmVzLCB3b3JsZC1sb2NhbCwgYVxuICogICBzZWxmLWhvc3RlZCBwcm9jZXNzKSBub3RoaW5nIHBpbnMgYSBydW4gdG8gdGhlIGNvZGUgdGhhdCBzdGFydGVkIGl0LCBzb1xuICogICBlbmFibGUgaXQgZHVyaW5nIGEgcXVpZXQgd2luZG93LlxuICogLSBBIHJvbGxpbmcgZGVwbG95IHRoYXQgbGVhdmVzIGJvdGggdmFsdWVzIGxpdmUsIHdoaWNoIHB1dHMgdHdvIHNjaGVtZXMgb24gb25lXG4gKiAgIHJ1biBjb25jdXJyZW50bHkg4oCUIHRoZSBzaWRlLWJ5LXNpZGUgYXBwZW5kIHRoaXMgd2hvbGUgbWVjaGFuaXNtIGV4aXN0cyB0b1xuICogICBhdm9pZC4gUm9sbCB0aGUgdmFsdWUgb3V0IHRvIHRoZSB3aG9sZSBmbGVldCBhdCBvbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQZXJLaW5kQ29ycmVsYXRpb25JZHNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUEVSX0tJTkRfQ09SUkVMQVRJT05fSURTID09PSAnMSc7XG59XG4iXX0=
@@ -1,12 +0,0 @@
1
- /**
2
- * Entry point for the VM serialization bundle.
3
- *
4
- * This file is bundled by esbuild into a self-contained IIFE that
5
- * sets up serialize/deserialize on globalThis. The bundled output
6
- * is evaluated inside the QuickJS VM during bootstrap.
7
- *
8
- * TextEncoder, TextDecoder, and Headers are provided by native C
9
- * extensions in quickjs-wasi, so no polyfills are needed.
10
- */
11
- export {};
12
- //# sourceMappingURL=vm-bundle-entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vm-bundle-entry.d.ts","sourceRoot":"","sources":["../../src/serialization/vm-bundle-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Entry point for the VM serialization bundle.
3
- *
4
- * This file is bundled by esbuild into a self-contained IIFE that
5
- * sets up serialize/deserialize on globalThis. The bundled output
6
- * is evaluated inside the QuickJS VM during bootstrap.
7
- *
8
- * TextEncoder, TextDecoder, and Headers are provided by native C
9
- * extensions in quickjs-wasi, so no polyfills are needed.
10
- */
11
- import { monotonicFactory } from 'ulid';
12
- import { deserialize, serialize } from './workflow-vm.js';
13
- // Install on global scope under the public well-known symbols. The
14
- // snapshot runtime's bootstrap (and the various inline-evaluated JS
15
- // strings in `snapshot-runtime.ts`) reach the same functions via
16
- // `globalThis[Symbol.for('workflow-serialize')]` etc.
17
- globalThis[Symbol.for('workflow-serialize')] = serialize;
18
- globalThis[Symbol.for('workflow-deserialize')] = deserialize;
19
- // ULID generator for correlationIds — uses the same monotonicFactory
20
- // as the node:vm engine. Both inputs MUST be set by the host before the
21
- // first ULID is drawn, otherwise the seeded-ULID determinism guarantee
22
- // is silently broken:
23
- //
24
- // * `Math.random` must be replaced with the host's seeded PRNG via
25
- // `vm.newFunction('random', …)` (see `quickjs-runtime.ts`, the
26
- // `Seeded Math.random` block). Two workflow invocations of the same
27
- // run MUST observe an identical random sequence so their
28
- // correlationIds collide and the world's EntityConflictError dedup
29
- // applies. We pass it explicitly to `monotonicFactory` because
30
- // ULID's auto-detect (`detectPRNG`) only knows about
31
- // `crypto.getRandomValues` / `crypto.randomBytes`, neither of which
32
- // exist in QuickJS. The PRNG is deliberately LATE-BOUND (the arrow
33
- // reads `Math.random` at draw time, not at bundle-eval time) so
34
- // that this bundle can be evaluated during static VM initialization
35
- // — before the per-run seeded PRNG is installed — without capturing
36
- // the unseeded built-in. This is also what allows a future VM
37
- // snapshot taken after bundle eval to have its PRNG swapped
38
- // post-restore.
39
- // * `globalThis.__ulidTimestamp` must be a number (typically
40
- // `workflowRun.startedAt`). It's used in place of `Date.now()` so
41
- // the time portion of the ULID is also stable across concurrent
42
- // invocations of the same run.
43
- //
44
- // The timestamp prerequisite is validated below — fail loudly rather
45
- // than fall back to `Date.now()`, which would re-introduce
46
- // non-determinism that replay relies on us NOT having.
47
- const ulid = monotonicFactory(() => Math.random());
48
- globalThis.__generateUlid = () => {
49
- const t = globalThis.__ulidTimestamp;
50
- if (typeof t !== 'number') {
51
- throw new Error('__generateUlid: globalThis.__ulidTimestamp must be a number set by ' +
52
- 'the host before the serde bundle is evaluated. Without it, ULIDs ' +
53
- 'would fall back to Date.now() and concurrent workflow invocations ' +
54
- 'of the same resumption would produce divergent correlationIds.');
55
- }
56
- return ulid(t);
57
- };
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm0tYnVuZGxlLWVudHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vdm0tYnVuZGxlLWVudHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFELG1FQUFtRTtBQUNuRSxvRUFBb0U7QUFDcEUsaUVBQWlFO0FBQ2pFLHNEQUFzRDtBQUNyRCxVQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUNqRSxVQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUV0RSxxRUFBcUU7QUFDckUsd0VBQXdFO0FBQ3hFLHVFQUF1RTtBQUN2RSxzQkFBc0I7QUFDdEIsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxtRUFBbUU7QUFDbkUsd0VBQXdFO0FBQ3hFLDZEQUE2RDtBQUM3RCx1RUFBdUU7QUFDdkUsbUVBQW1FO0FBQ25FLHlEQUF5RDtBQUN6RCx3RUFBd0U7QUFDeEUsdUVBQXVFO0FBQ3ZFLG9FQUFvRTtBQUNwRSx3RUFBd0U7QUFDeEUsd0VBQXdFO0FBQ3hFLGtFQUFrRTtBQUNsRSxnRUFBZ0U7QUFDaEUsb0JBQW9CO0FBQ3BCLCtEQUErRDtBQUMvRCxzRUFBc0U7QUFDdEUsb0VBQW9FO0FBQ3BFLG1DQUFtQztBQUNuQyxFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLDJEQUEyRDtBQUMzRCx1REFBdUQ7QUFDdkQsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbEQsVUFBa0IsQ0FBQyxjQUFjLEdBQUcsR0FBRyxFQUFFO0lBQ3hDLE1BQU0sQ0FBQyxHQUFJLFVBQWtCLENBQUMsZUFBZSxDQUFDO0lBQzlDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FDYixxRUFBcUU7WUFDbkUsbUVBQW1FO1lBQ25FLG9FQUFvRTtZQUNwRSxnRUFBZ0UsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVudHJ5IHBvaW50IGZvciB0aGUgVk0gc2VyaWFsaXphdGlvbiBidW5kbGUuXG4gKlxuICogVGhpcyBmaWxlIGlzIGJ1bmRsZWQgYnkgZXNidWlsZCBpbnRvIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0XG4gKiBzZXRzIHVwIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBvbiBnbG9iYWxUaGlzLiBUaGUgYnVuZGxlZCBvdXRwdXRcbiAqIGlzIGV2YWx1YXRlZCBpbnNpZGUgdGhlIFF1aWNrSlMgVk0gZHVyaW5nIGJvb3RzdHJhcC5cbiAqXG4gKiBUZXh0RW5jb2RlciwgVGV4dERlY29kZXIsIGFuZCBIZWFkZXJzIGFyZSBwcm92aWRlZCBieSBuYXRpdmUgQ1xuICogZXh0ZW5zaW9ucyBpbiBxdWlja2pzLXdhc2ksIHNvIG5vIHBvbHlmaWxscyBhcmUgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IGRlc2VyaWFsaXplLCBzZXJpYWxpemUgfSBmcm9tICcuL3dvcmtmbG93LXZtLmpzJztcblxuLy8gSW5zdGFsbCBvbiBnbG9iYWwgc2NvcGUgdW5kZXIgdGhlIHB1YmxpYyB3ZWxsLWtub3duIHN5bWJvbHMuIFRoZVxuLy8gc25hcHNob3QgcnVudGltZSdzIGJvb3RzdHJhcCAoYW5kIHRoZSB2YXJpb3VzIGlubGluZS1ldmFsdWF0ZWQgSlNcbi8vIHN0cmluZ3MgaW4gYHNuYXBzaG90LXJ1bnRpbWUudHNgKSByZWFjaCB0aGUgc2FtZSBmdW5jdGlvbnMgdmlhXG4vLyBgZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV1gIGV0Yy5cbihnbG9iYWxUaGlzIGFzIGFueSlbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldID0gc2VyaWFsaXplO1xuKGdsb2JhbFRoaXMgYXMgYW55KVtTeW1ib2wuZm9yKCd3b3JrZmxvdy1kZXNlcmlhbGl6ZScpXSA9IGRlc2VyaWFsaXplO1xuXG4vLyBVTElEIGdlbmVyYXRvciBmb3IgY29ycmVsYXRpb25JZHMg4oCUIHVzZXMgdGhlIHNhbWUgbW9ub3RvbmljRmFjdG9yeVxuLy8gYXMgdGhlIG5vZGU6dm0gZW5naW5lLiBCb3RoIGlucHV0cyBNVVNUIGJlIHNldCBieSB0aGUgaG9zdCBiZWZvcmUgdGhlXG4vLyBmaXJzdCBVTElEIGlzIGRyYXduLCBvdGhlcndpc2UgdGhlIHNlZWRlZC1VTElEIGRldGVybWluaXNtIGd1YXJhbnRlZVxuLy8gaXMgc2lsZW50bHkgYnJva2VuOlxuLy9cbi8vICAgKiBgTWF0aC5yYW5kb21gIG11c3QgYmUgcmVwbGFjZWQgd2l0aCB0aGUgaG9zdCdzIHNlZWRlZCBQUk5HIHZpYVxuLy8gICAgIGB2bS5uZXdGdW5jdGlvbigncmFuZG9tJywg4oCmKWAgKHNlZSBgcXVpY2tqcy1ydW50aW1lLnRzYCwgdGhlXG4vLyAgICAgYFNlZWRlZCBNYXRoLnJhbmRvbWAgYmxvY2spLiBUd28gd29ya2Zsb3cgaW52b2NhdGlvbnMgb2YgdGhlIHNhbWVcbi8vICAgICBydW4gTVVTVCBvYnNlcnZlIGFuIGlkZW50aWNhbCByYW5kb20gc2VxdWVuY2Ugc28gdGhlaXJcbi8vICAgICBjb3JyZWxhdGlvbklkcyBjb2xsaWRlIGFuZCB0aGUgd29ybGQncyBFbnRpdHlDb25mbGljdEVycm9yIGRlZHVwXG4vLyAgICAgYXBwbGllcy4gV2UgcGFzcyBpdCBleHBsaWNpdGx5IHRvIGBtb25vdG9uaWNGYWN0b3J5YCBiZWNhdXNlXG4vLyAgICAgVUxJRCdzIGF1dG8tZGV0ZWN0IChgZGV0ZWN0UFJOR2ApIG9ubHkga25vd3MgYWJvdXRcbi8vICAgICBgY3J5cHRvLmdldFJhbmRvbVZhbHVlc2AgLyBgY3J5cHRvLnJhbmRvbUJ5dGVzYCwgbmVpdGhlciBvZiB3aGljaFxuLy8gICAgIGV4aXN0IGluIFF1aWNrSlMuIFRoZSBQUk5HIGlzIGRlbGliZXJhdGVseSBMQVRFLUJPVU5EICh0aGUgYXJyb3dcbi8vICAgICByZWFkcyBgTWF0aC5yYW5kb21gIGF0IGRyYXcgdGltZSwgbm90IGF0IGJ1bmRsZS1ldmFsIHRpbWUpIHNvXG4vLyAgICAgdGhhdCB0aGlzIGJ1bmRsZSBjYW4gYmUgZXZhbHVhdGVkIGR1cmluZyBzdGF0aWMgVk0gaW5pdGlhbGl6YXRpb25cbi8vICAgICDigJQgYmVmb3JlIHRoZSBwZXItcnVuIHNlZWRlZCBQUk5HIGlzIGluc3RhbGxlZCDigJQgd2l0aG91dCBjYXB0dXJpbmdcbi8vICAgICB0aGUgdW5zZWVkZWQgYnVpbHQtaW4uIFRoaXMgaXMgYWxzbyB3aGF0IGFsbG93cyBhIGZ1dHVyZSBWTVxuLy8gICAgIHNuYXBzaG90IHRha2VuIGFmdGVyIGJ1bmRsZSBldmFsIHRvIGhhdmUgaXRzIFBSTkcgc3dhcHBlZFxuLy8gICAgIHBvc3QtcmVzdG9yZS5cbi8vICAgKiBgZ2xvYmFsVGhpcy5fX3VsaWRUaW1lc3RhbXBgIG11c3QgYmUgYSBudW1iZXIgKHR5cGljYWxseVxuLy8gICAgIGB3b3JrZmxvd1J1bi5zdGFydGVkQXRgKS4gSXQncyB1c2VkIGluIHBsYWNlIG9mIGBEYXRlLm5vdygpYCBzb1xuLy8gICAgIHRoZSB0aW1lIHBvcnRpb24gb2YgdGhlIFVMSUQgaXMgYWxzbyBzdGFibGUgYWNyb3NzIGNvbmN1cnJlbnRcbi8vICAgICBpbnZvY2F0aW9ucyBvZiB0aGUgc2FtZSBydW4uXG4vL1xuLy8gVGhlIHRpbWVzdGFtcCBwcmVyZXF1aXNpdGUgaXMgdmFsaWRhdGVkIGJlbG93IOKAlCBmYWlsIGxvdWRseSByYXRoZXJcbi8vIHRoYW4gZmFsbCBiYWNrIHRvIGBEYXRlLm5vdygpYCwgd2hpY2ggd291bGQgcmUtaW50cm9kdWNlXG4vLyBub24tZGV0ZXJtaW5pc20gdGhhdCByZXBsYXkgcmVsaWVzIG9uIHVzIE5PVCBoYXZpbmcuXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcbihnbG9iYWxUaGlzIGFzIGFueSkuX19nZW5lcmF0ZVVsaWQgPSAoKSA9PiB7XG4gIGNvbnN0IHQgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdWxpZFRpbWVzdGFtcDtcbiAgaWYgKHR5cGVvZiB0ICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdfX2dlbmVyYXRlVWxpZDogZ2xvYmFsVGhpcy5fX3VsaWRUaW1lc3RhbXAgbXVzdCBiZSBhIG51bWJlciBzZXQgYnkgJyArXG4gICAgICAgICd0aGUgaG9zdCBiZWZvcmUgdGhlIHNlcmRlIGJ1bmRsZSBpcyBldmFsdWF0ZWQuIFdpdGhvdXQgaXQsIFVMSURzICcgK1xuICAgICAgICAnd291bGQgZmFsbCBiYWNrIHRvIERhdGUubm93KCkgYW5kIGNvbmN1cnJlbnQgd29ya2Zsb3cgaW52b2NhdGlvbnMgJyArXG4gICAgICAgICdvZiB0aGUgc2FtZSByZXN1bXB0aW9uIHdvdWxkIHByb2R1Y2UgZGl2ZXJnZW50IGNvcnJlbGF0aW9uSWRzLidcbiAgICApO1xuICB9XG4gIHJldHVybiB1bGlkKHQpO1xufTtcbiJdfQ==