@workflow/core 5.0.0-beta.2 → 5.0.0-beta.20

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 (247) hide show
  1. package/dist/attribute-changes.d.ts +7 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +22 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +41 -4
  7. package/dist/capture-stack.d.ts +16 -0
  8. package/dist/capture-stack.d.ts.map +1 -0
  9. package/dist/capture-stack.js +21 -0
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +11 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +59 -6
  16. package/dist/context-errors.d.ts +27 -0
  17. package/dist/context-errors.d.ts.map +1 -0
  18. package/dist/context-errors.js +101 -0
  19. package/dist/context-violation-error.d.ts +97 -0
  20. package/dist/context-violation-error.d.ts.map +1 -0
  21. package/dist/context-violation-error.js +147 -0
  22. package/dist/create-hook.d.ts +40 -1
  23. package/dist/create-hook.d.ts.map +1 -1
  24. package/dist/create-hook.js +4 -3
  25. package/dist/define-hook.d.ts.map +1 -1
  26. package/dist/define-hook.js +20 -5
  27. package/dist/describe-error.d.ts +70 -0
  28. package/dist/describe-error.d.ts.map +1 -0
  29. package/dist/describe-error.js +165 -0
  30. package/dist/encryption.d.ts +22 -1
  31. package/dist/encryption.d.ts.map +1 -1
  32. package/dist/encryption.js +72 -27
  33. package/dist/events-consumer.d.ts +24 -0
  34. package/dist/events-consumer.d.ts.map +1 -1
  35. package/dist/events-consumer.js +79 -16
  36. package/dist/flushable-stream.d.ts +10 -10
  37. package/dist/flushable-stream.d.ts.map +1 -1
  38. package/dist/flushable-stream.js +18 -13
  39. package/dist/global.d.ts +15 -1
  40. package/dist/global.d.ts.map +1 -1
  41. package/dist/global.js +21 -3
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/log-format.d.ts +25 -0
  46. package/dist/log-format.d.ts.map +1 -0
  47. package/dist/log-format.js +250 -0
  48. package/dist/logger.d.ts +28 -30
  49. package/dist/logger.d.ts.map +1 -1
  50. package/dist/logger.js +77 -31
  51. package/dist/private.d.ts +84 -0
  52. package/dist/private.d.ts.map +1 -1
  53. package/dist/private.js +80 -3
  54. package/dist/runtime/constants.d.ts +93 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +168 -8
  57. package/dist/runtime/get-port-lazy.d.ts +25 -0
  58. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  59. package/dist/runtime/get-port-lazy.js +92 -0
  60. package/dist/runtime/get-world-lazy.d.ts +32 -0
  61. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  62. package/dist/runtime/get-world-lazy.js +56 -0
  63. package/dist/runtime/helpers.d.ts +50 -7
  64. package/dist/runtime/helpers.d.ts.map +1 -1
  65. package/dist/runtime/helpers.js +149 -31
  66. package/dist/runtime/replay-budget.d.ts +98 -0
  67. package/dist/runtime/replay-budget.d.ts.map +1 -0
  68. package/dist/runtime/replay-budget.js +191 -0
  69. package/dist/runtime/resume-hook.d.ts.map +1 -1
  70. package/dist/runtime/resume-hook.js +39 -23
  71. package/dist/runtime/run-id-time.d.ts +10 -0
  72. package/dist/runtime/run-id-time.d.ts.map +1 -0
  73. package/dist/runtime/run-id-time.js +31 -0
  74. package/dist/runtime/run.d.ts.map +1 -1
  75. package/dist/runtime/run.js +44 -9
  76. package/dist/runtime/runs.d.ts.map +1 -1
  77. package/dist/runtime/runs.js +4 -1
  78. package/dist/runtime/start.d.ts +30 -1
  79. package/dist/runtime/start.d.ts.map +1 -1
  80. package/dist/runtime/start.js +138 -20
  81. package/dist/runtime/step-executor.d.ts +91 -0
  82. package/dist/runtime/step-executor.d.ts.map +1 -0
  83. package/dist/runtime/step-executor.js +659 -0
  84. package/dist/runtime/step-handler.d.ts.map +1 -1
  85. package/dist/runtime/step-handler.js +699 -556
  86. package/dist/runtime/suspension-handler.d.ts +55 -6
  87. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  88. package/dist/runtime/suspension-handler.js +282 -115
  89. package/dist/runtime/wait-continuation.d.ts +84 -0
  90. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  91. package/dist/runtime/wait-continuation.js +92 -0
  92. package/dist/runtime/wait-until.d.ts +18 -0
  93. package/dist/runtime/wait-until.d.ts.map +1 -0
  94. package/dist/runtime/wait-until.js +42 -0
  95. package/dist/runtime/world-init.d.ts +75 -0
  96. package/dist/runtime/world-init.d.ts.map +1 -0
  97. package/dist/runtime/world-init.js +75 -0
  98. package/dist/runtime/world.d.ts.map +1 -1
  99. package/dist/runtime/world.js +47 -18
  100. package/dist/runtime.d.ts +11 -8
  101. package/dist/runtime.d.ts.map +1 -1
  102. package/dist/runtime.js +1234 -334
  103. package/dist/schemas.d.ts +1 -1
  104. package/dist/schemas.d.ts.map +1 -1
  105. package/dist/schemas.js +1 -1
  106. package/dist/serialization/client.d.ts +17 -0
  107. package/dist/serialization/client.d.ts.map +1 -0
  108. package/dist/serialization/client.js +48 -0
  109. package/dist/serialization/codec-devalue.d.ts +14 -0
  110. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  111. package/dist/serialization/codec-devalue.js +98 -0
  112. package/dist/serialization/codec.d.ts +106 -0
  113. package/dist/serialization/codec.d.ts.map +1 -0
  114. package/dist/serialization/codec.js +17 -0
  115. package/dist/serialization/compression.d.ts +104 -0
  116. package/dist/serialization/compression.d.ts.map +1 -0
  117. package/dist/serialization/compression.js +260 -0
  118. package/dist/serialization/encryption.d.ts +33 -0
  119. package/dist/serialization/encryption.d.ts.map +1 -0
  120. package/dist/serialization/encryption.js +70 -0
  121. package/dist/serialization/errors.d.ts +34 -0
  122. package/dist/serialization/errors.d.ts.map +1 -0
  123. package/dist/serialization/errors.js +59 -0
  124. package/dist/serialization/format.d.ts +60 -0
  125. package/dist/serialization/format.d.ts.map +1 -0
  126. package/dist/serialization/format.js +97 -0
  127. package/dist/serialization/index.d.ts +19 -0
  128. package/dist/serialization/index.d.ts.map +1 -0
  129. package/dist/serialization/index.js +22 -0
  130. package/dist/serialization/reducers/class.d.ts +11 -0
  131. package/dist/serialization/reducers/class.d.ts.map +1 -0
  132. package/dist/serialization/reducers/class.js +68 -0
  133. package/dist/serialization/reducers/common.d.ts +16 -0
  134. package/dist/serialization/reducers/common.d.ts.map +1 -0
  135. package/dist/serialization/reducers/common.js +417 -0
  136. package/dist/serialization/reducers/step-function.d.ts +35 -0
  137. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  138. package/dist/serialization/reducers/step-function.js +88 -0
  139. package/dist/serialization/step.d.ts +17 -0
  140. package/dist/serialization/step.d.ts.map +1 -0
  141. package/dist/serialization/step.js +48 -0
  142. package/dist/serialization/types.d.ts +253 -0
  143. package/dist/serialization/types.d.ts.map +1 -0
  144. package/dist/serialization/types.js +25 -0
  145. package/dist/serialization/workflow.d.ts +29 -0
  146. package/dist/serialization/workflow.d.ts.map +1 -0
  147. package/dist/serialization/workflow.js +54 -0
  148. package/dist/serialization-format.d.ts +15 -0
  149. package/dist/serialization-format.d.ts.map +1 -1
  150. package/dist/serialization-format.js +209 -11
  151. package/dist/serialization.d.ts +313 -214
  152. package/dist/serialization.d.ts.map +1 -1
  153. package/dist/serialization.js +1417 -658
  154. package/dist/set-attributes.d.ts +13 -0
  155. package/dist/set-attributes.d.ts.map +1 -0
  156. package/dist/set-attributes.js +42 -0
  157. package/dist/sleep.d.ts.map +1 -1
  158. package/dist/sleep.js +3 -2
  159. package/dist/source-map.d.ts +5 -0
  160. package/dist/source-map.d.ts.map +1 -1
  161. package/dist/source-map.js +102 -10
  162. package/dist/step/context-storage.d.ts +16 -0
  163. package/dist/step/context-storage.d.ts.map +1 -1
  164. package/dist/step/context-storage.js +1 -1
  165. package/dist/step/get-closure-vars.d.ts.map +1 -1
  166. package/dist/step/get-closure-vars.js +3 -2
  167. package/dist/step/get-step-metadata.d.ts.map +1 -1
  168. package/dist/step/get-step-metadata.js +3 -2
  169. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  170. package/dist/step/get-workflow-metadata.js +3 -2
  171. package/dist/step/writable-stream.d.ts.map +1 -1
  172. package/dist/step/writable-stream.js +49 -5
  173. package/dist/step.d.ts.map +1 -1
  174. package/dist/step.js +98 -20
  175. package/dist/symbols.d.ts +28 -0
  176. package/dist/symbols.d.ts.map +1 -1
  177. package/dist/symbols.js +29 -1
  178. package/dist/telemetry/semantic-conventions.d.ts +30 -2
  179. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  180. package/dist/telemetry/semantic-conventions.js +21 -1
  181. package/dist/telemetry.d.ts +60 -0
  182. package/dist/telemetry.d.ts.map +1 -1
  183. package/dist/telemetry.js +82 -4
  184. package/dist/types.d.ts +6 -0
  185. package/dist/types.d.ts.map +1 -1
  186. package/dist/types.js +23 -1
  187. package/dist/util.d.ts +16 -6
  188. package/dist/util.d.ts.map +1 -1
  189. package/dist/util.js +25 -16
  190. package/dist/version.d.ts +1 -1
  191. package/dist/version.d.ts.map +1 -1
  192. package/dist/version.js +2 -2
  193. package/dist/vm/index.d.ts.map +1 -1
  194. package/dist/vm/index.js +3 -2
  195. package/dist/vm/script-cache.d.ts +28 -0
  196. package/dist/vm/script-cache.d.ts.map +1 -0
  197. package/dist/vm/script-cache.js +140 -0
  198. package/dist/workflow/abort-controller.d.ts +65 -0
  199. package/dist/workflow/abort-controller.d.ts.map +1 -0
  200. package/dist/workflow/abort-controller.js +260 -0
  201. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  202. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  203. package/dist/workflow/attribute-dispatcher.js +48 -0
  204. package/dist/workflow/create-hook.d.ts.map +1 -1
  205. package/dist/workflow/create-hook.js +23 -2
  206. package/dist/workflow/define-hook.d.ts +1 -1
  207. package/dist/workflow/define-hook.d.ts.map +1 -1
  208. package/dist/workflow/define-hook.js +8 -4
  209. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  210. package/dist/workflow/get-workflow-metadata.js +14 -3
  211. package/dist/workflow/hook.d.ts.map +1 -1
  212. package/dist/workflow/hook.js +207 -33
  213. package/dist/workflow/index.d.ts +1 -0
  214. package/dist/workflow/index.d.ts.map +1 -1
  215. package/dist/workflow/index.js +5 -3
  216. package/dist/workflow/set-attributes.d.ts +73 -0
  217. package/dist/workflow/set-attributes.d.ts.map +1 -0
  218. package/dist/workflow/set-attributes.js +65 -0
  219. package/dist/workflow/sleep.d.ts.map +1 -1
  220. package/dist/workflow/sleep.js +45 -8
  221. package/dist/workflow/world-init-stub.d.ts +15 -0
  222. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  223. package/dist/workflow/world-init-stub.js +15 -0
  224. package/dist/workflow.d.ts.map +1 -1
  225. package/dist/workflow.js +148 -47
  226. package/docs/api-reference/create-hook.mdx +38 -0
  227. package/docs/api-reference/create-webhook.mdx +1 -0
  228. package/docs/api-reference/experimental-set-attributes.mdx +65 -0
  229. package/docs/api-reference/fetch.mdx +5 -0
  230. package/docs/api-reference/index.mdx +3 -0
  231. package/docs/foundations/cancellation.mdx +459 -0
  232. package/docs/foundations/errors-and-retries.mdx +7 -3
  233. package/docs/foundations/hooks.mdx +29 -0
  234. package/docs/foundations/idempotency.mdx +236 -11
  235. package/docs/foundations/index.mdx +3 -3
  236. package/docs/foundations/meta.json +3 -2
  237. package/docs/foundations/serialization.mdx +78 -42
  238. package/docs/foundations/starting-workflows.mdx +6 -2
  239. package/docs/foundations/streaming.mdx +14 -23
  240. package/docs/foundations/versioning.mdx +263 -0
  241. package/docs/how-it-works/cancellation.mdx +287 -0
  242. package/docs/how-it-works/code-transform.mdx +2 -2
  243. package/docs/how-it-works/encryption.mdx +2 -2
  244. package/docs/how-it-works/event-sourcing.mdx +2 -2
  245. package/docs/how-it-works/meta.json +2 -1
  246. package/package.json +22 -10
  247. package/docs/foundations/common-patterns.mdx +0 -265
