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

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 (325) 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 +33 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +71 -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 +26 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +109 -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 +149 -0
  22. package/dist/correlation-id.d.ts +109 -0
  23. package/dist/correlation-id.d.ts.map +1 -0
  24. package/dist/correlation-id.js +139 -0
  25. package/dist/create-hook.d.ts +62 -4
  26. package/dist/create-hook.d.ts.map +1 -1
  27. package/dist/create-hook.js +4 -3
  28. package/dist/define-hook.d.ts.map +1 -1
  29. package/dist/define-hook.js +20 -5
  30. package/dist/describe-error.d.ts +70 -0
  31. package/dist/describe-error.d.ts.map +1 -0
  32. package/dist/describe-error.js +189 -0
  33. package/dist/encryption.d.ts +37 -3
  34. package/dist/encryption.d.ts.map +1 -1
  35. package/dist/encryption.js +97 -31
  36. package/dist/events-consumer.d.ts +26 -1
  37. package/dist/events-consumer.d.ts.map +1 -1
  38. package/dist/events-consumer.js +105 -18
  39. package/dist/flushable-stream.d.ts +65 -10
  40. package/dist/flushable-stream.d.ts.map +1 -1
  41. package/dist/flushable-stream.js +131 -18
  42. package/dist/global.d.ts +37 -1
  43. package/dist/global.d.ts.map +1 -1
  44. package/dist/global.js +21 -3
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -1
  48. package/dist/log-format.d.ts +25 -0
  49. package/dist/log-format.d.ts.map +1 -0
  50. package/dist/log-format.js +250 -0
  51. package/dist/logger.d.ts +29 -30
  52. package/dist/logger.d.ts.map +1 -1
  53. package/dist/logger.js +82 -32
  54. package/dist/private.d.ts +178 -9
  55. package/dist/private.d.ts.map +1 -1
  56. package/dist/private.js +273 -9
  57. package/dist/replay-payload-cache.d.ts +68 -0
  58. package/dist/replay-payload-cache.d.ts.map +1 -0
  59. package/dist/replay-payload-cache.js +160 -0
  60. package/dist/runtime/compute-instance.d.ts +12 -0
  61. package/dist/runtime/compute-instance.d.ts.map +1 -0
  62. package/dist/runtime/compute-instance.js +13 -0
  63. package/dist/runtime/constants.d.ts +237 -0
  64. package/dist/runtime/constants.d.ts.map +1 -1
  65. package/dist/runtime/constants.js +405 -15
  66. package/dist/runtime/count-step-started-events.d.ts +52 -0
  67. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  68. package/dist/runtime/count-step-started-events.js +72 -0
  69. package/dist/runtime/deployment-guard.d.ts +99 -0
  70. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  71. package/dist/runtime/deployment-guard.js +154 -0
  72. package/dist/runtime/get-port-lazy.d.ts +25 -0
  73. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  74. package/dist/runtime/get-port-lazy.js +92 -0
  75. package/dist/runtime/get-world-lazy.d.ts +23 -0
  76. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  77. package/dist/runtime/get-world-lazy.js +46 -0
  78. package/dist/runtime/helpers.d.ts +219 -10
  79. package/dist/runtime/helpers.d.ts.map +1 -1
  80. package/dist/runtime/helpers.js +414 -40
  81. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  82. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-assets.generated.js +30 -0
  84. package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
  85. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  86. package/dist/runtime/quickjs-entrypoint.js +1429 -0
  87. package/dist/runtime/quickjs-runtime.d.ts +193 -0
  88. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  89. package/dist/runtime/quickjs-runtime.js +1944 -0
  90. package/dist/runtime/replay-budget.d.ts +98 -0
  91. package/dist/runtime/replay-budget.d.ts.map +1 -0
  92. package/dist/runtime/replay-budget.js +192 -0
  93. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  95. package/dist/runtime/replay-recovery-reporter.js +64 -0
  96. package/dist/runtime/resume-hook.d.ts +27 -4
  97. package/dist/runtime/resume-hook.d.ts.map +1 -1
  98. package/dist/runtime/resume-hook.js +448 -76
  99. package/dist/runtime/run-id-time.d.ts +19 -0
  100. package/dist/runtime/run-id-time.d.ts.map +1 -0
  101. package/dist/runtime/run-id-time.js +42 -0
  102. package/dist/runtime/run.d.ts +8 -2
  103. package/dist/runtime/run.d.ts.map +1 -1
  104. package/dist/runtime/run.js +62 -15
  105. package/dist/runtime/runs.d.ts +54 -3
  106. package/dist/runtime/runs.d.ts.map +1 -1
  107. package/dist/runtime/runs.js +117 -10
  108. package/dist/runtime/start.d.ts +70 -1
  109. package/dist/runtime/start.d.ts.map +1 -1
  110. package/dist/runtime/start.js +312 -54
  111. package/dist/runtime/step-executor.d.ts +177 -0
  112. package/dist/runtime/step-executor.d.ts.map +1 -0
  113. package/dist/runtime/step-executor.js +949 -0
  114. package/dist/runtime/step-latency.d.ts +197 -0
  115. package/dist/runtime/step-latency.d.ts.map +1 -0
  116. package/dist/runtime/step-latency.js +207 -0
  117. package/dist/runtime/step-ownership.d.ts +72 -0
  118. package/dist/runtime/step-ownership.d.ts.map +1 -0
  119. package/dist/runtime/step-ownership.js +114 -0
  120. package/dist/runtime/step-single-flight.d.ts +12 -0
  121. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  122. package/dist/runtime/step-single-flight.js +69 -0
  123. package/dist/runtime/suspension-handler.d.ts +102 -7
  124. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  125. package/dist/runtime/suspension-handler.js +439 -140
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +84 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +105 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +5 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +12 -0
  141. package/dist/runtime/world-init.d.ts +50 -0
  142. package/dist/runtime/world-init.d.ts.map +1 -0
  143. package/dist/runtime/world-init.js +50 -0
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +101 -26
  147. package/dist/runtime.d.ts +17 -12
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3078 -327
  150. package/dist/schemas.d.ts +1 -1
  151. package/dist/schemas.d.ts.map +1 -1
  152. package/dist/schemas.js +1 -1
  153. package/dist/sealed-box.d.ts +167 -0
  154. package/dist/sealed-box.d.ts.map +1 -0
  155. package/dist/sealed-box.js +571 -0
  156. package/dist/serialization/client.d.ts +17 -0
  157. package/dist/serialization/client.d.ts.map +1 -0
  158. package/dist/serialization/client.js +48 -0
  159. package/dist/serialization/codec-devalue-vm.d.ts +9 -0
  160. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  161. package/dist/serialization/codec-devalue-vm.js +137 -0
  162. package/dist/serialization/codec-devalue.d.ts +14 -0
  163. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  164. package/dist/serialization/codec-devalue.js +105 -0
  165. package/dist/serialization/codec.d.ts +125 -0
  166. package/dist/serialization/codec.d.ts.map +1 -0
  167. package/dist/serialization/codec.js +17 -0
  168. package/dist/serialization/compression.d.ts +104 -0
  169. package/dist/serialization/compression.d.ts.map +1 -0
  170. package/dist/serialization/compression.js +260 -0
  171. package/dist/serialization/encryption.d.ts +134 -0
  172. package/dist/serialization/encryption.d.ts.map +1 -0
  173. package/dist/serialization/encryption.js +186 -0
  174. package/dist/serialization/errors.d.ts +34 -0
  175. package/dist/serialization/errors.d.ts.map +1 -0
  176. package/dist/serialization/errors.js +59 -0
  177. package/dist/serialization/format.d.ts +60 -0
  178. package/dist/serialization/format.d.ts.map +1 -0
  179. package/dist/serialization/format.js +97 -0
  180. package/dist/serialization/hardened.d.ts +155 -0
  181. package/dist/serialization/hardened.d.ts.map +1 -0
  182. package/dist/serialization/hardened.js +523 -0
  183. package/dist/serialization/index.d.ts +20 -0
  184. package/dist/serialization/index.d.ts.map +1 -0
  185. package/dist/serialization/index.js +22 -0
  186. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  187. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  188. package/dist/serialization/reducers/class-vm.js +77 -0
  189. package/dist/serialization/reducers/class.d.ts +11 -0
  190. package/dist/serialization/reducers/class.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class.js +73 -0
  192. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  193. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  194. package/dist/serialization/reducers/common-vm.js +579 -0
  195. package/dist/serialization/reducers/common.d.ts +16 -0
  196. package/dist/serialization/reducers/common.d.ts.map +1 -0
  197. package/dist/serialization/reducers/common.js +478 -0
  198. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  199. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  200. package/dist/serialization/reducers/step-function-vm.js +97 -0
  201. package/dist/serialization/reducers/step-function.d.ts +35 -0
  202. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  203. package/dist/serialization/reducers/step-function.js +104 -0
  204. package/dist/serialization/step.d.ts +17 -0
  205. package/dist/serialization/step.d.ts.map +1 -0
  206. package/dist/serialization/step.js +48 -0
  207. package/dist/serialization/types.d.ts +273 -0
  208. package/dist/serialization/types.d.ts.map +1 -0
  209. package/dist/serialization/types.js +35 -0
  210. package/dist/serialization/vm-bundle-entry.d.ts +12 -0
  211. package/dist/serialization/vm-bundle-entry.d.ts.map +1 -0
  212. package/dist/serialization/vm-bundle-entry.js +58 -0
  213. package/dist/serialization/workflow-vm.d.ts +24 -0
  214. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  215. package/dist/serialization/workflow-vm.js +66 -0
  216. package/dist/serialization/workflow.d.ts +29 -0
  217. package/dist/serialization/workflow.d.ts.map +1 -0
  218. package/dist/serialization/workflow.js +54 -0
  219. package/dist/serialization-format.d.ts +60 -4
  220. package/dist/serialization-format.d.ts.map +1 -1
  221. package/dist/serialization-format.js +276 -56
  222. package/dist/serialization.d.ts +374 -221
  223. package/dist/serialization.d.ts.map +1 -1
  224. package/dist/serialization.js +2300 -783
  225. package/dist/set-attributes.d.ts +13 -0
  226. package/dist/set-attributes.d.ts.map +1 -0
  227. package/dist/set-attributes.js +60 -0
  228. package/dist/sleep.d.ts.map +1 -1
  229. package/dist/sleep.js +3 -2
  230. package/dist/source-map.d.ts +25 -0
  231. package/dist/source-map.d.ts.map +1 -1
  232. package/dist/source-map.js +148 -10
  233. package/dist/step/context-storage.d.ts +61 -2
  234. package/dist/step/context-storage.d.ts.map +1 -1
  235. package/dist/step/context-storage.js +7 -5
  236. package/dist/step/get-closure-vars.d.ts.map +1 -1
  237. package/dist/step/get-closure-vars.js +3 -2
  238. package/dist/step/get-step-metadata.d.ts.map +1 -1
  239. package/dist/step/get-step-metadata.js +3 -2
  240. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  241. package/dist/step/get-workflow-metadata.js +3 -2
  242. package/dist/step/writable-stream.d.ts.map +1 -1
  243. package/dist/step/writable-stream.js +71 -7
  244. package/dist/step.d.ts.map +1 -1
  245. package/dist/step.js +226 -30
  246. package/dist/symbols.d.ts +54 -0
  247. package/dist/symbols.d.ts.map +1 -1
  248. package/dist/symbols.js +55 -1
  249. package/dist/telemetry/semantic-conventions.d.ts +242 -2
  250. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  251. package/dist/telemetry/semantic-conventions.js +173 -1
  252. package/dist/telemetry.d.ts +73 -0
  253. package/dist/telemetry.d.ts.map +1 -1
  254. package/dist/telemetry.js +153 -16
  255. package/dist/types.d.ts +6 -0
  256. package/dist/types.d.ts.map +1 -1
  257. package/dist/types.js +23 -1
  258. package/dist/util.d.ts +16 -6
  259. package/dist/util.d.ts.map +1 -1
  260. package/dist/util.js +25 -16
  261. package/dist/version.d.ts +1 -1
  262. package/dist/version.d.ts.map +1 -1
  263. package/dist/version.js +2 -2
  264. package/dist/vm/index.d.ts.map +1 -1
  265. package/dist/vm/index.js +77 -9
  266. package/dist/vm/script-cache.d.ts +28 -0
  267. package/dist/vm/script-cache.d.ts.map +1 -0
  268. package/dist/vm/script-cache.js +140 -0
  269. package/dist/workflow/abort-controller.d.ts +65 -0
  270. package/dist/workflow/abort-controller.d.ts.map +1 -0
  271. package/dist/workflow/abort-controller.js +314 -0
  272. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  273. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  274. package/dist/workflow/attribute-dispatcher.js +48 -0
  275. package/dist/workflow/create-hook.d.ts.map +1 -1
  276. package/dist/workflow/create-hook.js +25 -3
  277. package/dist/workflow/define-hook.d.ts +1 -1
  278. package/dist/workflow/define-hook.d.ts.map +1 -1
  279. package/dist/workflow/define-hook.js +8 -4
  280. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  281. package/dist/workflow/get-workflow-metadata.js +14 -3
  282. package/dist/workflow/hook.d.ts.map +1 -1
  283. package/dist/workflow/hook.js +303 -37
  284. package/dist/workflow/index.d.ts +1 -0
  285. package/dist/workflow/index.d.ts.map +1 -1
  286. package/dist/workflow/index.js +5 -3
  287. package/dist/workflow/set-attributes.d.ts +68 -0
  288. package/dist/workflow/set-attributes.d.ts.map +1 -0
  289. package/dist/workflow/set-attributes.js +60 -0
  290. package/dist/workflow/sleep.d.ts.map +1 -1
  291. package/dist/workflow/sleep.js +58 -9
  292. package/dist/workflow/world-init-stub.d.ts +15 -0
  293. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  294. package/dist/workflow/world-init-stub.js +15 -0
  295. package/dist/workflow.d.ts +69 -3
  296. package/dist/workflow.d.ts.map +1 -1
  297. package/dist/workflow.js +791 -554
  298. package/docs/api-reference/create-hook.mdx +79 -0
  299. package/docs/api-reference/create-webhook.mdx +1 -0
  300. package/docs/api-reference/define-hook.mdx +26 -24
  301. package/docs/api-reference/fatal-error.mdx +29 -7
  302. package/docs/api-reference/fetch.mdx +8 -4
  303. package/docs/api-reference/index.mdx +3 -0
  304. package/docs/api-reference/set-attributes.mdx +61 -0
  305. package/docs/api-reference/sleep.mdx +1 -1
  306. package/docs/foundations/cancellation.mdx +459 -0
  307. package/docs/foundations/errors-and-retries.mdx +7 -3
  308. package/docs/foundations/hooks.mdx +29 -0
  309. package/docs/foundations/idempotency.mdx +243 -11
  310. package/docs/foundations/index.mdx +1 -23
  311. package/docs/foundations/meta.json +3 -1
  312. package/docs/foundations/serialization.mdx +77 -41
  313. package/docs/foundations/starting-workflows.mdx +79 -2
  314. package/docs/foundations/streaming.mdx +14 -23
  315. package/docs/foundations/versioning.mdx +263 -0
  316. package/docs/how-it-works/cancellation.mdx +287 -0
  317. package/docs/how-it-works/code-transform.mdx +21 -17
  318. package/docs/how-it-works/encryption.mdx +5 -5
  319. package/docs/how-it-works/event-sourcing.mdx +6 -6
  320. package/docs/how-it-works/framework-integrations.mdx +96 -337
  321. package/docs/how-it-works/meta.json +2 -1
  322. package/package.json +31 -13
  323. package/dist/runtime/step-handler.d.ts +0 -2
  324. package/dist/runtime/step-handler.d.ts.map +0 -1
  325. package/dist/runtime/step-handler.js +0 -678