@@ -0,0 +1,191 @@
1
+ import { FatalError, RUN_ERROR_CODES } from '@workflow/errors';
2
+ import { SPEC_VERSION_CURRENT } from '@workflow/world';
3
+ import { describeError } from '../describe-error.js';
4
+ import { runtimeLogger } from '../logger.js';
5
+ import { dehydrateRunError } from '../serialization.js';
6
+ import { getReplayTimeoutMs, REPLAY_TIMEOUT_MAX_RETRIES } from './constants.js';
7
+ import { memoizeEncryptionKey } from './helpers.js';
8
+ import { getWorld } from './world.js';
9
+ /**
10
+ * Per-invocation accounting of the *non-step* portion of a workflow
11
+ * handler run: deterministic event-log replay, workflow-VM execution
12
+ * between step boundaries, suspension handling, queue round-trips, etc.
13
+ * Inline step bodies (`"use step"` functions invoked via `executeStep`)
14
+ * are intentionally excluded — they are bounded by the platform's
15
+ * function `maxDuration` and the `NO_INLINE_REPLAY_AFTER_MS` early-return
16
+ * guard.
17
+ *
18
+ * Usage:
19
+ *
20
+ * ```ts
21
+ * const budget = new ReplayBudget();
22
+ * // …non-step work happens here, accumulates against the budget…
23
+ * budget.pause();
24
+ * try {
25
+ * await executeStep(...); // not charged
26
+ * } finally {
27
+ * budget.resume();
28
+ * }
29
+ * // back to charging
30
+ * if (budget.isExhausted()) { ... }
31
+ * ```
32
+ *
33
+ * Implementation notes:
34
+ *
35
+ * - `pause()` and `resume()` are idempotent: calling `pause()` while
36
+ * already paused (or `resume()` while already resumed) is a no-op.
37
+ * This protects against double-counting in future refactors that nest
38
+ * step execution or take an early-return path between a `pause()` and
39
+ * the matching `resume()`.
40
+ * - `isExhausted()` is checked at loop boundaries by the caller — the
41
+ * budget itself does not arm any timers. This means an in-flight
42
+ * pathological `runWorkflow` call (e.g. a huge event-log replay) can
43
+ * overshoot the budget by up to one iteration's worth of work before
44
+ * the next check fires. In practice the 20s headroom built into
45
+ * `MAX_REPLAY_TIMEOUT_MS` (and the function `maxDuration` ceiling)
46
+ * gives us slack; the old `setTimeout`-based approach also ultimately
47
+ * relied on the platform SIGTERM as the hard backstop.
48
+ */
49
+ export class ReplayBudget {
50
+ limitMs;
51
+ elapsedMs = 0;
52
+ intervalStart;
53
+ constructor(limitMs = getReplayTimeoutMs()) {
54
+ this.limitMs = limitMs;
55
+ this.intervalStart = Date.now();
56
+ }
57
+ /**
58
+ * The configured replay-timeout limit, in ms. Useful for log messages.
59
+ */
60
+ get configuredLimitMs() {
61
+ return this.limitMs;
62
+ }
63
+ /**
64
+ * Total non-step time accumulated so far, in ms. Includes the
65
+ * currently-active interval if the budget is not paused.
66
+ */
67
+ elapsed() {
68
+ const open = this.intervalStart === null ? 0 : Date.now() - this.intervalStart;
69
+ return this.elapsedMs + open;
70
+ }
71
+ /**
72
+ * Stop counting elapsed time toward the budget. Idempotent — safe to
73
+ * call multiple times in a row; subsequent calls are no-ops until
74
+ * `resume()` reopens an interval.
75
+ */
76
+ pause() {
77
+ if (this.intervalStart === null)
78
+ return;
79
+ this.elapsedMs += Date.now() - this.intervalStart;
80
+ this.intervalStart = null;
81
+ }
82
+ /**
83
+ * Resume counting elapsed time toward the budget. Idempotent — safe to
84
+ * call multiple times in a row; subsequent calls re-anchor the
85
+ * interval start to `now()`, which is fine because no time accrues
86
+ * between back-to-back `resume()` calls.
87
+ */
88
+ resume() {
89
+ this.intervalStart = Date.now();
90
+ }
91
+ /**
92
+ * True if the budget has been exhausted (`elapsed() >= limitMs`).
93
+ * Callers should invoke `handleExhausted(...)` afterward and return
94
+ * from the handler.
95
+ */
96
+ isExhausted() {
97
+ return this.elapsed() >= this.limitMs;
98
+ }
99
+ }
100
+ /**
101
+ * Fail the run (or retry, on early attempts) when the replay budget is
102
+ * exhausted. The handling depends on whether the underlying World
103
+ * supports `process.exit(1)` as a queue redelivery signal (see
104
+ * `World.processExitTriggersQueueRedelivery`):
105
+ *
106
+ * - **Managed-platform Worlds** (`world-vercel`): on attempts <=
107
+ * `REPLAY_TIMEOUT_MAX_RETRIES` exit the process so the platform fails
108
+ * the invocation and the queue redelivers; on the next attempt write
109
+ * `run_failed` with `RUN_ERROR_CODES.REPLAY_TIMEOUT` and exit.
110
+ *
111
+ * - **In-process Worlds** (`world-local`, dev servers): calling
112
+ * `process.exit()` would terminate the host (e.g. `pnpm dev`), so
113
+ * instead log a warning, write `run_failed` best-effort, and return.
114
+ * The framework completes the request normally.
115
+ */
116
+ export async function handleReplayBudgetExhausted(args) {
117
+ const { runId, workflowName, requestId, attempt, limitMs } = args;
118
+ const runLogger = runtimeLogger.forRun(runId, workflowName);
119
+ const world = await getWorld();
120
+ const canExitForRedelivery = world.processExitTriggersQueueRedelivery === true;
121
+ // Worlds without managed-platform redelivery (e.g. world-local, custom
122
+ // in-process worlds) must not have us exit the process — that would
123
+ // kill the user's host (`pnpm dev`, CLI, etc.) without producing a
124
+ // retry. Surface the failure via the event log if we can, then return.
125
+ if (!canExitForRedelivery) {
126
+ runLogger.warn('Workflow replay exceeded timeout; current World does not support process exit for redelivery — failing the run and returning', { timeoutMs: limitMs, attempt });
127
+ try {
128
+ const getEncryptionKey = memoizeEncryptionKey(world, runId);
129
+ const timeoutErr = new FatalError(`Workflow replay exceeded maximum duration (${limitMs / 1000}s)`);
130
+ await world.events.create(runId, {
131
+ eventType: 'run_failed',
132
+ specVersion: SPEC_VERSION_CURRENT,
133
+ eventData: {
134
+ error: await dehydrateRunError(timeoutErr, runId, await getEncryptionKey()),
135
+ errorCode: RUN_ERROR_CODES.REPLAY_TIMEOUT,
136
+ },
137
+ }, { requestId });
138
+ }
139
+ catch (err) {
140
+ runLogger.warn('Unable to mark run as failed', {
141
+ attempt,
142
+ errorName: err instanceof Error ? err.name : 'UnknownError',
143
+ errorMessage: err instanceof Error ? err.message : String(err),
144
+ });
145
+ }
146
+ return;
147
+ }
148
+ if (attempt <= REPLAY_TIMEOUT_MAX_RETRIES) {
149
+ runLogger.warn('Workflow replay exceeded timeout but will be re-attempted (attempt < maxRetries)', {
150
+ timeoutMs: limitMs,
151
+ attempt,
152
+ maxRetries: REPLAY_TIMEOUT_MAX_RETRIES,
153
+ });
154
+ process.exit(1);
155
+ }
156
+ const replayTimeoutDescription = describeError(undefined, RUN_ERROR_CODES.REPLAY_TIMEOUT);
157
+ runLogger.error('Workflow replay exceeded timeout and max retries exceeded. Failing the run', {
158
+ timeoutMs: limitMs,
159
+ attempt,
160
+ maxRetries: REPLAY_TIMEOUT_MAX_RETRIES,
161
+ errorCode: replayTimeoutDescription.errorCode,
162
+ errorAttribution: replayTimeoutDescription.attribution,
163
+ });
164
+ try {
165
+ const getEncryptionKey = memoizeEncryptionKey(world, runId);
166
+ const timeoutErr = new FatalError(`Workflow replay exceeded maximum duration (${limitMs / 1000}s) after ${attempt} attempts`);
167
+ await world.events.create(runId, {
168
+ eventType: 'run_failed',
169
+ specVersion: SPEC_VERSION_CURRENT,
170
+ eventData: {
171
+ error: await dehydrateRunError(timeoutErr, runId, await getEncryptionKey()),
172
+ errorCode: RUN_ERROR_CODES.REPLAY_TIMEOUT,
173
+ },
174
+ }, { requestId });
175
+ }
176
+ catch (err) {
177
+ // Best effort — process exits regardless. Surface why so operators
178
+ // can diagnose repeat timeouts against the backend.
179
+ runLogger.warn('Unable to mark run as failed. The queue will continue to retry', {
180
+ attempt,
181
+ errorName: err instanceof Error ? err.name : 'UnknownError',
182
+ errorMessage: err instanceof Error ? err.message : String(err),
183
+ errorStack: err instanceof Error ? err.stack : undefined,
184
+ });
185
+ }
186
+ // Note that this also prevents the runtime from acking the queue
187
+ // message, so the queue will call back once, after which a 410 will
188
+ // get it to exit early.
189
+ process.exit(1);
190
+ }
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LWJ1ZGdldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3JlcGxheS1idWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDTixPQUFPLENBQVM7SUFDekIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLGFBQWEsQ0FBZ0I7SUFFckMsWUFBWSxVQUFrQixrQkFBa0IsRUFBRTtRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMs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QUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYztZQUMzRCxZQUFZLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUM5RCxVQUFVLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN6RCxDQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsaUVBQWlFO0lBQ2pFLG9FQUFvRTtJQUNwRSx3QkFBd0I7SUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmF0YWxFcnJvciwgUlVOX0VSUk9SX0NPREVTIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZXNjcmliZUVycm9yIH0gZnJvbSAnLi4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0UmVwbGF5VGltZW91dE1zLCBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IG1lbW9pemVFbmNyeXB0aW9uS2V5IH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGdldFdvcmxkIH0gZnJvbSAnLi93b3JsZC5qcyc7XG5cbi8qKlxuICogUGVyLWludm9jYXRpb24gYWNjb3VudGluZyBvZiB0aGUgKm5vbi1zdGVwKiBwb3J0aW9uIG9mIGEgd29ya2Zsb3dcbiAqIGhhbmRsZXIgcnVuOiBkZXRlcm1pbmlzdGljIGV2ZW50LWxvZyByZXBsYXksIHdvcmtmbG93LVZNIGV4ZWN1dGlvblxuICogYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMsIHN1c3BlbnNpb24gaGFuZGxpbmcsIHF1ZXVlIHJvdW5kLXRyaXBzLCBldGMuXG4gKiBJbmxpbmUgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9ucyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKVxuICogYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQg4oCUIHRoZXkgYXJlIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3NcbiAqIGZ1bmN0aW9uIGBtYXhEdXJhdGlvbmAgYW5kIHRoZSBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AgZWFybHktcmV0dXJuXG4gKiBndWFyZC5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgYnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuICogLy8g4oCmbm9uLXN0ZXAgd29yayBoYXBwZW5zIGhlcmUsIGFjY3VtdWxhdGVzIGFnYWluc3QgdGhlIGJ1ZGdldOKAplxuICogYnVkZ2V0LnBhdXNlKCk7XG4gKiB0cnkge1xuICogICBhd2FpdCBleGVjdXRlU3RlcCguLi4pOyAvLyBub3QgY2hhcmdlZFxuICogfSBmaW5hbGx5IHtcbiAqICAgYnVkZ2V0LnJlc3VtZSgpO1xuICogfVxuICogLy8gYmFjayB0byBjaGFyZ2luZ1xuICogaWYgKGJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBub3RlczpcbiAqXG4gKiAtIGBwYXVzZSgpYCBhbmQgYHJlc3VtZSgpYCBhcmUgaWRlbXBvdGVudDogY2FsbGluZyBgcGF1c2UoKWAgd2hpbGVcbiAqICAgYWxyZWFkeSBwYXVzZWQgKG9yIGByZXN1bWUoKWAgd2hpbGUgYWxyZWFkeSByZXN1bWVkKSBpcyBhIG5vLW9wLlxuICogICBUaGlzIHByb3RlY3RzIGFnYWluc3QgZG91YmxlLWNvdW50aW5nIGluIGZ1dHVyZSByZWZhY3RvcnMgdGhhdCBuZXN0XG4gKiAgIHN0ZXAgZXhlY3V0aW9uIG9yIHRha2UgYW4gZWFybHktcmV0dXJuIHBhdGggYmV0d2VlbiBhIGBwYXVzZSgpYCBhbmRcbiAqICAgdGhlIG1hdGNoaW5nIGByZXN1bWUoKWAuXG4gKiAtIGBpc0V4aGF1c3RlZCgpYCBpcyBjaGVja2VkIGF0IGxvb3AgYm91bmRhcmllcyBieSB0aGUgY2FsbGVyIOKAlCB0aGVcbiAqICAgYnVkZ2V0IGl0c2VsZiBkb2VzIG5vdCBhcm0gYW55IHRpbWVycy4gVGhpcyBtZWFucyBhbiBpbi1mbGlnaHRcbiAqICAgcGF0aG9sb2dpY2FsIGBydW5Xb3JrZmxvd2AgY2FsbCAoZS5nLiBhIGh1Z2UgZXZlbnQtbG9nIHJlcGxheSkgY2FuXG4gKiAgIG92ZXJzaG9vdCB0aGUgYnVkZ2V0IGJ5IHVwIHRvIG9uZSBpdGVyYXRpb24ncyB3b3J0aCBvZiB3b3JrIGJlZm9yZVxuICogICB0aGUgbmV4dCBjaGVjayBmaXJlcy4gSW4gcHJhY3RpY2UgdGhlIDIwcyBoZWFkcm9vbSBidWlsdCBpbnRvXG4gKiAgIGBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgIChhbmQgdGhlIGZ1bmN0aW9uIGBtYXhEdXJhdGlvbmAgY2VpbGluZylcbiAqICAgZ2l2ZXMgdXMgc2xhY2s7IHRoZSBvbGQgYHNldFRpbWVvdXRgLWJhc2VkIGFwcHJvYWNoIGFsc28gdWx0aW1hdGVseVxuICogICByZWxpZWQgb24gdGhlIHBsYXRmb3JtIFNJR1RFUk0gYXMgdGhlIGhhcmQgYmFja3N0b3AuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBsYXlCdWRnZXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbWl0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbGFwc2VkTXMgPSAwO1xuICBwcml2YXRlIGludGVydmFsU3RhcnQ6IG51bWJlciB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IobGltaXRNczogbnVtYmVyID0gZ2V0UmVwbGF5VGltZW91dE1zKCkpIHtcbiAgICB0aGlzLmxpbWl0TXMgPSBsaW1pdE1zO1xuICAgIHRoaXMuaW50ZXJ2YWxTdGFydCA9IERhdGUubm93KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyZWQgcmVwbGF5LXRpbWVvdXQgbGltaXQsIGluIG1zLiBVc2VmdWwgZm9yIGxvZyBtZXNzYWdlcy5cbiAgICovXG4gIGdldCBjb25maWd1cmVkTGltaXRNcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxpbWl0TXM7XG4gIH1cblxuICAvKipcbiAgICogVG90YWwgbm9uLXN0ZXAgdGltZSBhY2N1bXVsYXRlZCBzbyBmYXIsIGluIG1zLiBJbmNsdWRlcyB0aGVcbiAgICogY3VycmVudGx5LWFjdGl2ZSBpbnRlcnZhbCBpZiB0aGUgYnVkZ2V0IGlzIG5vdCBwYXVzZWQuXG4gICAqL1xuICBlbGFwc2VkKCk6IG51bWJlciB7XG4gICAgY29uc3Qgb3BlbiA9XG4gICAgICB0aGlzLmludGVydmFsU3RhcnQgPT09IG51bGwgPyAwIDogRGF0ZS5ub3coKSAtIHRoaXMuaW50ZXJ2YWxTdGFydDtcbiAgICByZXR1cm4gdGhpcy5lbGFwc2VkTXMgKyBvcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgY291bnRpbmcgZWxhcHNlZCB0aW1lIHRvd2FyZCB0aGUgYnVkZ2V0LiBJZGVtcG90ZW50IOKAlCBzYWZlIHRvXG4gICAqIGNhbGwgbXVsdGlwbGUgdGltZXMgaW4gYSByb3c7IHN1YnNlcXVlbnQgY2FsbHMgYXJlIG5vLW9wcyB1bnRpbFxuICAgKiBgcmVzdW1lKClgIHJlb3BlbnMgYW4gaW50ZXJ2YWwuXG4gICAqL1xuICBwYXVzZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbFN0YXJ0ID09PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5lbGFwc2VkTXMgKz0gRGF0ZS5ub3coKSAtIHRoaXMuaW50ZXJ2YWxTdGFydDtcbiAgICB0aGlzLmludGVydmFsU3RhcnQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBjb3VudGluZyBlbGFwc2VkIHRpbWUgdG93YXJkIHRoZSBidWRnZXQuIElkZW1wb3RlbnQg4oCUIHNhZmUgdG9cbiAgICogY2FsbCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdzsgc3Vic2VxdWVudCBjYWxscyByZS1hbmNob3IgdGhlXG4gICAqIGludGVydmFsIHN0YXJ0IHRvIGBub3coKWAsIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSBubyB0aW1lIGFjY3J1ZXNcbiAgICogYmV0d2VlbiBiYWNrLXRvLWJhY2sgYHJlc3VtZSgpYCBjYWxscy5cbiAgICovXG4gIHJlc3VtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmludGVydmFsU3RhcnQgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhlIGJ1ZGdldCBoYXMgYmVlbiBleGhhdXN0ZWQgKGBlbGFwc2VkKCkgPj0gbGltaXRNc2ApLlxuICAgKiBDYWxsZXJzIHNob3VsZCBpbnZva2UgYGhhbmRsZUV4aGF1c3RlZCguLi4pYCBhZnRlcndhcmQgYW5kIHJldHVyblxuICAgKiBmcm9tIHRoZSBoYW5kbGVyLlxuICAgKi9cbiAgaXNFeGhhdXN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWxhcHNlZCgpID49IHRoaXMubGltaXRNcztcbiAgfVxufVxuXG4vKipcbiAqIEZhaWwgdGhlIHJ1biAob3IgcmV0cnksIG9uIGVhcmx5IGF0dGVtcHRzKSB3aGVuIHRoZSByZXBsYXkgYnVkZ2V0IGlzXG4gKiBleGhhdXN0ZWQuIFRoZSBoYW5kbGluZyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgV29ybGRcbiAqIHN1cHBvcnRzIGBwcm9jZXNzLmV4aXQoMSlgIGFzIGEgcXVldWUgcmVkZWxpdmVyeSBzaWduYWwgKHNlZVxuICogYFdvcmxkLnByb2Nlc3NFeGl0VHJpZ2dlcnNRdWV1ZVJlZGVsaXZlcnlgKTpcbiAqXG4gKiAtICoqTWFuYWdlZC1wbGF0Zm9ybSBXb3JsZHMqKiAoYHdvcmxkLXZlcmNlbGApOiBvbiBhdHRlbXB0cyA8PVxuICogICBgUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVNgIGV4aXQgdGhlIHByb2Nlc3Mgc28gdGhlIHBsYXRmb3JtIGZhaWxzXG4gKiAgIHRoZSBpbnZvY2F0aW9uIGFuZCB0aGUgcXVldWUgcmVkZWxpdmVyczsgb24gdGhlIG5leHQgYXR0ZW1wdCB3cml0ZVxuICogICBgcnVuX2ZhaWxlZGAgd2l0aCBgUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUYCBhbmQgZXhpdC5cbiAqXG4gKiAtICoqSW4tcHJvY2VzcyBXb3JsZHMqKiAoYHdvcmxkLWxvY2FsYCwgZGV2IHNlcnZlcnMpOiBjYWxsaW5nXG4gKiAgIGBwcm9jZXNzLmV4aXQoKWAgd291bGQgdGVybWluYXRlIHRoZSBob3N0IChlLmcuIGBwbnBtIGRldmApLCBzb1xuICogICBpbnN0ZWFkIGxvZyBhIHdhcm5pbmcsIHdyaXRlIGBydW5fZmFpbGVkYCBiZXN0LWVmZm9ydCwgYW5kIHJldHVybi5cbiAqICAgVGhlIGZyYW1ld29yayBjb21wbGV0ZXMgdGhlIHJlcXVlc3Qgbm9ybWFsbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQoYXJnczoge1xuICBydW5JZDogc3RyaW5nO1xuICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgbGltaXRNczogbnVtYmVyO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHJ1bklkLCB3b3JrZmxvd05hbWUsIHJlcXVlc3RJZCwgYXR0ZW1wdCwgbGltaXRNcyB9ID0gYXJncztcbiAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICBjb25zdCBjYW5FeGl0Rm9yUmVkZWxpdmVyeSA9XG4gICAgd29ybGQucHJvY2Vzc0V4aXRUcmlnZ2Vyc1F1ZXVlUmVkZWxpdmVyeSA9PT0gdHJ1ZTtcblxuICAvLyBXb3JsZHMgd2l0aG91dCBtYW5hZ2VkLXBsYXRmb3JtIHJlZGVsaXZlcnkgKGUuZy4gd29ybGQtbG9jYWwsIGN1c3RvbVxuICAvLyBpbi1wcm9jZXNzIHdvcmxkcykgbXVzdCBub3QgaGF2ZSB1cyBleGl0IHRoZSBwcm9jZXNzIOKAlCB0aGF0IHdvdWxkXG4gIC8vIGtpbGwgdGhlIHVzZXIncyBob3N0IChgcG5wbSBkZXZgLCBDTEksIGV0Yy4pIHdpdGhvdXQgcHJvZHVjaW5nIGFcbiAgLy8gcmV0cnkuIFN1cmZhY2UgdGhlIGZhaWx1cmUgdmlhIHRoZSBldmVudCBsb2cgaWYgd2UgY2FuLCB0aGVuIHJldHVybi5cbiAgaWYgKCFjYW5FeGl0Rm9yUmVkZWxpdmVyeSkge1xuICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgJ1dvcmtmbG93IHJlcGxheSBleGNlZWRlZCB0aW1lb3V0OyBjdXJyZW50IFdvcmxkIGRvZXMgbm90IHN1cHBvcnQgcHJvY2VzcyBleGl0IGZvciByZWRlbGl2ZXJ5IOKAlCBmYWlsaW5nIHRoZSBydW4gYW5kIHJldHVybmluZycsXG4gICAgICB7IHRpbWVvdXRNczogbGltaXRNcywgYXR0ZW1wdCB9XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5JZCk7XG4gICAgICBjb25zdCB0aW1lb3V0RXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZXhjZWVkZWQgbWF4aW11bSBkdXJhdGlvbiAoJHtsaW1pdE1zIC8gMTAwMH1zKWBcbiAgICAgICk7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICBydW5JZCxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgdGltZW91dEVycixcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VULFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydW5Mb2dnZXIud2FybignVW5hYmxlIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCcsIHtcbiAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhdHRlbXB0IDw9IFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTKSB7XG4gICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAnV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIHRpbWVvdXQgYnV0IHdpbGwgYmUgcmUtYXR0ZW1wdGVkIChhdHRlbXB0IDwgbWF4UmV0cmllcyknLFxuICAgICAge1xuICAgICAgICB0aW1lb3V0TXM6IGxpbWl0TXMsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG1heFJldHJpZXM6IFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTLFxuICAgICAgfVxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcmVwbGF5VGltZW91dERlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICB1bmRlZmluZWQsXG4gICAgUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUXG4gICk7XG4gIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAnV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIHRpbWVvdXQgYW5kIG1heCByZXRyaWVzIGV4Y2VlZGVkLiBGYWlsaW5nIHRoZSBydW4nLFxuICAgIHtcbiAgICAgIHRpbWVvdXRNczogbGltaXRNcyxcbiAgICAgIGF0dGVtcHQsXG4gICAgICBtYXhSZXRyaWVzOiBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyxcbiAgICAgIGVycm9yQ29kZTogcmVwbGF5VGltZW91dERlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgIGVycm9yQXR0cmlidXRpb246IHJlcGxheVRpbWVvdXREZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICB9XG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICBjb25zdCB0aW1lb3V0RXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICBgV29ya2Zsb3cgcmVwbGF5IGV4Y2VlZGVkIG1heGltdW0gZHVyYXRpb24gKCR7bGltaXRNcyAvIDEwMDB9cykgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0c2BcbiAgICApO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgdGltZW91dEVycixcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQmVzdCBlZmZvcnQg4oCUIHByb2Nlc3MgZXhpdHMgcmVnYXJkbGVzcy4gU3VyZmFjZSB3aHkgc28gb3BlcmF0b3JzXG4gICAgLy8gY2FuIGRpYWdub3NlIHJlcGVhdCB0aW1lb3V0cyBhZ2FpbnN0IHRoZSBiYWNrZW5kLlxuICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgJ1VuYWJsZSB0byBtYXJrIHJ1biBhcyBmYWlsZWQuIFRoZSBxdWV1ZSB3aWxsIGNvbnRpbnVlIHRvIHJldHJ5JyxcbiAgICAgIHtcbiAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIC8vIE5vdGUgdGhhdCB0aGlzIGFsc28gcHJldmVudHMgdGhlIHJ1bnRpbWUgZnJvbSBhY2tpbmcgdGhlIHF1ZXVlXG4gIC8vIG1lc3NhZ2UsIHNvIHRoZSBxdWV1ZSB3aWxsIGNhbGwgYmFjayBvbmNlLCBhZnRlciB3aGljaCBhIDQxMCB3aWxsXG4gIC8vIGdldCBpdCB0byBleGl0IGVhcmx5LlxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"resume-hook.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-hook.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,IAAI,EAMV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,kBAAkB,CAAC;AAqC7D;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,CAAC,EACV,qBAAqB,CAAC,EAAE,SAAS,GAChC,OAAO,CAAC,IAAI,CAAC,CAoHf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CA0DnB"}
1
+ {"version":3,"file":"resume-hook.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-hook.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,IAAI,EAOV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,kBAAkB,CAAC;AAsC7D;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,CAAC,EACV,qBAAqB,CAAC,EAAE,SAAS,GAChC,OAAO,CAAC,IAAI,CAAC,CAuIf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CA0DnB"}
@@ -1,21 +1,21 @@
1
- import { waitUntil } from '@vercel/functions';
2
1
  import { ERROR_SLUGS, HookNotFoundError, WorkflowRuntimeError, } from '@workflow/errors';