@@ -1,5 +1,8 @@
1
+ import { throwNotInWorkflowOrStepContext } from '../context-errors.js';
1
2
  import { createFlushableState, flushablePipe, pollWritableLock, } from '../flushable-stream.js';
2
- import { getExternalReducers, getSerializeStream, WorkflowServerWritableStream, } from '../serialization.js';
3
+ import { bytesToBase64 } from '../sealed-box.js';
4
+ import { getExternalReducers, getSerializeStream, isRunPayloadKeys, WorkflowServerWritableStream, } from '../serialization.js';
5
+ import { STREAM_NAME_SYMBOL, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, STREAM_SERVER_PUBLIC_KEY_SYMBOL, STREAM_SERVER_RUN_ID_SYMBOL, } from '../symbols.js';
3
6
  import { getWorkflowRunStreamId } from '../util.js';
4
7
  import { contextStorage } from './context-storage.js';
5
8
  /**
@@ -15,25 +18,86 @@ import { contextStorage } from './context-storage.js';
15
18
  export function getWritable(options = {}) {
16
19
  const ctx = contextStorage.getStore();
17
20
  if (!ctx) {
18
- throw new Error('`getWritable()` can only be called inside a workflow or step function');
21
+ throwNotInWorkflowOrStepContext('getWritable()', 'https://workflow-sdk.dev/docs/api-reference/workflow/get-writable', getWritable);
19
22
  }
20
23
  const { namespace } = options;
21
24
  const runId = ctx.workflowMetadata.workflowRunId;
22
25
  const name = getWorkflowRunStreamId(runId, namespace);
23
- // Create a transform stream that serializes chunks and pipes to the workflow server
24
- const serialize = getSerializeStream(getExternalReducers(globalThis, ctx.ops, runId, ctx.encryptionKey), ctx.encryptionKey);
26
+ // Cache the writable per (runId, namespace) within the step context.
27
+ //
28
+ // The previous behavior — constructing a fresh TransformStream and
29
+ // background pipe on every call — produced non-deterministic chunk
30
+ // ordering when callers acquired a new writer per write (e.g. a
31
+ // per-chunk loop). Each pipe flushed to the same (runId, name) server
32
+ // stream independently, and on Vercel the 50-100ms HTTP latency
33
+ // turned the race window from microseconds into something prod-visible.
34
+ //
35
+ // Sharing a single TransformStream + pipe across calls makes the
36
+ // unsafe pattern correct: writes go through one serial sink in the
37
+ // order the user wrote them. See
38
+ // https://github.com/vercel/workflow/issues/2058.
39
+ ctx.writables ??= new Map();
40
+ const cache = ctx.writables;
41
+ const cached = cache.get(name);
42
+ if (cached) {
43
+ return cached.writable;
44
+ }
45
+ // Create a transform stream that serializes chunks and pipes to the workflow server.
46
+ // The target run is the workflow run that owns this step, which (per
47
+ // version skew protection) is on this same SDK version, so byte-stream
48
+ // framing is always safe here.
49
+ const serialize = getSerializeStream(
50
+ // In turbo optimistic start the body runs before `run_started` is durable.
51
+ // Thread the run-ready barrier so that a nested ReadableStream written into
52
+ // this writable is piped to its own server stream only after the run
53
+ // exists. Undefined outside turbo / on the await path.
54
+ getExternalReducers(globalThis, ctx.ops, runId, ctx.encryptionKey, true, ctx.runReadyBarrier), ctx.encryptionKey);
25
55
  // Use flushable pipe so the ops promise resolves when the user releases
26
56
  // their writer lock, not only when the stream is explicitly closed.
27
57
  // Without this, Vercel functions hang until the runtime timeout because
28
58
  // .pipeTo() only resolves on stream close.
29
- const serverWritable = new WorkflowServerWritableStream(runId, name);
59
+ // In turbo optimistic start the body runs before `run_started` is durable;
60
+ // pass the run-ready barrier so the first server write orders after the run
61
+ // exists. Undefined outside turbo / on the await path (run already durable).
62
+ const serverWritable = new WorkflowServerWritableStream(runId, name, ctx.runReadyBarrier);
30
63
  const state = createFlushableState();
31
64
  ctx.ops.push(state.promise);
32
65
  flushablePipe(serialize.readable, serverWritable, state).catch(() => {
33
66
  // Errors are handled via state.reject
34
67
  });
35
68
  pollWritableLock(serialize.writable, state);
36
- // Return the writable side of the transform stream
69
+ // Tag the writable with its underlying `(runId, name)` so downstream
70
+ // reducers can recognize that it's already backed by a workflow
71
+ // server stream. Calling `start(child, [args, theWritable])` from
72
+ // the same step uses these tags to emit `{ name, runId }` in the
73
+ // dehydrated descriptor, so the child's reviver can open the
74
+ // writable against the original `(runId, name)` directly — no
75
+ // in-process bridge tied to this step's lifetime.
76
+ Object.defineProperty(serialize.writable, STREAM_NAME_SYMBOL, {
77
+ value: name,
78
+ writable: false,
79
+ });
80
+ Object.defineProperty(serialize.writable, STREAM_SERVER_RUN_ID_SYMBOL, {
81
+ value: runId,
82
+ writable: false,
83
+ });
84
+ if (ctx.workflowDeploymentId) {
85
+ Object.defineProperty(serialize.writable, STREAM_SERVER_DEPLOYMENT_ID_SYMBOL, {
86
+ value: ctx.workflowDeploymentId,
87
+ writable: false,
88
+ });
89
+ }
90
+ // Publish this run's X25519 public key on the handle so that a run this
91
+ // writable is forwarded to can seal frames without looking anything up.
92
+ // The key is already resolved on the step context, so this costs nothing
93
+ // here and saves the receiver a round trip.
94
+ if (isRunPayloadKeys(ctx.encryptionKey)) {
95
+ Object.defineProperty(serialize.writable, STREAM_SERVER_PUBLIC_KEY_SYMBOL, {
96
+ value: bytesToBase64(ctx.encryptionKey.keyPair.publicKey),
97
+ writable: false,
98
+ });
99
+ }
100
+ cache.set(name, { writable: serialize.writable, state });
37
101
  return serialize.writable;
38
102
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGFibGUtc3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvd3JpdGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGdCQUFnQixHQUNqQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLDRCQUE0QixHQUM3QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFhdEQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsVUFBeUMsRUFBRTtJQUUzQyxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUM7SUFDakQsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXRELG9GQUFvRjtJQUNwRixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FDbEMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFDbEUsR0FBRyxDQUFDLGFBQWEsQ0FDbEIsQ0FBQztJQUVGLHdFQUF3RTtJQUN4RSxvRUFBb0U7SUFDcEUsd0VBQXdFO0lBQ3hFLDJDQUEyQztJQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLDRCQUE0QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3JDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1QixhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNsRSxzQ0FBc0M7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTVDLG1EQUFtRDtJQUNuRCxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZUZsdXNoYWJsZVN0YXRlLFxuICBmbHVzaGFibGVQaXBlLFxuICBwb2xsV3JpdGFibGVMb2NrLFxufSBmcm9tICcuLi9mbHVzaGFibGUtc3RyZWFtLmpzJztcbmltcG9ydCB7XG4gIGdldEV4dGVybmFsUmVkdWNlcnMsXG4gIGdldFNlcmlhbGl6ZVN0cmVhbSxcbiAgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4vY29udGV4dC1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3Ige0BsaW5rIGdldFdyaXRhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lc3BhY2UgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBzdHJlYW1zIGFzc29jaWF0ZWRcbiAgICogd2l0aCB0aGUgc2FtZSB3b3JrZmxvdyBydW4uXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgd3JpdGFibGUgc3RyZWFtIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHdvcmtmbG93LlxuICpcbiAqIFRoZSB3cml0YWJsZSBzdHJlYW0gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoaW4gc3RlcCBmdW5jdGlvbnMgdG8gd3JpdGVcbiAqIGRhdGEgdGhhdCBjYW4gYmUgcmVhZCBvdXRzaWRlIHRoZSB3b3JrZmxvdyBieSB1c2luZyB0aGUgcmVhZGFibGUgbWV0aG9kIG9mIGdldFJ1bi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB3cml0YWJsZSBzdHJlYW1cbiAqIEByZXR1cm5zIFRoZSB3cml0YWJsZSBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHdvcmtmbG93IHJ1blxuICogQHRocm93cyBFcnJvciBpZiBjYWxsZWQgb3V0c2lkZSBhIHdvcmtmbG93IG9yIHN0ZXAgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRhYmxlPFcgPSBhbnk+KFxuICBvcHRpb25zOiBXb3JrZmxvd1dyaXRhYmxlU3RyZWFtT3B0aW9ucyA9IHt9XG4pOiBXcml0YWJsZVN0cmVhbTxXPiB7XG4gIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yYWdlLmdldFN0b3JlKCk7XG4gIGlmICghY3R4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2BnZXRXcml0YWJsZSgpYCBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIGEgd29ya2Zsb3cgb3Igc3RlcCBmdW5jdGlvbidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bklkID0gY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZDtcbiAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQocnVuSWQsIG5hbWVzcGFjZSk7XG5cbiAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtIHN0cmVhbSB0aGF0IHNlcmlhbGl6ZXMgY2h1bmtzIGFuZCBwaXBlcyB0byB0aGUgd29ya2Zsb3cgc2VydmVyXG4gIGNvbnN0IHNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZVN0cmVhbShcbiAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKGdsb2JhbFRoaXMsIGN0eC5vcHMsIHJ1bklkLCBjdHguZW5jcnlwdGlvbktleSksXG4gICAgY3R4LmVuY3J5cHRpb25LZXlcbiAgKTtcblxuICAvLyBVc2UgZmx1c2hhYmxlIHBpcGUgc28gdGhlIG9wcyBwcm9taXNlIHJlc29sdmVzIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXNcbiAgLy8gdGhlaXIgd3JpdGVyIGxvY2ssIG5vdCBvbmx5IHdoZW4gdGhlIHN0cmVhbSBpcyBleHBsaWNpdGx5IGNsb3NlZC5cbiAgLy8gV2l0aG91dCB0aGlzLCBWZXJjZWwgZnVuY3Rpb25zIGhhbmcgdW50aWwgdGhlIHJ1bnRpbWUgdGltZW91dCBiZWNhdXNlXG4gIC8vIC5waXBlVG8oKSBvbmx5IHJlc29sdmVzIG9uIHN0cmVhbSBjbG9zZS5cbiAgY29uc3Qgc2VydmVyV3JpdGFibGUgPSBuZXcgV29ya2Zsb3dTZXJ2ZXJXcml0YWJsZVN0cmVhbShydW5JZCwgbmFtZSk7XG4gIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgY3R4Lm9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICB9KTtcblxuICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gIC8vIFJldHVybiB0aGUgd3JpdGFibGUgc2lkZSBvZiB0aGUgdHJhbnNmb3JtIHN0cmVhbVxuICByZXR1cm4gc2VyaWFsaXplLndyaXRhYmxlO1xufVxuIl19
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGFibGUtc3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvd3JpdGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGdCQUFnQixHQUNqQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsNEJBQTRCLEdBQzdCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQ0FBa0MsRUFDbEMsK0JBQStCLEVBQy9CLDJCQUEyQixHQUM1QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUF1QixjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWEzRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixVQUF5QyxFQUFFO0lBRTNDLE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCwrQkFBK0IsQ0FDN0IsZUFBZSxFQUNmLG1FQUFtRSxFQUNuRSxXQUFXLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUM7SUFDakQsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXRELHFFQUFx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QztZQUN6RCxRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXpELE9BQU8sU0FBUyxDQUFDLFFBQTZCLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRocm93Tm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0LWVycm9ycy5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVGbHVzaGFibGVTdGF0ZSxcbiAgZmx1c2hhYmxlUGlwZSxcbiAgcG9sbFdyaXRhYmxlTG9jayxcbn0gZnJvbSAnLi4vZmx1c2hhYmxlLXN0cmVhbS5qcyc7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0IH0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBnZXRFeHRlcm5hbFJlZHVjZXJzLFxuICBnZXRTZXJpYWxpemVTdHJlYW0sXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHtcbiAgU1RSRUFNX05BTUVfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1BVQkxJQ19LRVlfU1lNQk9MLFxuICBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0wsXG59IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHsgdHlwZSBDYWNoZWRXcml0YWJsZSwgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayBnZXRXcml0YWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZXNwYWNlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbXVsdGlwbGUgc3RyZWFtcyBhc3NvY2lhdGVkXG4gICAqIHdpdGggdGhlIHNhbWUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIHdyaXRhYmxlIHN0cmVhbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB3b3JrZmxvdy5cbiAqXG4gKiBUaGUgd3JpdGFibGUgc3RyZWFtIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aGluIHN0ZXAgZnVuY3Rpb25zIHRvIHdyaXRlXG4gKiBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgb3V0c2lkZSB0aGUgd29ya2Zsb3cgYnkgdXNpbmcgdGhlIHJlYWRhYmxlIG1ldGhvZCBvZiBnZXRSdW4uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgd3JpdGFibGUgc3RyZWFtXG4gKiBAcmV0dXJucyBUaGUgd3JpdGFibGUgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB3b3JrZmxvdyBydW5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgY2FsbGVkIG91dHNpZGUgYSB3b3JrZmxvdyBvciBzdGVwIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0YWJsZTxXID0gYW55PihcbiAgb3B0aW9uczogV29ya2Zsb3dXcml0YWJsZVN0cmVhbU9wdGlvbnMgPSB7fVxuKTogV3JpdGFibGVTdHJlYW08Vz4ge1xuICBjb25zdCBjdHggPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93Tm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHQoXG4gICAgICAnZ2V0V3JpdGFibGUoKScsXG4gICAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy9nZXQtd3JpdGFibGUnLFxuICAgICAgZ2V0V3JpdGFibGVcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bklkID0gY3R4LndvcmtmbG93TWV0YWRhdGEud29ya2Zsb3dSdW5JZDtcbiAgY29uc3QgbmFtZSA9IGdldFdvcmtmbG93UnVuU3RyZWFtSWQocnVuSWQsIG5hbWVzcGFjZSk7XG5cbiAgLy8gQ2FjaGUgdGhlIHdyaXRhYmxlIHBlciAocnVuSWQsIG5hbWVzcGFjZSkgd2l0aGluIHRoZSBzdGVwIGNvbnRleHQuXG4gIC8vXG4gIC8vIFRoZSBwcmV2aW91cyBiZWhhdmlvciDigJQgY29uc3RydWN0aW5nIGEgZnJlc2ggVHJhbnNmb3JtU3RyZWFtIGFuZFxuICAvLyBiYWNrZ3JvdW5kIHBpcGUgb24gZXZlcnkgY2FsbCDigJQgcHJvZHVjZWQgbm9uLWRldGVybWluaXN0aWMgY2h1bmtcbiAgLy8gb3JkZXJpbmcgd2hlbiBjYWxsZXJzIGFjcXVpcmVkIGEgbmV3IHdyaXRlciBwZXIgd3JpdGUgKGUuZy4gYVxuICAvLyBwZXItY2h1bmsgbG9vcCkuIEVhY2ggcGlwZSBmbHVzaGVkIHRvIHRoZSBzYW1lIChydW5JZCwgbmFtZSkgc2VydmVyXG4gIC8vIHN0cmVhbSBpbmRlcGVuZGVudGx5LCBhbmQgb24gVmVyY2VsIHRoZSA1MC0xMDBtcyBIVFRQIGxhdGVuY3lcbiAgLy8gdHVybmVkIHRoZSByYWNlIHdpbmRvdyBmcm9tIG1pY3Jvc2Vjb25kcyBpbnRvIHNvbWV0aGluZyBwcm9kLXZpc2libGUuXG4gIC8vXG4gIC8vIFNoYXJpbmcgYSBzaW5nbGUgVHJhbnNmb3JtU3RyZWFtICsgcGlwZSBhY3Jvc3MgY2FsbHMgbWFrZXMgdGhlXG4gIC8vIHVuc2FmZSBwYXR0ZXJuIGNvcnJlY3Q6IHdyaXRlcyBnbyB0aHJvdWdoIG9uZSBzZXJpYWwgc2luayBpbiB0aGVcbiAgLy8gb3JkZXIgdGhlIHVzZXIgd3JvdGUgdGhlbS4gU2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzIwNTguXG4gIGN0eC53cml0YWJsZXMgPz89IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRXcml0YWJsZT4oKTtcbiAgY29uc3QgY2FjaGUgPSBjdHgud3JpdGFibGVzO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobmFtZSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkLndyaXRhYmxlIGFzIFdyaXRhYmxlU3RyZWFtPFc+O1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtIHN0cmVhbSB0aGF0IHNlcmlhbGl6ZXMgY2h1bmtzIGFuZCBwaXBlcyB0byB0aGUgd29ya2Zsb3cgc2VydmVyLlxuICAvLyBUaGUgdGFyZ2V0IHJ1biBpcyB0aGUgd29ya2Zsb3cgcnVuIHRoYXQgb3ducyB0aGlzIHN0ZXAsIHdoaWNoIChwZXJcbiAgLy8gdmVyc2lvbiBza2V3IHByb3RlY3Rpb24pIGlzIG9uIHRoaXMgc2FtZSBTREsgdmVyc2lvbiwgc28gYnl0ZS1zdHJlYW1cbiAgLy8gZnJhbWluZyBpcyBhbHdheXMgc2FmZSBoZXJlLlxuICBjb25zdCBzZXJpYWxpemUgPSBnZXRTZXJpYWxpemVTdHJlYW0oXG4gICAgLy8gSW4gdHVyYm8gb3B0aW1pc3RpYyBzdGFydCB0aGUgYm9keSBydW5zIGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGlzIGR1cmFibGUuXG4gICAgLy8gVGhyZWFkIHRoZSBydW4tcmVhZHkgYmFycmllciBzbyB0aGF0IGEgbmVzdGVkIFJlYWRhYmxlU3RyZWFtIHdyaXR0ZW4gaW50b1xuICAgIC8vIHRoaXMgd3JpdGFibGUgaXMgcGlwZWQgdG8gaXRzIG93biBzZXJ2ZXIgc3RyZWFtIG9ubHkgYWZ0ZXIgdGhlIHJ1blxuICAgIC8vIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgICBnZXRFeHRlcm5hbFJlZHVjZXJzKFxuICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgIGN0eC5vcHMsXG4gICAgICBydW5JZCxcbiAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgdHJ1ZSxcbiAgICAgIGN0eC5ydW5SZWFkeUJhcnJpZXJcbiAgICApLFxuICAgIGN0eC5lbmNyeXB0aW9uS2V5XG4gICk7XG5cbiAgLy8gVXNlIGZsdXNoYWJsZSBwaXBlIHNvIHRoZSBvcHMgcHJvbWlzZSByZXNvbHZlcyB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzXG4gIC8vIHRoZWlyIHdyaXRlciBsb2NrLCBub3Qgb25seSB3aGVuIHRoZSBzdHJlYW0gaXMgZXhwbGljaXRseSBjbG9zZWQuXG4gIC8vIFdpdGhvdXQgdGhpcywgVmVyY2VsIGZ1bmN0aW9ucyBoYW5nIHVudGlsIHRoZSBydW50aW1lIHRpbWVvdXQgYmVjYXVzZVxuICAvLyAucGlwZVRvKCkgb25seSByZXNvbHZlcyBvbiBzdHJlYW0gY2xvc2UuXG4gIC8vIEluIHR1cmJvIG9wdGltaXN0aWMgc3RhcnQgdGhlIGJvZHkgcnVucyBiZWZvcmUgYHJ1bl9zdGFydGVkYCBpcyBkdXJhYmxlO1xuICAvLyBwYXNzIHRoZSBydW4tcmVhZHkgYmFycmllciBzbyB0aGUgZmlyc3Qgc2VydmVyIHdyaXRlIG9yZGVycyBhZnRlciB0aGUgcnVuXG4gIC8vIGV4aXN0cy4gVW5kZWZpbmVkIG91dHNpZGUgdHVyYm8gLyBvbiB0aGUgYXdhaXQgcGF0aCAocnVuIGFscmVhZHkgZHVyYWJsZSkuXG4gIGNvbnN0IHNlcnZlcldyaXRhYmxlID0gbmV3IFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0oXG4gICAgcnVuSWQsXG4gICAgbmFtZSxcbiAgICBjdHgucnVuUmVhZHlCYXJyaWVyXG4gICk7XG4gIGNvbnN0IHN0YXRlID0gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTtcbiAgY3R4Lm9wcy5wdXNoKHN0YXRlLnByb21pc2UpO1xuXG4gIGZsdXNoYWJsZVBpcGUoc2VyaWFsaXplLnJlYWRhYmxlLCBzZXJ2ZXJXcml0YWJsZSwgc3RhdGUpLmNhdGNoKCgpID0+IHtcbiAgICAvLyBFcnJvcnMgYXJlIGhhbmRsZWQgdmlhIHN0YXRlLnJlamVjdFxuICB9KTtcblxuICBwb2xsV3JpdGFibGVMb2NrKHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUpO1xuXG4gIC8vIFRhZyB0aGUgd3JpdGFibGUgd2l0aCBpdHMgdW5kZXJseWluZyBgKHJ1bklkLCBuYW1lKWAgc28gZG93bnN0cmVhbVxuICAvLyByZWR1Y2VycyBjYW4gcmVjb2duaXplIHRoYXQgaXQncyBhbHJlYWR5IGJhY2tlZCBieSBhIHdvcmtmbG93XG4gIC8vIHNlcnZlciBzdHJlYW0uIENhbGxpbmcgYHN0YXJ0KGNoaWxkLCBbYXJncywgdGhlV3JpdGFibGVdKWAgZnJvbVxuICAvLyB0aGUgc2FtZSBzdGVwIHVzZXMgdGhlc2UgdGFncyB0byBlbWl0IGB7IG5hbWUsIHJ1bklkIH1gIGluIHRoZVxuICAvLyBkZWh5ZHJhdGVkIGRlc2NyaXB0b3IsIHNvIHRoZSBjaGlsZCdzIHJldml2ZXIgY2FuIG9wZW4gdGhlXG4gIC8vIHdyaXRhYmxlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGAocnVuSWQsIG5hbWUpYCBkaXJlY3RseSDigJQgbm9cbiAgLy8gaW4tcHJvY2VzcyBicmlkZ2UgdGllZCB0byB0aGlzIHN0ZXAncyBsaWZldGltZS5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX05BTUVfU1lNQk9MLCB7XG4gICAgdmFsdWU6IG5hbWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9SVU5fSURfU1lNQk9MLCB7XG4gICAgdmFsdWU6IHJ1bklkLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIGlmIChjdHgud29ya2Zsb3dEZXBsb3ltZW50SWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICBzZXJpYWxpemUud3JpdGFibGUsXG4gICAgICBTVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURfU1lNQk9MLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogY3R4LndvcmtmbG93RGVwbG95bWVudElkLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvLyBQdWJsaXNoIHRoaXMgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkgb24gdGhlIGhhbmRsZSBzbyB0aGF0IGEgcnVuIHRoaXNcbiAgLy8gd3JpdGFibGUgaXMgZm9yd2FyZGVkIHRvIGNhbiBzZWFsIGZyYW1lcyB3aXRob3V0IGxvb2tpbmcgYW55dGhpbmcgdXAuXG4gIC8vIFRoZSBrZXkgaXMgYWxyZWFkeSByZXNvbHZlZCBvbiB0aGUgc3RlcCBjb250ZXh0LCBzbyB0aGlzIGNvc3RzIG5vdGhpbmdcbiAgLy8gaGVyZSBhbmQgc2F2ZXMgdGhlIHJlY2VpdmVyIGEgcm91bmQgdHJpcC5cbiAgaWYgKGlzUnVuUGF5bG9hZEtleXMoY3R4LmVuY3J5cHRpb25LZXkpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlcmlhbGl6ZS53cml0YWJsZSwgU1RSRUFNX1NFUlZFUl9QVUJMSUNfS0VZX1NZTUJPTCwge1xuICAgICAgdmFsdWU6IGJ5dGVzVG9CYXNlNjQoY3R4LmVuY3J5cHRpb25LZXkua2V5UGFpci5wdWJsaWNLZXkpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgY2FjaGUuc2V0KG5hbWUsIHsgd3JpdGFibGU6IHNlcmlhbGl6ZS53cml0YWJsZSwgc3RhdGUgfSk7XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZS53cml0YWJsZSBhcyBXcml0YWJsZVN0cmVhbTxXPjtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,wBAAgB,aAAa,CAAC,GAAG,EAAE,2BAA2B,IACpC,IAAI,SAAS,YAAY,EAAE,EAAE,MAAM,EACzD,UAAU,MAAM,EAChB,gBAAgB,MAAM,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,YAI1C,OAAO,WACJ,IAAI,KACZ,OAAO,CAAC,MAAM,CAAC,CAgMrB"}
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,wBAAgB,aAAa,CAAC,GAAG,EAAE,2BAA2B,IACpC,IAAI,SAAS,YAAY,EAAE,EAAE,MAAM,EACzD,UAAU,MAAM,EAChB,gBAAgB,MAAM,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,YAI1C,OAAO,WACJ,IAAI,KACZ,OAAO,CAAC,MAAM,CAAC,CAkbrB"}
package/dist/step.js CHANGED
@@ -1,16 +1,17 @@
1
- import { FatalError, WorkflowRuntimeError } from '@workflow/errors';
1
+ import { FatalError, ReplayDivergenceError } from '@workflow/errors';
2
2
  import { withResolvers } from '@workflow/utils';
3
3
  import { EventConsumerResult } from './events-consumer.js';
4
4
  import { WorkflowSuspension } from './global.js';
5
5
  import { stepLogger } from './logger.js';
6
- import { scheduleWhenIdle, } from './private.js';
7
- import { hydrateStepReturnValue } from './serialization.js';
6
+ import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWhenIdle, } from './private.js';
7
+ import { markUseStepClosureFn } from './serialization/hardened.js';
8
+ import { hydrateStepError, hydrateStepReturnValue } from './serialization.js';
8
9
  export function createUseStep(ctx) {
9
10
  return function useStep(stepName, closureVarsFn) {
10
11
  // Use a regular function (not arrow) so we can capture `this` when invoked as a method
11
12
  const stepFunction = function (...args) {
12
13
  const { promise, resolve, reject } = withResolvers();
13
- const correlationId = `step_${ctx.generateUlid()}`;
14
+ const correlationId = `step_${ctx.generateCorrelationId('step')}`;
14
15
  const queueItem = {
15
16
  type: 'step',
16
17
  correlationId,
@@ -39,7 +40,12 @@ export function createUseStep(ctx) {
39
40
  // Crucially, if we got here, then this step Promise does
40
41
  // not resolve so that the user workflow code does not proceed any further.
41
42
  // Notify the workflow handler that this step has not been run / has not completed yet.
43
+ const generation = ctx.suspensionGeneration;
42
44
  scheduleWhenIdle(ctx, () => {
45
+ // A retained session may have resumed past this boundary while
46
+ // the timer was queued; a stale signal must not fire.
47
+ if (generation !== ctx.suspensionGeneration)
48
+ return;
43
49
  ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
44
50
  });
45
51
  return EventConsumerResult.NotConsumed;
@@ -56,6 +62,17 @@ export function createUseStep(ctx) {
56
62
  // We're not interested in this event - the correlationId belongs to a different entity
57
63
  return EventConsumerResult.NotConsumed;
58
64
  }
65
+ const eventStepName = 'eventData' in event &&
66
+ event.eventData &&
67
+ 'stepName' in event.eventData
68
+ ? event.eventData.stepName
69
+ : undefined;
70
+ if (typeof eventStepName === 'string' && eventStepName !== stepName) {
71
+ ctx.promiseQueue = ctx.promiseQueue.then(() => {
72
+ ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: step event ${event.eventType} for ${correlationId} belongs to "${eventStepName}", but the current step consumer is "${stepName}"`, { eventId: event.eventId }));
73
+ });
74
+ return EventConsumerResult.Finished;
75
+ }
59
76
  if (event.eventType === 'step_created') {
60
77
  // Step has been created (registered for execution) - mark as having event
61
78
  // but keep in queue so suspension handler knows to queue execution without
@@ -65,7 +82,7 @@ export function createUseStep(ctx) {
65
82
  // This indicates event log corruption - step_created received
66
83
  // but the step was never invoked in the workflow during replay.
67
84
  ctx.promiseQueue = ctx.promiseQueue.then(() => {
68
- reject(new WorkflowRuntimeError(`Corrupted event log: step ${correlationId} (${stepName}) created but not found in invocation queue`));
85
+ reject(new ReplayDivergenceError(`Replay divergence: step ${correlationId} (${stepName}) created but not found in invocation queue`, { eventId: event.eventId }));
69
86
  });
70
87
  return EventConsumerResult.Finished;
71
88
  }
@@ -74,13 +91,38 @@ export function createUseStep(ctx) {
74
91
  return EventConsumerResult.Consumed;
75
92
  }
76
93
  if (event.eventType === 'step_started') {
77
- // Step was started - don't do anything. The step is left in the invocationQueue which
78
- // will allow it to be re-enqueued. We rely on the queue's idempotency to prevent it from
79
- // actually being over enqueued.
94
+ // Step was started but is not terminal it stays in the
95
+ // invocationQueue so the suspension handler can decide how to
96
+ // dispatch it. Record the inline-ownership state from the event:
97
+ // the LATEST start wins, so a stamped start (inline execution or
98
+ // owner recovery) sets the owner and an unstamped one (a retry
99
+ // attempt driven by a queued step message, or an older runtime)
100
+ // clears it. The dispatch loop uses this to suppress the immediate
101
+ // requeue of a step whose owning invocation may still be running
102
+ // its body (vercel/workflow#2780).
103
+ const queueItem = ctx.invocationsQueue.get(correlationId);
104
+ if (queueItem && queueItem.type === 'step') {
105
+ const ownerMessageId = 'eventData' in event &&
106
+ event.eventData &&
107
+ 'ownerMessageId' in event.eventData &&
108
+ typeof event.eventData.ownerMessageId === 'string'
109
+ ? event.eventData.ownerMessageId
110
+ : undefined;
111
+ queueItem.ownerMessageId = ownerMessageId;
112
+ queueItem.lastStartedAt = +event.createdAt;
113
+ }
80
114
  return EventConsumerResult.Consumed;
81
115
  }
82
116
  if (event.eventType === 'step_retrying') {
83
- // Step is being retried - just consume the event and wait for next step_started
117
+ // Step is being retried consume the event and wait for the next
118
+ // step_started. From here on the step is queue-owned (the delayed
119
+ // retry handoff message, or the replay requeue), so inline
120
+ // ownership is permanently lapsed for this correlation ID.
121
+ const queueItem = ctx.invocationsQueue.get(correlationId);
122
+ if (queueItem && queueItem.type === 'step') {
123
+ queueItem.sawRetrying = true;
124
+ queueItem.ownerMessageId = undefined;
125
+ }
84
126
  return EventConsumerResult.Consumed;
85
127
  }
86
128
  if (event.eventType === 'step_failed') {
@@ -88,21 +130,46 @@ export function createUseStep(ctx) {
88
130
  ctx.invocationsQueue.delete(event.correlationId);
89
131
  // Step failed - chain through promiseQueue to ensure
90
132
  // deterministic ordering of all promise resolutions/rejections.
91
- ctx.promiseQueue = ctx.promiseQueue.then(() => {
92
- const errorData = event.eventData.error;
93
- const isErrorObject = typeof errorData === 'object' && errorData !== null;
94
- const errorMessage = isErrorObject
95
- ? (errorData.message ?? 'Unknown error')
96
- : typeof errorData === 'string'
97
- ? errorData
98
- : 'Unknown error';
99
- const errorStack = (isErrorObject ? errorData.stack : undefined) ??
100
- event.eventData.stack;
101
- const error = new FatalError(errorMessage);
102
- if (errorStack) {
103
- error.stack = errorStack;
133
+ // Hydrate the serialized thrown value from the event log so the
134
+ // original type identity and custom properties are preserved.
135
+ //
136
+ // The rejection is as branch-deciding as a success: it decides
137
+ // whether a `try`/`catch` continuation runs, and therefore which
138
+ // ULIDs the follow-up `useStep` calls draw. So it is ordered by
139
+ // event-log position exactly like `step_completed` below — see there
140
+ // for why the deferral is captured here, at event-consumption time,
141
+ // and awaited off the serial queue.
142
+ const eventIndex = ctx.eventsConsumer.eventIndex;
143
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'step');
144
+ let rejection;
145
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'step');
146
+ ctx.pendingDeliveries++;
147
+ ctx.promiseQueue = ctx.promiseQueue.then(async () => {
148
+ try {
149
+ const prepared = await ctx.replayPayloadCache.prepareEventPayload(event.eventId, 'error', event.eventData.error);
150
+ rejection = await hydrateStepError(event.eventData.error, ctx.runId, ctx.encryptionKey, ctx.globalThis, {}, prepared);
151
+ }
152
+ catch (hydrateErr) {
153
+ // If hydration fails for any reason, fall back to a generic
154
+ // FatalError so the workflow doesn't hang. This should be
155
+ // extremely rare in practice (corrupted event data).
156
+ stepLogger.error('Failed to hydrate step_failed error', {
157
+ correlationId: event.correlationId,
158
+ error: hydrateErr instanceof Error
159
+ ? hydrateErr.message
160
+ : String(hydrateErr),
161
+ });
162
+ rejection = new FatalError(`Failed to hydrate step error: ${hydrateErr instanceof Error
163
+ ? hydrateErr.message
164
+ : String(hydrateErr)}`);
165
+ }
166
+ finally {
167
+ ctx.pendingDeliveries--;
104
168
  }
105
- reject(error);
169
+ void earlierDelivered.then(() => {
170
+ barrier.markDelivered();
171
+ reject(rejection);
172
+ });
106
173
  });
107
174
  return EventConsumerResult.Finished;
108
175
  }
@@ -115,24 +182,86 @@ export function createUseStep(ctx) {
115
182
  // takes variable time, promises resolve in event log order.
116
183
  // Each step's hydration + resolve waits for all prior hydrations
117
184
  // to complete before executing, preserving deterministic ordering.
185
+ //
186
+ // Prepared serialized bytes are shared across replay VMs, but final
187
+ // objects are always revived here inside this ordered queue slot.
188
+ // Only immutable primitive final values bypass revival entirely.
189
+ //
190
+ // Hydration cost is what makes this delivery's timing unstable
191
+ // across replays of one invocation: the first replay pays the full
192
+ // decrypt/decompress/revive, later replays memo-hit a primitive
193
+ // result in `ReplayPayloadCache` and finish in a hop or two. A
194
+ // workflow awaiting this result on one branch and a `sleep()` or
195
+ // hook payload on another would therefore allocate its follow-up
196
+ // step ULIDs in a different order on a warm replay than the
197
+ // invocation that WROTE those `step_created` events did — a
198
+ // permanent `ReplayDivergenceError`. So the result is ordered by
199
+ // event-log position through the delivery-barrier registry (see
200
+ // `ctx.pendingDeliveryBarriers`):
201
+ // - Register a 'step' barrier at this event's index so a
202
+ // LATER-in-log wait/hook delivery is handed over only after it.
203
+ // - Hydrate inside this serial queue slot (keeping async
204
+ // deserialization in event-log order) but only CAPTURE the
205
+ // outcome; then defer behind every EARLIER-in-log wait and hook
206
+ // delivery before resolving, and mark this step delivered.
207
+ //
208
+ // The deferral is captured HERE, while consuming the event, and not
209
+ // inside the queue slot. Two reasons, both load-bearing:
210
+ // - Determinism: the set of earlier deliveries is then a function of
211
+ // log position alone. Captured later it would depend on how much
212
+ // hydration the earlier deliveries had already finished — the very
213
+ // coupling this barrier exists to remove.
214
+ // - Coverage: an earlier delivery whose own hydration slot runs
215
+ // first on this serial queue has usually already resolved (and so
216
+ // deregistered its barrier) by the time a later slot starts. Read
217
+ // at slot start, its barrier would be invisible and this step
218
+ // would not defer at all. Every event in one drain window is
219
+ // consumed before any slot runs, so capturing at consumption time
220
+ // sees all of them.
221
+ //
222
+ // The deferral runs OFF the serial queue: it may wait on an earlier
223
+ // wait/hook delivery whose own resolution is driven by this queue,
224
+ // and blocking a queue slot on that would deadlock the queue (the
225
+ // same constraint sleep.ts and hook.ts document). `pendingDeliveries`
226
+ // is likewise released inside the slot, before the detached defer, so
227
+ // `scheduleWhenIdle` can still reach idle and retire the barriers
228
+ // this deferral may be waiting on.
229
+ const completedEventId = event.eventId;
230
+ const serializedResult = event.eventData.result;
231
+ const eventIndex = ctx.eventsConsumer.eventIndex;
232
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'step');
233
+ let outcome;
234
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'step');
118
235
  ctx.pendingDeliveries++;
119
236
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
120
237
  try {
121
- const hydratedResult = await hydrateStepReturnValue(event.eventData.result, ctx.runId, ctx.encryptionKey, ctx.globalThis);
122
- resolve(hydratedResult);
238
+ const hydratedResult = await ctx.replayPayloadCache.getStepResult(completedEventId, async () => {
239
+ const prepared = await ctx.replayPayloadCache.prepareEventPayload(completedEventId, 'result', serializedResult);
240
+ return await hydrateStepReturnValue(serializedResult, ctx.runId, ctx.encryptionKey, ctx.globalThis, {}, prepared);
241
+ });
242
+ outcome = { ok: true, value: hydratedResult };
123
243
  }
124
244
  catch (error) {
125
- reject(error);
245
+ outcome = { ok: false, error };
126
246
  }
127
247
  finally {
128
248
  ctx.pendingDeliveries--;
129
249
  }
250
+ void earlierDelivered.then(() => {
251
+ barrier.markDelivered();
252
+ if (outcome.ok) {
253
+ resolve(outcome.value);
254
+ }
255
+ else {
256
+ reject(outcome.error);
257
+ }
258
+ });
130
259
  });
131
260
  return EventConsumerResult.Finished;
132
261
  }
133
- // An unexpected event type has been received, this event log looks corrupted. Let's fail immediately.
262
+ // This replay installed a different consumer than the stored event needs.
134
263
  ctx.promiseQueue = ctx.promiseQueue.then(() => {
135
- ctx.onWorkflowError(new WorkflowRuntimeError(`Unexpected event type for step ${correlationId} (name: ${stepName}) "${event.eventType}"`));
264
+ ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: Unexpected event type for step ${correlationId} (name: ${stepName}) "${event.eventType}"`, { eventId: event.eventId }));
136
265
  });
137
266
  return EventConsumerResult.Finished;
138
267
  });
@@ -151,8 +280,14 @@ export function createUseStep(ctx) {
151
280
  enumerable: false,
152
281
  configurable: false,
153
282
  });
154
- // Store the closure variables function for serialization
283
+ // Store the closure variables function for serialization. Mark it so the
284
+ // step-function reducer can tell a function that came through `useStep`
285
+ // apart from one workflow code assigned over the property afterwards —
286
+ // the reducer has to invoke whatever is there, and only the latter is
287
+ // worth reporting. See `markUseStepClosureFn` for the limits of what
288
+ // this proves.
155
289
  if (closureVarsFn) {
290
+ markUseStepClosureFn(closureVarsFn);
156
291
  Object.defineProperty(stepFunction, '__closureVarsFn', {
157
292
  value: closureVarsFn,
158
293
  writable: false,
@@ -160,7 +295,68 @@ export function createUseStep(ctx) {
160
295
  configurable: false,
161
296
  });
162
297
  }
298
+ // Override `.bind` so the bound function preserves the step proxy
299
+ // metadata that `getStepFunctionReducer` relies on for serialization.
300
+ // Without this override, `Function.prototype.bind` would return a new
301
+ // function that doesn't inherit `stepId`, `__closureVarsFn`, or any
302
+ // other own properties of the original proxy — so the StepFunction
303
+ // reducer would refuse to serialize it (it'd look like a plain
304
+ // function), and a `useStep(...).bind(this)` proxy that flowed
305
+ // through workflow serialization would silently break.
306
+ //
307
+ // The override stashes three pieces of state on the bound function so
308
+ // the round trip is faithful:
309
+ // - `stepId` — already set on the original proxy.
310
+ // - `__closureVarsFn` — only when the original proxy had one.
311
+ // - `__boundThis` — the receiver passed to `.bind(thisArg, …)`.
312
+ // Always set (even when `thisArg` is
313
+ // `null`/`undefined`) so the reducer can
314
+ // distinguish "was bound" from "wasn't".
315
+ // - `__boundArgs` — only when the user supplied prefilled
316
+ // arguments (`.bind(thisArg, x, y)`). The
317
+ // SWC plugin only ever emits `.bind(this)`
318
+ // today, so this is rare in practice; we
319
+ // still capture it so the partial args
320
+ // survive serialization rather than
321
+ // silently disappearing on the step side.
322
+ Object.defineProperty(stepFunction, 'bind', {
323
+ value: function (thisArg, ...partialArgs) {
324
+ const bound = Function.prototype.bind.call(this, thisArg, ...partialArgs);
325
+ Object.defineProperty(bound, 'stepId', {
326
+ value: stepName,
327
+ writable: false,
328
+ enumerable: false,
329
+ configurable: false,
330
+ });
331
+ if (closureVarsFn) {
332
+ Object.defineProperty(bound, '__closureVarsFn', {
333
+ value: closureVarsFn,
334
+ writable: false,
335
+ enumerable: false,
336
+ configurable: false,
337
+ });
338
+ }
339
+ Object.defineProperty(bound, '__boundThis', {
340
+ value: thisArg,
341
+ writable: false,
342
+ enumerable: false,
343
+ configurable: false,
344
+ });
345
+ if (partialArgs.length > 0) {
346
+ Object.defineProperty(bound, '__boundArgs', {
347
+ value: partialArgs,
348
+ writable: false,
349
+ enumerable: false,
350
+ configurable: false,
351
+ });
352
+ }
353
+ return bound;
354
+ },
355
+ writable: false,
356
+ enumerable: false,
357
+ configurable: false,
358
+ });
163
359
  return stepFunction;
164
360
  };
165
361
  }
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxnQkFBZ0IsR0FFakIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFnQztJQUM1RCxPQUFPLFNBQVMsT0FBTyxDQUNyQixRQUFnQixFQUNoQixhQUFrRDtRQUVsRCx1RkFBdUY7UUFDdkYsTUFBTSxZQUFZLEdBQUcsVUFFbkIsR0FBRyxJQUFVO1lBRWIsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsYUFBYSxFQUFVLENBQUM7WUFFN0QsTUFBTSxhQUFhLEdBQUcsUUFBUSxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUVuRCxNQUFNLFNBQVMsR0FBNEI7Z0JBQ3pDLElBQUksRUFBRSxNQUFNO2dCQUNaLGFBQWE7Z0JBQ2IsUUFBUTtnQkFDUixJQUFJO2FBQ0wsQ0FBQztZQUVGLHVFQUF1RTtZQUN2RSw4REFBOEQ7WUFDOUQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUMvRCxTQUFTLENBQUMsT0FBTyxHQUFHLElBQW9CLENBQUM7WUFDM0MsQ0FBQztZ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Q0FBQyxDQUFDO1FBRUYscUVBQXFFO1FBQ3JFLCtFQUErRTtRQUMvRSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUMxQyxLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDLENBQUM7UUFFSCwwRUFBMEU7UUFDMUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFO1lBQzVDLEtBQUssRUFBRSxRQUFRO1lBQ2YsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsS0FBSztTQUNwQixDQUFDLENBQUM7UUFFSCx5REFBeUQ7UUFDekQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRTtnQkFDckQsS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixZQUFZLEVBQUUsS0FBSzthQUNwQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZhdGFsRXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB3aXRoUmVzb2x2ZXJzIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IEV2ZW50Q29uc3VtZXJSZXN1bHQgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgeyBzdGVwTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4vc2NoZW1hcy5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZVN0ZXAoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVN0ZXA8QXJncyBleHRlbmRzIFNlcmlhbGl6YWJsZVtdLCBSZXN1bHQ+KFxuICAgIHN0ZXBOYW1lOiBzdHJpbmcsXG4gICAgY2xvc3VyZVZhcnNGbj86ICgpID0+IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZT5cbiAgKSB7XG4gICAgLy8gVXNlIGEgcmVndWxhciBmdW5jdGlvbiAobm90IGFycm93KSBzbyB3ZSBjYW4gY2FwdHVyZSBgdGhpc2Agd2hlbiBpbnZva2VkIGFzIGEgbWV0aG9kXG4gICAgY29uc3Qgc3RlcEZ1bmN0aW9uID0gZnVuY3Rpb24gKFxuICAgICAgdGhpczogdW5rbm93bixcbiAgICAgIC4uLmFyZ3M6IEFyZ3NcbiAgICApOiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSA9IHdpdGhSZXNvbHZlcnM8UmVzdWx0PigpO1xuXG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHN0ZXBfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgICAgY29uc3QgcXVldWVJdGVtOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhcHR1cmUgYHRoaXNgIHZhbHVlIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgaWYgYHRoaXNgIGlzIGRlZmluZWQgYW5kIG5vdCB0aGUgZ2xvYmFsIG9iamVjdFxuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzICE9PSBudWxsICYmIHRoaXMgIT09IGdsb2JhbFRoaXMpIHtcbiAgICAgICAgcXVldWVJdGVtLnRoaXNWYWwgPSB0aGlzIGFzIFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cblxuICAgICAgLy8gSW52b2tlIHRoZSBjbG9zdXJlIHZhcmlhYmxlcyBmdW5jdGlvbiB0byBnZXQgdGhlIGNsb3N1cmUgc2NvcGVcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnNGbj8uKCk7XG4gICAgICBpZiAoY2xvc3VyZVZhcnMpIHtcbiAgICAgICAgcXVldWVJdGVtLmNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnM7XG4gICAgICB9XG5cbiAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCBxdWV1ZUl0ZW0pO1xuXG4gICAgICBzdGVwTG9nZ2VyLmRlYnVnKCdTdGVwIGNvbnN1bWVyIHNldHVwJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZXZlbnRzLCBzbyB0aGlzIHN0ZXAgaGFzIGVpdGhlciBub3QgYmVlbiBydW4gb3IgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAgICAgICAgLy8gQ3J1Y2lhbGx5LCBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGlzIHN0ZXAgUHJvbWlzZSBkb2VzXG4gICAgICAgICAgLy8gbm90IHJlc29sdmUgc28gdGhhdCB0aGUgdXNlciB3b3JrZmxvdyBjb2RlIGRvZXMgbm90IHByb2NlZWQgYW55IGZ1cnRoZXIuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSB3b3JrZmxvdyBoYW5kbGVyIHRoYXQgdGhpcyBzdGVwIGhhcyBub3QgYmVlbiBydW4gLyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAgICAgICAgc2NoZWR1bGVXaGVuSWRsZShjdHgsICgpID0+IHtcbiAgICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ZXBMb2dnZXIuZGVidWcoJ1N0ZXAgY29uc3VtZXIgZXZlbnQgcHJvY2Vzc2luZycsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGFyZ3M6IGFyZ3Muam9pbignLCAnKSxcbiAgICAgICAgICBpbmNvbWluZ0NvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgaXNNYXRjaDogY29ycmVsYXRpb25JZCA9PT0gZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50IC0gdGhlIGNvcnJlbGF0aW9uSWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBlbnRpdHlcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgLy8gU3RlcCBoYXMgYmVlbiBjcmVhdGVkIChyZWdpc3RlcmVkIGZvciBleGVjdXRpb24pIC0gbWFyayBhcyBoYXZpbmcgZXZlbnRcbiAgICAgICAgICAvLyBidXQga2VlcCBpbiBxdWV1ZSBzbyBzdXNwZW5zaW9uIGhhbmRsZXIga25vd3MgdG8gcXVldWUgZXhlY3V0aW9uIHdpdGhvdXRcbiAgICAgICAgICAvLyBjcmVhdGluZyBhIGR1cGxpY2F0ZSBzdGVwX2NyZWF0ZWQgZXZlbnRcbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKCFxdWV1ZUl0ZW0gfHwgcXVldWVJdGVtLnR5cGUgIT09ICdzdGVwJykge1xuICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgZXZlbnQgbG9nIGNvcnJ1cHRpb24gLSBzdGVwX2NyZWF0ZWQgcmVjZWl2ZWRcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgc3RlcCB3YXMgbmV2ZXIgaW52b2tlZCBpbiB0aGUgd29ya2Zsb3cgZHVyaW5nIHJlcGxheS5cbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYENvcnJ1cHRlZCBldmVudCBsb2c6IHN0ZXAgJHtjb3JyZWxhdGlvbklkfSAoJHtzdGVwTmFtZX0pIGNyZWF0ZWQgYnV0IG5vdCBmb3VuZCBpbiBpbnZvY2F0aW9uIHF1ZXVlYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdhaXRpbmcgZm9yIHN0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZC9zdGVwX2ZhaWxlZCBldmVudHNcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gU3RlcCB3YXMgc3RhcnRlZCAtIGRvbid0IGRvIGFueXRoaW5nLiBUaGUgc3RlcCBpcyBsZWZ0IGluIHRoZSBpbnZvY2F0aW9uUXVldWUgd2hpY2hcbiAgICAgICAgICAvLyB3aWxsIGFsbG93IGl0IHRvIGJlIHJlLWVucXVldWVkLiBXZSByZWx5IG9uIHRoZSBxdWV1ZSdzIGlkZW1wb3RlbmN5IHRvIHByZXZlbnQgaXQgZnJvbVxuICAgICAgICAgIC8vIGFjdHVhbGx5IGJlaW5nIG92ZXIgZW5xdWV1ZWQuXG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgICAgICAvLyBTdGVwIGlzIGJlaW5nIHJldHJpZWQgLSBqdXN0IGNvbnN1bWUgdGhlIGV2ZW50IGFuZCB3YWl0IGZvciBuZXh0IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykge1xuICAgICAgICAgIC8vIFRlcm1pbmFsIHN0YXRlIC0gd2UgY2FuIHJlbW92ZSB0aGUgaW52b2NhdGlvblF1ZXVlIGl0ZW1cbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgLy8gU3RlcCBmYWlsZWQgLSBjaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmVcbiAgICAgICAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIG9mIGFsbCBwcm9taXNlIHJlc29sdXRpb25zL3JlamVjdGlvbnMuXG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvckRhdGEgPSBldmVudC5ldmVudERhdGEuZXJyb3I7XG4gICAgICAgICAgICBjb25zdCBpc0Vycm9yT2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIGVycm9yRGF0YSA9PT0gJ29iamVjdCcgJiYgZXJyb3JEYXRhICE9PSBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgID8gKGVycm9yRGF0YS5tZXNzYWdlID8/ICdVbmtub3duIGVycm9yJylcbiAgICAgICAgICAgICAgOiB0eXBlb2YgZXJyb3JEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZXJyb3JEYXRhXG4gICAgICAgICAgICAgICAgOiAnVW5rbm93biBlcnJvcic7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAoaXNFcnJvck9iamVjdCA/IGVycm9yRGF0YS5zdGFjayA6IHVuZGVmaW5lZCkgPz9cbiAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnN0YWNrO1xuXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICBlcnJvci5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIFRlcm1pbmFsIHN0YXRlIC0gd2UgY2FuIHJlbW92ZSB0aGUgaW52b2NhdGlvblF1ZXVlIGl0ZW1cbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG5cbiAgICAgICAgICAvLyBTdGVwIGhhcyBjb21wbGV0ZWQsIHNvIHJlc29sdmUgdGhlIFByb21pc2Ugd2l0aCB0aGUgY2FjaGVkIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGUgaHlkcmF0aW9uIGlzIGFzeW5jIChlLmcuLCBkZWNyeXB0aW9uKSwgc28gd2UgY2hhaW4gaXQgdGhyb3VnaFxuICAgICAgICAgIC8vIGN0eC5wcm9taXNlUXVldWUgdG8gZW5zdXJlIHRoYXQgZXZlbiBpZiBkZXNlcmlhbGl6YXRpb25cbiAgICAgICAgICAvLyB0YWtlcyB2YXJpYWJsZSB0aW1lLCBwcm9taXNlcyByZXNvbHZlIGluIGV2ZW50IGxvZyBvcmRlci5cbiAgICAgICAgICAvLyBFYWNoIHN0ZXAncyBoeWRyYXRpb24gKyByZXNvbHZlIHdhaXRzIGZvciBhbGwgcHJpb3IgaHlkcmF0aW9uc1xuICAgICAgICAgIC8vIHRvIGNvbXBsZXRlIGJlZm9yZSBleGVjdXRpbmcsIHByZXNlcnZpbmcgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZy5cbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkUmVzdWx0ID0gYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucmVzdWx0LFxuICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXNvbHZlKGh5ZHJhdGVkUmVzdWx0IGFzIFJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbiB1bmV4cGVjdGVkIGV2ZW50IHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQsIHRoaXMgZXZlbnQgbG9nIGxvb2tzIGNvcnJ1cHRlZC4gTGV0J3MgZmFpbCBpbW1lZGlhdGVseS5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYFVuZXhwZWN0ZWQgZXZlbnQgdHlwZSBmb3Igc3RlcCAke2NvcnJlbGF0aW9uSWR9IChuYW1lOiAke3N0ZXBOYW1lfSkgXCIke2V2ZW50LmV2ZW50VHlwZX1cImBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB0aGUgXCJuYW1lXCIgcHJvcGVydHkgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgc3RlcCBmdW5jdGlvbiBuYW1lXG4gICAgLy8gRXh0cmFjdCBmdW5jdGlvbiBuYW1lIGZyb20gc3RlcE5hbWUgKGZvcm1hdDogXCJzdGVwLy9maWxlcGF0aC8vZnVuY3Rpb25OYW1lXCIpXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3RlcE5hbWUuc3BsaXQoJy8vJykucG9wKCk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ25hbWUnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb25OYW1lLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSBzdGVwIGZ1bmN0aW9uIGlkZW50aWZpZXIgdG8gdGhlIHN0ZXAgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RlcEZ1bmN0aW9uLCAnc3RlcElkJywge1xuICAgICAgdmFsdWU6IHN0ZXBOYW1lLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gU3RvcmUgdGhlIGNsb3N1cmUgdmFyaWFibGVzIGZ1bmN0aW9uIGZvciBzZXJpYWxpemF0aW9uXG4gICAgaWYgKGNsb3N1cmVWYXJzRm4pIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdGVwRnVuY3Rpb24sICdfX2Nsb3N1cmVWYXJzRm4nLCB7XG4gICAgICAgIHZhbHVlOiBjbG9zdXJlVmFyc0ZuLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ZXBGdW5jdGlvbjtcbiAgfTtcbn1cbiJdfQ==
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUVqQixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RSxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQWdDO0lBQzVELE9BQU8sU0FBUyxPQUFPLENBQ3JCLFFBQWdCLEVBQ2hCLGFBQWtEO1FBRWxELHVGQUF1RjtRQUN2RixNQUFNLFlBQVksR0FBRyxVQUVuQixHQUFHLElBQVU7WUFFYixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxhQUFhLEVBQVUsQ0FBQztZQUU3RCxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBRWxFLE1BQU0sU0FBUyxHQUE0QjtnQkFDekMsSUFBSSxFQUFFLE1BQU07Z0JBQ1osYUFBYTtnQkFDYixRQUFRO2dCQUNSLElBQUk7YUFDTCxDQUFDO1lBRUYsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM5RCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUks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QkFDM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFO3dCQUMxQyxLQUFLLEVBQUUsV0FBVzt3QkFDbEIsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsVUFBVSxFQUFFLEtBQUs7d0JBQ2pCLFlBQVksRUFBRSxLQUFLO3FCQUNwQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFlBQVksRUFBRSxLQUFLO1NBQ3BCLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yLCBSZXBsYXlEaXZlcmdlbmNlRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHN0ZXBMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4vc2NoZW1hcy5qcyc7XG5pbXBvcnQgeyBtYXJrVXNlU3RlcENsb3N1cmVGbiB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9oYXJkZW5lZC5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcEVycm9yLCBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZVN0ZXAoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVN0ZXA8QXJncyBleHRlbmRzIFNlcmlhbGl6YWJsZVtdLCBSZXN1bHQ+KFxuICAgIHN0ZXBOYW1lOiBzdHJpbmcsXG4gICAgY2xvc3VyZVZhcnNGbj86ICgpID0+IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZT5cbiAgKSB7XG4gICAgLy8gVXNlIGEgcmVndWxhciBmdW5jdGlvbiAobm90IGFycm93KSBzbyB3ZSBjYW4gY2FwdHVyZSBgdGhpc2Agd2hlbiBpbnZva2VkIGFzIGEgbWV0aG9kXG4gICAgY29uc3Qgc3RlcEZ1bmN0aW9uID0gZnVuY3Rpb24gKFxuICAgICAgdGhpczogdW5rbm93bixcbiAgICAgIC4uLmFyZ3M6IEFyZ3NcbiAgICApOiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSA9IHdpdGhSZXNvbHZlcnM8UmVzdWx0PigpO1xuXG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHN0ZXBfJHtjdHguZ2VuZXJhdGVDb3JyZWxhdGlvbklkKCdzdGVwJyl9YDtcblxuICAgICAgY29uc3QgcXVldWVJdGVtOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhcHR1cmUgYHRoaXNgIHZhbHVlIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgaWYgYHRoaXNgIGlzIGRlZmluZWQgYW5kIG5vdCB0aGUgZ2xvYmFsIG9iamVjdFxuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzICE9PSBudWxsICYmIHRoaXMgIT09IGdsb2JhbFRoaXMpIHtcbiAgICAgICAgcXVldWVJdGVtLnRoaXNWYWwgPSB0aGlzIGFzIFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cblxuICAgICAgLy8gSW52b2tlIHRoZSBjbG9zdXJlIHZhcmlhYmxlcyBmdW5jdGlvbiB0byBnZXQgdGhlIGNsb3N1cmUgc2NvcGVcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnNGbj8uKCk7XG4gICAgICBpZiAoY2xvc3VyZVZhcnMpIHtcbiAgICAgICAgcXVldWVJdGVtLmNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnM7XG4gICAgICB9XG5cbiAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCBxdWV1ZUl0ZW0pO1xuXG4gICAgICBzdGVwTG9nZ2VyLmRlYnVnKCdTdGVwIGNvbnN1bWVyIHNldHVwJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZXZlbnRzLCBzbyB0aGlzIHN0ZXAgaGFzIGVpdGhlciBub3QgYmVlbiBydW4gb3IgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAgICAgICAgLy8gQ3J1Y2lhbGx5LCBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGlzIHN0ZXAgUHJvbWlzZSBkb2VzXG4gICAgICAgICAgLy8gbm90IHJlc29sdmUgc28gdGhhdCB0aGUgdXNlciB3b3JrZmxvdyBjb2RlIGRvZXMgbm90IHByb2NlZWQgYW55IGZ1cnRoZXIuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSB3b3JrZmxvdyBoYW5kbGVyIHRoYXQgdGhpcyBzdGVwIGhhcyBub3QgYmVlbiBydW4gLyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IGN0eC5zdXNwZW5zaW9uR2VuZXJhdGlvbjtcbiAgICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQSByZXRhaW5lZCBzZXNzaW9uIG1heSBoYXZlIHJlc3VtZWQgcGFzdCB0aGlzIGJvdW5kYXJ5IHdoaWxlXG4gICAgICAgICAgICAvLyB0aGUgdGltZXIgd2FzIHF1ZXVlZDsgYSBzdGFsZSBzaWduYWwgbXVzdCBub3QgZmlyZS5cbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSBjdHguc3VzcGVuc2lvbkdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ZXBMb2dnZXIuZGVidWcoJ1N0ZXAgY29uc3VtZXIgZXZlbnQgcHJvY2Vzc2luZycsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGFyZ3M6IGFyZ3Muam9pbignLCAnKSxcbiAgICAgICAgICBpbmNvbWluZ0NvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgaXNNYXRjaDogY29ycmVsYXRpb25JZCA9PT0gZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50IC0gdGhlIGNvcnJlbGF0aW9uSWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBlbnRpdHlcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50U3RlcE5hbWUgPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmXG4gICAgICAgICAgZXZlbnQuZXZlbnREYXRhICYmXG4gICAgICAgICAgJ3N0ZXBOYW1lJyBpbiBldmVudC5ldmVudERhdGFcbiAgICAgICAgICAgID8gZXZlbnQuZXZlbnREYXRhLnN0ZXBOYW1lXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50U3RlcE5hbWUgPT09ICdzdHJpbmcnICYmIGV2ZW50U3RlcE5hbWUgIT09IHN0ZXBOYW1lKSB7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogc3RlcCBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byBcIiR7ZXZlbnRTdGVwTmFtZX1cIiwgYnV0IHRoZSBjdXJyZW50IHN0ZXAgY29uc3VtZXIgaXMgXCIke3N0ZXBOYW1lfVwiYCxcbiAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpIHtcbiAgICAgICAgICAvLyBTdGVwIGhhcyBiZWVuIGNyZWF0ZWQgKHJlZ2lzdGVyZWQgZm9yIGV4ZWN1dGlvbikgLSBtYXJrIGFzIGhhdmluZyBldmVudFxuICAgICAgICAgIC8vIGJ1dCBrZWVwIGluIHF1ZXVlIHNvIHN1c3BlbnNpb24gaGFuZGxlciBrbm93cyB0byBxdWV1ZSBleGVjdXRpb24gd2l0aG91dFxuICAgICAgICAgIC8vIGNyZWF0aW5nIGEgZHVwbGljYXRlIHN0ZXBfY3JlYXRlZCBldmVudFxuICAgICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlSXRlbSB8fCBxdWV1ZUl0ZW0udHlwZSAhPT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyBldmVudCBsb2cgY29ycnVwdGlvbiAtIHN0ZXBfY3JlYXRlZCByZWNlaXZlZFxuICAgICAgICAgICAgLy8gYnV0IHRoZSBzdGVwIHdhcyBuZXZlciBpbnZva2VkIGluIHRoZSB3b3JrZmxvdyBkdXJpbmcgcmVwbGF5LlxuICAgICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBzdGVwICR7Y29ycmVsYXRpb25JZH0gKCR7c3RlcE5hbWV9KSBjcmVhdGVkIGJ1dCBub3QgZm91bmQgaW4gaW52b2NhdGlvbiBxdWV1ZWAsXG4gICAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdhaXRpbmcgZm9yIHN0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZC9zdGVwX2ZhaWxlZCBldmVudHNcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gU3RlcCB3YXMgc3RhcnRlZCBidXQgaXMgbm90IHRlcm1pbmFsIOKAlCBpdCBzdGF5cyBpbiB0aGVcbiAgICAgICAgICAvLyBpbnZvY2F0aW9uUXVldWUgc28gdGhlIHN1c3BlbnNpb24gaGFuZGxlciBjYW4gZGVjaWRlIGhvdyB0b1xuICAgICAgICAgIC8vIGRpc3BhdGNoIGl0LiBSZWNvcmQgdGhlIGlubGluZS1vd25lcnNoaXAgc3RhdGUgZnJvbSB0aGUgZXZlbnQ6XG4gICAgICAgICAgLy8gdGhlIExBVEVTVCBzdGFydCB3aW5zLCBzbyBhIHN0YW1wZWQgc3RhcnQgKGlubGluZSBleGVjdXRpb24gb3JcbiAgICAgICAgICAvLyBvd25lciByZWNvdmVyeSkgc2V0cyB0aGUgb3duZXIgYW5kIGFuIHVuc3RhbXBlZCBvbmUgKGEgcmV0cnlcbiAgICAgICAgICAvLyBhdHRlbXB0IGRyaXZlbiBieSBhIHF1ZXVlZCBzdGVwIG1lc3NhZ2UsIG9yIGFuIG9sZGVyIHJ1bnRpbWUpXG4gICAgICAgICAgLy8gY2xlYXJzIGl0LiBUaGUgZGlzcGF0Y2ggbG9vcCB1c2VzIHRoaXMgdG8gc3VwcHJlc3MgdGhlIGltbWVkaWF0ZVxuICAgICAgICAgIC8vIHJlcXVldWUgb2YgYSBzdGVwIHdob3NlIG93bmluZyBpbnZvY2F0aW9uIG1heSBzdGlsbCBiZSBydW5uaW5nXG4gICAgICAgICAgLy8gaXRzIGJvZHkgKHZlcmNlbC93b3JrZmxvdyMyNzgwKS5cbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICBjb25zdCBvd25lck1lc3NhZ2VJZCA9XG4gICAgICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmXG4gICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YSAmJlxuICAgICAgICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGV2ZW50LmV2ZW50RGF0YSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZXZlbnQuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBxdWV1ZUl0ZW0ub3duZXJNZXNzYWdlSWQgPSBvd25lck1lc3NhZ2VJZDtcbiAgICAgICAgICAgIHF1ZXVlSXRlbS5sYXN0U3RhcnRlZEF0ID0gK2V2ZW50LmNyZWF0ZWRBdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgICAgICAvLyBTdGVwIGlzIGJlaW5nIHJldHJpZWQg4oCUIGNvbnN1bWUgdGhlIGV2ZW50IGFuZCB3YWl0IGZvciB0aGUgbmV4dFxuICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZC4gRnJvbSBoZXJlIG9uIHRoZSBzdGVwIGlzIHF1ZXVlLW93bmVkICh0aGUgZGVsYXllZFxuICAgICAgICAgIC8vIHJldHJ5IGhhbmRvZmYgbWVzc2FnZSwgb3IgdGhlIHJlcGxheSByZXF1ZXVlKSwgc28gaW5saW5lXG4gICAgICAgICAgLy8gb3duZXJzaGlwIGlzIHBlcm1hbmVudGx5IGxhcHNlZCBmb3IgdGhpcyBjb3JyZWxhdGlvbiBJRC5cbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICBxdWV1ZUl0ZW0uc2F3UmV0cnlpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcXVldWVJdGVtLm93bmVyTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpIHtcbiAgICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHdlIGNhbiByZW1vdmUgdGhlIGludm9jYXRpb25RdWV1ZSBpdGVtXG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIC8vIFN0ZXAgZmFpbGVkIC0gY2hhaW4gdGhyb3VnaCBwcm9taXNlUXVldWUgdG8gZW5zdXJlXG4gICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyBvZiBhbGwgcHJvbWlzZSByZXNvbHV0aW9ucy9yZWplY3Rpb25zLlxuICAgICAgICAgIC8vIEh5ZHJhdGUgdGhlIHNlcmlhbGl6ZWQgdGhyb3duIHZhbHVlIGZyb20gdGhlIGV2ZW50IGxvZyBzbyB0aGVcbiAgICAgICAgICAvLyBvcmlnaW5hbCB0eXBlIGlkZW50aXR5IGFuZCBjdXN0b20gcHJvcGVydGllcyBhcmUgcHJlc2VydmVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBhcyBicmFuY2gtZGVjaWRpbmcgYXMgYSBzdWNjZXNzOiBpdCBkZWNpZGVzXG4gICAgICAgICAgLy8gd2hldGhlciBhIGB0cnlgL2BjYXRjaGAgY29udGludWF0aW9uIHJ1bnMsIGFuZCB0aGVyZWZvcmUgd2hpY2hcbiAgICAgICAgICAvLyBVTElEcyB0aGUgZm9sbG93LXVwIGB1c2VTdGVwYCBjYWxscyBkcmF3LiBTbyBpdCBpcyBvcmRlcmVkIGJ5XG4gICAgICAgICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIGV4YWN0bHkgbGlrZSBgc3RlcF9jb21wbGV0ZWRgIGJlbG93IOKAlCBzZWUgdGhlcmVcbiAgICAgICAgICAvLyBmb3Igd2h5IHRoZSBkZWZlcnJhbCBpcyBjYXB0dXJlZCBoZXJlLCBhdCBldmVudC1jb25zdW1wdGlvbiB0aW1lLFxuICAgICAgICAgIC8vIGFuZCBhd2FpdGVkIG9mZiB0aGUgc2VyaWFsIHF1ZXVlLlxuICAgICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgICBjb25zdCBiYXJyaWVyID0gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoY3R4LCBldmVudEluZGV4LCAnc3RlcCcpO1xuICAgICAgICAgIGxldCByZWplY3Rpb246IHVua25vd247XG4gICAgICAgICAgY29uc3QgZWFybGllckRlbGl2ZXJlZCA9IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICAgJ3N0ZXAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgY3R4LnJlcGxheVBheWxvYWRDYWNoZS5wcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEuZXJyb3JcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVqZWN0aW9uID0gYXdhaXQgaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEuZXJyb3IsXG4gICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHByZXBhcmVkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChoeWRyYXRlRXJyKSB7XG4gICAgICAgICAgICAgIC8vIElmIGh5ZHJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwgZmFsbCBiYWNrIHRvIGEgZ2VuZXJpY1xuICAgICAgICAgICAgICAvLyBGYXRhbEVycm9yIHNvIHRoZSB3b3JrZmxvdyBkb2Vzbid0IGhhbmcuIFRoaXMgc2hvdWxkIGJlXG4gICAgICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGluIHByYWN0aWNlIChjb3JydXB0ZWQgZXZlbnQgZGF0YSkuXG4gICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBoeWRyYXRlIHN0ZXBfZmFpbGVkIGVycm9yJywge1xuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyBoeWRyYXRlRXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoaHlkcmF0ZUVyciksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZWplY3Rpb24gPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGh5ZHJhdGUgc3RlcCBlcnJvcjogJHtcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVFcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICA/IGh5ZHJhdGVFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhoeWRyYXRlRXJyKVxuICAgICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgZWFybGllckRlbGl2ZXJlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgIHJlamVjdChyZWplY3Rpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnKSB7XG4gICAgICAgICAgLy8gVGVybWluYWwgc3RhdGUgLSB3ZSBjYW4gcmVtb3ZlIHRoZSBpbnZvY2F0aW9uUXVldWUgaXRlbVxuICAgICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShldmVudC5jb3JyZWxhdGlvbklkKTtcblxuICAgICAgICAgIC8vIFN0ZXAgaGFzIGNvbXBsZXRlZCwgc28gcmVzb2x2ZSB0aGUgUHJvbWlzZSB3aXRoIHRoZSBjYWNoZWQgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoZSBoeWRyYXRpb24gaXMgYXN5bmMgKGUuZy4sIGRlY3J5cHRpb24pLCBzbyB3ZSBjaGFpbiBpdCB0aHJvdWdoXG4gICAgICAgICAgLy8gY3R4LnByb21pc2VRdWV1ZSB0byBlbnN1cmUgdGhhdCBldmVuIGlmIGRlc2VyaWFsaXphdGlvblxuICAgICAgICAgIC8vIHRha2VzIHZhcmlhYmxlIHRpbWUsIHByb21pc2VzIHJlc29sdmUgaW4gZXZlbnQgbG9nIG9yZGVyLlxuICAgICAgICAgIC8vIEVhY2ggc3RlcCdzIGh5ZHJhdGlvbiArIHJlc29sdmUgd2FpdHMgZm9yIGFsbCBwcmlvciBoeWRyYXRpb25zXG4gICAgICAgICAgLy8gdG8gY29tcGxldGUgYmVmb3JlIGV4ZWN1dGluZywgcHJlc2VydmluZyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gUHJlcGFyZWQgc2VyaWFsaXplZCBieXRlcyBhcmUgc2hhcmVkIGFjcm9zcyByZXBsYXkgVk1zLCBidXQgZmluYWxcbiAgICAgICAgICAvLyBvYmplY3RzIGFyZSBhbHdheXMgcmV2aXZlZCBoZXJlIGluc2lkZSB0aGlzIG9yZGVyZWQgcXVldWUgc2xvdC5cbiAgICAgICAgICAvLyBPbmx5IGltbXV0YWJsZSBwcmltaXRpdmUgZmluYWwgdmFsdWVzIGJ5cGFzcyByZXZpdmFsIGVudGlyZWx5LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSHlkcmF0aW9uIGNvc3QgaXMgd2hhdCBtYWtlcyB0aGlzIGRlbGl2ZXJ5J3MgdGltaW5nIHVuc3RhYmxlXG4gICAgICAgICAgLy8gYWNyb3NzIHJlcGxheXMgb2Ygb25lIGludm9jYXRpb246IHRoZSBmaXJzdCByZXBsYXkgcGF5cyB0aGUgZnVsbFxuICAgICAgICAgIC8vIGRlY3J5cHQvZGVjb21wcmVzcy9yZXZpdmUsIGxhdGVyIHJlcGxheXMgbWVtby1oaXQgYSBwcmltaXRpdmVcbiAgICAgICAgICAvLyByZXN1bHQgaW4gYFJlcGxheVBheWxvYWRDYWNoZWAgYW5kIGZpbmlzaCBpbiBhIGhvcCBvciB0d28uIEFcbiAgICAgICAgICAvLyB3b3JrZmxvdyBhd2FpdGluZyB0aGlzIHJlc3VsdCBvbiBvbmUgYnJhbmNoIGFuZCBhIGBzbGVlcCgpYCBvclxuICAgICAgICAgIC8vIGhvb2sgcGF5bG9hZCBvbiBhbm90aGVyIHdvdWxkIHRoZXJlZm9yZSBhbGxvY2F0ZSBpdHMgZm9sbG93LXVwXG4gICAgICAgICAgLy8gc3RlcCBVTElEcyBpbiBhIGRpZmZlcmVudCBvcmRlciBvbiBhIHdhcm0gcmVwbGF5IHRoYW4gdGhlXG4gICAgICAgICAgLy8gaW52b2NhdGlvbiB0aGF0IFdST1RFIHRob3NlIGBzdGVwX2NyZWF0ZWRgIGV2ZW50cyBkaWQg4oCUIGFcbiAgICAgICAgICAvLyBwZXJtYW5lbnQgYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuIFNvIHRoZSByZXN1bHQgaXMgb3JkZXJlZCBieVxuICAgICAgICAgIC8vIGV2ZW50LWxvZyBwb3NpdGlvbiB0aHJvdWdoIHRoZSBkZWxpdmVyeS1iYXJyaWVyIHJlZ2lzdHJ5IChzZWVcbiAgICAgICAgICAvLyBgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzYCk6XG4gICAgICAgICAgLy8gIC0gUmVnaXN0ZXIgYSAnc3RlcCcgYmFycmllciBhdCB0aGlzIGV2ZW50J3MgaW5kZXggc28gYVxuICAgICAgICAgIC8vICAgIExBVEVSLWluLWxvZyB3YWl0L2hvb2sgZGVsaXZlcnkgaXMgaGFuZGVkIG92ZXIgb25seSBhZnRlciBpdC5cbiAgICAgICAgICAvLyAgLSBIeWRyYXRlIGluc2lkZSB0aGlzIHNlcmlhbCBxdWV1ZSBzbG90IChrZWVwaW5nIGFzeW5jXG4gICAgICAgICAgLy8gICAgZGVzZXJpYWxpemF0aW9uIGluIGV2ZW50LWxvZyBvcmRlcikgYnV0IG9ubHkgQ0FQVFVSRSB0aGVcbiAgICAgICAgICAvLyAgICBvdXRjb21lOyB0aGVuIGRlZmVyIGJlaGluZCBldmVyeSBFQVJMSUVSLWluLWxvZyB3YWl0IGFuZCBob29rXG4gICAgICAgICAgLy8gICAgZGVsaXZlcnkgYmVmb3JlIHJlc29sdmluZywgYW5kIG1hcmsgdGhpcyBzdGVwIGRlbGl2ZXJlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBkZWZlcnJhbCBpcyBjYXB0dXJlZCBIRVJFLCB3aGlsZSBjb25zdW1pbmcgdGhlIGV2ZW50LCBhbmQgbm90XG4gICAgICAgICAgLy8gaW5zaWRlIHRoZSBxdWV1ZSBzbG90LiBUd28gcmVhc29ucywgYm90aCBsb2FkLWJlYXJpbmc6XG4gICAgICAgICAgLy8gIC0gRGV0ZXJtaW5pc206IHRoZSBzZXQgb2YgZWFybGllciBkZWxpdmVyaWVzIGlzIHRoZW4gYSBmdW5jdGlvbiBvZlxuICAgICAgICAgIC8vICAgIGxvZyBwb3NpdGlvbiBhbG9uZS4gQ2FwdHVyZWQgbGF0ZXIgaXQgd291bGQgZGVwZW5kIG9uIGhvdyBtdWNoXG4gICAgICAgICAgLy8gICAgaHlkcmF0aW9uIHRoZSBlYXJsaWVyIGRlbGl2ZXJpZXMgaGFkIGFscmVhZHkgZmluaXNoZWQg4oCUIHRoZSB2ZXJ5XG4gICAgICAgICAgLy8gICAgY291cGxpbmcgdGhpcyBiYXJyaWVyIGV4aXN0cyB0byByZW1vdmUuXG4gICAgICAgICAgLy8gIC0gQ292ZXJhZ2U6IGFuIGVhcmxpZXIgZGVsaXZlcnkgd2hvc2Ugb3duIGh5ZHJhdGlvbiBzbG90IHJ1bnNcbiAgICAgICAgICAvLyAgICBmaXJzdCBvbiB0aGlzIHNlcmlhbCBxdWV1ZSBoYXMgdXN1YWxseSBhbHJlYWR5IHJlc29sdmVkIChhbmQgc29cbiAgICAgICAgICAvLyAgICBkZXJlZ2lzdGVyZWQgaXRzIGJhcnJpZXIpIGJ5IHRoZSB0aW1lIGEgbGF0ZXIgc2xvdCBzdGFydHMuIFJlYWRcbiAgICAgICAgICAvLyAgICBhdCBzbG90IHN0YXJ0LCBpdHMgYmFycmllciB3b3VsZCBiZSBpbnZpc2libGUgYW5kIHRoaXMgc3RlcFxuICAgICAgICAgIC8vICAgIHdvdWxkIG5vdCBkZWZlciBhdCBhbGwuIEV2ZXJ5IGV2ZW50IGluIG9uZSBkcmFpbiB3aW5kb3cgaXNcbiAgICAgICAgICAvLyAgICBjb25zdW1lZCBiZWZvcmUgYW55IHNsb3QgcnVucywgc28gY2FwdHVyaW5nIGF0IGNvbnN1bXB0aW9uIHRpbWVcbiAgICAgICAgICAvLyAgICBzZWVzIGFsbCBvZiB0aGVtLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhlIGRlZmVycmFsIHJ1bnMgT0ZGIHRoZSBzZXJpYWwgcXVldWU6IGl0IG1heSB3YWl0IG9uIGFuIGVhcmxpZXJcbiAgICAgICAgICAvLyB3YWl0L2hvb2sgZGVsaXZlcnkgd2hvc2Ugb3duIHJlc29sdXRpb24gaXMgZHJpdmVuIGJ5IHRoaXMgcXVldWUsXG4gICAgICAgICAgLy8gYW5kIGJsb2NraW5nIGEgcXVldWUgc2xvdCBvbiB0aGF0IHdvdWxkIGRlYWRsb2NrIHRoZSBxdWV1ZSAodGhlXG4gICAgICAgICAgLy8gc2FtZSBjb25zdHJhaW50IHNsZWVwLnRzIGFuZCBob29rLnRzIGRvY3VtZW50KS4gYHBlbmRpbmdEZWxpdmVyaWVzYFxuICAgICAgICAgIC8vIGlzIGxpa2V3aXNlIHJlbGVhc2VkIGluc2lkZSB0aGUgc2xvdCwgYmVmb3JlIHRoZSBkZXRhY2hlZCBkZWZlciwgc29cbiAgICAgICAgICAvLyBgc2NoZWR1bGVXaGVuSWRsZWAgY2FuIHN0aWxsIHJlYWNoIGlkbGUgYW5kIHJldGlyZSB0aGUgYmFycmllcnNcbiAgICAgICAgICAvLyB0aGlzIGRlZmVycmFsIG1heSBiZSB3YWl0aW5nIG9uLlxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZEV2ZW50SWQgPSBldmVudC5ldmVudElkO1xuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRSZXN1bHQgPSBldmVudC5ldmVudERhdGEucmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgICBjb25zdCBiYXJyaWVyID0gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoY3R4LCBldmVudEluZGV4LCAnc3RlcCcpO1xuICAgICAgICAgIGxldCBvdXRjb21lOlxuICAgICAgICAgICAgfCB7IG9rOiB0cnVlOyB2YWx1ZTogUmVzdWx0IH1cbiAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH07XG4gICAgICAgICAgY29uc3QgZWFybGllckRlbGl2ZXJlZCA9IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICAgJ3N0ZXAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkUmVzdWx0ID0gYXdhaXQgY3R4LnJlcGxheVBheWxvYWRDYWNoZS5nZXRTdGVwUmVzdWx0KFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcHJlcGFyZWQgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjdHgucmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0JyxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG91dGNvbWUgPSB7IG9rOiB0cnVlLCB2YWx1ZTogaHlkcmF0ZWRSZXN1bHQgYXMgUmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgZWFybGllckRlbGl2ZXJlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgIGlmIChvdXRjb21lLm9rKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRjb21lLnZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3Qob3V0Y29tZS5lcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyByZXBsYXkgaW5zdGFsbGVkIGEgZGlmZmVyZW50IGNvbnN1bWVyIHRoYW4gdGhlIHN0b3JlZCBldmVudCBuZWVkcy5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciBzdGVwICR7Y29ycmVsYXRpb25JZH0gKG5hbWU6ICR7c3RlcE5hbWV9KSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB0aGUgXCJuYW1lXCIgcHJvcGVydHkgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgc3RlcCBmdW5jdGlvbiBuYW1lXG4gICAgLy8gRXh0cmFjdCBmdW5jdGlvbiBuYW1lIGZyb20gc3RlcE5hbWUgKGZvcm1hdDogXCJzdGVwLy9maWxlcGF0aC8vZnVuY3Rpb25OYW1lXCIpXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3RlcE5hbWUuc3BsaXQoJy8vJykucG9wKCk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ25hbWUnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb25OYW1lLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSBzdGVwIGZ1bmN0aW9uIGlkZW50aWZpZXIgdG8gdGhlIHN0ZXAgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RlcEZ1bmN0aW9uLCAnc3RlcElkJywge1xuICAgICAgdmFsdWU6IHN0ZXBOYW1lLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gU3RvcmUgdGhlIGNsb3N1cmUgdmFyaWFibGVzIGZ1bmN0aW9uIGZvciBzZXJpYWxpemF0aW9uLiBNYXJrIGl0IHNvIHRoZVxuICAgIC8vIHN0ZXAtZnVuY3Rpb24gcmVkdWNlciBjYW4gdGVsbCBhIGZ1bmN0aW9uIHRoYXQgY2FtZSB0aHJvdWdoIGB1c2VTdGVwYFxuICAgIC8vIGFwYXJ0IGZyb20gb25lIHdvcmtmbG93IGNvZGUgYXNzaWduZWQgb3ZlciB0aGUgcHJvcGVydHkgYWZ0ZXJ3YXJkcyDigJRcbiAgICAvLyB0aGUgcmVkdWNlciBoYXMgdG8gaW52b2tlIHdoYXRldmVyIGlzIHRoZXJlLCBhbmQgb25seSB0aGUgbGF0dGVyIGlzXG4gICAgLy8gd29ydGggcmVwb3J0aW5nLiBTZWUgYG1hcmtVc2VTdGVwQ2xvc3VyZUZuYCBmb3IgdGhlIGxpbWl0cyBvZiB3aGF0XG4gICAgLy8gdGhpcyBwcm92ZXMuXG4gICAgaWYgKGNsb3N1cmVWYXJzRm4pIHtcbiAgICAgIG1hcmtVc2VTdGVwQ2xvc3VyZUZuKGNsb3N1cmVWYXJzRm4pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ19fY2xvc3VyZVZhcnNGbicsIHtcbiAgICAgICAgdmFsdWU6IGNsb3N1cmVWYXJzRm4sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPdmVycmlkZSBgLmJpbmRgIHNvIHRoZSBib3VuZCBmdW5jdGlvbiBwcmVzZXJ2ZXMgdGhlIHN0ZXAgcHJveHlcbiAgICAvLyBtZXRhZGF0YSB0aGF0IGBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyYCByZWxpZXMgb24gZm9yIHNlcmlhbGl6YXRpb24uXG4gICAgLy8gV2l0aG91dCB0aGlzIG92ZXJyaWRlLCBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIHdvdWxkIHJldHVybiBhIG5ld1xuICAgIC8vIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCBpbmhlcml0IGBzdGVwSWRgLCBgX19jbG9zdXJlVmFyc0ZuYCwgb3IgYW55XG4gICAgLy8gb3RoZXIgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIHByb3h5IOKAlCBzbyB0aGUgU3RlcEZ1bmN0aW9uXG4gICAgLy8gcmVkdWNlciB3b3VsZCByZWZ1c2UgdG8gc2VyaWFsaXplIGl0IChpdCdkIGxvb2sgbGlrZSBhIHBsYWluXG4gICAgLy8gZnVuY3Rpb24pLCBhbmQgYSBgdXNlU3RlcCguLi4pLmJpbmQodGhpcylgIHByb3h5IHRoYXQgZmxvd2VkXG4gICAgLy8gdGhyb3VnaCB3b3JrZmxvdyBzZXJpYWxpemF0aW9uIHdvdWxkIHNpbGVudGx5IGJyZWFrLlxuICAgIC8vXG4gICAgLy8gVGhlIG92ZXJyaWRlIHN0YXNoZXMgdGhyZWUgcGllY2VzIG9mIHN0YXRlIG9uIHRoZSBib3VuZCBmdW5jdGlvbiBzb1xuICAgIC8vIHRoZSByb3VuZCB0cmlwIGlzIGZhaXRoZnVsOlxuICAgIC8vICAgLSBgc3RlcElkYCAgICAgICAgICAgICDigJQgYWxyZWFkeSBzZXQgb24gdGhlIG9yaWdpbmFsIHByb3h5LlxuICAgIC8vICAgLSBgX19jbG9zdXJlVmFyc0ZuYCAgICDigJQgb25seSB3aGVuIHRoZSBvcmlnaW5hbCBwcm94eSBoYWQgb25lLlxuICAgIC8vICAgLSBgX19ib3VuZFRoaXNgICAgICAgICDigJQgdGhlIHJlY2VpdmVyIHBhc3NlZCB0byBgLmJpbmQodGhpc0FyZywg4oCmKWAuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzIHNldCAoZXZlbiB3aGVuIGB0aGlzQXJnYCBpc1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBudWxsYC9gdW5kZWZpbmVkYCkgc28gdGhlIHJlZHVjZXIgY2FuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluZ3Vpc2ggXCJ3YXMgYm91bmRcIiBmcm9tIFwid2Fzbid0XCIuXG4gICAgLy8gICAtIGBfX2JvdW5kQXJnc2AgICAgICAgIOKAlCBvbmx5IHdoZW4gdGhlIHVzZXIgc3VwcGxpZWQgcHJlZmlsbGVkXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIChgLmJpbmQodGhpc0FyZywgeCwgeSlgKS4gVGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dDIHBsdWdpbiBvbmx5IGV2ZXIgZW1pdHMgYC5iaW5kKHRoaXMpYFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5LCBzbyB0aGlzIGlzIHJhcmUgaW4gcHJhY3RpY2U7IHdlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgY2FwdHVyZSBpdCBzbyB0aGUgcGFydGlhbCBhcmdzXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vydml2ZSBzZXJpYWxpemF0aW9uIHJhdGhlciB0aGFuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50bHkgZGlzYXBwZWFyaW5nIG9uIHRoZSBzdGVwIHNpZGUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ2JpbmQnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKFxuICAgICAgICB0aGlzOiB0eXBlb2Ygc3RlcEZ1bmN0aW9uLFxuICAgICAgICB0aGlzQXJnOiB1bmtub3duLFxuICAgICAgICAuLi5wYXJ0aWFsQXJnczogdW5rbm93bltdXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYm91bmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpc0FyZyxcbiAgICAgICAgICAuLi5wYXJ0aWFsQXJnc1xuICAgICAgICApO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYm91bmQsICdzdGVwSWQnLCB7XG4gICAgICAgICAgdmFsdWU6IHN0ZXBOYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNsb3N1cmVWYXJzRm4pIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYm91bmQsICdfX2Nsb3N1cmVWYXJzRm4nLCB7XG4gICAgICAgICAgICB2YWx1ZTogY2xvc3VyZVZhcnNGbixcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYm91bmQsICdfX2JvdW5kVGhpcycsIHtcbiAgICAgICAgICB2YWx1ZTogdGhpc0FyZyxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXJ0aWFsQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJvdW5kLCAnX19ib3VuZEFyZ3MnLCB7XG4gICAgICAgICAgICB2YWx1ZTogcGFydGlhbEFyZ3MsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJvdW5kO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGVwRnVuY3Rpb247XG4gIH07XG59XG4iXX0=