3
- import { isLegacySpecVersion, SPEC_VERSION_CURRENT, SPEC_VERSION_LEGACY, } from '@workflow/world';
2
+ import { isLegacySpecVersion, SPEC_VERSION_CURRENT, SPEC_VERSION_LEGACY, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
4
3
  import { getRunCapabilities } from '../capabilities.js';
5
4
  import { importKey } from '../encryption.js';
5
+ import { runtimeLogger } from '../logger.js';
6
6
  import { dehydrateStepReturnValue, hydrateStepArguments, SerializationFormat, } from '../serialization.js';
7
7
  import { WEBHOOK_RESPONSE_WRITABLE } from '../symbols.js';
8
8
  import * as Attribute from '../telemetry/semantic-conventions.js';
9
- import { getSpanContextForTraceCarrier, trace } from '../telemetry.js';
10
- import { waitedUntil } from '../util.js';
9
+ import { linkToTraceCarrier, trace } from '../telemetry.js';
10
+ import { getWorldLazy } from './get-world-lazy.js';
11
11
  import { getWorkflowQueueName } from './helpers.js';
12
- import { getWorld } from './world.js';
12
+ import { safeWaitUntil, waitedUntil } from './wait-until.js';
13
13
  /**
14
14
  * Internal helper that returns the hook, the associated workflow run,
15
15
  * and the resolved encryption key.
16
16
  */
17
17
  async function getHookByTokenWithKey(token) {
18
- const world = await getWorld();
18
+ const world = await getWorldLazy();
19
19
  const hook = await world.hooks.getByToken(token);
20
20
  const run = await world.runs.get(hook.runId);
21
21
  const rawKey = await world.getEncryptionKeyForRun?.(run);
@@ -68,7 +68,7 @@ export async function getHookByToken(token) {
68
68
  export async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
69
69
  return await waitedUntil(() => {
70
70
  return trace('hook.resume', async (span) => {
71
- const world = await getWorld();
71
+ const world = await getWorldLazy();
72
72
  try {
73
73
  let hook;
74
74
  let workflowRun;
@@ -98,39 +98,55 @@ export async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
98
98
  // Check the target run's capabilities to ensure we encode the
99
99
  // payload in a format the run's deployment can decode. For example,
100
100
  // runs created before encryption support was added cannot decode
101
- // the 'encr' serialization format.
101
+ // the 'encr' serialization format, and runs created before
102
+ // byte-stream framing support cannot decode framed byte streams.
102
103
  const rawVersion = workflowRun.executionContext?.workflowCoreVersion;
103
- const { supportedFormats } = getRunCapabilities(typeof rawVersion === 'string' ? rawVersion : undefined);
104
- if (!supportedFormats.has(SerializationFormat.ENCRYPTED)) {
104
+ const capabilities = getRunCapabilities(typeof rawVersion === 'string' ? rawVersion : undefined);
105
+ if (!capabilities.supportedFormats.has(SerializationFormat.ENCRYPTED)) {
105
106
  encryptionKey = undefined;
106
107
  }
108
+ // Compress the payload only when the target run is marked as
109
+ // possibly containing compressed payloads (specVersion >= 5) AND
110
+ // its deployment can decode the 'gzip' format.
111
+ const compression = (workflowRun.specVersion ?? 0) >= SPEC_VERSION_SUPPORTS_COMPRESSION &&
112
+ capabilities.supportedFormats.has(SerializationFormat.GZIP);
107
113
  // Dehydrate the payload for storage
108
114
  const ops = [];
109
115
  const v1Compat = isLegacySpecVersion(hook.specVersion);
110
- const dehydratedPayload = await dehydrateStepReturnValue(payload, hook.runId, encryptionKey, ops, globalThis, v1Compat);
111
- // NOTE: Workaround instead of injecting catching undefined unhandled rejections in webhook bundle
112
- waitUntil(Promise.all(ops).catch((err) => {
113
- if (err !== undefined)
114
- throw err;
115
- }));
116
+ const dehydratedPayload = await dehydrateStepReturnValue(payload, hook.runId, encryptionKey, ops, globalThis, v1Compat, capabilities.framedByteStreams, compression);
117
+ // These payload-stream ops are flushed in the background; the
118
+ // promise handed to waitUntil must never reject (an unconsumed
119
+ // waitUntil rejection crashes the process as unhandledRejection),
120
+ // so unexpected failures are logged instead.
121
+ // NOTE: rejections with `undefined` are an expected artifact of the
122
+ // webhook bundle and are ignored entirely.
123
+ safeWaitUntil(Promise.all(ops), (err) => {
124
+ if (err === undefined)
125
+ return;
126
+ runtimeLogger.warn('Background flush of hook payload ops failed', {
127
+ workflowRunId: hook.runId,
128
+ hookId: hook.hookId,
129
+ error: err instanceof Error ? err.message : String(err),
130
+ });
131
+ });
116
132
  // Create a hook_received event with the payload
117
133
  await world.events.create(hook.runId, {
118
134
  eventType: 'hook_received',
119
135
  specVersion: SPEC_VERSION_CURRENT,
120
136
  correlationId: hook.hookId,
121
137
  eventData: {
138
+ ...(v1Compat ? {} : { token: hook.token }),
122
139
  payload: dehydratedPayload,
123
140
  },
124
141
  }, { v1Compat });
125
142
  span?.setAttributes({
126
143
  ...Attribute.WorkflowName(workflowRun.workflowName),
127
144
  });
128
- const traceCarrier = workflowRun.executionContext?.traceCarrier;
129
- if (traceCarrier) {
130
- const context = await getSpanContextForTraceCarrier(traceCarrier);
131
- if (context) {
132
- span?.addLink?.({ context });
133
- }
145
+ // Link to the run-origin context from the workflow run's stored
146
+ // trace carrier (skipped when absent or invalid).
147
+ const originLink = await linkToTraceCarrier(workflowRun.executionContext?.traceCarrier);
148
+ if (originLink) {
149
+ span?.addLink?.(originLink);
134
150
  }
135
151
  // Re-trigger the workflow against the deployment ID associated
136
152
  // with the workflow run that the hook belongs to
@@ -239,4 +255,4 @@ export async function resumeWebhook(token, request) {
239
255
  }
240
256
  return response;
241
257
  }
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUNMLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsbUJBQW1CLEdBR3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFrQixTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0Qzs7O0dBR0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsS0FBYTtJQUtoRCxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO0lBQy9CLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsTUFBTSxHQUFH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QUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUM3RCxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsa0NBQWtDLEVBQUUsQ0FDekQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLHlFQUF5RTtRQUN6RSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFL0MsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGtEQUFrRDtRQUNsRCxpQ0FBaUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFO1lBQ3JFLElBQUksRUFBRSxXQUFXLENBQUMseUJBQXlCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdFVudGlsIH0gZnJvbSAnQHZlcmNlbC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtcbiAgRVJST1JfU0xVR1MsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEhvb2ssXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICB0eXBlIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IGdldFJ1bkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL2NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyB0eXBlIENyeXB0b0tleSwgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHdhaXRlZFVudGlsIH0gZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKipcbiAqIEludGVybmFsIGhlbHBlciB0aGF0IHJldHVybnMgdGhlIGhvb2ssIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bixcbiAqIGFuZCB0aGUgcmVzb2x2ZWQgZW5jcnlwdGlvbiBrZXkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuV2l0aEtleSh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx7XG4gIGhvb2s6IEhvb2s7XG4gIHJ1bjogV29ya2Zsb3dSdW47XG4gIGVuY3J5cHRpb25LZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZDtcbn0+IHtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbik7XG4gIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KGhvb2sucnVuSWQpO1xuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2subWV0YWRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaG9vay5tZXRhZGF0YSA9IGF3YWl0IGh5ZHJhdGVTdGVwQXJndW1lbnRzKFxuICAgICAgaG9vay5tZXRhZGF0YSBhcyBhbnksXG4gICAgICBob29rLnJ1bklkLFxuICAgICAgZW5jcnlwdGlvbktleVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgaG9vaywgcnVuLCBlbmNyeXB0aW9uS2V5IH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBob29rIGJ5IHRva2VuIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQgd29ya2Zsb3cgcnVuLFxuICogYW5kIGh5ZHJhdGUgdGhlIGBtZXRhZGF0YWAgcHJvcGVydHkgaWYgaXQgd2FzIHNldCBmcm9tIHdpdGhpblxuICogdGhlIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxIb29rPiB7XG4gIGNvbnN0IHsgaG9vayB9ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuKTtcbiAgcmV0dXJuIGhvb2s7XG59XG5cbi8qKlxuICogUmVzdW1lcyBhIHdvcmtmbG93IHJ1biBieSBzZW5kaW5nIGEgcGF5bG9hZCB0byBhIGhvb2sgaWRlbnRpZmllZCBieSBpdHMgdG9rZW4uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXh0ZXJuYWxseSAoZS5nLiwgZnJvbSBhbiBBUEkgcm91dGUgb3Igc2VydmVyIGFjdGlvbilcbiAqIHRvIHNlbmQgZGF0YSB0byBhIGhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuT3JIb29rIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9vaywgb3IgdGhlIGhvb2sgb2JqZWN0IGl0c2VsZlxuICogQHBhcmFtIHBheWxvYWQgLSBUaGUgZGF0YSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBob29rXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBob29rIGlzIG5vdCBmb3VuZCBvciBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB0aGUgcHJvY2Vzc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lSG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgeyB0b2tlbiwgZGF0YSB9ID0gYXdhaXQgcmVxdWVzdC5qc29uKCk7XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZXN1bWVIb29rKHRva2VuLCBkYXRhKTtcbiAqICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IHJ1bklkOiBob29rLnJ1bklkIH0pO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0hvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVIb29rPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlPzogQ3J5cHRvS2V5XG4pOiBQcm9taXNlPEhvb2s+IHtcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gdHJhY2UoJ2hvb2sucmVzdW1lJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2s7XG4gICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gICAgICAgIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuT3JIb29rKTtcbiAgICAgICAgICBob29rID0gcmVzdWx0Lmhvb2s7XG4gICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUgPz8gcmVzdWx0LmVuY3J5cHRpb25LZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaG9vayA9IHRva2VuT3JIb29rO1xuICAgICAgICAgIHdvcmtmbG93UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gICAgICAgICAgaWYgKGVuY3J5cHRpb25LZXlPdmVycmlkZSkge1xuICAgICAgICAgICAgZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LlxuICAgICAgICBjb25zdCByYXdWZXJzaW9uID0gd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8ud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgICAgICAgY29uc3QgeyBzdXBwb3J0ZWRGb3JtYXRzIH0gPSBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gICAgICAgICAgdHlwZW9mIHJhd1ZlcnNpb24gPT09ICdzdHJpbmcnID8gcmF3VmVyc2lvbiA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKSkge1xuICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oaG9vay5zcGVjVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIHYxQ29tcGF0XG4gICAgICAgICk7XG4gICAgICAgIC8vIE5PVEU6IFdvcmthcm91bmQgaW5zdGVhZCBvZiBpbmplY3RpbmcgY2F0Y2hpbmcgdW5kZWZpbmVkIHVuaGFuZGxlZCByZWplY3Rpb25zIGluIHdlYmhvb2sgYnVuZGxlXG4gICAgICAgIHdhaXRVbnRpbChcbiAgICAgICAgICBQcm9taXNlLmFsbChvcHMpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIHRoZSBwYXlsb2FkXG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IGRlaHlkcmF0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICApO1xuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyO1xuXG4gICAgICAgIGlmICh0cmFjZUNhcnJpZXIpIHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIodHJhY2VDYXJyaWVyKTtcbiAgICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgc3Bhbj8uYWRkTGluaz8uKHsgY29udGV4dCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZS10cmlnZ2VyIHRoZSB3b3JrZmxvdyBhZ2FpbnN0IHRoZSBkZXBsb3ltZW50IElEIGFzc29jaWF0ZWRcbiAgICAgICAgLy8gd2l0aCB0aGUgd29ya2Zsb3cgcnVuIHRoYXQgdGhlIGhvb2sgYmVsb25ncyB0b1xuICAgICAgICBhd2FpdCB3b3JsZC5xdWV1ZShcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkOiBob29rLnJ1bklkLFxuICAgICAgICAgICAgLy8gYXR0YWNoIHRoZSB0cmFjZSBjYXJyaWVyIGZyb20gdGhlIHdvcmtmbG93IHJ1blxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOlxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bi5leGVjdXRpb25Db250ZXh0Py50cmFjZUNhcnJpZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIH0gc2F0aXNmaWVzIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gaG9vaztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKFxuICAgICAgICAgICAgdHlwZW9mIHRva2VuT3JIb29rID09PSAnc3RyaW5nJyA/IHRva2VuT3JIb29rIDogdG9rZW5Pckhvb2sudG9rZW5cbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rRm91bmQoZmFsc2UpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXN1bWVzIGEgd2ViaG9vayBieSBzZW5kaW5nIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0IHwgUmVxdWVzdH1cbiAqIG9iamVjdCB0byBhIGhvb2sgaWRlbnRpZmllZCBieSBpdHMgdG9rZW4uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXh0ZXJuYWxseSAoZS5nLiwgZnJvbSBhbiBBUEkgcm91dGUgb3Igc2VydmVyIGFjdGlvbilcbiAqIHRvIHNlbmQgYSByZXF1ZXN0IHRvIGEgd2ViaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXNwb25zZVxuICogQHRocm93cyBFcnJvciBpZiB0aGUgaG9vayBpcyBub3QgZm91bmQgb3IgaWYgdGhlcmUncyBhbiBlcnJvciBkdXJpbmcgdGhlIHByb2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGltcG9ydCB7IHJlc3VtZVdlYmhvb2sgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gKiAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICogICBjb25zdCB0b2tlbiA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd0b2tlbicpO1xuICpcbiAqICAgaWYgKCF0b2tlbikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ01pc3NpbmcgdG9rZW4nLCB7IHN0YXR1czogNDAwIH0pO1xuICogICB9XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdW1lV2ViaG9vayh0b2tlbiwgcmVxdWVzdCk7XG4gKiAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ1dlYmhvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVXZWJob29rKFxuICB0b2tlbjogc3RyaW5nLFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IHsgaG9vaywgZW5jcnlwdGlvbktleSB9ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuKTtcblxuICAvLyBPbmx5IHdlYmhvb2tzIGNhbiBiZSByZXN1bWVkIHZpYSB0aGUgcHVibGljIGVuZHBvaW50LlxuICAvLyBJZiB0aGUgaG9vayB3YXMgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpIChpc1dlYmhvb2sgIT09IHRydWUpLFxuICAvLyB0aHJvdyB0aGUgc2FtZSBcIm5vdCBmb3VuZFwiIGVycm9yIHRoZSB3b3JsZCB3b3VsZCB0aHJvdyBmb3IgYSBtaXNzaW5nXG4gIC8vIHRva2VuLiBUaGlzIHByZXZlbnRzIGxlYWtpbmcgdGhhdCB0aGUgdG9rZW4gaXMgdmFsaWQuXG4gIGlmIChob29rLmlzV2ViaG9vayA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IodG9rZW4pO1xuICB9XG5cbiAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtPFJlc3BvbnNlPiB8IHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgIGhvb2subWV0YWRhdGEgJiZcbiAgICB0eXBlb2YgaG9vay5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAncmVzcG9uZFdpdGgnIGluIGhvb2subWV0YWRhdGFcbiAgKSB7XG4gICAgaWYgKGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGggPT09ICdtYW51YWwnKSB7XG4gICAgICBjb25zdCB7IHJlYWRhYmxlLCB3cml0YWJsZSB9ID0gbmV3IFRyYW5zZm9ybVN0cmVhbTxSZXNwb25zZSwgUmVzcG9uc2U+KCk7XG4gICAgICByZXNwb25zZVJlYWRhYmxlID0gcmVhZGFibGU7XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGluc3RhbmNlIGluY2x1ZGVzIHRoZSB3cml0YWJsZSBzdHJlYW0gd2hpY2ggd2lsbCBiZSB1c2VkXG4gICAgICAvLyB0byB3cml0ZSB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCBmcm9tIHdpdGhpbiB0aGUgd29ya2Zsb3cgcnVuXG4gICAgICAocmVxdWVzdCBhcyBhbnkpW1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEVdID0gd3JpdGFibGU7XG4gICAgfSBlbHNlIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgIHJlc3BvbnNlID0gaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgSW52YWxpZCBcXGByZXNwb25kV2l0aFxcYCB2YWx1ZTogJHtob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRofWAsXG4gICAgICAgIHsgc2x1ZzogRVJST1JfU0xVR1MuV0VCSE9PS19JTlZBTElEX1JFU1BPTkRfV0lUSF9WQUxVRSB9XG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBObyBgcmVzcG9uZFdpdGhgIHZhbHVlIGltcGxpZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgcmV0dXJuaW5nIGEgMjAyXG4gICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDIwMiB9KTtcbiAgfVxuXG4gIGF3YWl0IHJlc3VtZUhvb2soaG9vaywgcmVxdWVzdCwgZW5jcnlwdGlvbktleSk7XG5cbiAgaWYgKHJlc3BvbnNlUmVhZGFibGUpIHtcbiAgICAvLyBXYWl0IGZvciB0aGUgcmVhZGFibGUgc3RyZWFtIHRvIGVtaXQgb25lIGNodW5rLFxuICAgIC8vIHdoaWNoIGlzIHRoZSBgUmVzcG9uc2VgIG9iamVjdFxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlUmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gICAgY29uc3QgY2h1bmsgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChjaHVuay52YWx1ZSkge1xuICAgICAgcmVzcG9uc2UgPSBjaHVuay52YWx1ZTtcbiAgICB9XG4gICAgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG5cbiAgaWYgKCFyZXNwb25zZSkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV29ya2Zsb3cgcnVuIGRpZCBub3Qgc2VuZCBhIHJlc3BvbnNlJywge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuV0VCSE9PS19SRVNQT05TRV9OT1RfU0VOVCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cbiJdfQ==
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFrQixTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUFDLEtBQWE7SUFLaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUss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Z0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksb0JBQW9CLENBQUMsc0NBQXNDLEVBQUU7WUFDckUsSUFBSSxFQUFFLFdBQVcsQ0FBQyx5QkFBeUI7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFUlJPUl9TTFVHUyxcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIHR5cGUgSG9vayxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBDcnlwdG9LZXksIGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgbGlua1RvVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwsIHdhaXRlZFVudGlsIH0gZnJvbSAnLi93YWl0LXVudGlsLmpzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBoZWxwZXIgdGhhdCByZXR1cm5zIHRoZSBob29rLCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgdGhlIHJlc29sdmVkIGVuY3J5cHRpb24ga2V5LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICBob29rOiBIb29rO1xuICBydW46IFdvcmtmbG93UnVuO1xuICBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG59PiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IGhvb2sgPSBhd2FpdCB3b3JsZC5ob29rcy5nZXRCeVRva2VuKHRva2VuKTtcbiAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vay5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBob29rLm1ldGFkYXRhID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICBob29rLm1ldGFkYXRhIGFzIGFueSxcbiAgICAgIGhvb2sucnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5XG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBob29rLCBydW4sIGVuY3J5cHRpb25LZXkgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGhvb2sgYnkgdG9rZW4gdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgaHlkcmF0ZSB0aGUgYG1ldGFkYXRhYCBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGZyb20gd2l0aGluXG4gKiB0aGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgY29uc3QgeyBob29rIH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuICByZXR1cm4gaG9vaztcbn1cblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Pckhvb2sgLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rLCBvciB0aGUgaG9vayBvYmplY3QgaXRzZWxmXG4gKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBkYXRhIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGhvb2tcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVIb29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB7IHRva2VuLCBkYXRhIH0gPSBhd2FpdCByZXF1ZXN0Lmpzb24oKTtcbiAqXG4gKiAgIHRyeSB7XG4gKiAgICAgY29uc3QgaG9vayA9IGF3YWl0IHJlc3VtZUhvb2sodG9rZW4sIGRhdGEpO1xuICogICAgIHJldHVybiBSZXNwb25zZS5qc29uKHsgcnVuSWQ6IGhvb2sucnVuSWQgfSk7XG4gKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnSG9vayBub3QgZm91bmQnLCB7IHN0YXR1czogNDA0IH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3VtZUhvb2s8VCA9IGFueT4oXG4gIHRva2VuT3JIb29rOiBzdHJpbmcgfCBIb29rLFxuICBwYXlsb2FkOiBULFxuICBlbmNyeXB0aW9uS2V5T3ZlcnJpZGU/OiBDcnlwdG9LZXlcbik6IFByb21pc2U8SG9vaz4ge1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIHJldHVybiB0cmFjZSgnaG9vay5yZXN1bWUnLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2s7XG4gICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gICAgICAgIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuT3JIb29rKTtcbiAgICAgICAgICBob29rID0gcmVzdWx0Lmhvb2s7XG4gICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUgPz8gcmVzdWx0LmVuY3J5cHRpb25LZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaG9vayA9IHRva2VuT3JIb29rO1xuICAgICAgICAgIHdvcmtmbG93UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gICAgICAgICAgaWYgKGVuY3J5cHRpb25LZXlPdmVycmlkZSkge1xuICAgICAgICAgICAgZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LCBhbmQgcnVucyBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAvLyBieXRlLXN0cmVhbSBmcmFtaW5nIHN1cHBvcnQgY2Fubm90IGRlY29kZSBmcmFtZWQgYnl0ZSBzdHJlYW1zLlxuICAgICAgICBjb25zdCByYXdWZXJzaW9uID0gd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8ud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgIHR5cGVvZiByYXdWZXJzaW9uID09PSAnc3RyaW5nJyA/IHJhd1ZlcnNpb24gOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpKSB7XG4gICAgICAgICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXByZXNzIHRoZSBwYXlsb2FkIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IHJ1biBpcyBtYXJrZWQgYXNcbiAgICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkRcbiAgICAgICAgLy8gaXRzIGRlcGxveW1lbnQgY2FuIGRlY29kZSB0aGUgJ2d6aXAnIGZvcm1hdC5cbiAgICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gJiZcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQKTtcblxuICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oaG9vay5zcGVjVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIHYxQ29tcGF0LFxuICAgICAgICAgIGNhcGFiaWxpdGllcy5mcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICApO1xuICAgICAgICAvLyBUaGVzZSBwYXlsb2FkLXN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZVxuICAgICAgICAvLyBwcm9taXNlIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWRcbiAgICAgICAgLy8gd2FpdFVudGlsIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksXG4gICAgICAgIC8vIHNvIHVuZXhwZWN0ZWQgZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgICAvLyBOT1RFOiByZWplY3Rpb25zIHdpdGggYHVuZGVmaW5lZGAgYXJlIGFuIGV4cGVjdGVkIGFydGlmYWN0IG9mIHRoZVxuICAgICAgICAvLyB3ZWJob29rIGJ1bmRsZSBhbmQgYXJlIGlnbm9yZWQgZW50aXJlbHkuXG4gICAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCBmbHVzaCBvZiBob29rIHBheWxvYWQgb3BzIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIHRoZSBwYXlsb2FkXG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIC4uLih2MUNvbXBhdCA/IHt9IDogeyB0b2tlbjogaG9vay50b2tlbiB9KSxcbiAgICAgICAgICAgICAgcGF5bG9hZDogZGVoeWRyYXRlZFBheWxvYWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMaW5rIHRvIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgd29ya2Zsb3cgcnVuJ3Mgc3RvcmVkXG4gICAgICAgIC8vIHRyYWNlIGNhcnJpZXIgKHNraXBwZWQgd2hlbiBhYnNlbnQgb3IgaW52YWxpZCkuXG4gICAgICAgIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gICAgICAgICAgd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5MaW5rKSB7XG4gICAgICAgICAgc3Bhbj8uYWRkTGluaz8uKG9yaWdpbkxpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtdHJpZ2dlciB0aGUgd29ya2Zsb3cgYWdhaW5zdCB0aGUgZGVwbG95bWVudCBJRCBhc3NvY2lhdGVkXG4gICAgICAgIC8vIHdpdGggdGhlIHdvcmtmbG93IHJ1biB0aGF0IHRoZSBob29rIGJlbG9uZ3MgdG9cbiAgICAgICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIC8vIGF0dGFjaCB0aGUgdHJhY2UgY2FycmllciBmcm9tIHRoZSB3b3JrZmxvdyBydW5cbiAgICAgICAgICAgIHRyYWNlQ2FycmllcjpcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2s7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihcbiAgICAgICAgICAgIHR5cGVvZiB0b2tlbk9ySG9vayA9PT0gJ3N0cmluZycgPyB0b2tlbk9ySG9vayA6IHRva2VuT3JIb29rLnRva2VuXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0ZvdW5kKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzdW1lcyBhIHdlYmhvb2sgYnkgc2VuZGluZyBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdCB8IFJlcXVlc3R9XG4gKiBvYmplY3QgdG8gYSBob29rIGlkZW50aWZpZWQgYnkgaXRzIHRva2VuLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV4dGVybmFsbHkgKGUuZy4sIGZyb20gYW4gQVBJIHJvdXRlIG9yIHNlcnZlciBhY3Rpb24pXG4gKiB0byBzZW5kIGEgcmVxdWVzdCB0byBhIHdlYmhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9va1xuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBob29rXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzcG9uc2VcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAqICAgY29uc3QgdG9rZW4gPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndG9rZW4nKTtcbiAqXG4gKiAgIGlmICghdG9rZW4pIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAqICAgfVxuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3VtZVdlYmhvb2sodG9rZW4sIHJlcXVlc3QpO1xuICogICAgIHJldHVybiByZXNwb25zZTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdXZWJob29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lV2ViaG9vayhcbiAgdG9rZW46IHN0cmluZyxcbiAgcmVxdWVzdDogUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfSA9IGF3YWl0IGdldEhvb2tCeVRva2VuV2l0aEtleSh0b2tlbik7XG5cbiAgLy8gT25seSB3ZWJob29rcyBjYW4gYmUgcmVzdW1lZCB2aWEgdGhlIHB1YmxpYyBlbmRwb2ludC5cbiAgLy8gSWYgdGhlIGhvb2sgd2FzIGNyZWF0ZWQgdmlhIGNyZWF0ZUhvb2soKSAoaXNXZWJob29rICE9PSB0cnVlKSxcbiAgLy8gdGhyb3cgdGhlIHNhbWUgXCJub3QgZm91bmRcIiBlcnJvciB0aGUgd29ybGQgd291bGQgdGhyb3cgZm9yIGEgbWlzc2luZ1xuICAvLyB0b2tlbi4gVGhpcyBwcmV2ZW50cyBsZWFraW5nIHRoYXQgdGhlIHRva2VuIGlzIHZhbGlkLlxuICBpZiAoaG9vay5pc1dlYmhvb2sgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKHRva2VuKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTogUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNwb25zZVJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxSZXNwb25zZT4gfCB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBob29rLm1ldGFkYXRhICYmXG4gICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3Jlc3BvbmRXaXRoJyBpbiBob29rLm1ldGFkYXRhXG4gICkge1xuICAgIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoID09PSAnbWFudWFsJykge1xuICAgICAgY29uc3QgeyByZWFkYWJsZSwgd3JpdGFibGUgfSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08UmVzcG9uc2UsIFJlc3BvbnNlPigpO1xuICAgICAgcmVzcG9uc2VSZWFkYWJsZSA9IHJlYWRhYmxlO1xuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBpbnN0YW5jZSBpbmNsdWRlcyB0aGUgd3JpdGFibGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgdXNlZFxuICAgICAgLy8gdG8gd3JpdGUgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IHJ1blxuICAgICAgKHJlcXVlc3QgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHdyaXRhYmxlO1xuICAgIH0gZWxzZSBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZSA9IGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgXFxgcmVzcG9uZFdpdGhcXGAgdmFsdWU6ICR7aG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aH1gLFxuICAgICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUUgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gYHJlc3BvbmRXaXRoYCB2YWx1ZSBpbXBsaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHJldHVybmluZyBhIDIwMlxuICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAyMDIgfSk7XG4gIH1cblxuICBhd2FpdCByZXN1bWVIb29rKGhvb2ssIHJlcXVlc3QsIGVuY3J5cHRpb25LZXkpO1xuXG4gIGlmIChyZXNwb25zZVJlYWRhYmxlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlYWRhYmxlIHN0cmVhbSB0byBlbWl0IG9uZSBjaHVuayxcbiAgICAvLyB3aGljaCBpcyB0aGUgYFJlc3BvbnNlYCBvYmplY3RcbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZVJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsudmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gY2h1bmsudmFsdWU7XG4gICAgfVxuICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dvcmtmbG93IHJ1biBkaWQgbm90IHNlbmQgYSByZXNwb25zZScsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
3
+ * run ID by decoding the embedded ULID time component.
4
+ *
5
+ * Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
6
+ * legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
7
+ * an authoritative timestamp from the run snapshot (`createdAt`) in that case.
8
+ */
9
+ export declare function runIdCreatedAt(runId: string): number | undefined;
10
+ //# sourceMappingURL=run-id-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-id-time.d.ts","sourceRoot":"","sources":["../../src/runtime/run-id-time.ts"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAShE"}
@@ -0,0 +1,31 @@
1
+ import { decodeTime } from 'ulid';
2
+ /**
3
+ * Run IDs are minted client-side in `start()` as `wrun_<ulid>` (see
4
+ * `runtime/start.ts`). A ULID encodes its creation time in its first 48 bits,
5
+ * so the run's creation timestamp is recoverable from the run ID alone —
6
+ * without any server round-trip or run-snapshot load. This is the earliest
7
+ * replay-stable timestamp a delivery has (the run ID arrives in the queue
8
+ * payload), which lets the workflow VM be seeded and clock-initialized before
9
+ * `run_started`.
10
+ */
11
+ const RUN_ID_PREFIX = 'wrun_';
12
+ /**
13
+ * Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
14
+ * run ID by decoding the embedded ULID time component.
15
+ *
16
+ * Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
17
+ * legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
18
+ * an authoritative timestamp from the run snapshot (`createdAt`) in that case.
19
+ */
20
+ export function runIdCreatedAt(runId) {
21
+ const ulidPart = runId.startsWith(RUN_ID_PREFIX)
22
+ ? runId.slice(RUN_ID_PREFIX.length)
23
+ : runId;
24
+ try {
25
+ return decodeTime(ulidPart);
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWlkLXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9ydW4taWQtdGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO0FBRTlCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWE7SUFDMUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVjb2RlVGltZSB9IGZyb20gJ3VsaWQnO1xuXG4vKipcbiAqIFJ1biBJRHMgYXJlIG1pbnRlZCBjbGllbnQtc2lkZSBpbiBgc3RhcnQoKWAgYXMgYHdydW5fPHVsaWQ+YCAoc2VlXG4gKiBgcnVudGltZS9zdGFydC50c2ApLiBBIFVMSUQgZW5jb2RlcyBpdHMgY3JlYXRpb24gdGltZSBpbiBpdHMgZmlyc3QgNDggYml0cyxcbiAqIHNvIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lc3RhbXAgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgcnVuIElEIGFsb25lIOKAlFxuICogd2l0aG91dCBhbnkgc2VydmVyIHJvdW5kLXRyaXAgb3IgcnVuLXNuYXBzaG90IGxvYWQuIFRoaXMgaXMgdGhlIGVhcmxpZXN0XG4gKiByZXBsYXktc3RhYmxlIHRpbWVzdGFtcCBhIGRlbGl2ZXJ5IGhhcyAodGhlIHJ1biBJRCBhcnJpdmVzIGluIHRoZSBxdWV1ZVxuICogcGF5bG9hZCksIHdoaWNoIGxldHMgdGhlIHdvcmtmbG93IFZNIGJlIHNlZWRlZCBhbmQgY2xvY2staW5pdGlhbGl6ZWQgYmVmb3JlXG4gKiBgcnVuX3N0YXJ0ZWRgLlxuICovXG5jb25zdCBSVU5fSURfUFJFRklYID0gJ3dydW5fJztcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcnVuJ3MgY3JlYXRpb24gdGltZXN0YW1wIChlcG9jaCBtaWxsaXNlY29uZHMpIGZyb20gYSBgd3J1bl9gXG4gKiBydW4gSUQgYnkgZGVjb2RpbmcgdGhlIGVtYmVkZGVkIFVMSUQgdGltZSBjb21wb25lbnQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGBydW5JZGAgaXMgbm90IGEgZGVjb2RhYmxlIGB3cnVuXzx1bGlkPmAgKGUuZy4gYVxuICogbGVnYWN5L25vbi1VTElEIGlkLCBvciBhIHRlc3QgZml4dHVyZSBsaWtlIGB3cnVuX3Rlc3RgKTsgY2FsbGVycyBmYWxsIGJhY2sgdG9cbiAqIGFuIGF1dGhvcml0YXRpdmUgdGltZXN0YW1wIGZyb20gdGhlIHJ1biBzbmFwc2hvdCAoYGNyZWF0ZWRBdGApIGluIHRoYXQgY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bklkQ3JlYXRlZEF0KHJ1bklkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB1bGlkUGFydCA9IHJ1bklkLnN0YXJ0c1dpdGgoUlVOX0lEX1BSRUZJWClcbiAgICA/IHJ1bklkLnNsaWNlKFJVTl9JRF9QUkVGSVgubGVuZ3RoKVxuICAgIDogcnVuSWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVRpbWUodWxpZFBhcnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAGnB;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAuB9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAKvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;CAqF7B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAChE;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,GAAG,CAAC,OAAO;;IACtB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;;;;IAIlD,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;gBA4BF,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAiC9D;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAa7B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAKvC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKlC;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAKzC;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAK3C;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CAErC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,GAAG,GAAG,EACjB,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CAAC,CAAC,CAAC;CA6G7B;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3D"}