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

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 (220) hide show
  1. package/dist/capabilities.d.ts +4 -4
  2. package/dist/capabilities.js +5 -5
  3. package/dist/capture-stack.d.ts +1 -1
  4. package/dist/capture-stack.js +2 -2
  5. package/dist/class-serialization.d.ts +8 -8
  6. package/dist/class-serialization.js +9 -9
  7. package/dist/classify-error.js +5 -5
  8. package/dist/context-violation-error.d.ts +5 -5
  9. package/dist/context-violation-error.d.ts.map +1 -1
  10. package/dist/context-violation-error.js +5 -5
  11. package/dist/create-hook.d.ts +10 -6
  12. package/dist/create-hook.d.ts.map +1 -1
  13. package/dist/create-hook.js +1 -1
  14. package/dist/define-hook.js +2 -2
  15. package/dist/describe-error.d.ts +7 -7
  16. package/dist/describe-error.js +8 -8
  17. package/dist/encryption.d.ts +5 -5
  18. package/dist/encryption.js +7 -7
  19. package/dist/events-consumer.d.ts +19 -7
  20. package/dist/events-consumer.d.ts.map +1 -1
  21. package/dist/events-consumer.js +33 -12
  22. package/dist/flushable-stream.d.ts +4 -4
  23. package/dist/flushable-stream.js +12 -12
  24. package/dist/global.d.ts +1 -1
  25. package/dist/global.js +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/log-format.d.ts +2 -2
  29. package/dist/log-format.js +5 -5
  30. package/dist/logger.js +4 -4
  31. package/dist/private.d.ts +39 -64
  32. package/dist/private.d.ts.map +1 -1
  33. package/dist/private.js +294 -48
  34. package/dist/replay-payload-cache.d.ts +1 -1
  35. package/dist/replay-payload-cache.js +4 -4
  36. package/dist/runtime/compute-instance.d.ts +4 -3
  37. package/dist/runtime/compute-instance.d.ts.map +1 -1
  38. package/dist/runtime/compute-instance.js +5 -4
  39. package/dist/runtime/constants.d.ts +46 -19
  40. package/dist/runtime/constants.d.ts.map +1 -1
  41. package/dist/runtime/constants.js +76 -38
  42. package/dist/runtime/count-step-started-events.d.ts +7 -7
  43. package/dist/runtime/count-step-started-events.js +4 -4
  44. package/dist/runtime/deployment-guard.d.ts +7 -7
  45. package/dist/runtime/deployment-guard.js +8 -8
  46. package/dist/runtime/get-port-lazy.d.ts +2 -2
  47. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  48. package/dist/runtime/get-port-lazy.js +37 -30
  49. package/dist/runtime/get-world-lazy.d.ts +2 -2
  50. package/dist/runtime/get-world-lazy.js +3 -3
  51. package/dist/runtime/helpers.d.ts +18 -18
  52. package/dist/runtime/helpers.js +27 -27
  53. package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
  54. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  55. package/dist/runtime/quickjs-entrypoint.js +200 -81
  56. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  57. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  58. package/dist/runtime/quickjs-runtime.js +126 -77
  59. package/dist/runtime/quickjs-serde.d.ts +10 -10
  60. package/dist/runtime/quickjs-serde.js +20 -20
  61. package/dist/runtime/replay-budget.d.ts +4 -4
  62. package/dist/runtime/replay-budget.js +5 -5
  63. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  64. package/dist/runtime/replay-recovery-reporter.js +2 -2
  65. package/dist/runtime/resume-hook.d.ts +2 -2
  66. package/dist/runtime/resume-hook.js +27 -27
  67. package/dist/runtime/resume-latency.d.ts +25 -25
  68. package/dist/runtime/resume-latency.d.ts.map +1 -1
  69. package/dist/runtime/resume-latency.js +4 -4
  70. package/dist/runtime/run-id-time.d.ts +2 -2
  71. package/dist/runtime/run-id-time.js +5 -5
  72. package/dist/runtime/run.d.ts +21 -4
  73. package/dist/runtime/run.d.ts.map +1 -1
  74. package/dist/runtime/run.js +154 -35
  75. package/dist/runtime/runs.d.ts +4 -4
  76. package/dist/runtime/runs.js +2 -2
  77. package/dist/runtime/start.d.ts +3 -3
  78. package/dist/runtime/start.d.ts.map +1 -1
  79. package/dist/runtime/start.js +27 -23
  80. package/dist/runtime/step-executor.d.ts +59 -11
  81. package/dist/runtime/step-executor.d.ts.map +1 -1
  82. package/dist/runtime/step-executor.js +116 -42
  83. package/dist/runtime/step-latency.d.ts +20 -14
  84. package/dist/runtime/step-latency.d.ts.map +1 -1
  85. package/dist/runtime/step-latency.js +13 -11
  86. package/dist/runtime/step-ownership.d.ts +6 -6
  87. package/dist/runtime/step-ownership.js +8 -8
  88. package/dist/runtime/step-single-flight.d.ts +1 -1
  89. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  90. package/dist/runtime/step-single-flight.js +17 -11
  91. package/dist/runtime/suspension-handler.d.ts +99 -7
  92. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  93. package/dist/runtime/suspension-handler.js +678 -57
  94. package/dist/runtime/unserializable-step.d.ts +34 -0
  95. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  96. package/dist/runtime/unserializable-step.js +52 -0
  97. package/dist/runtime/vm-mode.d.ts +1 -1
  98. package/dist/runtime/vm-mode.js +2 -2
  99. package/dist/runtime/wait-continuation.d.ts +31 -9
  100. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  101. package/dist/runtime/wait-continuation.js +44 -13
  102. package/dist/runtime/wait-until.d.ts +1 -1
  103. package/dist/runtime/wait-until.js +2 -2
  104. package/dist/runtime/world-compatibility.d.ts +20 -9
  105. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  106. package/dist/runtime/world-compatibility.js +24 -13
  107. package/dist/runtime/world-init.d.ts +5 -5
  108. package/dist/runtime/world-init.js +6 -6
  109. package/dist/runtime/world.d.ts.map +1 -1
  110. package/dist/runtime/world.js +13 -3
  111. package/dist/runtime.d.ts.map +1 -1
  112. package/dist/runtime.js +417 -213
  113. package/dist/sealed-box.d.ts +7 -7
  114. package/dist/sealed-box.js +15 -15
  115. package/dist/serialization/client.js +2 -2
  116. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  117. package/dist/serialization/codec-devalue-vm.js +4 -4
  118. package/dist/serialization/codec-devalue.d.ts +1 -1
  119. package/dist/serialization/codec-devalue.js +2 -2
  120. package/dist/serialization/codec.d.ts +4 -4
  121. package/dist/serialization/codec.js +2 -2
  122. package/dist/serialization/compression.d.ts +12 -11
  123. package/dist/serialization/compression.d.ts.map +1 -1
  124. package/dist/serialization/compression.js +16 -15
  125. package/dist/serialization/encryption.d.ts +7 -7
  126. package/dist/serialization/encryption.d.ts.map +1 -1
  127. package/dist/serialization/encryption.js +8 -8
  128. package/dist/serialization/errors.js +2 -2
  129. package/dist/serialization/format.d.ts +6 -6
  130. package/dist/serialization/format.js +7 -7
  131. package/dist/serialization/hardened.d.ts +18 -18
  132. package/dist/serialization/hardened.d.ts.map +1 -1
  133. package/dist/serialization/hardened.js +41 -32
  134. package/dist/serialization/index.d.ts +1 -1
  135. package/dist/serialization/index.js +2 -2
  136. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  137. package/dist/serialization/reducers/class-vm.js +2 -2
  138. package/dist/serialization/reducers/class.js +2 -2
  139. package/dist/serialization/reducers/common-vm.js +12 -12
  140. package/dist/serialization/reducers/common.js +12 -12
  141. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  142. package/dist/serialization/reducers/step-function-vm.js +2 -2
  143. package/dist/serialization/reducers/step-function.js +2 -2
  144. package/dist/serialization/step.js +2 -2
  145. package/dist/serialization/types.d.ts +5 -5
  146. package/dist/serialization/types.js +2 -2
  147. package/dist/serialization/workflow-vm.d.ts +1 -1
  148. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  149. package/dist/serialization/workflow-vm.js +13 -10
  150. package/dist/serialization-format.d.ts +11 -11
  151. package/dist/serialization-format.d.ts.map +1 -1
  152. package/dist/serialization-format.js +29 -23
  153. package/dist/serialization.d.ts +20 -12
  154. package/dist/serialization.d.ts.map +1 -1
  155. package/dist/serialization.js +141 -99
  156. package/dist/set-attributes.js +2 -2
  157. package/dist/source-map.d.ts +1 -1
  158. package/dist/source-map.d.ts.map +1 -1
  159. package/dist/source-map.js +18 -12
  160. package/dist/step/context-storage.d.ts +5 -5
  161. package/dist/step/context-storage.js +1 -1
  162. package/dist/step/writable-stream.d.ts +3 -3
  163. package/dist/step/writable-stream.js +7 -7
  164. package/dist/step.js +12 -12
  165. package/dist/symbols.d.ts +2 -2
  166. package/dist/symbols.js +3 -3
  167. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  168. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  169. package/dist/telemetry/semantic-conventions.js +21 -15
  170. package/dist/telemetry.d.ts +9 -3
  171. package/dist/telemetry.d.ts.map +1 -1
  172. package/dist/telemetry.js +40 -10
  173. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  174. package/dist/test-support/orchestrator-context.js +12 -2
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +2 -2
  177. package/dist/vm/index.js +4 -4
  178. package/dist/vm/script-cache.d.ts.map +1 -1
  179. package/dist/vm/script-cache.js +23 -17
  180. package/dist/vm/uint8array-base64.js +1 -1
  181. package/dist/workflow/abort-controller.d.ts +1 -1
  182. package/dist/workflow/abort-controller.js +12 -12
  183. package/dist/workflow/create-hook.js +3 -3
  184. package/dist/workflow/get-workflow-metadata.js +2 -2
  185. package/dist/workflow/hook.js +18 -18
  186. package/dist/workflow/set-attributes.d.ts +1 -1
  187. package/dist/workflow/set-attributes.js +2 -2
  188. package/dist/workflow/sleep.js +2 -2
  189. package/dist/workflow/world-init-stub.d.ts +1 -1
  190. package/dist/workflow/world-init-stub.js +2 -2
  191. package/dist/workflow.d.ts +2 -2
  192. package/dist/workflow.js +36 -14
  193. package/docs/api-reference/create-hook.mdx +15 -15
  194. package/docs/api-reference/create-webhook.mdx +15 -15
  195. package/docs/api-reference/define-hook.mdx +10 -10
  196. package/docs/api-reference/fatal-error.mdx +2 -2
  197. package/docs/api-reference/fetch.mdx +7 -7
  198. package/docs/api-reference/get-step-metadata.mdx +2 -2
  199. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  200. package/docs/api-reference/get-writable.mdx +7 -7
  201. package/docs/api-reference/index.mdx +1 -1
  202. package/docs/api-reference/retryable-error.mdx +1 -1
  203. package/docs/api-reference/set-attributes.mdx +2 -2
  204. package/docs/api-reference/sleep.mdx +3 -3
  205. package/docs/foundations/cancellation.mdx +31 -31
  206. package/docs/foundations/errors-and-retries.mdx +42 -11
  207. package/docs/foundations/hooks.mdx +37 -37
  208. package/docs/foundations/idempotency.mdx +9 -9
  209. package/docs/foundations/serialization.mdx +21 -22
  210. package/docs/foundations/starting-workflows.mdx +36 -37
  211. package/docs/foundations/streaming.mdx +68 -39
  212. package/docs/foundations/versioning.mdx +3 -3
  213. package/docs/foundations/workflows-and-steps.mdx +9 -9
  214. package/docs/how-it-works/cancellation.mdx +62 -62
  215. package/docs/how-it-works/code-transform.mdx +66 -54
  216. package/docs/how-it-works/encryption.mdx +25 -21
  217. package/docs/how-it-works/event-sourcing.mdx +84 -28
  218. package/docs/how-it-works/framework-integrations.mdx +12 -12
  219. package/docs/how-it-works/understanding-directives.mdx +21 -21
  220. package/package.json +7 -7
@@ -22,7 +22,7 @@ const generateResumeId = monotonicFactory();
22
22
  * message at ~256 KiB, and the message also carries the runId, hookId, token,
23
23
  * resumeId, digest, and trace carrier alongside CBOR framing overhead. Staying
24
24
  * well under that ceiling keeps the queue publish from rejecting an oversized
25
- * message which, on the parallel path, would persist `hook_received` but never
25
+ * message, which, on the parallel path, would persist `hook_received` but never
26
26
  * re-trigger the run. Above this size we fall back to the sequential path, whose
27
27
  * queue message carries only the run ID (the payload lives in the event log).
28
28
  */
@@ -33,7 +33,7 @@ const MAX_INLINE_RESUME_PAYLOAD_BYTES = 128 * 1024;
33
33
  * the queue `hookInput`, so both writers of the same `resumeId` record an
34
34
  * identical digest on the server's `(runId, resumeId)` constraint. Hashing the
35
35
  * already-serialized bytes (not the raw value) keeps producer and consumer in
36
- * lockstep the consumer forwards this string without recomputing.
36
+ * lockstep: the consumer forwards this string without recomputing.
37
37
  */
38
38
  async function computeResumePayloadDigest(bytes) {
39
39
  const digest = await crypto.subtle.digest('SHA-256', bytes);
@@ -65,8 +65,8 @@ function resumeContextFromRun(run) {
65
65
  }
66
66
  /**
67
67
  * Resolve resume context for a hook. Uses the stored `resumeContext` when
68
- * present (fast path no run read); otherwise fetches the run and synthesizes
69
- * it. Does NOT resolve the encryption key callers do that separately. Only
68
+ * present (fast path, no run read); otherwise fetches the run and synthesizes
69
+ * it. Does NOT resolve the encryption key; callers do that separately. Only
70
70
  * the fallback path can gate key work behind a local terminal-run check (it
71
71
  * has the fetched run); the fast path's stored context carries no status, so
72
72
  * seal/serialization work may run before the receiving side rejects
@@ -85,7 +85,7 @@ async function resolveHookResumeInfo(hook) {
85
85
  }
86
86
  /**
87
87
  * Resolve the run's symmetric key for a payload WRITE, as a bare `CryptoKey`
88
- * (`importKey`) the `encr` write fallback used when the run published no
88
+ * (`importKey`): the `encr` write fallback used when the run published no
89
89
  * public key to seal to. Writing needs only the AES key, not the read-side
90
90
  * keypair. On the fast path this needs only `runId` + `deploymentId` (no run
91
91
  * entity); on the fallback path the already fetched run is reused.
@@ -105,7 +105,7 @@ async function getHookByTokenWithKey(token) {
105
105
  // Only a hook that actually carries metadata needs the run's key resolved
106
106
  // here: hydrating that metadata is a READ, so derive the full RunPayloadKeys
107
107
  // (which opens sealed `encp` metadata, not just symmetric `encr`). The common
108
- // default webhook createWebhook() with no `respondWith` stores no
108
+ // default webhook (createWebhook() with no `respondWith`) stores no
109
109
  // metadata, so it skips this entirely: no ~350ms `run-key` API round trip,
110
110
  // and, crucially, no resolved key handed to `resumeHook`, leaving it free to
111
111
  // seal the payload to the run's published public key instead. Metadata-
@@ -170,8 +170,8 @@ export async function getHookByToken(token) {
170
170
  */
171
171
  export async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
172
172
  // Public entry point. It never attests hook freshness, so a Hook object
173
- // supplied here which may carry a `resumeCapabilities` cached before a
174
- // server rollback or kill switch is ignored by the dynamic-dedup gate and
173
+ // supplied here (which may carry a `resumeCapabilities` cached before a
174
+ // server rollback or kill switch) is ignored by the dynamic-dedup gate and
175
175
  // fails closed to the sequential path. Only `resumeWebhook`, which fetches
176
176
  // the hook by token in-line during the same resume, reaches the internal
177
177
  // implementation with the fresh attestation set. Keeping the freshness flag
@@ -179,7 +179,7 @@ export async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
179
179
  // `true` and reactivating dynamic dedup against a rolled-back backend.
180
180
  //
181
181
  // T0 of the hook-resume TTR window is taken HERE, at the public entry point,
182
- // rather than inside the implementation see the parameter's doc comment.
182
+ // rather than inside the implementation; see the parameter's doc comment.
183
183
  return resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, false, Date.now());
184
184
  }
185
185
  /**
@@ -194,8 +194,8 @@ export async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
194
194
  * @param resumeRequestedAtMs - T0 of the hook-resume TTR window (see
195
195
  * runtime/resume-latency.ts), stamped by the PUBLIC entry point the caller
196
196
  * used. It is a parameter rather than a local because `resumeWebhook` does
197
- * real work before it gets here the by-token lookup, the run-key
198
- * resolution that hydrates hook metadata, and the `respondWith` setup and
197
+ * real work before it gets here (the by-token lookup, the run-key
198
+ * resolution that hydrates hook metadata, and the `respondWith` setup) and
199
199
  * stamping locally would silently exclude all of it, so the two entry points
200
200
  * would report the same metric over different windows.
201
201
  */
@@ -224,7 +224,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
224
224
  // fallback path (which fetched the run). On the fast path the terminal
225
225
  // check happens server-side: `hook_received` against an ended run is
226
226
  // rejected, which the catch around `world.events.create` below re-keys
227
- // to HookNotFoundError same public contract, no run pre-fetch.
227
+ // to HookNotFoundError: same public contract, no run pre-fetch.
228
228
  if (info.run && isTerminalWorkflowRunStatus(info.run.status)) {
229
229
  throw new HookNotFoundError(hook.token);
230
230
  }
@@ -238,7 +238,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
238
238
  //
239
239
  // Preferred path: seal to the run's published X25519 public key, which
240
240
  // the stored `resumeContext` carries inline. On the fast path this is
241
- // the whole win no run read AND no `getEncryptionKeyForRun`, whose
241
+ // the whole win: no run read AND no `getEncryptionKeyForRun`, whose
242
242
  // ~350ms `run-key` API round trip dominates cross-deployment hook
243
243
  // resumption latency. (On the fallback path the key is synthesized
244
244
  // from the fetched run, which also carries it.)
@@ -252,7 +252,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
252
252
  // is itself the gate. A run only carries one if the runtime that
253
253
  // created it could also open a sealed payload, and runs are pinned to
254
254
  // their creating deployment, so presence is a more reliable attestation
255
- // than a version compare and it stays correct even when package
255
+ // than a version compare, and it stays correct even when package
256
256
  // versions drift.
257
257
  let payloadKey;
258
258
  const runPublicKey = encryptionKeyOverride
@@ -329,12 +329,12 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
329
329
  // so changing it generally requires redeploying the workflow
330
330
  // deployment. (The backend can independently drop new resumes to the
331
331
  // sequential path fleet-wide by ceasing to attest dedup support on
332
- // the by-token lookup see the backend-dedup condition below.)
332
+ // the by-token lookup; see the backend-dedup condition below.)
333
333
  // - backend dedup: the live backend must enforce the
334
334
  // `(runId, resumeId)` constraint, or the two writers would commit two
335
335
  // `hook_received` events. Fail closed. Attested by EITHER a fresh,
336
336
  // response-only `hook.resumeCapabilities.hookResumeDedupVersion` from
337
- // the by-token lookup (world-vercel recomputed every read, so a
337
+ // the by-token lookup (world-vercel: recomputed every read, so a
338
338
  // server rollback or kill switch drops to sequential immediately) OR
339
339
  // the static `world.capabilities.hookResumeDedup` (world-local, whose
340
340
  // adapter and backend ship together). The response-only capability is
@@ -355,8 +355,8 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
355
355
  // - raw bytes: the dehydrated payload must be a `Uint8Array` (the
356
356
  // content digest that keys the dedup constraint is over these bytes).
357
357
  // - size: a payload above the queue's message ceiling would fail the
358
- // publish which, on the parallel path, would persist the event but
359
- // never re-trigger the run so oversized payloads stay sequential
358
+ // publish (which, on the parallel path, would persist the event but
359
+ // never re-trigger the run), so oversized payloads stay sequential
360
360
  // (their queue message carries only the run ID).
361
361
  const parallelResumeDisabled = process.env.WORKFLOW_DISABLE_LAZY_HOOK_RESUME === '1';
362
362
  // Backend dedup is supported when EITHER the live server attests it
@@ -412,7 +412,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
412
412
  // treated as "hook gone" for historical / conflict-shaped-rejection
413
413
  // compatibility: there is no queue message in flight, so a conflict has
414
414
  // no re-ensuring consumer to converge on. The PARALLEL path handles 409
415
- // differently (see below) it published the queue message before the
415
+ // differently (see below): it published the queue message before the
416
416
  // conflict, so the consumer will converge the event.
417
417
  const isHookGoneError = (err) => HookNotFoundError.is(err) ||
418
418
  EntityConflictError.is(err) ||
@@ -435,7 +435,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
435
435
  }
436
436
  // T1 of the TTR window. Stamped immediately before the publish so
437
437
  // `producer_prep` covers exactly the work above it (hook lookup,
438
- // key resolution, serialization, and on this path the awaited
438
+ // key resolution, serialization, and, on this path, the awaited
439
439
  // `hook_received` write, which is genuinely serial here).
440
440
  const queuePublishRequestedAtMs = Date.now();
441
441
  await world.queue(queueName, {
@@ -456,7 +456,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
456
456
  const payloadDigest = await computeResumePayloadDigest(dehydratedPayload);
457
457
  span?.setAttributes({ 'workflow.hook.resume_id': resumeId });
458
458
  // Wrapped in a thunk purely so T1 of the TTR window is stamped at the
459
- // exact instant the publish is requested after the racing
459
+ // exact instant the publish is requested, after the racing
460
460
  // `hook_received` write has been kicked off, which is where the
461
461
  // additive `producer_prep` phase must end. The two calls still start
462
462
  // in the same turn and race exactly as before.
@@ -492,7 +492,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
492
492
  }, { v1Compat, resumeId, resumePayloadDigest: payloadDigest }),
493
493
  publishInvocation(),
494
494
  ]);
495
- // Queue failure is always fatal the run was not re-triggered, so no
495
+ // Queue failure is always fatal: the run was not re-triggered, so no
496
496
  // consumer will re-ensure the event.
497
497
  if (queueResult.status === 'rejected') {
498
498
  throw queueResult.reason;
@@ -513,7 +513,7 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
513
513
  if (EntityConflictError.is(err) || isRetryableWorldError(err)) {
514
514
  // Resilient. Two shapes reach here, both non-terminal:
515
515
  // - EntityConflict (409): this write raced its own re-ensuring
516
- // consumer (or a redrive) on the shared `resumeId` the run is
516
+ // consumer (or a redrive) on the shared `resumeId`; the run is
517
517
  // NOT gone, and the consumer converges on the one committed
518
518
  // event. Unlike the sequential path, a 409 here is expected
519
519
  // concurrency, not a vanished hook.
@@ -595,8 +595,8 @@ async function resumeHookImpl(tokenOrHook, payload, encryptionKeyOverride, hookF
595
595
  * ```
596
596
  */
597
597
  export async function resumeWebhook(token, request) {
598
- // T0 of the hook-resume TTR window. Everything below the by-token lookup,
599
- // the run-key resolution it may trigger, and the `respondWith` setup is
598
+ // T0 of the hook-resume TTR window. Everything below (the by-token lookup,
599
+ // the run-key resolution it may trigger, and the `respondWith` setup) is
600
600
  // real producer-side latency on this path, so the window has to open here
601
601
  // and not inside `resumeHookImpl`; otherwise webhook resumes would report a
602
602
  // systematically shorter total than `resumeHook` ones into the same metric.
@@ -634,7 +634,7 @@ export async function resumeWebhook(token, request) {
634
634
  }
635
635
  // `hook` was just fetched via `getHookByTokenWithKey` (a fresh by-token
636
636
  // lookup) above, so its response-only `resumeCapabilities` reflects the live
637
- // backend call the internal implementation with the fresh attestation so
637
+ // backend. Call the internal implementation with the fresh attestation so
638
638
  // the parallel fast path stays available without a second GET. (The public
639
639
  // `resumeHook` never sets this, so a caller cannot forge it.)
640
640
  await resumeHookImpl(hook, request, encryptionKey, true, resumeRequestedAtMs);
@@ -655,4 +655,4 @@ export async function resumeWebhook(token, request) {
655
655
  }
656
656
  return response;
657
657
  }
658
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBR3pCLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFB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SUFBSSxvQkFBb0IsQ0FDNUIsa0NBQWtDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQzdELEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRSxDQUN6RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04seUVBQXlFO1FBQ3pFLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDhEQUE4RDtJQUM5RCxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU5RSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsa0RBQWtEO1FBQ2xELGlDQUFpQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksb0JBQW9CLENBQUMsc0NBQXNDLEVBQUU7WUFDckUsSUFBSSxFQUFFLFdBQVcsQ0FBQyx5QkFBeUI7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBFUlJPUl9TTFVHUyxcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgSE9PS19SRVNVTUVfREVEVVBfVkVSU0lPTixcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgdHlwZSBIb29rLFxuICB0eXBlIEhvb2tSZXN1bWVDb250ZXh0LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGRlY29kZVJ1blB1YmxpY0tleSB9IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHsgZGVyaXZlUnVuUGF5bG9hZEtleXMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBsaW5rVG9UcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG4vKiogTW9ub3RvbmljIFVMSUQgZmFjdG9yeSBmb3IgcGVyLWNhbGwgcmVzdW1lIGlkZW1wb3RlbmN5IGtleXMuICovXG5jb25zdCBnZW5lcmF0ZVJlc3VtZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIHRoZSBzZXJpYWxpemVkIGhvb2sgcGF5bG9hZCB0aGF0IHRoZSBwYXJhbGxlbCBmYXN0IHBhdGggd2lsbFxuICogaW5saW5lIGludG8gdGhlIHF1ZXVlIG1lc3NhZ2UncyBgaG9va0lucHV0YC4gVmVyY2VsIFF1ZXVlcyBjYXBzIGEgc2luZ2xlXG4gKiBtZXNzYWdlIGF0IH4yNTYgS2lCLCBhbmQgdGhlIG1lc3NhZ2UgYWxzbyBjYXJyaWVzIHRoZSBydW5JZCwgaG9va0lkLCB0b2tlbixcbiAqIHJlc3VtZUlkLCBkaWdlc3QsIGFuZCB0cmFjZSBjYXJyaWVyIGFsb25nc2lkZSBDQk9SIGZyYW1pbmcgb3ZlcmhlYWQuIFN0YXlpbmdcbiAqIHdlbGwgdW5kZXIgdGhhdCBjZWlsaW5nIGtlZXBzIHRoZSBxdWV1ZSBwdWJsaXNoIGZyb20gcmVqZWN0aW5nIGFuIG92ZXJzaXplZFxuICogbWVzc2FnZSDigJQgd2hpY2gsIG9uIHRoZSBwYXJhbGxlbCBwYXRoLCB3b3VsZCBwZXJzaXN0IGBob29rX3JlY2VpdmVkYCBidXQgbmV2ZXJcbiAqIHJlLXRyaWdnZXIgdGhlIHJ1bi4gQWJvdmUgdGhpcyBzaXplIHdlIGZhbGwgYmFjayB0byB0aGUgc2VxdWVudGlhbCBwYXRoLCB3aG9zZVxuICogcXVldWUgbWVzc2FnZSBjYXJyaWVzIG9ubHkgdGhlIHJ1biBJRCAodGhlIHBheWxvYWQgbGl2ZXMgaW4gdGhlIGV2ZW50IGxvZykuXG4gKi9cbmNvbnN0IE1BWF9JTkxJTkVfUkVTVU1FX1BBWUxPQURfQllURVMgPSAxMjggKiAxMDI0O1xuXG4vKipcbiAqIEhleCBTSEEtMjU2IG9mIHRoZSBzZXJpYWxpemVkIHJlc3VtZSBwYXlsb2FkIGJ5dGVzLiBDb21wdXRlZCBvbmNlIGJ5IHRoZVxuICogcHJvZHVjZXIgYW5kIGZvcndhcmRlZCB2ZXJiYXRpbSBvbiBib3RoIHRoZSBkaXJlY3QgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZFxuICogdGhlIHF1ZXVlIGBob29rSW5wdXRgLCBzbyBib3RoIHdyaXRlcnMgb2YgdGhlIHNhbWUgYHJlc3VtZUlkYCByZWNvcmQgYW5cbiAqIGlkZW50aWNhbCBkaWdlc3Qgb24gdGhlIHNlcnZlcidzIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uc3RyYWludC4gSGFzaGluZyB0aGVcbiAqIGFscmVhZHktc2VyaWFsaXplZCBieXRlcyAobm90IHRoZSByYXcgdmFsdWUpIGtlZXBzIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpblxuICogbG9ja3N0ZXAg4oCUIHRoZSBjb25zdW1lciBmb3J3YXJkcyB0aGlzIHN0cmluZyB3aXRob3V0IHJlY29tcHV0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlUmVzdW1lUGF5bG9hZERpZ2VzdChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgYnl0ZXMpO1xuICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGlnZXN0KTtcbiAgbGV0IGhleCA9ICcnO1xuICBmb3IgKGNvbnN0IGIgb2Ygdmlldykge1xuICAgIGhleCArPSBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG4gIHJldHVybiBoZXg7XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBjb250ZXh0IGZvciBhIGhvb2sgcGx1cyB3aGVyZSBpdCBjYW1lIGZyb20uIGBydW5gIGlzIHByZXNlbnQgb25seVxuICogb24gdGhlIGZhbGxiYWNrIHBhdGggKHByZS1gcmVzdW1lQ29udGV4dGAgaG9va3MpLCB3aGVyZSBpdCBhbHNvIGNhcnJpZXMgdGhlXG4gKiBydW4ncyBtdXRhYmxlIHN0YXR1cyBmb3IgdGhlIHRlcm1pbmFsLXJ1biBjaGVjay4gS2V5IHJlc29sdXRpb24gaXMga2VwdFxuICogc2VwYXJhdGUgc28gY2FsbGVycyBjYW4gZ2F0ZSBpdCBiZWhpbmQgdGhhdCBjaGVjay5cbiAqL1xuaW50ZXJmYWNlIEhvb2tSZXN1bWVJbmZvIHtcbiAgcmVzdW1lQ29udGV4dDogSG9va1Jlc3VtZUNvbnRleHQ7XG4gIHNvdXJjZTogJ2hvb2snIHwgJ3J1bl9mYWxsYmFjayc7XG4gIHJ1bj86IFdvcmtmbG93UnVuO1xufVxuXG4vKiogRGVyaXZlIGEgcmVzdW1lIGNvbnRleHQgZnJvbSBhIGZ1bGwgcnVuIChmYWxsYmFjayBmb3IgcHJlLWByZXN1bWVDb250ZXh0YCBob29rcykuICovXG5mdW5jdGlvbiByZXN1bWVDb250ZXh0RnJvbVJ1bihydW46IFdvcmtmbG93UnVuKTogSG9va1Jlc3VtZUNvbnRleHQge1xuICBjb25zdCBjb3JlVmVyc2lvbiA9IHJ1bi5leGVjdXRpb25Db250ZXh0Py53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICBjb25zdCB0cmFjZUNhcnJpZXIgPSBydW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyO1xuICBjb25zdCBob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcnVuLmV4ZWN1dGlvbkNvbnRleHQ/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gIHJldHVybiB7XG4gICAgZGVwbG95bWVudElkOiBydW4uZGVwbG95bWVudElkLFxuICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICBydW5TcGVjVmVyc2lvbjogcnVuLnNwZWNWZXJzaW9uLFxuICAgIHdvcmtmbG93Q29yZVZlcnNpb246XG4gICAgICB0eXBlb2YgY29yZVZlcnNpb24gPT09ICdzdHJpbmcnID8gY29yZVZlcnNpb24gOiB1bmRlZmluZWQsXG4gICAgdHJhY2VDYXJyaWVyOlxuICAgICAgdHJhY2VDYXJyaWVyICYmIHR5cGVvZiB0cmFjZUNhcnJpZXIgPT09ICdvYmplY3QnXG4gICAgICAgID8gKHRyYWNlQ2FycmllciBhcyBIb29rUmVzdW1lQ29udGV4dFsndHJhY2VDYXJyaWVyJ10pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIGVuY3J5cHRpb25QdWJsaWNLZXk6IHJ1bi5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb246XG4gICAgICB0eXBlb2YgaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9PT0gJ251bWJlcidcbiAgICAgICAgPyBob29rUmVzdW1lSW5wdXRWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcmVzdW1lIGNvbnRleHQgZm9yIGEgaG9vay4gVXNlcyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCB3aGVuXG4gKiBwcmVzZW50IChmYXN0IHBhdGgg4oCUIG5vIHJ1biByZWFkKTsgb3RoZXJ3aXNlIGZldGNoZXMgdGhlIHJ1biBhbmQgc3ludGhlc2l6ZXNcbiAqIGl0LiBEb2VzIE5PVCByZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSDigJQgY2FsbGVycyBkbyB0aGF0IHNlcGFyYXRlbHkuIE9ubHlcbiAqIHRoZSBmYWxsYmFjayBwYXRoIGNhbiBnYXRlIGtleSB3b3JrIGJlaGluZCBhIGxvY2FsIHRlcm1pbmFsLXJ1biBjaGVjayAoaXRcbiAqIGhhcyB0aGUgZmV0Y2hlZCBydW4pOyB0aGUgZmFzdCBwYXRoJ3Mgc3RvcmVkIGNvbnRleHQgY2FycmllcyBubyBzdGF0dXMsIHNvXG4gKiBzZWFsL3NlcmlhbGl6YXRpb24gd29yayBtYXkgcnVuIGJlZm9yZSB0aGUgcmVjZWl2aW5nIHNpZGUgcmVqZWN0c1xuICogYGhvb2tfcmVjZWl2ZWRgIGZvciBhbiBlbmRlZCBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb29rUmVzdW1lSW5mbyhob29rOiBIb29rKTogUHJvbWlzZTxIb29rUmVzdW1lSW5mbz4ge1xuICBpZiAoaG9vay5yZXN1bWVDb250ZXh0KSB7XG4gICAgcmV0dXJuIHsgcmVzdW1lQ29udGV4dDogaG9vay5yZXN1bWVDb250ZXh0LCBzb3VyY2U6ICdob29rJyB9O1xuICB9XG4gIGNvbnN0IHJ1biA9IGF3YWl0IChhd2FpdCBnZXRXb3JsZExhenkoKSkucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gIHJldHVybiB7XG4gICAgcmVzdW1lQ29udGV4dDogcmVzdW1lQ29udGV4dEZyb21SdW4ocnVuKSxcbiAgICBzb3VyY2U6ICdydW5fZmFsbGJhY2snLFxuICAgIHJ1bixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBydW4ncyBzeW1tZXRyaWMga2V5IGZvciBhIHBheWxvYWQgV1JJVEUsIGFzIGEgYmFyZSBgQ3J5cHRvS2V5YFxuICogKGBpbXBvcnRLZXlgKSDigJQgdGhlIGBlbmNyYCB3cml0ZSBmYWxsYmFjayB1c2VkIHdoZW4gdGhlIHJ1biBwdWJsaXNoZWQgbm9cbiAqIHB1YmxpYyBrZXkgdG8gc2VhbCB0by4gV3JpdGluZyBuZWVkcyBvbmx5IHRoZSBBRVMga2V5LCBub3QgdGhlIHJlYWQtc2lkZVxuICoga2V5cGFpci4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIG5lZWRzIG9ubHkgYHJ1bklkYCArIGBkZXBsb3ltZW50SWRgIChubyBydW5cbiAqIGVudGl0eSk7IG9uIHRoZSBmYWxsYmFjayBwYXRoIHRoZSBhbHJlYWR5IGZldGNoZWQgcnVuIGlzIHJldXNlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KFxuICBob29rOiBIb29rLFxuICBpbmZvOiBIb29rUmVzdW1lSW5mb1xuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGltcG9ydEtleT4+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaW5mby5ydW4pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaG9vay5ydW5JZCwge1xuICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICB9KTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICBob29rOiBIb29rO1xuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xufT4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbik7XG5cbiAgLy8gT25seSBhIGhvb2sgdGhhdCBhY3R1YWxseSBjYXJyaWVzIG1ldGFkYXRhIG5lZWRzIHRoZSBydW4ncyBrZXkgcmVzb2x2ZWRcbiAgLy8gaGVyZTogaHlkcmF0aW5nIHRoYXQgbWV0YWRhdGEgaXMgYSBSRUFELCBzbyBkZXJpdmUgdGhlIGZ1bGwgUnVuUGF5bG9hZEtleXNcbiAgLy8gKHdoaWNoIG9wZW5zIHNlYWxlZCBgZW5jcGAgbWV0YWRhdGEsIG5vdCBqdXN0IHN5bW1ldHJpYyBgZW5jcmApLiBUaGUgY29tbW9uXG4gIC8vIGRlZmF1bHQgd2ViaG9vayDigJQgY3JlYXRlV2ViaG9vaygpIHdpdGggbm8gYHJlc3BvbmRXaXRoYCDigJQgc3RvcmVzIG5vXG4gIC8vIG1ldGFkYXRhLCBzbyBpdCBza2lwcyB0aGlzIGVudGlyZWx5OiBubyB+MzUwbXMgYHJ1bi1rZXlgIEFQSSByb3VuZCB0cmlwLFxuICAvLyBhbmQsIGNydWNpYWxseSwgbm8gcmVzb2x2ZWQga2V5IGhhbmRlZCB0byBgcmVzdW1lSG9va2AsIGxlYXZpbmcgaXQgZnJlZSB0b1xuICAvLyBzZWFsIHRoZSBwYXlsb2FkIHRvIHRoZSBydW4ncyBwdWJsaXNoZWQgcHVibGljIGtleSBpbnN0ZWFkLiBNZXRhZGF0YS1cbiAgLy8gYmVhcmluZyB3ZWJob29rcyBzdGlsbCBsZWdpdGltYXRlbHkgcGF5IG9uZSBsb29rdXAgdG8gaHlkcmF0ZS5cbiAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vay5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUhvb2tSZXN1bWVJbmZvKGhvb2spO1xuICAgIC8vIE9uIHRoZSBmYXN0IHBhdGggdGhpcyByZXNvbHZlcyB0aGUga2V5IGJ5IHJ1bklkICsgZGVwbG95bWVudElkIChubyBydW5cbiAgICAvLyByZWFkKTsgb24gdGhlIGZhbGxiYWNrIHBhdGggaXQgcmV1c2VzIHRoZSBhbHJlYWR5LWZldGNoZWQgcnVuLlxuICAgIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihpbmZvLnJ1bilcbiAgICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhvb2sucnVuSWQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgIH0pO1xuICAgIGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgIGhvb2subWV0YWRhdGEgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgIGhvb2subWV0YWRhdGEgYXMgYW55LFxuICAgICAgaG9vay5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXlcbiAgICApO1xuICB9XG4gIHJldHVybiB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGhvb2sgYnkgdG9rZW4gdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgaHlkcmF0ZSB0aGUgYG1ldGFkYXRhYCBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGZyb20gd2l0aGluXG4gKiB0aGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEEgSG9vayBrZXB0IGJ5IG1pbmltdW0gcmV0ZW50aW9uIHJlbWFpbnMgYXZhaWxhYmxlIGhlcmUgYWZ0ZXIgaXRzIHJ1biBlbmRzLFxuICogYnV0IGNhbm5vdCBiZSByZXN1bWVkLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgY29uc3QgeyBob29rIH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuICByZXR1cm4gaG9vaztcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayByZXN1bWVIb29rfTogYSB7QGxpbmsgSG9va30gYXVnbWVudGVkIHdpdGggYW4gb3B0aW9uYWxcbiAqIHJlc2lsaWVuY2Ugc2lnbmFsLlxuICpcbiAqIE9uIHRoZSBwYXJhbGxlbCBmYXN0IHBhdGgsIGByZXN1bWVIb29rKClgIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IGFuZFxuICogZGlzcGF0Y2hlcyB0aGUgd29ya2Zsb3cgcXVldWUgbWVzc2FnZSBjb25jdXJyZW50bHkuIFdoZW4gdGhlIGRpcmVjdCBldmVudFxuICogd3JpdGUgZmFpbHMgKnRyYW5zaWVudGx5KiDigJQgYSA0MjkvNXh4LCBhIHRyYW5zcG9ydCBlcnJvciwgb3IgYW4gZXhwZWN0ZWRcbiAqIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uZmxpY3Qgd2l0aCBpdHMgb3duIHJlLWVuc3VyaW5nIGNvbnN1bWVyIOKAlCBidXQgdGhlIHF1ZXVlXG4gKiBkaXNwYXRjaCBzdWNjZWVkcywgdGhlIHJlc3VtZSBpcyBzdGlsbCBndWFyYW50ZWVkOiB0aGUgcXVldWUgY29uc3VtZXJcbiAqIGlkZW1wb3RlbnRseSBtYXRlcmlhbGl6ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIHRoZSBwYXlsb2FkIGNhcnJpZWRcbiAqIG9uIHRoZSBtZXNzYWdlIGJlZm9yZSByZXBsYXkuIEluIHRoYXQgcmVjb3ZlcmVkIGNhc2UgdGhlIHJldHVybmVkIGhvb2sgY2Fycmllc1xuICogYHJlc2lsaWVudFJlc3VtZTogdHJ1ZWAuXG4gKlxuICogT24gdGhlIGhhcHB5IHBhdGggKHRoZSBkaXJlY3Qgd3JpdGUgbGFuZGVkKSBhbmQgb24gdGhlIHNlcXVlbnRpYWwgZmFsbGJhY2tcbiAqIHBhdGgsIHRoZSBmbGFnIGlzIGFic2VudCAoYHVuZGVmaW5lZGApLiBDYWxsZXJzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCB0aGVcbiAqIGRpc3RpbmN0aW9uIGNhbiB0cmVhdCB0aGUgcmVzdWx0IGFzIGEgcGxhaW4ge0BsaW5rIEhvb2t9LlxuICovXG5leHBvcnQgdHlwZSBSZXN1bWVkSG9vayA9IEhvb2sgJiB7IHJlc2lsaWVudFJlc3VtZT86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Pckhvb2sgLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rLCBvciB0aGUgaG9vayBvYmplY3QgaXRzZWxmXG4gKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBkYXRhIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHtAbGluayBSZXN1bWVkSG9va31cbiAqIEB0aHJvd3Mge0hvb2tOb3RGb3VuZEVycm9yfSBJZiB0aGUgSG9vayBkb2VzIG5vdCBleGlzdCBvciBpdHMgcnVuIGhhcyBlbmRlZFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lSG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgeyB0b2tlbiwgZGF0YSB9ID0gYXdhaXQgcmVxdWVzdC5qc29uKCk7XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZXN1bWVIb29rKHRva2VuLCBkYXRhKTtcbiAqICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IHJ1bklkOiBob29rLnJ1bklkIH0pO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0hvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVIb29rPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlPzogUGF5bG9hZEtleVxuKTogUHJvbWlzZTxSZXN1bWVkSG9vaz4ge1xuICAvLyBQdWJsaWMgZW50cnkgcG9pbnQuIEl0IG5ldmVyIGF0dGVzdHMgaG9vayBmcmVzaG5lc3MsIHNvIGEgSG9vayBvYmplY3RcbiAgLy8gc3VwcGxpZWQgaGVyZSDigJQgd2hpY2ggbWF5IGNhcnJ5IGEgYHJlc3VtZUNhcGFiaWxpdGllc2AgY2FjaGVkIGJlZm9yZSBhXG4gIC8vIHNlcnZlciByb2xsYmFjayBvciBraWxsIHN3aXRjaCDigJQgaXMgaWdub3JlZCBieSB0aGUgZHluYW1pYy1kZWR1cCBnYXRlIGFuZFxuICAvLyBmYWlscyBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC4gT25seSBgcmVzdW1lV2ViaG9va2AsIHdoaWNoIGZldGNoZXNcbiAgLy8gdGhlIGhvb2sgYnkgdG9rZW4gaW4tbGluZSBkdXJpbmcgdGhlIHNhbWUgcmVzdW1lLCByZWFjaGVzIHRoZSBpbnRlcm5hbFxuICAvLyBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBmcmVzaCBhdHRlc3RhdGlvbiBzZXQuIEtlZXBpbmcgdGhlIGZyZXNobmVzcyBmbGFnXG4gIC8vIG9mZiB0aGUgZXhwb3J0ZWQgc2lnbmF0dXJlIHByZXZlbnRzIGEgY2FsbGVyIGZyb20gcGFzc2luZyBhIHN0YWxlIEhvb2sgcGx1c1xuICAvLyBgdHJ1ZWAgYW5kIHJlYWN0aXZhdGluZyBkeW5hbWljIGRlZHVwIGFnYWluc3QgYSByb2xsZWQtYmFjayBiYWNrZW5kLlxuICAvL1xuICAvLyBUMCBvZiB0aGUgaG9vay1yZXN1bWUgVFRSIHdpbmRvdyBpcyB0YWtlbiBIRVJFLCBhdCB0aGUgcHVibGljIGVudHJ5IHBvaW50LFxuICAvLyByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uIOKAlCBzZWUgdGhlIHBhcmFtZXRlcidzIGRvYyBjb21tZW50LlxuICByZXR1cm4gcmVzdW1lSG9va0ltcGwoXG4gICAgdG9rZW5Pckhvb2ssXG4gICAgcGF5bG9hZCxcbiAgICBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUsXG4gICAgZmFsc2UsXG4gICAgRGF0ZS5ub3coKVxuICApO1xufVxuXG4vKipcbiAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayByZXN1bWVIb29rfS4gTk9UIGV4cG9ydGVkOiB0aGVcbiAqIGBob29rRnJlc2hseUxvb2tlZFVwYCBhdHRlc3RhdGlvbiBtdXN0IG5ldmVyIGJlIHJlYWNoYWJsZSBieSBwdWJsaWMgY2FsbGVyc1xuICogKHNlZSB0aGUgd3JhcHBlciBhYm92ZSkuXG4gKlxuICogQHBhcmFtIGhvb2tGcmVzaGx5TG9va2VkVXAgLSBBdHRlc3RzIHRoYXQgYSBzdXBwbGllZCBIb29rIG9iamVjdCB3YXMgZmV0Y2hlZFxuICogICBieSB0b2tlbiBkdXJpbmcgVEhJUyByZXN1bWUsIHNvIGl0cyByZXNwb25zZS1vbmx5IGByZXN1bWVDYXBhYmlsaXRpZXNgXG4gKiAgIHJlZmxlY3RzIHRoZSBsaXZlIGJhY2tlbmQgYW5kIG1heSBiZSB0cnVzdGVkIGZvciB0aGUgZHluYW1pYy1kZWR1cCBnYXRlLlxuICogICBBIHRva2VuIHN0cmluZyBpcyBhbHdheXMgZmV0Y2hlZCBmcmVzaCBoZXJlLCBzbyBpdCBpcyBpbXBsaWNpdGx5IGZyZXNoLlxuICogQHBhcmFtIHJlc3VtZVJlcXVlc3RlZEF0TXMgLSBUMCBvZiB0aGUgaG9vay1yZXN1bWUgVFRSIHdpbmRvdyAoc2VlXG4gKiAgIHJ1bnRpbWUvcmVzdW1lLWxhdGVuY3kudHMpLCBzdGFtcGVkIGJ5IHRoZSBQVUJMSUMgZW50cnkgcG9pbnQgdGhlIGNhbGxlclxuICogICB1c2VkLiBJdCBpcyBhIHBhcmFtZXRlciByYXRoZXIgdGhhbiBhIGxvY2FsIGJlY2F1c2UgYHJlc3VtZVdlYmhvb2tgIGRvZXNcbiAqICAgcmVhbCB3b3JrIGJlZm9yZSBpdCBnZXRzIGhlcmUg4oCUIHRoZSBieS10b2tlbiBsb29rdXAsIHRoZSBydW4ta2V5XG4gKiAgIHJlc29sdXRpb24gdGhhdCBoeWRyYXRlcyBob29rIG1ldGFkYXRhLCBhbmQgdGhlIGByZXNwb25kV2l0aGAgc2V0dXAg4oCUIGFuZFxuICogICBzdGFtcGluZyBsb2NhbGx5IHdvdWxkIHNpbGVudGx5IGV4Y2x1ZGUgYWxsIG9mIGl0LCBzbyB0aGUgdHdvIGVudHJ5IHBvaW50c1xuICogICB3b3VsZCByZXBvcnQgdGhlIHNhbWUgbWV0cmljIG92ZXIgZGlmZmVyZW50IHdpbmRvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc3VtZUhvb2tJbXBsPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlOiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBob29rRnJlc2hseUxvb2tlZFVwOiBib29sZWFuLFxuICByZXN1bWVSZXF1ZXN0ZWRBdE1zOiBudW1iZXJcbik6IFByb21pc2U8UmVzdW1lZEhvb2s+IHtcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gdHJhY2UoJ2hvb2sucmVzdW1lJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1cHBsaWVkVG9rZW4gPSB0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCBob29rOiBIb29rID0gc3VwcGxpZWRUb2tlblxuICAgICAgICAgID8gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbk9ySG9vaylcbiAgICAgICAgICA6IHRva2VuT3JIb29rO1xuICAgICAgICAvLyBUaGUgZHluYW1pYywgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYCBtYXkgb25seSBiZSB0cnVzdGVkXG4gICAgICAgIC8vIHdoZW4gaXQgY2FtZSBmcm9tIGEgYnktdG9rZW4gbG9va3VwIHBlcmZvcm1lZCBkdXJpbmcgdGhpcyByZXN1bWUuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaCA9XG4gICAgICAgICAgc3VwcGxpZWRUb2tlbiB8fCBob29rRnJlc2hseUxvb2tlZFVwO1xuXG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlSG9va1Jlc3VtZUluZm8oaG9vayk7XG4gICAgICAgIGNvbnN0IHsgcmVzdW1lQ29udGV4dCB9ID0gaW5mbztcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9jb250ZXh0X3NvdXJjZSc6IGluZm8uc291cmNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCBpbnRlbnRpb25hbGx5IG9taXRzIHRoZSBydW4ncyBtdXRhYmxlXG4gICAgICAgIC8vIHN0YXR1cywgc28gdGhpcyBlYXJseSBjbGllbnQtc2lkZSByZWplY3Rpb24gb25seSBydW5zIG9uIHRoZVxuICAgICAgICAvLyBmYWxsYmFjayBwYXRoICh3aGljaCBmZXRjaGVkIHRoZSBydW4pLiBPbiB0aGUgZmFzdCBwYXRoIHRoZSB0ZXJtaW5hbFxuICAgICAgICAvLyBjaGVjayBoYXBwZW5zIHNlcnZlci1zaWRlOiBgaG9va19yZWNlaXZlZGAgYWdhaW5zdCBhbiBlbmRlZCBydW4gaXNcbiAgICAgICAgLy8gcmVqZWN0ZWQsIHdoaWNoIHRoZSBjYXRjaCBhcm91bmQgYHdvcmxkLmV2ZW50cy5jcmVhdGVgIGJlbG93IHJlLWtleXNcbiAgICAgICAgLy8gdG8gSG9va05vdEZvdW5kRXJyb3Ig4oCUIHNhbWUgcHVibGljIGNvbnRyYWN0LCBubyBydW4gcHJlLWZldGNoLlxuICAgICAgICBpZiAoaW5mby5ydW4gJiYgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKGluZm8ucnVuLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LCBhbmQgcnVucyBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAvLyBieXRlLXN0cmVhbSBmcmFtaW5nIHN1cHBvcnQgY2Fubm90IGRlY29kZSBmcmFtZWQgYnl0ZSBzdHJlYW1zLlxuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gICAgICAgICAgcmVzdW1lQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgcGF5bG9hZCBmb3IgdGhlIHRhcmdldCBydW4gKGEgV1JJVEUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBQcmVmZXJyZWQgcGF0aDogc2VhbCB0byB0aGUgcnVuJ3MgcHVibGlzaGVkIFgyNTUxOSBwdWJsaWMga2V5LCB3aGljaFxuICAgICAgICAvLyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCBjYXJyaWVzIGlubGluZS4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIGlzXG4gICAgICAgIC8vIHRoZSB3aG9sZSB3aW4g4oCUIG5vIHJ1biByZWFkIEFORCBubyBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAsIHdob3NlXG4gICAgICAgIC8vIH4zNTBtcyBgcnVuLWtleWAgQVBJIHJvdW5kIHRyaXAgZG9taW5hdGVzIGNyb3NzLWRlcGxveW1lbnQgaG9va1xuICAgICAgICAvLyByZXN1bXB0aW9uIGxhdGVuY3kuIChPbiB0aGUgZmFsbGJhY2sgcGF0aCB0aGUga2V5IGlzIHN5bnRoZXNpemVkXG4gICAgICAgIC8vIGZyb20gdGhlIGZldGNoZWQgcnVuLCB3aGljaCBhbHNvIGNhcnJpZXMgaXQuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWFsaW5nIGFsc28gZHJvcHMgcHJpdmlsZWdlOiB0aGUgcmVzdW1lciBlbmRzIHVwIGFibGUgdG8gd3JpdGUgYVxuICAgICAgICAvLyBwYXlsb2FkIGZvciB0aGUgcnVuIHdpdGhvdXQgYmVpbmcgYWJsZSB0byByZWFkIGFueXRoaW5nIG9mIHRoZVxuICAgICAgICAvLyBydW4ncywgd2hlcmUgZmV0Y2hpbmcgdGhlIHN5bW1ldHJpYyBrZXkgZ3JhbnRzIGJvdGguXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSBOT1QgZ2F0ZWQgb24gYGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzYCB0aGUgd2F5XG4gICAgICAgIC8vIHRoZSBzeW1tZXRyaWMgZmFsbGJhY2sgYmVsb3cgZ2F0ZXMgYGVuY3JgOiBwcmVzZW5jZSBvZiB0aGUgcHVibGljIGtleVxuICAgICAgICAvLyBpcyBpdHNlbGYgdGhlIGdhdGUuIEEgcnVuIG9ubHkgY2FycmllcyBvbmUgaWYgdGhlIHJ1bnRpbWUgdGhhdFxuICAgICAgICAvLyBjcmVhdGVkIGl0IGNvdWxkIGFsc28gb3BlbiBhIHNlYWxlZCBwYXlsb2FkLCBhbmQgcnVucyBhcmUgcGlubmVkIHRvXG4gICAgICAgIC8vIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsIHNvIHByZXNlbmNlIGlzIGEgbW9yZSByZWxpYWJsZSBhdHRlc3RhdGlvblxuICAgICAgICAvLyB0aGFuIGEgdmVyc2lvbiBjb21wYXJlIOKAlCBhbmQgaXQgc3RheXMgY29ycmVjdCBldmVuIHdoZW4gcGFja2FnZVxuICAgICAgICAvLyB2ZXJzaW9ucyBkcmlmdC5cbiAgICAgICAgbGV0IHBheWxvYWRLZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJ1blB1YmxpY0tleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZVxuICAgICAgICAgID8gLy8gVGhlIGNhbGxlciBhbHJlYWR5IGhvbGRzIGEga2V5IChyZXN1bWVXZWJob29rIHJlc29sdmVkIG9uZSB0b1xuICAgICAgICAgICAgLy8gaHlkcmF0ZSBob29rIG1ldGFkYXRhKSwgc28gc2VhbGluZyB3b3VsZCBhZGQgYW4gRUNESCBmb3Igbm9cbiAgICAgICAgICAgIC8vIHNhdmVkIHJvdW5kIHRyaXAuIFJldXNlIHdoYXQgaXQgcmVzb2x2ZWQuXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICA6IGRlY29kZVJ1blB1YmxpY0tleShyZXN1bWVDb250ZXh0LmVuY3J5cHRpb25QdWJsaWNLZXkpO1xuXG4gICAgICAgIGlmIChydW5QdWJsaWNLZXkpIHtcbiAgICAgICAgICBwYXlsb2FkS2V5ID0gc2VhbFRvKHJ1blB1YmxpY0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3ltbWV0cmljIGBlbmNyYCB3cml0ZSBmYWxsYmFjazogbmVlZHMgb25seSB0aGUgQUVTIGtleVxuICAgICAgICAgIC8vIChhIGJhcmUgQ3J5cHRvS2V5IHZpYSBgcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5YCksIG5vdCB0aGVcbiAgICAgICAgICAvLyByZWFkLXNpZGUgUnVuUGF5bG9hZEtleXMuXG4gICAgICAgICAgbGV0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICAgICAgZW5jcnlwdGlvbktleU92ZXJyaWRlID8/XG4gICAgICAgICAgICAoYXdhaXQgcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KGhvb2ssIGluZm8pKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF5bG9hZEtleSA9IGVuY3J5cHRpb25LZXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wcmVzcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBydW4gYW5kIGl0cyBkZXBsb3ltZW50IHN1cHBvcnQgdGhlXG4gICAgICAgIC8vIGNvbXByZXNzaW9uIGZvcm1hdHMgaW50cm9kdWNlZCB3aXRoIHNwZWMgdmVyc2lvbiA1LlxuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgICAgKHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTiAmJlxuICAgICAgICAgIGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVApO1xuXG4gICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgcGF5bG9hZCBmb3Igc3RvcmFnZVxuICAgICAgICBjb25zdCBvcHM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihob29rLnNwZWNWZXJzaW9uKTtcbiAgICAgICAgY29uc3QgZGVoeWRyYXRlZFBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgIHBheWxvYWRLZXksXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgdjFDb21wYXQsXG4gICAgICAgICAgY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZXNlIHBheWxvYWQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlXG4gICAgICAgIC8vIHByb21pc2UgaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZFxuICAgICAgICAvLyB3YWl0VW50aWwgcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSxcbiAgICAgICAgLy8gc28gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgIC8vIE5PVEU6IHJlamVjdGlvbnMgd2l0aCBgdW5kZWZpbmVkYCBhcmUgYW4gZXhwZWN0ZWQgYXJ0aWZhY3Qgb2YgdGhlXG4gICAgICAgIC8vIHdlYmhvb2sgYnVuZGxlIGFuZCBhcmUgaWdub3JlZCBlbnRpcmVseS5cbiAgICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdCYWNrZ3JvdW5kIGZsdXNoIG9mIGhvb2sgcGF5bG9hZCBvcHMgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGluayB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHN0b3JlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgIC8vIChza2lwcGVkIHdoZW4gYWJzZW50IG9yIGludmFsaWQpLiBSZXNvbHZlZCBiZWZvcmUgZGlzcGF0Y2ggc28gYm90aFxuICAgICAgICAvLyB0aGUgc2VxdWVudGlhbCBhbmQgcGFyYWxsZWwgcGF0aHMgYXR0YWNoIGl0LlxuICAgICAgICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyKTtcbiAgICAgICAgaWYgKG9yaWdpbkxpbmspIHtcbiAgICAgICAgICBzcGFuPy5hZGRMaW5rPy4ob3JpZ2luTGluayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudERhdGEgPSB7XG4gICAgICAgICAgLi4uKHYxQ29tcGF0ID8ge30gOiB7IHRva2VuOiBob29rLnRva2VuIH0pLFxuICAgICAgICAgIHBheWxvYWQ6IGRlaHlkcmF0ZWRQYXlsb2FkLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHF1ZXVlTmFtZSA9IGdldFdvcmtmbG93UXVldWVOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKTtcbiAgICAgICAgY29uc3QgcXVldWVPcHRpb25zID0ge1xuICAgICAgICAgIGRlcGxveW1lbnRJZDogcmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBwYXJhbGxlbGl6ZSB0aGUgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZCB0aGUgcXVldWVcbiAgICAgICAgLy8gcHVibGlzaC4gVGhlIGZhc3QgcGF0aCBpcyBvbmx5IHNhZmUgd2hlbiBFVkVSWSBwcmVjb25kaXRpb24gaG9sZHM7IHRoZVxuICAgICAgICAvLyBmaXJzdCB0aGF0IGZhaWxzIG5hbWVzIHRoZSBmYWxsYmFjayByZWFzb24gKGVtaXR0ZWQgYXMgYSBzcGFuXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBmb3Igb2JzZXJ2YWJpbGl0eSwgYW5kIHRvIG1ha2UgXCJ3aHkgZGlkIHRoaXMgcnVuIHNlcXVlbnRpYWxcIlxuICAgICAgICAvLyBhbnN3ZXJhYmxlIGluIHByb2R1Y3Rpb24pLiBBbGwgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gIC0ga2lsbCBzd2l0Y2g6IGBXT1JLRkxPV19ESVNBQkxFX0xBWllfSE9PS19SRVNVTUVgIGZvcmNlcyBzZXF1ZW50aWFsXG4gICAgICAgIC8vICAgIGlmIHRoZSBmYXN0IHBhdGggZXZlciBtaXNiZWhhdmVzLiBJdCBpcyBhbiBTREstZGVwbG95bWVudCBlbnYgdmFyLFxuICAgICAgICAvLyAgICBzbyBjaGFuZ2luZyBpdCBnZW5lcmFsbHkgcmVxdWlyZXMgcmVkZXBsb3lpbmcgdGhlIHdvcmtmbG93XG4gICAgICAgIC8vICAgIGRlcGxveW1lbnQuIChUaGUgYmFja2VuZCBjYW4gaW5kZXBlbmRlbnRseSBkcm9wIG5ldyByZXN1bWVzIHRvIHRoZVxuICAgICAgICAvLyAgICBzZXF1ZW50aWFsIHBhdGggZmxlZXQtd2lkZSBieSBjZWFzaW5nIHRvIGF0dGVzdCBkZWR1cCBzdXBwb3J0IG9uXG4gICAgICAgIC8vICAgIHRoZSBieS10b2tlbiBsb29rdXAg4oCUIHNlZSB0aGUgYmFja2VuZC1kZWR1cCBjb25kaXRpb24gYmVsb3cuKVxuICAgICAgICAvLyAgLSBiYWNrZW5kIGRlZHVwOiB0aGUgbGl2ZSBiYWNrZW5kIG11c3QgZW5mb3JjZSB0aGVcbiAgICAgICAgLy8gICAgYChydW5JZCwgcmVzdW1lSWQpYCBjb25zdHJhaW50LCBvciB0aGUgdHdvIHdyaXRlcnMgd291bGQgY29tbWl0IHR3b1xuICAgICAgICAvLyAgICBgaG9va19yZWNlaXZlZGAgZXZlbnRzLiBGYWlsIGNsb3NlZC4gQXR0ZXN0ZWQgYnkgRUlUSEVSIGEgZnJlc2gsXG4gICAgICAgIC8vICAgIHJlc3BvbnNlLW9ubHkgYGhvb2sucmVzdW1lQ2FwYWJpbGl0aWVzLmhvb2tSZXN1bWVEZWR1cFZlcnNpb25gIGZyb21cbiAgICAgICAgLy8gICAgdGhlIGJ5LXRva2VuIGxvb2t1cCAod29ybGQtdmVyY2VsIOKAlCByZWNvbXB1dGVkIGV2ZXJ5IHJlYWQsIHNvIGFcbiAgICAgICAgLy8gICAgc2VydmVyIHJvbGxiYWNrIG9yIGtpbGwgc3dpdGNoIGRyb3BzIHRvIHNlcXVlbnRpYWwgaW1tZWRpYXRlbHkpIE9SXG4gICAgICAgIC8vICAgIHRoZSBzdGF0aWMgYHdvcmxkLmNhcGFiaWxpdGllcy5ob29rUmVzdW1lRGVkdXBgICh3b3JsZC1sb2NhbCwgd2hvc2VcbiAgICAgICAgLy8gICAgYWRhcHRlciBhbmQgYmFja2VuZCBzaGlwIHRvZ2V0aGVyKS4gVGhlIHJlc3BvbnNlLW9ubHkgY2FwYWJpbGl0eSBpc1xuICAgICAgICAvLyAgICB0cnVzdGVkIE9OTFkgd2hlbiB0aGUgaG9vayB3YXMgbG9va2VkIHVwIGJ5IHRva2VuIGR1cmluZyB0aGlzXG4gICAgICAgIC8vICAgIHJlc3VtZSAoYGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaGApOyBhIEhvb2sgb2JqZWN0IGhhbmRlZCBpblxuICAgICAgICAvLyAgICBieSBhIHB1YmxpYyBjYWxsZXIgbWF5IGNhcnJ5IGEgY2FwYWJpbGl0eSBjYWNoZWQgYmVmb3JlIGEgcm9sbGJhY2ssXG4gICAgICAgIC8vICAgIHNvIGl0IGlzIGlnbm9yZWQgYW5kIHRoZSBwYXRoIGZhbGxzIGJhY2sgdG8gc2VxdWVudGlhbC5cbiAgICAgICAgLy8gIC0gY29uc3VtZXIgc3VwcG9ydDogdGhlIHRhcmdldCBydW4ncyBkZXBsb3ltZW50IG11c3QgcmUtZW5zdXJlIHRoZVxuICAgICAgICAvLyAgICBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQXR0ZXN0ZWQgYnkgdGhlIHJ1bidzIGV4cGxpY2l0XG4gICAgICAgIC8vICAgIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCBleGVjdXRpb24tY29udGV4dCBtYXJrZXIgKG1pcnJvcmVkIG9udG9cbiAgICAgICAgLy8gICAgcmVzdW1lQ29udGV4dCksIE5PVCBhIHZlcnNpb24tY29tcGFyZSBhZ2FpbnN0IGEgcHJlZGljdGVkIHJlbGVhc2VcbiAgICAgICAgLy8gICAgY3V0b2ZmLiBBYnNlbnQg4oaSIGEgbG9zdCBwcm9kdWNlciB3cml0ZSB3b3VsZCBiZSBhIGxvc3QgcmVzdW1lLlxuICAgICAgICAvLyAgLSBub3QgbGVnYWN5OiB2MUNvbXBhdCBydW5zIG9taXQgYHRva2VuYCBmcm9tIHRoZSBwcm9kdWNlcidzIGV2ZW50XG4gICAgICAgIC8vICAgIGJvZHkgYnV0IHRoZSBjb25zdW1lcidzIHJlLWVuc3VyZSBhbHdheXMgaW5jbHVkZXMgaXQsIHNvIHRoZSB0d29cbiAgICAgICAgLy8gICAgd3JpdGVycyB3b3VsZCBkaXNhZ3JlZSBvbiB0aGUgZXZlbnQgYm9keS4gTGVnYWN5IHN0YXlzIHNlcXVlbnRpYWwuXG4gICAgICAgIC8vICAtIENCT1IgdHJhbnNwb3J0OiB0aGUgcnVuIG11c3QgdXNlIENCT1IgcXVldWUgdHJhbnNwb3J0IHNvIHRoZSBiaW5hcnlcbiAgICAgICAgLy8gICAgcGF5bG9hZCBzdXJ2aXZlcyB0aGUgcXVldWUgbWVzc2FnZS5cbiAgICAgICAgLy8gIC0gcmF3IGJ5dGVzOiB0aGUgZGVoeWRyYXRlZCBwYXlsb2FkIG11c3QgYmUgYSBgVWludDhBcnJheWAgKHRoZVxuICAgICAgICAvLyAgICBjb250ZW50IGRpZ2VzdCB0aGF0IGtleXMgdGhlIGRlZHVwIGNvbnN0cmFpbnQgaXMgb3ZlciB0aGVzZSBieXRlcykuXG4gICAgICAgIC8vICAtIHNpemU6IGEgcGF5bG9hZCBhYm92ZSB0aGUgcXVldWUncyBtZXNzYWdlIGNlaWxpbmcgd291bGQgZmFpbCB0aGVcbiAgICAgICAgLy8gICAgcHVibGlzaCDigJQgd2hpY2gsIG9uIHRoZSBwYXJhbGxlbCBwYXRoLCB3b3VsZCBwZXJzaXN0IHRoZSBldmVudCBidXRcbiAgICAgICAgLy8gICAgbmV2ZXIgcmUtdHJpZ2dlciB0aGUgcnVuIOKAlCBzbyBvdmVyc2l6ZWQgcGF5bG9hZHMgc3RheSBzZXF1ZW50aWFsXG4gICAgICAgIC8vICAgICh0aGVpciBxdWV1ZSBtZXNzYWdlIGNhcnJpZXMgb25seSB0aGUgcnVuIElEKS5cbiAgICAgICAgY29uc3QgcGFyYWxsZWxSZXN1bWVEaXNhYmxlZCA9XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfRElTQUJMRV9MQVpZX0hPT0tfUkVTVU1FID09PSAnMSc7XG4gICAgICAgIC8vIEJhY2tlbmQgZGVkdXAgaXMgc3VwcG9ydGVkIHdoZW4gRUlUSEVSIHRoZSBsaXZlIHNlcnZlciBhdHRlc3RzIGl0XG4gICAgICAgIC8vIGZyZXNoIG9uIHRoaXMgYnktdG9rZW4gaG9vayAod29ybGQtdmVyY2VsOiByZXNwb25zZS1vbmx5LCByZWNvbXB1dGVkXG4gICAgICAgIC8vIGV2ZXJ5IHJlYWQsIHNvIHJvbGxiYWNrL2tpbGwtc3dpdGNoIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5KSBPUiB0aGVcbiAgICAgICAgLy8gc3RhdGljIHdvcmxkIGNhcGFiaWxpdHkgaXMgc2V0ICh3b3JsZC1sb2NhbDogYWRhcHRlciArIGJhY2tlbmQgc2hpcFxuICAgICAgICAvLyB0b2dldGhlcikuIEJvdGggYXJlIHJlLWV2YWx1YXRlZCBwZXIgcmVzdW1lLCBzbyBldmVyeSByb2xsb3V0IGFuZFxuICAgICAgICAvLyByb2xsYmFjayBkaXJlY3Rpb24gZGVncmFkZXMgc2FmZWx5IHRvIHRoZSBzZXF1ZW50aWFsIHBhdGguXG4gICAgICAgIGNvbnN0IGJhY2tlbmREZWR1cFN1cHBvcnRlZCA9XG4gICAgICAgICAgKGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaFxuICAgICAgICAgICAgPyAoaG9vay5yZXN1bWVDYXBhYmlsaXRpZXM/Lmhvb2tSZXN1bWVEZWR1cFZlcnNpb24gPz8gMClcbiAgICAgICAgICAgIDogMCkgPj0gSE9PS19SRVNVTUVfREVEVVBfVkVSU0lPTiB8fFxuICAgICAgICAgIHdvcmxkLmNhcGFiaWxpdGllcz8uaG9va1Jlc3VtZURlZHVwID09PSB0cnVlO1xuICAgICAgICBjb25zdCBmYWxsYmFja1JlYXNvbjogc3RyaW5nIHwgbnVsbCA9IHBhcmFsbGVsUmVzdW1lRGlzYWJsZWRcbiAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICA6ICFiYWNrZW5kRGVkdXBTdXBwb3J0ZWRcbiAgICAgICAgICAgID8gJ2JhY2tlbmRfdW5zdXBwb3J0ZWQnXG4gICAgICAgICAgICA6IChyZXN1bWVDb250ZXh0Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPz8gMCkgPFxuICAgICAgICAgICAgICAgIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT05cbiAgICAgICAgICAgICAgPyAnY29uc3VtZXJfdW5zdXBwb3J0ZWQnXG4gICAgICAgICAgICAgIDogdjFDb21wYXRcbiAgICAgICAgICAgICAgICA/ICdsZWdhY3knXG4gICAgICAgICAgICAgICAgOiAocmVzdW1lQ29udGV4dC5ydW5TcGVjVmVyc2lvbiA/PyAwKSA8XG4gICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICAgICAgPyAnbm9uX2Nib3JfdHJhbnNwb3J0J1xuICAgICAgICAgICAgICAgICAgOiAhKGRlaHlkcmF0ZWRQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgPyAnbm9uX2J5dGVzJ1xuICAgICAgICAgICAgICAgICAgICA6IGRlaHlkcmF0ZWRQYXlsb2FkLmJ5dGVMZW5ndGggPlxuICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lOTElORV9SRVNVTUVfUEFZTE9BRF9CWVRFU1xuICAgICAgICAgICAgICAgICAgICAgID8gJ292ZXJzaXplZCdcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHVzZVBhcmFsbGVsUmVzdW1lID0gZmFsbGJhY2tSZWFzb24gPT09IG51bGw7XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX3N0cmF0ZWd5JzogdXNlUGFyYWxsZWxSZXN1bWVcbiAgICAgICAgICAgID8gJ3BhcmFsbGVsJ1xuICAgICAgICAgICAgOiAnc2VxdWVudGlhbCcsXG4gICAgICAgICAgLi4uKGZhbGxiYWNrUmVhc29uXG4gICAgICAgICAgICA/IHsgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2ZhbGxiYWNrX3JlYXNvbic6IGZhbGxiYWNrUmVhc29uIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS1rZXkgYW55IFwiaG9vayBjYW4gbm8gbG9uZ2VyIGJlIHJlY2VpdmVkXCIgcmVqZWN0aW9uIHRvXG4gICAgICAgIC8vIEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pIHNvIGAudG9rZW5gIG1hdGNoZXMgdGhlIHByZS1mYXN0LXBhdGhcbiAgICAgICAgLy8gY29udHJhY3QsIHdoZXJlIHJlc3VtZUhvb2sgdGhyZXcgYEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pYFxuICAgICAgICAvLyBhZnRlciBpdHMgb3duIHRlcm1pbmFsIGNoZWNrLiBUaGUgc3BlY2lmaWMgZXJyb3IgZGVwZW5kcyBvbiB0aGVcbiAgICAgICAgLy8gV29ybGQ6XG4gICAgICAgIC8vICAgLSBhIGdlbnVpbmVseSBtaXNzaW5nIGhvb2sgbWFwcyB0byBIb29rTm90Rm91bmRFcnJvciAoa2V5ZWQgb24gdGhlXG4gICAgICAgIC8vICAgICBldmVudCBjb3JyZWxhdGlvbklkIC8gaG9vayBJRCk7XG4gICAgICAgIC8vICAgLSBhIHRlcm1pbmFsIHJ1biBvbiBWZXJjZWwgcmVqZWN0cyBob29rX3JlY2VpdmVkIHdpdGggNDA0LCB3aGljaFxuICAgICAgICAvLyAgICAgd29ybGQtdmVyY2VsIG1hcHMgdG8gSG9va05vdEZvdW5kRXJyb3I7XG4gICAgICAgIC8vICAgLSBhIHRlcm1pbmFsIHJ1biBvbiB3b3JsZC1sb2NhbCAvIHdvcmxkLXBvc3RncmVzIHJlamVjdHMgd2l0aFxuICAgICAgICAvLyAgICAgUnVuRXhwaXJlZEVycm9yLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbiB0aGUgU0VRVUVOVElBTCBwYXRoIGFuIEVudGl0eUNvbmZsaWN0RXJyb3IgKEhUVFAgNDA5KSBpcyBhbHNvXG4gICAgICAgIC8vIHRyZWF0ZWQgYXMgXCJob29rIGdvbmVcIiBmb3IgaGlzdG9yaWNhbCAvIGNvbmZsaWN0LXNoYXBlZC1yZWplY3Rpb25cbiAgICAgICAgLy8gY29tcGF0aWJpbGl0eTogdGhlcmUgaXMgbm8gcXVldWUgbWVzc2FnZSBpbiBmbGlnaHQsIHNvIGEgY29uZmxpY3QgaGFzXG4gICAgICAgIC8vIG5vIHJlLWVuc3VyaW5nIGNvbnN1bWVyIHRvIGNvbnZlcmdlIG9uLiBUaGUgUEFSQUxMRUwgcGF0aCBoYW5kbGVzIDQwOVxuICAgICAgICAvLyBkaWZmZXJlbnRseSAoc2VlIGJlbG93KSDigJQgaXQgcHVibGlzaGVkIHRoZSBxdWV1ZSBtZXNzYWdlIGJlZm9yZSB0aGVcbiAgICAgICAgLy8gY29uZmxpY3QsIHNvIHRoZSBjb25zdW1lciB3aWxsIGNvbnZlcmdlIHRoZSBldmVudC5cbiAgICAgICAgY29uc3QgaXNIb29rR29uZUVycm9yID0gKGVycjogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycik7XG5cbiAgICAgICAgaWYgKCF1c2VQYXJhbGxlbFJlc3VtZSkge1xuICAgICAgICAgIC8vIFNlcXVlbnRpYWwgcGF0aDogY3JlYXRlIGEgaG9va19yZWNlaXZlZCBldmVudCwgdGhlbiByZS10cmlnZ2VyLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGlzSG9va0dvbmVFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihob29rLnRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUMSBvZiB0aGUgVFRSIHdpbmRvdy4gU3RhbXBlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHB1Ymxpc2ggc29cbiAgICAgICAgICAvLyBgcHJvZHVjZXJfcHJlcGAgY292ZXJzIGV4YWN0bHkgdGhlIHdvcmsgYWJvdmUgaXQgKGhvb2sgbG9va3VwLFxuICAgICAgICAgIC8vIGtleSByZXNvbHV0aW9uLCBzZXJpYWxpemF0aW9uLCBhbmQg4oCUIG9uIHRoaXMgcGF0aCDigJQgdGhlIGF3YWl0ZWRcbiAgICAgICAgICAvLyBgaG9va19yZWNlaXZlZGAgd3JpdGUsIHdoaWNoIGlzIGdlbnVpbmVseSBzZXJpYWwgaGVyZSkuXG4gICAgICAgICAgY29uc3QgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJ1bklkOiBob29rLnJ1bklkLFxuICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgaG9va1Jlc3VtZVRpbWluZzoge1xuICAgICAgICAgICAgICAgIHJlc3VtZVJlcXVlc3RlZEF0TXMsXG4gICAgICAgICAgICAgICAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICAgICAgICAgICAgICBzdHJhdGVneTogJ3NlcXVlbnRpYWwnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgICAgcXVldWVPcHRpb25zXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiBob29rO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyYWxsZWwgZmFzdCBwYXRoLiBBIHN0YWJsZSBpZGVtcG90ZW5jeSBrZXkgdGllcyB0aGUgZGlyZWN0IHdyaXRlIHRvXG4gICAgICAgIC8vIHRoZSBxdWV1ZSBjb25zdW1lcidzIHJlLWVuc3VyZTsgdGhlIHBheWxvYWQgZGlnZXN0IGxldHMgdGhlIHNlcnZlclxuICAgICAgICAvLyBkZXRlY3Qga2V5IHJldXNlIGFjcm9zcyBieXRlLWlkZW50aWNhbCBwYXlsb2Fkcy5cbiAgICAgICAgY29uc3QgcmVzdW1lSWQgPSBnZW5lcmF0ZVJlc3VtZUlkKCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWREaWdlc3QgPSBhd2FpdCBjb21wdXRlUmVzdW1lUGF5bG9hZERpZ2VzdChcbiAgICAgICAgICBkZWh5ZHJhdGVkUGF5bG9hZCBhcyBVaW50OEFycmF5XG4gICAgICAgICk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoeyAnd29ya2Zsb3cuaG9vay5yZXN1bWVfaWQnOiByZXN1bWVJZCB9KTtcblxuICAgICAgICAvLyBXcmFwcGVkIGluIGEgdGh1bmsgcHVyZWx5IHNvIFQxIG9mIHRoZSBUVFIgd2luZG93IGlzIHN0YW1wZWQgYXQgdGhlXG4gICAgICAgIC8vIGV4YWN0IGluc3RhbnQgdGhlIHB1Ymxpc2ggaXMgcmVxdWVzdGVkIOKAlCBhZnRlciB0aGUgcmFjaW5nXG4gICAgICAgIC8vIGBob29rX3JlY2VpdmVkYCB3cml0ZSBoYXMgYmVlbiBraWNrZWQgb2ZmLCB3aGljaCBpcyB3aGVyZSB0aGVcbiAgICAgICAgLy8gYWRkaXRpdmUgYHByb2R1Y2VyX3ByZXBgIHBoYXNlIG11c3QgZW5kLiBUaGUgdHdvIGNhbGxzIHN0aWxsIHN0YXJ0XG4gICAgICAgIC8vIGluIHRoZSBzYW1lIHR1cm4gYW5kIHJhY2UgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAgICAgIGNvbnN0IHB1Ymxpc2hJbnZvY2F0aW9uID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHJldHVybiB3b3JsZC5xdWV1ZShcbiAgICAgICAgICAgIHF1ZXVlTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmVzdW1lQ29udGV4dC50cmFjZUNhcnJpZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBob29rSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICByZXN1bWVJZCxcbiAgICAgICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRlaHlkcmF0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHBheWxvYWREaWdlc3QsXG4gICAgICAgICAgICAgICAgLy8gRGVwbG95bWVudCBhZmZpbml0eSBmb3IgdGhlIGNvbnN1bWVyJ3MgY2hlYXAgcHJlLXdyaXRlXG4gICAgICAgICAgICAgICAgLy8gY2hlY2s6IGxldHMgYSBtaXNyb3V0ZWQgZGVsaXZlcnkgcmUtcm91dGUgYmVmb3JlIGl0c1xuICAgICAgICAgICAgICAgIC8vIGhvaXN0ZWQgaG9va19yZWNlaXZlZCB3cml0ZSBpbnN0ZWFkIG9mIGFmdGVyLlxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGhvb2tSZXN1bWVUaW1pbmc6IHtcbiAgICAgICAgICAgICAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgICAgICAgICAgICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6ICdwYXJhbGxlbCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAgICBxdWV1ZU9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBbZXZlbnRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICBldmVudERhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2MUNvbXBhdCwgcmVzdW1lSWQsIHJlc3VtZVBheWxvYWREaWdlc3Q6IHBheWxvYWREaWdlc3QgfVxuICAgICAgICAgICksXG4gICAgICAgICAgcHVibGlzaEludm9jYXRpb24oKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWwg4oCUIHRoZSBydW4gd2FzIG5vdCByZS10cmlnZ2VyZWQsIHNvIG5vXG4gICAgICAgIC8vIGNvbnN1bWVyIHdpbGwgcmUtZW5zdXJlIHRoZSBldmVudC5cbiAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB3aGVuIHRoZSBkaXJlY3Qgd3JpdGUgZGlkIG5vdCBsYW5kIGJ1dCB0aGUgcXVldWUgZGlzcGF0Y2ggZGlkLCBzb1xuICAgICAgICAvLyB0aGUgY29uc3VtZXIgbWF0ZXJpYWxpemVzIHRoZSBldmVudCBiZWZvcmUgcmVwbGF5LiBTdXJmYWNlZCB0byB0aGVcbiAgICAgICAgLy8gY2FsbGVyIGFzIGBSZXN1bWVkSG9vay5yZXNpbGllbnRSZXN1bWVgIGFuZCBvbiB0aGUgc3Bhbi5cbiAgICAgICAgbGV0IHJlc2lsaWVudFJlc3VtZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZXZlbnRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgZXJyID0gZXZlbnRSZXN1bHQucmVhc29uO1xuICAgICAgICAgIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAvLyBUaGUgaG9vaydzIHJ1biBoYXMgZ2VudWluZWx5IGVuZGVkOiBzdXJmYWNlIHRoZSBzYW1lIGNvbnRyYWN0IGFzXG4gICAgICAgICAgICAvLyB0aGUgc2VxdWVudGlhbCBwYXRoLiBUaGUgcXVldWUgbWVzc2FnZSBhbHJlYWR5IHdlbnQgb3V0LCBidXQgdGhlXG4gICAgICAgICAgICAvLyBjb25zdW1lcidzIHJlLWVuc3VyZSB3aWxsIGFsc28gcmVqZWN0IGFnYWluc3QgdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgLy8gYW5kIG5vLW9wLCBzbyB0aGUgd29ya2Zsb3cgZG9lcyBub3QgcmVzdW1lLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGhvb2sudG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAvLyBSZXNpbGllbnQuIFR3byBzaGFwZXMgcmVhY2ggaGVyZSwgYm90aCBub24tdGVybWluYWw6XG4gICAgICAgICAgICAvLyAgIC0gRW50aXR5Q29uZmxpY3QgKDQwOSk6IHRoaXMgd3JpdGUgcmFjZWQgaXRzIG93biByZS1lbnN1cmluZ1xuICAgICAgICAgICAgLy8gICAgIGNvbnN1bWVyIChvciBhIHJlZHJpdmUpIG9uIHRoZSBzaGFyZWQgYHJlc3VtZUlkYCDigJQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgLy8gICAgIE5PVCBnb25lLCBhbmQgdGhlIGNvbnN1bWVyIGNvbnZlcmdlcyBvbiB0aGUgb25lIGNvbW1pdHRlZFxuICAgICAgICAgICAgLy8gICAgIGV2ZW50LiBVbmxpa2UgdGhlIHNlcXVlbnRpYWwgcGF0aCwgYSA0MDkgaGVyZSBpcyBleHBlY3RlZFxuICAgICAgICAgICAgLy8gICAgIGNvbmN1cnJlbmN5LCBub3QgYSB2YW5pc2hlZCBob29rLlxuICAgICAgICAgICAgLy8gICAtIDQyOSAvIDV4eCAvIHRyYW5zcG9ydDogYSB0cmFuc2llbnQgYmFja2VuZCBmYWlsdXJlLlxuICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcyB0aGUgcnVuIFdBUyByZS10cmlnZ2VyZWQgdmlhIHRoZSBxdWV1ZSBhbmQgdGhlXG4gICAgICAgICAgICAvLyBjb25zdW1lciBpZGVtcG90ZW50bHkgZW5zdXJlcyB0aGUgaG9va19yZWNlaXZlZCBiZWZvcmUgcmVwbGF5LCBzb1xuICAgICAgICAgICAgLy8gc3dhbGxvdyByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gUHJvZHVjZXIgdGVsZW1ldHJ5OiByZWNvcmQgdGhhdCB0aGUgZGlyZWN0IHdyaXRlIGRpZCBub3QgbGFuZCBidXRcbiAgICAgICAgICAgIC8vIHRoZSByZXN1bWUgaXMgc3RpbGwgZ3VhcmFudGVlZCB2aWEgcXVldWUtZGVsaXZlcmVkIGBob29rSW5wdXRgLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb3BlcmF0aW9uYWwgc2lnbmFsIHRoYXQgdGhlIHJlY292ZXJ5IHBhdGggZmlyZWQsXG4gICAgICAgICAgICAvLyBzdXJmYWNlZCBib3RoIG9uIHRoZSBzcGFuIGFuZCBhcyB0aGUgcHVibGljIGByZXNpbGllbnRSZXN1bWVgXG4gICAgICAgICAgICAvLyBmbGFnIG9uIHRoZSByZXR1cm5lZCBob29rICh0aGUgcmVzdW1lIG91dGNvbWUgaXMgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyBpZGVudGljYWwgdG8gdGhlIGhhcHB5IHBhdGggZnJvbSB0aGUgY2FsbGVyJ3MgcGVyc3BlY3RpdmUpLlxuICAgICAgICAgICAgcmVzaWxpZW50UmVzdW1lID0gdHJ1ZTtcbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZSh0cnVlKSxcbiAgICAgICAgICAgICAgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2V2ZW50X3dyaXRlX3JlY292ZXJlZCc6IHRydWUsXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9ldmVudF93cml0ZV9lcnJvcic6XG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICd1bmtub3duJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAnSG9vayByZXN1bWUgZXZlbnQgd3JpdGUgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgcmUtdHJpZ2dlcmVkIHZpYSAnICtcbiAgICAgICAgICAgICAgICAndGhlIHF1ZXVlLiBUaGUgaG9va19yZWNlaXZlZCBldmVudCB3aWxsIGJlIGVuc3VyZWQgYnkgdGhlICcgK1xuICAgICAgICAgICAgICAgICdxdWV1ZSBjb25zdW1lci4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgICAgIHJlc3VtZUlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHJlc2lsaWVudFJlc3VtZSA/IHsgLi4uaG9vaywgcmVzaWxpZW50UmVzdW1lOiB0cnVlIH0gOiBob29rXG4gICAgICAgICkgc2F0aXNmaWVzIFJlc3VtZWRIb29rO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rVG9rZW4oXG4gICAgICAgICAgICB0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnID8gdG9rZW5Pckhvb2sgOiB0b2tlbk9ySG9vay50b2tlblxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tGb3VuZChmYWxzZSksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc3VtZXMgYSB3ZWJob29rIGJ5IHNlbmRpbmcgYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JlcXVlc3QgfCBSZXF1ZXN0fVxuICogb2JqZWN0IHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBhIHJlcXVlc3QgdG8gYSB3ZWJob29rIGFuZCByZXN1bWUgdGhlIGFzc29jaWF0ZWQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqIEBwYXJhbSByZXF1ZXN0IC0gVGhlIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3BvbnNlXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBob29rIGlzIG5vdCBmb3VuZCBvciBpZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB0aGUgcHJvY2Vzc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lV2ViaG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gKiAgIGNvbnN0IHRva2VuID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3Rva2VuJyk7XG4gKlxuICogICBpZiAoIXRva2VuKSB7XG4gKiAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnTWlzc2luZyB0b2tlbicsIHsgc3RhdHVzOiA0MDAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIHRyeSB7XG4gKiAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXN1bWVXZWJob29rKHRva2VuLCByZXF1ZXN0KTtcbiAqICAgICByZXR1cm4gcmVzcG9uc2U7XG4gKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnV2ViaG9vayBub3QgZm91bmQnLCB7IHN0YXR1czogNDA0IH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3VtZVdlYmhvb2soXG4gIHRva2VuOiBzdHJpbmcsXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgLy8gVDAgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cuIEV2ZXJ5dGhpbmcgYmVsb3cg4oCUIHRoZSBieS10b2tlbiBsb29rdXAsXG4gIC8vIHRoZSBydW4ta2V5IHJlc29sdXRpb24gaXQgbWF5IHRyaWdnZXIsIGFuZCB0aGUgYHJlc3BvbmRXaXRoYCBzZXR1cCDigJQgaXNcbiAgLy8gcmVhbCBwcm9kdWNlci1zaWRlIGxhdGVuY3kgb24gdGhpcyBwYXRoLCBzbyB0aGUgd2luZG93IGhhcyB0byBvcGVuIGhlcmVcbiAgLy8gYW5kIG5vdCBpbnNpZGUgYHJlc3VtZUhvb2tJbXBsYDsgb3RoZXJ3aXNlIHdlYmhvb2sgcmVzdW1lcyB3b3VsZCByZXBvcnQgYVxuICAvLyBzeXN0ZW1hdGljYWxseSBzaG9ydGVyIHRvdGFsIHRoYW4gYHJlc3VtZUhvb2tgIG9uZXMgaW50byB0aGUgc2FtZSBtZXRyaWMuXG4gIGNvbnN0IHJlc3VtZVJlcXVlc3RlZEF0TXMgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfSA9IGF3YWl0IGdldEhvb2tCeVRva2VuV2l0aEtleSh0b2tlbik7XG5cbiAgLy8gT25seSB3ZWJob29rcyBjYW4gYmUgcmVzdW1lZCB2aWEgdGhlIHB1YmxpYyBlbmRwb2ludC5cbiAgLy8gSWYgdGhlIGhvb2sgd2FzIGNyZWF0ZWQgdmlhIGNyZWF0ZUhvb2soKSAoaXNXZWJob29rICE9PSB0cnVlKSxcbiAgLy8gdGhyb3cgdGhlIHNhbWUgXCJub3QgZm91bmRcIiBlcnJvciB0aGUgd29ybGQgd291bGQgdGhyb3cgZm9yIGEgbWlzc2luZ1xuICAvLyB0b2tlbi4gVGhpcyBwcmV2ZW50cyBsZWFraW5nIHRoYXQgdGhlIHRva2VuIGlzIHZhbGlkLlxuICBpZiAoaG9vay5pc1dlYmhvb2sgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKHRva2VuKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTogUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNwb25zZVJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxSZXNwb25zZT4gfCB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBob29rLm1ldGFkYXRhICYmXG4gICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3Jlc3BvbmRXaXRoJyBpbiBob29rLm1ldGFkYXRhXG4gICkge1xuICAgIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoID09PSAnbWFudWFsJykge1xuICAgICAgY29uc3QgeyByZWFkYWJsZSwgd3JpdGFibGUgfSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08UmVzcG9uc2UsIFJlc3BvbnNlPigpO1xuICAgICAgcmVzcG9uc2VSZWFkYWJsZSA9IHJlYWRhYmxlO1xuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBpbnN0YW5jZSBpbmNsdWRlcyB0aGUgd3JpdGFibGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgdXNlZFxuICAgICAgLy8gdG8gd3JpdGUgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IHJ1blxuICAgICAgKHJlcXVlc3QgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHdyaXRhYmxlO1xuICAgIH0gZWxzZSBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZSA9IGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgXFxgcmVzcG9uZFdpdGhcXGAgdmFsdWU6ICR7aG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aH1gLFxuICAgICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUUgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gYHJlc3BvbmRXaXRoYCB2YWx1ZSBpbXBsaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHJldHVybmluZyBhIDIwMlxuICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAyMDIgfSk7XG4gIH1cblxuICAvLyBgaG9va2Agd2FzIGp1c3QgZmV0Y2hlZCB2aWEgYGdldEhvb2tCeVRva2VuV2l0aEtleWAgKGEgZnJlc2ggYnktdG9rZW5cbiAgLy8gbG9va3VwKSBhYm92ZSwgc28gaXRzIHJlc3BvbnNlLW9ubHkgYHJlc3VtZUNhcGFiaWxpdGllc2AgcmVmbGVjdHMgdGhlIGxpdmVcbiAgLy8gYmFja2VuZCDigJQgY2FsbCB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgZnJlc2ggYXR0ZXN0YXRpb24gc29cbiAgLy8gdGhlIHBhcmFsbGVsIGZhc3QgcGF0aCBzdGF5cyBhdmFpbGFibGUgd2l0aG91dCBhIHNlY29uZCBHRVQuIChUaGUgcHVibGljXG4gIC8vIGByZXN1bWVIb29rYCBuZXZlciBzZXRzIHRoaXMsIHNvIGEgY2FsbGVyIGNhbm5vdCBmb3JnZSBpdC4pXG4gIGF3YWl0IHJlc3VtZUhvb2tJbXBsKGhvb2ssIHJlcXVlc3QsIGVuY3J5cHRpb25LZXksIHRydWUsIHJlc3VtZVJlcXVlc3RlZEF0TXMpO1xuXG4gIGlmIChyZXNwb25zZVJlYWRhYmxlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlYWRhYmxlIHN0cmVhbSB0byBlbWl0IG9uZSBjaHVuayxcbiAgICAvLyB3aGljaCBpcyB0aGUgYFJlc3BvbnNlYCBvYmplY3RcbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZVJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsudmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gY2h1bmsudmFsdWU7XG4gICAgfVxuICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dvcmtmbG93IHJ1biBkaWQgbm90IHNlbmQgYSByZXNwb25zZScsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG4iXX0=
658
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBR3pCLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQiwwQ0FBMEMsRUFDMUMsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBRXBCLG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFB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SUFBSSxvQkFBb0IsQ0FDNUIsa0NBQWtDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQzdELEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRSxDQUN6RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04seUVBQXlFO1FBQ3pFLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLDhEQUE4RDtJQUM5RCxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU5RSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsa0RBQWtEO1FBQ2xELGlDQUFpQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksb0JBQW9CLENBQUMsc0NBQXNDLEVBQUU7WUFDckUsSUFBSSxFQUFFLFdBQVcsQ0FBQyx5QkFBeUI7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBFUlJPUl9TTFVHUyxcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgSE9PS19SRVNVTUVfREVEVVBfVkVSU0lPTixcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgdHlwZSBIb29rLFxuICB0eXBlIEhvb2tSZXN1bWVDb250ZXh0LFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fTEVHQUNZLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGRlY29kZVJ1blB1YmxpY0tleSB9IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHsgZGVyaXZlUnVuUGF5bG9hZEtleXMgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRSB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBsaW5rVG9UcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG4vKiogTW9ub3RvbmljIFVMSUQgZmFjdG9yeSBmb3IgcGVyLWNhbGwgcmVzdW1lIGlkZW1wb3RlbmN5IGtleXMuICovXG5jb25zdCBnZW5lcmF0ZVJlc3VtZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIHRoZSBzZXJpYWxpemVkIGhvb2sgcGF5bG9hZCB0aGF0IHRoZSBwYXJhbGxlbCBmYXN0IHBhdGggd2lsbFxuICogaW5saW5lIGludG8gdGhlIHF1ZXVlIG1lc3NhZ2UncyBgaG9va0lucHV0YC4gVmVyY2VsIFF1ZXVlcyBjYXBzIGEgc2luZ2xlXG4gKiBtZXNzYWdlIGF0IH4yNTYgS2lCLCBhbmQgdGhlIG1lc3NhZ2UgYWxzbyBjYXJyaWVzIHRoZSBydW5JZCwgaG9va0lkLCB0b2tlbixcbiAqIHJlc3VtZUlkLCBkaWdlc3QsIGFuZCB0cmFjZSBjYXJyaWVyIGFsb25nc2lkZSBDQk9SIGZyYW1pbmcgb3ZlcmhlYWQuIFN0YXlpbmdcbiAqIHdlbGwgdW5kZXIgdGhhdCBjZWlsaW5nIGtlZXBzIHRoZSBxdWV1ZSBwdWJsaXNoIGZyb20gcmVqZWN0aW5nIGFuIG92ZXJzaXplZFxuICogbWVzc2FnZSwgd2hpY2gsIG9uIHRoZSBwYXJhbGxlbCBwYXRoLCB3b3VsZCBwZXJzaXN0IGBob29rX3JlY2VpdmVkYCBidXQgbmV2ZXJcbiAqIHJlLXRyaWdnZXIgdGhlIHJ1bi4gQWJvdmUgdGhpcyBzaXplIHdlIGZhbGwgYmFjayB0byB0aGUgc2VxdWVudGlhbCBwYXRoLCB3aG9zZVxuICogcXVldWUgbWVzc2FnZSBjYXJyaWVzIG9ubHkgdGhlIHJ1biBJRCAodGhlIHBheWxvYWQgbGl2ZXMgaW4gdGhlIGV2ZW50IGxvZykuXG4gKi9cbmNvbnN0IE1BWF9JTkxJTkVfUkVTVU1FX1BBWUxPQURfQllURVMgPSAxMjggKiAxMDI0O1xuXG4vKipcbiAqIEhleCBTSEEtMjU2IG9mIHRoZSBzZXJpYWxpemVkIHJlc3VtZSBwYXlsb2FkIGJ5dGVzLiBDb21wdXRlZCBvbmNlIGJ5IHRoZVxuICogcHJvZHVjZXIgYW5kIGZvcndhcmRlZCB2ZXJiYXRpbSBvbiBib3RoIHRoZSBkaXJlY3QgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZFxuICogdGhlIHF1ZXVlIGBob29rSW5wdXRgLCBzbyBib3RoIHdyaXRlcnMgb2YgdGhlIHNhbWUgYHJlc3VtZUlkYCByZWNvcmQgYW5cbiAqIGlkZW50aWNhbCBkaWdlc3Qgb24gdGhlIHNlcnZlcidzIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uc3RyYWludC4gSGFzaGluZyB0aGVcbiAqIGFscmVhZHktc2VyaWFsaXplZCBieXRlcyAobm90IHRoZSByYXcgdmFsdWUpIGtlZXBzIHByb2R1Y2VyIGFuZCBjb25zdW1lciBpblxuICogbG9ja3N0ZXA6IHRoZSBjb25zdW1lciBmb3J3YXJkcyB0aGlzIHN0cmluZyB3aXRob3V0IHJlY29tcHV0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlUmVzdW1lUGF5bG9hZERpZ2VzdChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgYnl0ZXMpO1xuICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGlnZXN0KTtcbiAgbGV0IGhleCA9ICcnO1xuICBmb3IgKGNvbnN0IGIgb2Ygdmlldykge1xuICAgIGhleCArPSBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICB9XG4gIHJldHVybiBoZXg7XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBjb250ZXh0IGZvciBhIGhvb2sgcGx1cyB3aGVyZSBpdCBjYW1lIGZyb20uIGBydW5gIGlzIHByZXNlbnQgb25seVxuICogb24gdGhlIGZhbGxiYWNrIHBhdGggKHByZS1gcmVzdW1lQ29udGV4dGAgaG9va3MpLCB3aGVyZSBpdCBhbHNvIGNhcnJpZXMgdGhlXG4gKiBydW4ncyBtdXRhYmxlIHN0YXR1cyBmb3IgdGhlIHRlcm1pbmFsLXJ1biBjaGVjay4gS2V5IHJlc29sdXRpb24gaXMga2VwdFxuICogc2VwYXJhdGUgc28gY2FsbGVycyBjYW4gZ2F0ZSBpdCBiZWhpbmQgdGhhdCBjaGVjay5cbiAqL1xuaW50ZXJmYWNlIEhvb2tSZXN1bWVJbmZvIHtcbiAgcmVzdW1lQ29udGV4dDogSG9va1Jlc3VtZUNvbnRleHQ7XG4gIHNvdXJjZTogJ2hvb2snIHwgJ3J1bl9mYWxsYmFjayc7XG4gIHJ1bj86IFdvcmtmbG93UnVuO1xufVxuXG4vKiogRGVyaXZlIGEgcmVzdW1lIGNvbnRleHQgZnJvbSBhIGZ1bGwgcnVuIChmYWxsYmFjayBmb3IgcHJlLWByZXN1bWVDb250ZXh0YCBob29rcykuICovXG5mdW5jdGlvbiByZXN1bWVDb250ZXh0RnJvbVJ1bihydW46IFdvcmtmbG93UnVuKTogSG9va1Jlc3VtZUNvbnRleHQge1xuICBjb25zdCBjb3JlVmVyc2lvbiA9IHJ1bi5leGVjdXRpb25Db250ZXh0Py53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICBjb25zdCB0cmFjZUNhcnJpZXIgPSBydW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyO1xuICBjb25zdCBob29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcnVuLmV4ZWN1dGlvbkNvbnRleHQ/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gIHJldHVybiB7XG4gICAgZGVwbG95bWVudElkOiBydW4uZGVwbG95bWVudElkLFxuICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICBydW5TcGVjVmVyc2lvbjogcnVuLnNwZWNWZXJzaW9uLFxuICAgIHdvcmtmbG93Q29yZVZlcnNpb246XG4gICAgICB0eXBlb2YgY29yZVZlcnNpb24gPT09ICdzdHJpbmcnID8gY29yZVZlcnNpb24gOiB1bmRlZmluZWQsXG4gICAgdHJhY2VDYXJyaWVyOlxuICAgICAgdHJhY2VDYXJyaWVyICYmIHR5cGVvZiB0cmFjZUNhcnJpZXIgPT09ICdvYmplY3QnXG4gICAgICAgID8gKHRyYWNlQ2FycmllciBhcyBIb29rUmVzdW1lQ29udGV4dFsndHJhY2VDYXJyaWVyJ10pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIGVuY3J5cHRpb25QdWJsaWNLZXk6IHJ1bi5lbmNyeXB0aW9uUHVibGljS2V5LFxuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb246XG4gICAgICB0eXBlb2YgaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9PT0gJ251bWJlcidcbiAgICAgICAgPyBob29rUmVzdW1lSW5wdXRWZXJzaW9uXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgcmVzdW1lIGNvbnRleHQgZm9yIGEgaG9vay4gVXNlcyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCB3aGVuXG4gKiBwcmVzZW50IChmYXN0IHBhdGgsIG5vIHJ1biByZWFkKTsgb3RoZXJ3aXNlIGZldGNoZXMgdGhlIHJ1biBhbmQgc3ludGhlc2l6ZXNcbiAqIGl0LiBEb2VzIE5PVCByZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleTsgY2FsbGVycyBkbyB0aGF0IHNlcGFyYXRlbHkuIE9ubHlcbiAqIHRoZSBmYWxsYmFjayBwYXRoIGNhbiBnYXRlIGtleSB3b3JrIGJlaGluZCBhIGxvY2FsIHRlcm1pbmFsLXJ1biBjaGVjayAoaXRcbiAqIGhhcyB0aGUgZmV0Y2hlZCBydW4pOyB0aGUgZmFzdCBwYXRoJ3Mgc3RvcmVkIGNvbnRleHQgY2FycmllcyBubyBzdGF0dXMsIHNvXG4gKiBzZWFsL3NlcmlhbGl6YXRpb24gd29yayBtYXkgcnVuIGJlZm9yZSB0aGUgcmVjZWl2aW5nIHNpZGUgcmVqZWN0c1xuICogYGhvb2tfcmVjZWl2ZWRgIGZvciBhbiBlbmRlZCBydW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIb29rUmVzdW1lSW5mbyhob29rOiBIb29rKTogUHJvbWlzZTxIb29rUmVzdW1lSW5mbz4ge1xuICBpZiAoaG9vay5yZXN1bWVDb250ZXh0KSB7XG4gICAgcmV0dXJuIHsgcmVzdW1lQ29udGV4dDogaG9vay5yZXN1bWVDb250ZXh0LCBzb3VyY2U6ICdob29rJyB9O1xuICB9XG4gIGNvbnN0IHJ1biA9IGF3YWl0IChhd2FpdCBnZXRXb3JsZExhenkoKSkucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gIHJldHVybiB7XG4gICAgcmVzdW1lQ29udGV4dDogcmVzdW1lQ29udGV4dEZyb21SdW4ocnVuKSxcbiAgICBzb3VyY2U6ICdydW5fZmFsbGJhY2snLFxuICAgIHJ1bixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBydW4ncyBzeW1tZXRyaWMga2V5IGZvciBhIHBheWxvYWQgV1JJVEUsIGFzIGEgYmFyZSBgQ3J5cHRvS2V5YFxuICogKGBpbXBvcnRLZXlgKTogdGhlIGBlbmNyYCB3cml0ZSBmYWxsYmFjayB1c2VkIHdoZW4gdGhlIHJ1biBwdWJsaXNoZWQgbm9cbiAqIHB1YmxpYyBrZXkgdG8gc2VhbCB0by4gV3JpdGluZyBuZWVkcyBvbmx5IHRoZSBBRVMga2V5LCBub3QgdGhlIHJlYWQtc2lkZVxuICoga2V5cGFpci4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIG5lZWRzIG9ubHkgYHJ1bklkYCArIGBkZXBsb3ltZW50SWRgIChubyBydW5cbiAqIGVudGl0eSk7IG9uIHRoZSBmYWxsYmFjayBwYXRoIHRoZSBhbHJlYWR5IGZldGNoZWQgcnVuIGlzIHJldXNlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KFxuICBob29rOiBIb29rLFxuICBpbmZvOiBIb29rUmVzdW1lSW5mb1xuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGltcG9ydEtleT4+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgPyBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaW5mby5ydW4pXG4gICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaG9vay5ydW5JZCwge1xuICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICB9KTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICBob29rOiBIb29rO1xuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xufT4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbik7XG5cbiAgLy8gT25seSBhIGhvb2sgdGhhdCBhY3R1YWxseSBjYXJyaWVzIG1ldGFkYXRhIG5lZWRzIHRoZSBydW4ncyBrZXkgcmVzb2x2ZWRcbiAgLy8gaGVyZTogaHlkcmF0aW5nIHRoYXQgbWV0YWRhdGEgaXMgYSBSRUFELCBzbyBkZXJpdmUgdGhlIGZ1bGwgUnVuUGF5bG9hZEtleXNcbiAgLy8gKHdoaWNoIG9wZW5zIHNlYWxlZCBgZW5jcGAgbWV0YWRhdGEsIG5vdCBqdXN0IHN5bW1ldHJpYyBgZW5jcmApLiBUaGUgY29tbW9uXG4gIC8vIGRlZmF1bHQgd2ViaG9vayAoY3JlYXRlV2ViaG9vaygpIHdpdGggbm8gYHJlc3BvbmRXaXRoYCkgc3RvcmVzIG5vXG4gIC8vIG1ldGFkYXRhLCBzbyBpdCBza2lwcyB0aGlzIGVudGlyZWx5OiBubyB+MzUwbXMgYHJ1bi1rZXlgIEFQSSByb3VuZCB0cmlwLFxuICAvLyBhbmQsIGNydWNpYWxseSwgbm8gcmVzb2x2ZWQga2V5IGhhbmRlZCB0byBgcmVzdW1lSG9va2AsIGxlYXZpbmcgaXQgZnJlZSB0b1xuICAvLyBzZWFsIHRoZSBwYXlsb2FkIHRvIHRoZSBydW4ncyBwdWJsaXNoZWQgcHVibGljIGtleSBpbnN0ZWFkLiBNZXRhZGF0YS1cbiAgLy8gYmVhcmluZyB3ZWJob29rcyBzdGlsbCBsZWdpdGltYXRlbHkgcGF5IG9uZSBsb29rdXAgdG8gaHlkcmF0ZS5cbiAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vay5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUhvb2tSZXN1bWVJbmZvKGhvb2spO1xuICAgIC8vIE9uIHRoZSBmYXN0IHBhdGggdGhpcyByZXNvbHZlcyB0aGUga2V5IGJ5IHJ1bklkICsgZGVwbG95bWVudElkIChubyBydW5cbiAgICAvLyByZWFkKTsgb24gdGhlIGZhbGxiYWNrIHBhdGggaXQgcmV1c2VzIHRoZSBhbHJlYWR5LWZldGNoZWQgcnVuLlxuICAgIGNvbnN0IHJhd0tleSA9IGluZm8ucnVuXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihpbmZvLnJ1bilcbiAgICAgIDogYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhvb2sucnVuSWQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQ6IGluZm8ucmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgIH0pO1xuICAgIGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgIGhvb2subWV0YWRhdGEgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgIGhvb2subWV0YWRhdGEgYXMgYW55LFxuICAgICAgaG9vay5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXlcbiAgICApO1xuICB9XG4gIHJldHVybiB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGhvb2sgYnkgdG9rZW4gdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgaHlkcmF0ZSB0aGUgYG1ldGFkYXRhYCBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGZyb20gd2l0aGluXG4gKiB0aGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEEgSG9vayBrZXB0IGJ5IG1pbmltdW0gcmV0ZW50aW9uIHJlbWFpbnMgYXZhaWxhYmxlIGhlcmUgYWZ0ZXIgaXRzIHJ1biBlbmRzLFxuICogYnV0IGNhbm5vdCBiZSByZXN1bWVkLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgY29uc3QgeyBob29rIH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuICByZXR1cm4gaG9vaztcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayByZXN1bWVIb29rfTogYSB7QGxpbmsgSG9va30gYXVnbWVudGVkIHdpdGggYW4gb3B0aW9uYWxcbiAqIHJlc2lsaWVuY2Ugc2lnbmFsLlxuICpcbiAqIE9uIHRoZSBwYXJhbGxlbCBmYXN0IHBhdGgsIGByZXN1bWVIb29rKClgIHdyaXRlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IGFuZFxuICogZGlzcGF0Y2hlcyB0aGUgd29ya2Zsb3cgcXVldWUgbWVzc2FnZSBjb25jdXJyZW50bHkuIFdoZW4gdGhlIGRpcmVjdCBldmVudFxuICogd3JpdGUgZmFpbHMgKnRyYW5zaWVudGx5KiAoYSA0MjkvNXh4LCBhIHRyYW5zcG9ydCBlcnJvciwgb3IgYW4gZXhwZWN0ZWRcbiAqIGAocnVuSWQsIHJlc3VtZUlkKWAgY29uZmxpY3Qgd2l0aCBpdHMgb3duIHJlLWVuc3VyaW5nIGNvbnN1bWVyKSBidXQgdGhlIHF1ZXVlXG4gKiBkaXNwYXRjaCBzdWNjZWVkcywgdGhlIHJlc3VtZSBpcyBzdGlsbCBndWFyYW50ZWVkOiB0aGUgcXVldWUgY29uc3VtZXJcbiAqIGlkZW1wb3RlbnRseSBtYXRlcmlhbGl6ZXMgdGhlIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIHRoZSBwYXlsb2FkIGNhcnJpZWRcbiAqIG9uIHRoZSBtZXNzYWdlIGJlZm9yZSByZXBsYXkuIEluIHRoYXQgcmVjb3ZlcmVkIGNhc2UgdGhlIHJldHVybmVkIGhvb2sgY2Fycmllc1xuICogYHJlc2lsaWVudFJlc3VtZTogdHJ1ZWAuXG4gKlxuICogT24gdGhlIGhhcHB5IHBhdGggKHRoZSBkaXJlY3Qgd3JpdGUgbGFuZGVkKSBhbmQgb24gdGhlIHNlcXVlbnRpYWwgZmFsbGJhY2tcbiAqIHBhdGgsIHRoZSBmbGFnIGlzIGFic2VudCAoYHVuZGVmaW5lZGApLiBDYWxsZXJzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCB0aGVcbiAqIGRpc3RpbmN0aW9uIGNhbiB0cmVhdCB0aGUgcmVzdWx0IGFzIGEgcGxhaW4ge0BsaW5rIEhvb2t9LlxuICovXG5leHBvcnQgdHlwZSBSZXN1bWVkSG9vayA9IEhvb2sgJiB7IHJlc2lsaWVudFJlc3VtZT86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Pckhvb2sgLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rLCBvciB0aGUgaG9vayBvYmplY3QgaXRzZWxmXG4gKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBkYXRhIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHtAbGluayBSZXN1bWVkSG9va31cbiAqIEB0aHJvd3Mge0hvb2tOb3RGb3VuZEVycm9yfSBJZiB0aGUgSG9vayBkb2VzIG5vdCBleGlzdCBvciBpdHMgcnVuIGhhcyBlbmRlZFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lSG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgeyB0b2tlbiwgZGF0YSB9ID0gYXdhaXQgcmVxdWVzdC5qc29uKCk7XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZXN1bWVIb29rKHRva2VuLCBkYXRhKTtcbiAqICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IHJ1bklkOiBob29rLnJ1bklkIH0pO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0hvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVIb29rPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlPzogUGF5bG9hZEtleVxuKTogUHJvbWlzZTxSZXN1bWVkSG9vaz4ge1xuICAvLyBQdWJsaWMgZW50cnkgcG9pbnQuIEl0IG5ldmVyIGF0dGVzdHMgaG9vayBmcmVzaG5lc3MsIHNvIGEgSG9vayBvYmplY3RcbiAgLy8gc3VwcGxpZWQgaGVyZSAod2hpY2ggbWF5IGNhcnJ5IGEgYHJlc3VtZUNhcGFiaWxpdGllc2AgY2FjaGVkIGJlZm9yZSBhXG4gIC8vIHNlcnZlciByb2xsYmFjayBvciBraWxsIHN3aXRjaCkgaXMgaWdub3JlZCBieSB0aGUgZHluYW1pYy1kZWR1cCBnYXRlIGFuZFxuICAvLyBmYWlscyBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC4gT25seSBgcmVzdW1lV2ViaG9va2AsIHdoaWNoIGZldGNoZXNcbiAgLy8gdGhlIGhvb2sgYnkgdG9rZW4gaW4tbGluZSBkdXJpbmcgdGhlIHNhbWUgcmVzdW1lLCByZWFjaGVzIHRoZSBpbnRlcm5hbFxuICAvLyBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBmcmVzaCBhdHRlc3RhdGlvbiBzZXQuIEtlZXBpbmcgdGhlIGZyZXNobmVzcyBmbGFnXG4gIC8vIG9mZiB0aGUgZXhwb3J0ZWQgc2lnbmF0dXJlIHByZXZlbnRzIGEgY2FsbGVyIGZyb20gcGFzc2luZyBhIHN0YWxlIEhvb2sgcGx1c1xuICAvLyBgdHJ1ZWAgYW5kIHJlYWN0aXZhdGluZyBkeW5hbWljIGRlZHVwIGFnYWluc3QgYSByb2xsZWQtYmFjayBiYWNrZW5kLlxuICAvL1xuICAvLyBUMCBvZiB0aGUgaG9vay1yZXN1bWUgVFRSIHdpbmRvdyBpcyB0YWtlbiBIRVJFLCBhdCB0aGUgcHVibGljIGVudHJ5IHBvaW50LFxuICAvLyByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uOyBzZWUgdGhlIHBhcmFtZXRlcidzIGRvYyBjb21tZW50LlxuICByZXR1cm4gcmVzdW1lSG9va0ltcGwoXG4gICAgdG9rZW5Pckhvb2ssXG4gICAgcGF5bG9hZCxcbiAgICBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUsXG4gICAgZmFsc2UsXG4gICAgRGF0ZS5ub3coKVxuICApO1xufVxuXG4vKipcbiAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayByZXN1bWVIb29rfS4gTk9UIGV4cG9ydGVkOiB0aGVcbiAqIGBob29rRnJlc2hseUxvb2tlZFVwYCBhdHRlc3RhdGlvbiBtdXN0IG5ldmVyIGJlIHJlYWNoYWJsZSBieSBwdWJsaWMgY2FsbGVyc1xuICogKHNlZSB0aGUgd3JhcHBlciBhYm92ZSkuXG4gKlxuICogQHBhcmFtIGhvb2tGcmVzaGx5TG9va2VkVXAgLSBBdHRlc3RzIHRoYXQgYSBzdXBwbGllZCBIb29rIG9iamVjdCB3YXMgZmV0Y2hlZFxuICogICBieSB0b2tlbiBkdXJpbmcgVEhJUyByZXN1bWUsIHNvIGl0cyByZXNwb25zZS1vbmx5IGByZXN1bWVDYXBhYmlsaXRpZXNgXG4gKiAgIHJlZmxlY3RzIHRoZSBsaXZlIGJhY2tlbmQgYW5kIG1heSBiZSB0cnVzdGVkIGZvciB0aGUgZHluYW1pYy1kZWR1cCBnYXRlLlxuICogICBBIHRva2VuIHN0cmluZyBpcyBhbHdheXMgZmV0Y2hlZCBmcmVzaCBoZXJlLCBzbyBpdCBpcyBpbXBsaWNpdGx5IGZyZXNoLlxuICogQHBhcmFtIHJlc3VtZVJlcXVlc3RlZEF0TXMgLSBUMCBvZiB0aGUgaG9vay1yZXN1bWUgVFRSIHdpbmRvdyAoc2VlXG4gKiAgIHJ1bnRpbWUvcmVzdW1lLWxhdGVuY3kudHMpLCBzdGFtcGVkIGJ5IHRoZSBQVUJMSUMgZW50cnkgcG9pbnQgdGhlIGNhbGxlclxuICogICB1c2VkLiBJdCBpcyBhIHBhcmFtZXRlciByYXRoZXIgdGhhbiBhIGxvY2FsIGJlY2F1c2UgYHJlc3VtZVdlYmhvb2tgIGRvZXNcbiAqICAgcmVhbCB3b3JrIGJlZm9yZSBpdCBnZXRzIGhlcmUgKHRoZSBieS10b2tlbiBsb29rdXAsIHRoZSBydW4ta2V5XG4gKiAgIHJlc29sdXRpb24gdGhhdCBoeWRyYXRlcyBob29rIG1ldGFkYXRhLCBhbmQgdGhlIGByZXNwb25kV2l0aGAgc2V0dXApIGFuZFxuICogICBzdGFtcGluZyBsb2NhbGx5IHdvdWxkIHNpbGVudGx5IGV4Y2x1ZGUgYWxsIG9mIGl0LCBzbyB0aGUgdHdvIGVudHJ5IHBvaW50c1xuICogICB3b3VsZCByZXBvcnQgdGhlIHNhbWUgbWV0cmljIG92ZXIgZGlmZmVyZW50IHdpbmRvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc3VtZUhvb2tJbXBsPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlOiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICBob29rRnJlc2hseUxvb2tlZFVwOiBib29sZWFuLFxuICByZXN1bWVSZXF1ZXN0ZWRBdE1zOiBudW1iZXJcbik6IFByb21pc2U8UmVzdW1lZEhvb2s+IHtcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gdHJhY2UoJ2hvb2sucmVzdW1lJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1cHBsaWVkVG9rZW4gPSB0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnO1xuICAgICAgICBjb25zdCBob29rOiBIb29rID0gc3VwcGxpZWRUb2tlblxuICAgICAgICAgID8gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbk9ySG9vaylcbiAgICAgICAgICA6IHRva2VuT3JIb29rO1xuICAgICAgICAvLyBUaGUgZHluYW1pYywgcmVzcG9uc2Utb25seSBgcmVzdW1lQ2FwYWJpbGl0aWVzYCBtYXkgb25seSBiZSB0cnVzdGVkXG4gICAgICAgIC8vIHdoZW4gaXQgY2FtZSBmcm9tIGEgYnktdG9rZW4gbG9va3VwIHBlcmZvcm1lZCBkdXJpbmcgdGhpcyByZXN1bWUuXG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaCA9XG4gICAgICAgICAgc3VwcGxpZWRUb2tlbiB8fCBob29rRnJlc2hseUxvb2tlZFVwO1xuXG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlSG9va1Jlc3VtZUluZm8oaG9vayk7XG4gICAgICAgIGNvbnN0IHsgcmVzdW1lQ29udGV4dCB9ID0gaW5mbztcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9jb250ZXh0X3NvdXJjZSc6IGluZm8uc291cmNlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCBpbnRlbnRpb25hbGx5IG9taXRzIHRoZSBydW4ncyBtdXRhYmxlXG4gICAgICAgIC8vIHN0YXR1cywgc28gdGhpcyBlYXJseSBjbGllbnQtc2lkZSByZWplY3Rpb24gb25seSBydW5zIG9uIHRoZVxuICAgICAgICAvLyBmYWxsYmFjayBwYXRoICh3aGljaCBmZXRjaGVkIHRoZSBydW4pLiBPbiB0aGUgZmFzdCBwYXRoIHRoZSB0ZXJtaW5hbFxuICAgICAgICAvLyBjaGVjayBoYXBwZW5zIHNlcnZlci1zaWRlOiBgaG9va19yZWNlaXZlZGAgYWdhaW5zdCBhbiBlbmRlZCBydW4gaXNcbiAgICAgICAgLy8gcmVqZWN0ZWQsIHdoaWNoIHRoZSBjYXRjaCBhcm91bmQgYHdvcmxkLmV2ZW50cy5jcmVhdGVgIGJlbG93IHJlLWtleXNcbiAgICAgICAgLy8gdG8gSG9va05vdEZvdW5kRXJyb3I6IHNhbWUgcHVibGljIGNvbnRyYWN0LCBubyBydW4gcHJlLWZldGNoLlxuICAgICAgICBpZiAoaW5mby5ydW4gJiYgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKGluZm8ucnVuLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LCBhbmQgcnVucyBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAvLyBieXRlLXN0cmVhbSBmcmFtaW5nIHN1cHBvcnQgY2Fubm90IGRlY29kZSBmcmFtZWQgYnl0ZSBzdHJlYW1zLlxuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gICAgICAgICAgcmVzdW1lQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgcGF5bG9hZCBmb3IgdGhlIHRhcmdldCBydW4gKGEgV1JJVEUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBQcmVmZXJyZWQgcGF0aDogc2VhbCB0byB0aGUgcnVuJ3MgcHVibGlzaGVkIFgyNTUxOSBwdWJsaWMga2V5LCB3aGljaFxuICAgICAgICAvLyB0aGUgc3RvcmVkIGByZXN1bWVDb250ZXh0YCBjYXJyaWVzIGlubGluZS4gT24gdGhlIGZhc3QgcGF0aCB0aGlzIGlzXG4gICAgICAgIC8vIHRoZSB3aG9sZSB3aW46IG5vIHJ1biByZWFkIEFORCBubyBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAsIHdob3NlXG4gICAgICAgIC8vIH4zNTBtcyBgcnVuLWtleWAgQVBJIHJvdW5kIHRyaXAgZG9taW5hdGVzIGNyb3NzLWRlcGxveW1lbnQgaG9va1xuICAgICAgICAvLyByZXN1bXB0aW9uIGxhdGVuY3kuIChPbiB0aGUgZmFsbGJhY2sgcGF0aCB0aGUga2V5IGlzIHN5bnRoZXNpemVkXG4gICAgICAgIC8vIGZyb20gdGhlIGZldGNoZWQgcnVuLCB3aGljaCBhbHNvIGNhcnJpZXMgaXQuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWFsaW5nIGFsc28gZHJvcHMgcHJpdmlsZWdlOiB0aGUgcmVzdW1lciBlbmRzIHVwIGFibGUgdG8gd3JpdGUgYVxuICAgICAgICAvLyBwYXlsb2FkIGZvciB0aGUgcnVuIHdpdGhvdXQgYmVpbmcgYWJsZSB0byByZWFkIGFueXRoaW5nIG9mIHRoZVxuICAgICAgICAvLyBydW4ncywgd2hlcmUgZmV0Y2hpbmcgdGhlIHN5bW1ldHJpYyBrZXkgZ3JhbnRzIGJvdGguXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERlbGliZXJhdGVseSBOT1QgZ2F0ZWQgb24gYGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzYCB0aGUgd2F5XG4gICAgICAgIC8vIHRoZSBzeW1tZXRyaWMgZmFsbGJhY2sgYmVsb3cgZ2F0ZXMgYGVuY3JgOiBwcmVzZW5jZSBvZiB0aGUgcHVibGljIGtleVxuICAgICAgICAvLyBpcyBpdHNlbGYgdGhlIGdhdGUuIEEgcnVuIG9ubHkgY2FycmllcyBvbmUgaWYgdGhlIHJ1bnRpbWUgdGhhdFxuICAgICAgICAvLyBjcmVhdGVkIGl0IGNvdWxkIGFsc28gb3BlbiBhIHNlYWxlZCBwYXlsb2FkLCBhbmQgcnVucyBhcmUgcGlubmVkIHRvXG4gICAgICAgIC8vIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsIHNvIHByZXNlbmNlIGlzIGEgbW9yZSByZWxpYWJsZSBhdHRlc3RhdGlvblxuICAgICAgICAvLyB0aGFuIGEgdmVyc2lvbiBjb21wYXJlLCBhbmQgaXQgc3RheXMgY29ycmVjdCBldmVuIHdoZW4gcGFja2FnZVxuICAgICAgICAvLyB2ZXJzaW9ucyBkcmlmdC5cbiAgICAgICAgbGV0IHBheWxvYWRLZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHJ1blB1YmxpY0tleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZVxuICAgICAgICAgID8gLy8gVGhlIGNhbGxlciBhbHJlYWR5IGhvbGRzIGEga2V5IChyZXN1bWVXZWJob29rIHJlc29sdmVkIG9uZSB0b1xuICAgICAgICAgICAgLy8gaHlkcmF0ZSBob29rIG1ldGFkYXRhKSwgc28gc2VhbGluZyB3b3VsZCBhZGQgYW4gRUNESCBmb3Igbm9cbiAgICAgICAgICAgIC8vIHNhdmVkIHJvdW5kIHRyaXAuIFJldXNlIHdoYXQgaXQgcmVzb2x2ZWQuXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICA6IGRlY29kZVJ1blB1YmxpY0tleShyZXN1bWVDb250ZXh0LmVuY3J5cHRpb25QdWJsaWNLZXkpO1xuXG4gICAgICAgIGlmIChydW5QdWJsaWNLZXkpIHtcbiAgICAgICAgICBwYXlsb2FkS2V5ID0gc2VhbFRvKHJ1blB1YmxpY0tleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3ltbWV0cmljIGBlbmNyYCB3cml0ZSBmYWxsYmFjazogbmVlZHMgb25seSB0aGUgQUVTIGtleVxuICAgICAgICAgIC8vIChhIGJhcmUgQ3J5cHRvS2V5IHZpYSBgcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5YCksIG5vdCB0aGVcbiAgICAgICAgICAvLyByZWFkLXNpZGUgUnVuUGF5bG9hZEtleXMuXG4gICAgICAgICAgbGV0IGVuY3J5cHRpb25LZXkgPVxuICAgICAgICAgICAgZW5jcnlwdGlvbktleU92ZXJyaWRlID8/XG4gICAgICAgICAgICAoYXdhaXQgcmVzb2x2ZUhvb2tFbmNyeXB0aW9uS2V5KGhvb2ssIGluZm8pKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF5bG9hZEtleSA9IGVuY3J5cHRpb25LZXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wcmVzcyBvbmx5IHdoZW4gdGhlIHRhcmdldCBydW4gYW5kIGl0cyBkZXBsb3ltZW50IHN1cHBvcnQgdGhlXG4gICAgICAgIC8vIGNvbXByZXNzaW9uIGZvcm1hdHMgaW50cm9kdWNlZCB3aXRoIHNwZWMgdmVyc2lvbiA1LlxuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgICAgKHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTiAmJlxuICAgICAgICAgIGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVApO1xuXG4gICAgICAgIC8vIERlaHlkcmF0ZSB0aGUgcGF5bG9hZCBmb3Igc3RvcmFnZVxuICAgICAgICBjb25zdCBvcHM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihob29rLnNwZWNWZXJzaW9uKTtcbiAgICAgICAgY29uc3QgZGVoeWRyYXRlZFBheWxvYWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgIHBheWxvYWRLZXksXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgdjFDb21wYXQsXG4gICAgICAgICAgY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZXNlIHBheWxvYWQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlXG4gICAgICAgIC8vIHByb21pc2UgaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZFxuICAgICAgICAvLyB3YWl0VW50aWwgcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSxcbiAgICAgICAgLy8gc28gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgIC8vIE5PVEU6IHJlamVjdGlvbnMgd2l0aCBgdW5kZWZpbmVkYCBhcmUgYW4gZXhwZWN0ZWQgYXJ0aWZhY3Qgb2YgdGhlXG4gICAgICAgIC8vIHdlYmhvb2sgYnVuZGxlIGFuZCBhcmUgaWdub3JlZCBlbnRpcmVseS5cbiAgICAgICAgc2FmZVdhaXRVbnRpbChQcm9taXNlLmFsbChvcHMpLCAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdCYWNrZ3JvdW5kIGZsdXNoIG9mIGhvb2sgcGF5bG9hZCBvcHMgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGluayB0byB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHN0b3JlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgIC8vIChza2lwcGVkIHdoZW4gYWJzZW50IG9yIGludmFsaWQpLiBSZXNvbHZlZCBiZWZvcmUgZGlzcGF0Y2ggc28gYm90aFxuICAgICAgICAvLyB0aGUgc2VxdWVudGlhbCBhbmQgcGFyYWxsZWwgcGF0aHMgYXR0YWNoIGl0LlxuICAgICAgICBjb25zdCBvcmlnaW5MaW5rID0gYXdhaXQgbGlua1RvVHJhY2VDYXJyaWVyKHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyKTtcbiAgICAgICAgaWYgKG9yaWdpbkxpbmspIHtcbiAgICAgICAgICBzcGFuPy5hZGRMaW5rPy4ob3JpZ2luTGluayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudERhdGEgPSB7XG4gICAgICAgICAgLi4uKHYxQ29tcGF0ID8ge30gOiB7IHRva2VuOiBob29rLnRva2VuIH0pLFxuICAgICAgICAgIHBheWxvYWQ6IGRlaHlkcmF0ZWRQYXlsb2FkLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHF1ZXVlTmFtZSA9IGdldFdvcmtmbG93UXVldWVOYW1lKHJlc3VtZUNvbnRleHQud29ya2Zsb3dOYW1lKTtcbiAgICAgICAgY29uc3QgcXVldWVPcHRpb25zID0ge1xuICAgICAgICAgIGRlcGxveW1lbnRJZDogcmVzdW1lQ29udGV4dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBwYXJhbGxlbGl6ZSB0aGUgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIGFuZCB0aGUgcXVldWVcbiAgICAgICAgLy8gcHVibGlzaC4gVGhlIGZhc3QgcGF0aCBpcyBvbmx5IHNhZmUgd2hlbiBFVkVSWSBwcmVjb25kaXRpb24gaG9sZHM7IHRoZVxuICAgICAgICAvLyBmaXJzdCB0aGF0IGZhaWxzIG5hbWVzIHRoZSBmYWxsYmFjayByZWFzb24gKGVtaXR0ZWQgYXMgYSBzcGFuXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBmb3Igb2JzZXJ2YWJpbGl0eSwgYW5kIHRvIG1ha2UgXCJ3aHkgZGlkIHRoaXMgcnVuIHNlcXVlbnRpYWxcIlxuICAgICAgICAvLyBhbnN3ZXJhYmxlIGluIHByb2R1Y3Rpb24pLiBBbGwgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gIC0ga2lsbCBzd2l0Y2g6IGBXT1JLRkxPV19ESVNBQkxFX0xBWllfSE9PS19SRVNVTUVgIGZvcmNlcyBzZXF1ZW50aWFsXG4gICAgICAgIC8vICAgIGlmIHRoZSBmYXN0IHBhdGggZXZlciBtaXNiZWhhdmVzLiBJdCBpcyBhbiBTREstZGVwbG95bWVudCBlbnYgdmFyLFxuICAgICAgICAvLyAgICBzbyBjaGFuZ2luZyBpdCBnZW5lcmFsbHkgcmVxdWlyZXMgcmVkZXBsb3lpbmcgdGhlIHdvcmtmbG93XG4gICAgICAgIC8vICAgIGRlcGxveW1lbnQuIChUaGUgYmFja2VuZCBjYW4gaW5kZXBlbmRlbnRseSBkcm9wIG5ldyByZXN1bWVzIHRvIHRoZVxuICAgICAgICAvLyAgICBzZXF1ZW50aWFsIHBhdGggZmxlZXQtd2lkZSBieSBjZWFzaW5nIHRvIGF0dGVzdCBkZWR1cCBzdXBwb3J0IG9uXG4gICAgICAgIC8vICAgIHRoZSBieS10b2tlbiBsb29rdXA7IHNlZSB0aGUgYmFja2VuZC1kZWR1cCBjb25kaXRpb24gYmVsb3cuKVxuICAgICAgICAvLyAgLSBiYWNrZW5kIGRlZHVwOiB0aGUgbGl2ZSBiYWNrZW5kIG11c3QgZW5mb3JjZSB0aGVcbiAgICAgICAgLy8gICAgYChydW5JZCwgcmVzdW1lSWQpYCBjb25zdHJhaW50LCBvciB0aGUgdHdvIHdyaXRlcnMgd291bGQgY29tbWl0IHR3b1xuICAgICAgICAvLyAgICBgaG9va19yZWNlaXZlZGAgZXZlbnRzLiBGYWlsIGNsb3NlZC4gQXR0ZXN0ZWQgYnkgRUlUSEVSIGEgZnJlc2gsXG4gICAgICAgIC8vICAgIHJlc3BvbnNlLW9ubHkgYGhvb2sucmVzdW1lQ2FwYWJpbGl0aWVzLmhvb2tSZXN1bWVEZWR1cFZlcnNpb25gIGZyb21cbiAgICAgICAgLy8gICAgdGhlIGJ5LXRva2VuIGxvb2t1cCAod29ybGQtdmVyY2VsOiByZWNvbXB1dGVkIGV2ZXJ5IHJlYWQsIHNvIGFcbiAgICAgICAgLy8gICAgc2VydmVyIHJvbGxiYWNrIG9yIGtpbGwgc3dpdGNoIGRyb3BzIHRvIHNlcXVlbnRpYWwgaW1tZWRpYXRlbHkpIE9SXG4gICAgICAgIC8vICAgIHRoZSBzdGF0aWMgYHdvcmxkLmNhcGFiaWxpdGllcy5ob29rUmVzdW1lRGVkdXBgICh3b3JsZC1sb2NhbCwgd2hvc2VcbiAgICAgICAgLy8gICAgYWRhcHRlciBhbmQgYmFja2VuZCBzaGlwIHRvZ2V0aGVyKS4gVGhlIHJlc3BvbnNlLW9ubHkgY2FwYWJpbGl0eSBpc1xuICAgICAgICAvLyAgICB0cnVzdGVkIE9OTFkgd2hlbiB0aGUgaG9vayB3YXMgbG9va2VkIHVwIGJ5IHRva2VuIGR1cmluZyB0aGlzXG4gICAgICAgIC8vICAgIHJlc3VtZSAoYGhvb2tSZXN1bWVDYXBhYmlsaXRpZXNBcmVGcmVzaGApOyBhIEhvb2sgb2JqZWN0IGhhbmRlZCBpblxuICAgICAgICAvLyAgICBieSBhIHB1YmxpYyBjYWxsZXIgbWF5IGNhcnJ5IGEgY2FwYWJpbGl0eSBjYWNoZWQgYmVmb3JlIGEgcm9sbGJhY2ssXG4gICAgICAgIC8vICAgIHNvIGl0IGlzIGlnbm9yZWQgYW5kIHRoZSBwYXRoIGZhbGxzIGJhY2sgdG8gc2VxdWVudGlhbC5cbiAgICAgICAgLy8gIC0gY29uc3VtZXIgc3VwcG9ydDogdGhlIHRhcmdldCBydW4ncyBkZXBsb3ltZW50IG11c3QgcmUtZW5zdXJlIHRoZVxuICAgICAgICAvLyAgICBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQXR0ZXN0ZWQgYnkgdGhlIHJ1bidzIGV4cGxpY2l0XG4gICAgICAgIC8vICAgIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCBleGVjdXRpb24tY29udGV4dCBtYXJrZXIgKG1pcnJvcmVkIG9udG9cbiAgICAgICAgLy8gICAgcmVzdW1lQ29udGV4dCksIE5PVCBhIHZlcnNpb24tY29tcGFyZSBhZ2FpbnN0IGEgcHJlZGljdGVkIHJlbGVhc2VcbiAgICAgICAgLy8gICAgY3V0b2ZmLiBBYnNlbnQg4oaSIGEgbG9zdCBwcm9kdWNlciB3cml0ZSB3b3VsZCBiZSBhIGxvc3QgcmVzdW1lLlxuICAgICAgICAvLyAgLSBub3QgbGVnYWN5OiB2MUNvbXBhdCBydW5zIG9taXQgYHRva2VuYCBmcm9tIHRoZSBwcm9kdWNlcidzIGV2ZW50XG4gICAgICAgIC8vICAgIGJvZHkgYnV0IHRoZSBjb25zdW1lcidzIHJlLWVuc3VyZSBhbHdheXMgaW5jbHVkZXMgaXQsIHNvIHRoZSB0d29cbiAgICAgICAgLy8gICAgd3JpdGVycyB3b3VsZCBkaXNhZ3JlZSBvbiB0aGUgZXZlbnQgYm9keS4gTGVnYWN5IHN0YXlzIHNlcXVlbnRpYWwuXG4gICAgICAgIC8vICAtIENCT1IgdHJhbnNwb3J0OiB0aGUgcnVuIG11c3QgdXNlIENCT1IgcXVldWUgdHJhbnNwb3J0IHNvIHRoZSBiaW5hcnlcbiAgICAgICAgLy8gICAgcGF5bG9hZCBzdXJ2aXZlcyB0aGUgcXVldWUgbWVzc2FnZS5cbiAgICAgICAgLy8gIC0gcmF3IGJ5dGVzOiB0aGUgZGVoeWRyYXRlZCBwYXlsb2FkIG11c3QgYmUgYSBgVWludDhBcnJheWAgKHRoZVxuICAgICAgICAvLyAgICBjb250ZW50IGRpZ2VzdCB0aGF0IGtleXMgdGhlIGRlZHVwIGNvbnN0cmFpbnQgaXMgb3ZlciB0aGVzZSBieXRlcykuXG4gICAgICAgIC8vICAtIHNpemU6IGEgcGF5bG9hZCBhYm92ZSB0aGUgcXVldWUncyBtZXNzYWdlIGNlaWxpbmcgd291bGQgZmFpbCB0aGVcbiAgICAgICAgLy8gICAgcHVibGlzaCAod2hpY2gsIG9uIHRoZSBwYXJhbGxlbCBwYXRoLCB3b3VsZCBwZXJzaXN0IHRoZSBldmVudCBidXRcbiAgICAgICAgLy8gICAgbmV2ZXIgcmUtdHJpZ2dlciB0aGUgcnVuKSwgc28gb3ZlcnNpemVkIHBheWxvYWRzIHN0YXkgc2VxdWVudGlhbFxuICAgICAgICAvLyAgICAodGhlaXIgcXVldWUgbWVzc2FnZSBjYXJyaWVzIG9ubHkgdGhlIHJ1biBJRCkuXG4gICAgICAgIGNvbnN0IHBhcmFsbGVsUmVzdW1lRGlzYWJsZWQgPVxuICAgICAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX0RJU0FCTEVfTEFaWV9IT09LX1JFU1VNRSA9PT0gJzEnO1xuICAgICAgICAvLyBCYWNrZW5kIGRlZHVwIGlzIHN1cHBvcnRlZCB3aGVuIEVJVEhFUiB0aGUgbGl2ZSBzZXJ2ZXIgYXR0ZXN0cyBpdFxuICAgICAgICAvLyBmcmVzaCBvbiB0aGlzIGJ5LXRva2VuIGhvb2sgKHdvcmxkLXZlcmNlbDogcmVzcG9uc2Utb25seSwgcmVjb21wdXRlZFxuICAgICAgICAvLyBldmVyeSByZWFkLCBzbyByb2xsYmFjay9raWxsLXN3aXRjaCB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseSkgT1IgdGhlXG4gICAgICAgIC8vIHN0YXRpYyB3b3JsZCBjYXBhYmlsaXR5IGlzIHNldCAod29ybGQtbG9jYWw6IGFkYXB0ZXIgKyBiYWNrZW5kIHNoaXBcbiAgICAgICAgLy8gdG9nZXRoZXIpLiBCb3RoIGFyZSByZS1ldmFsdWF0ZWQgcGVyIHJlc3VtZSwgc28gZXZlcnkgcm9sbG91dCBhbmRcbiAgICAgICAgLy8gcm9sbGJhY2sgZGlyZWN0aW9uIGRlZ3JhZGVzIHNhZmVseSB0byB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICBjb25zdCBiYWNrZW5kRGVkdXBTdXBwb3J0ZWQgPVxuICAgICAgICAgIChob29rUmVzdW1lQ2FwYWJpbGl0aWVzQXJlRnJlc2hcbiAgICAgICAgICAgID8gKGhvb2sucmVzdW1lQ2FwYWJpbGl0aWVzPy5ob29rUmVzdW1lRGVkdXBWZXJzaW9uID8/IDApXG4gICAgICAgICAgICA6IDApID49IEhPT0tfUkVTVU1FX0RFRFVQX1ZFUlNJT04gfHxcbiAgICAgICAgICB3b3JsZC5jYXBhYmlsaXRpZXM/Lmhvb2tSZXN1bWVEZWR1cCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tSZWFzb246IHN0cmluZyB8IG51bGwgPSBwYXJhbGxlbFJlc3VtZURpc2FibGVkXG4gICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgOiAhYmFja2VuZERlZHVwU3VwcG9ydGVkXG4gICAgICAgICAgICA/ICdiYWNrZW5kX3Vuc3VwcG9ydGVkJ1xuICAgICAgICAgICAgOiAocmVzdW1lQ29udGV4dC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uID8/IDApIDxcbiAgICAgICAgICAgICAgICBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OXG4gICAgICAgICAgICAgID8gJ2NvbnN1bWVyX3Vuc3VwcG9ydGVkJ1xuICAgICAgICAgICAgICA6IHYxQ29tcGF0XG4gICAgICAgICAgICAgICAgPyAnbGVnYWN5J1xuICAgICAgICAgICAgICAgIDogKHJlc3VtZUNvbnRleHQucnVuU3BlY1ZlcnNpb24gPz8gMCkgPFxuICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlRcbiAgICAgICAgICAgICAgICAgID8gJ25vbl9jYm9yX3RyYW5zcG9ydCdcbiAgICAgICAgICAgICAgICAgIDogIShkZWh5ZHJhdGVkUGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpXG4gICAgICAgICAgICAgICAgICAgID8gJ25vbl9ieXRlcydcbiAgICAgICAgICAgICAgICAgICAgOiBkZWh5ZHJhdGVkUGF5bG9hZC5ieXRlTGVuZ3RoID5cbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTkxJTkVfUkVTVU1FX1BBWUxPQURfQllURVNcbiAgICAgICAgICAgICAgICAgICAgICA/ICdvdmVyc2l6ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCB1c2VQYXJhbGxlbFJlc3VtZSA9IGZhbGxiYWNrUmVhc29uID09PSBudWxsO1xuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9zdHJhdGVneSc6IHVzZVBhcmFsbGVsUmVzdW1lXG4gICAgICAgICAgICA/ICdwYXJhbGxlbCdcbiAgICAgICAgICAgIDogJ3NlcXVlbnRpYWwnLFxuICAgICAgICAgIC4uLihmYWxsYmFja1JlYXNvblxuICAgICAgICAgICAgPyB7ICd3b3JrZmxvdy5ob29rLnJlc3VtZV9mYWxsYmFja19yZWFzb24nOiBmYWxsYmFja1JlYXNvbiB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmUta2V5IGFueSBcImhvb2sgY2FuIG5vIGxvbmdlciBiZSByZWNlaXZlZFwiIHJlamVjdGlvbiB0b1xuICAgICAgICAvLyBIb29rTm90Rm91bmRFcnJvcihob29rLnRva2VuKSBzbyBgLnRva2VuYCBtYXRjaGVzIHRoZSBwcmUtZmFzdC1wYXRoXG4gICAgICAgIC8vIGNvbnRyYWN0LCB3aGVyZSByZXN1bWVIb29rIHRocmV3IGBIb29rTm90Rm91bmRFcnJvcihob29rLnRva2VuKWBcbiAgICAgICAgLy8gYWZ0ZXIgaXRzIG93biB0ZXJtaW5hbCBjaGVjay4gVGhlIHNwZWNpZmljIGVycm9yIGRlcGVuZHMgb24gdGhlXG4gICAgICAgIC8vIFdvcmxkOlxuICAgICAgICAvLyAgIC0gYSBnZW51aW5lbHkgbWlzc2luZyBob29rIG1hcHMgdG8gSG9va05vdEZvdW5kRXJyb3IgKGtleWVkIG9uIHRoZVxuICAgICAgICAvLyAgICAgZXZlbnQgY29ycmVsYXRpb25JZCAvIGhvb2sgSUQpO1xuICAgICAgICAvLyAgIC0gYSB0ZXJtaW5hbCBydW4gb24gVmVyY2VsIHJlamVjdHMgaG9va19yZWNlaXZlZCB3aXRoIDQwNCwgd2hpY2hcbiAgICAgICAgLy8gICAgIHdvcmxkLXZlcmNlbCBtYXBzIHRvIEhvb2tOb3RGb3VuZEVycm9yO1xuICAgICAgICAvLyAgIC0gYSB0ZXJtaW5hbCBydW4gb24gd29ybGQtbG9jYWwgLyB3b3JsZC1wb3N0Z3JlcyByZWplY3RzIHdpdGhcbiAgICAgICAgLy8gICAgIFJ1bkV4cGlyZWRFcnJvci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT24gdGhlIFNFUVVFTlRJQUwgcGF0aCBhbiBFbnRpdHlDb25mbGljdEVycm9yIChIVFRQIDQwOSkgaXMgYWxzb1xuICAgICAgICAvLyB0cmVhdGVkIGFzIFwiaG9vayBnb25lXCIgZm9yIGhpc3RvcmljYWwgLyBjb25mbGljdC1zaGFwZWQtcmVqZWN0aW9uXG4gICAgICAgIC8vIGNvbXBhdGliaWxpdHk6IHRoZXJlIGlzIG5vIHF1ZXVlIG1lc3NhZ2UgaW4gZmxpZ2h0LCBzbyBhIGNvbmZsaWN0IGhhc1xuICAgICAgICAvLyBubyByZS1lbnN1cmluZyBjb25zdW1lciB0byBjb252ZXJnZSBvbi4gVGhlIFBBUkFMTEVMIHBhdGggaGFuZGxlcyA0MDlcbiAgICAgICAgLy8gZGlmZmVyZW50bHkgKHNlZSBiZWxvdyk6IGl0IHB1Ymxpc2hlZCB0aGUgcXVldWUgbWVzc2FnZSBiZWZvcmUgdGhlXG4gICAgICAgIC8vIGNvbmZsaWN0LCBzbyB0aGUgY29uc3VtZXIgd2lsbCBjb252ZXJnZSB0aGUgZXZlbnQuXG4gICAgICAgIGNvbnN0IGlzSG9va0dvbmVFcnJvciA9IChlcnI6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgICAgICAgSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpO1xuXG4gICAgICAgIGlmICghdXNlUGFyYWxsZWxSZXN1bWUpIHtcbiAgICAgICAgICAvLyBTZXF1ZW50aWFsIHBhdGg6IGNyZWF0ZSBhIGhvb2tfcmVjZWl2ZWQgZXZlbnQsIHRoZW4gcmUtdHJpZ2dlci5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmhvb2tJZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChpc0hvb2tHb25lRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVDEgb2YgdGhlIFRUUiB3aW5kb3cuIFN0YW1wZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwdWJsaXNoIHNvXG4gICAgICAgICAgLy8gYHByb2R1Y2VyX3ByZXBgIGNvdmVycyBleGFjdGx5IHRoZSB3b3JrIGFib3ZlIGl0IChob29rIGxvb2t1cCxcbiAgICAgICAgICAvLyBrZXkgcmVzb2x1dGlvbiwgc2VyaWFsaXphdGlvbiwgYW5kLCBvbiB0aGlzIHBhdGgsIHRoZSBhd2FpdGVkXG4gICAgICAgICAgLy8gYGhvb2tfcmVjZWl2ZWRgIHdyaXRlLCB3aGljaCBpcyBnZW51aW5lbHkgc2VyaWFsIGhlcmUpLlxuICAgICAgICAgIGNvbnN0IHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnF1ZXVlKFxuICAgICAgICAgICAgcXVldWVOYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXN1bWVDb250ZXh0LnRyYWNlQ2FycmllciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGhvb2tSZXN1bWVUaW1pbmc6IHtcbiAgICAgICAgICAgICAgICByZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgICAgICAgICAgICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6ICdzZXF1ZW50aWFsJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgICAgICAgICAgIHF1ZXVlT3B0aW9uc1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gaG9vaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcmFsbGVsIGZhc3QgcGF0aC4gQSBzdGFibGUgaWRlbXBvdGVuY3kga2V5IHRpZXMgdGhlIGRpcmVjdCB3cml0ZSB0b1xuICAgICAgICAvLyB0aGUgcXVldWUgY29uc3VtZXIncyByZS1lbnN1cmU7IHRoZSBwYXlsb2FkIGRpZ2VzdCBsZXRzIHRoZSBzZXJ2ZXJcbiAgICAgICAgLy8gZGV0ZWN0IGtleSByZXVzZSBhY3Jvc3MgYnl0ZS1pZGVudGljYWwgcGF5bG9hZHMuXG4gICAgICAgIGNvbnN0IHJlc3VtZUlkID0gZ2VuZXJhdGVSZXN1bWVJZCgpO1xuICAgICAgICBjb25zdCBwYXlsb2FkRGlnZXN0ID0gYXdhaXQgY29tcHV0ZVJlc3VtZVBheWxvYWREaWdlc3QoXG4gICAgICAgICAgZGVoeWRyYXRlZFBheWxvYWQgYXMgVWludDhBcnJheVxuICAgICAgICApO1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHsgJ3dvcmtmbG93Lmhvb2sucmVzdW1lX2lkJzogcmVzdW1lSWQgfSk7XG5cbiAgICAgICAgLy8gV3JhcHBlZCBpbiBhIHRodW5rIHB1cmVseSBzbyBUMSBvZiB0aGUgVFRSIHdpbmRvdyBpcyBzdGFtcGVkIGF0IHRoZVxuICAgICAgICAvLyBleGFjdCBpbnN0YW50IHRoZSBwdWJsaXNoIGlzIHJlcXVlc3RlZCwgYWZ0ZXIgdGhlIHJhY2luZ1xuICAgICAgICAvLyBgaG9va19yZWNlaXZlZGAgd3JpdGUgaGFzIGJlZW4ga2lja2VkIG9mZiwgd2hpY2ggaXMgd2hlcmUgdGhlXG4gICAgICAgIC8vIGFkZGl0aXZlIGBwcm9kdWNlcl9wcmVwYCBwaGFzZSBtdXN0IGVuZC4gVGhlIHR3byBjYWxscyBzdGlsbCBzdGFydFxuICAgICAgICAvLyBpbiB0aGUgc2FtZSB0dXJuIGFuZCByYWNlIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgICAgICBjb25zdCBwdWJsaXNoSW52b2NhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICByZXR1cm4gd29ybGQucXVldWUoXG4gICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJ1bklkOiBob29rLnJ1bklkLFxuICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJlc3VtZUNvbnRleHQudHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgaG9va0lucHV0OiB7XG4gICAgICAgICAgICAgICAgcmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgaG9va0lkOiBob29rLmhvb2tJZCxcbiAgICAgICAgICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBkZWh5ZHJhdGVkUGF5bG9hZCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgIC8vIERlcGxveW1lbnQgYWZmaW5pdHkgZm9yIHRoZSBjb25zdW1lcidzIGNoZWFwIHByZS13cml0ZVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrOiBsZXRzIGEgbWlzcm91dGVkIGRlbGl2ZXJ5IHJlLXJvdXRlIGJlZm9yZSBpdHNcbiAgICAgICAgICAgICAgICAvLyBob2lzdGVkIGhvb2tfcmVjZWl2ZWQgd3JpdGUgaW5zdGVhZCBvZiBhZnRlci5cbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJlc3VtZUNvbnRleHQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBob29rUmVzdW1lVGltaW5nOiB7XG4gICAgICAgICAgICAgICAgcmVzdW1lUmVxdWVzdGVkQXRNcyxcbiAgICAgICAgICAgICAgICBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zLFxuICAgICAgICAgICAgICAgIHN0cmF0ZWd5OiAncGFyYWxsZWwnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgICAgcXVldWVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgW2V2ZW50UmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmhvb2tJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgdjFDb21wYXQsIHJlc3VtZUlkLCByZXN1bWVQYXlsb2FkRGlnZXN0OiBwYXlsb2FkRGlnZXN0IH1cbiAgICAgICAgICApLFxuICAgICAgICAgIHB1Ymxpc2hJbnZvY2F0aW9uKCksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsOiB0aGUgcnVuIHdhcyBub3QgcmUtdHJpZ2dlcmVkLCBzbyBub1xuICAgICAgICAvLyBjb25zdW1lciB3aWxsIHJlLWVuc3VyZSB0aGUgZXZlbnQuXG4gICAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgd2hlbiB0aGUgZGlyZWN0IHdyaXRlIGRpZCBub3QgbGFuZCBidXQgdGhlIHF1ZXVlIGRpc3BhdGNoIGRpZCwgc29cbiAgICAgICAgLy8gdGhlIGNvbnN1bWVyIG1hdGVyaWFsaXplcyB0aGUgZXZlbnQgYmVmb3JlIHJlcGxheS4gU3VyZmFjZWQgdG8gdGhlXG4gICAgICAgIC8vIGNhbGxlciBhcyBgUmVzdW1lZEhvb2sucmVzaWxpZW50UmVzdW1lYCBhbmQgb24gdGhlIHNwYW4uXG4gICAgICAgIGxldCByZXNpbGllbnRSZXN1bWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGV2ZW50UmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGV2ZW50UmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICBpZiAoSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgLy8gVGhlIGhvb2sncyBydW4gaGFzIGdlbnVpbmVseSBlbmRlZDogc3VyZmFjZSB0aGUgc2FtZSBjb250cmFjdCBhc1xuICAgICAgICAgICAgLy8gdGhlIHNlcXVlbnRpYWwgcGF0aC4gVGhlIHF1ZXVlIG1lc3NhZ2UgYWxyZWFkeSB3ZW50IG91dCwgYnV0IHRoZVxuICAgICAgICAgICAgLy8gY29uc3VtZXIncyByZS1lbnN1cmUgd2lsbCBhbHNvIHJlamVjdCBhZ2FpbnN0IHRoZSB0ZXJtaW5hbCBydW5cbiAgICAgICAgICAgIC8vIGFuZCBuby1vcCwgc28gdGhlIHdvcmtmbG93IGRvZXMgbm90IHJlc3VtZS5cbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihob29rLnRva2VuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgLy8gUmVzaWxpZW50LiBUd28gc2hhcGVzIHJlYWNoIGhlcmUsIGJvdGggbm9uLXRlcm1pbmFsOlxuICAgICAgICAgICAgLy8gICAtIEVudGl0eUNvbmZsaWN0ICg0MDkpOiB0aGlzIHdyaXRlIHJhY2VkIGl0cyBvd24gcmUtZW5zdXJpbmdcbiAgICAgICAgICAgIC8vICAgICBjb25zdW1lciAob3IgYSByZWRyaXZlKSBvbiB0aGUgc2hhcmVkIGByZXN1bWVJZGA7IHRoZSBydW4gaXNcbiAgICAgICAgICAgIC8vICAgICBOT1QgZ29uZSwgYW5kIHRoZSBjb25zdW1lciBjb252ZXJnZXMgb24gdGhlIG9uZSBjb21taXR0ZWRcbiAgICAgICAgICAgIC8vICAgICBldmVudC4gVW5saWtlIHRoZSBzZXF1ZW50aWFsIHBhdGgsIGEgNDA5IGhlcmUgaXMgZXhwZWN0ZWRcbiAgICAgICAgICAgIC8vICAgICBjb25jdXJyZW5jeSwgbm90IGEgdmFuaXNoZWQgaG9vay5cbiAgICAgICAgICAgIC8vICAgLSA0MjkgLyA1eHggLyB0cmFuc3BvcnQ6IGEgdHJhbnNpZW50IGJhY2tlbmQgZmFpbHVyZS5cbiAgICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMgdGhlIHJ1biBXQVMgcmUtdHJpZ2dlcmVkIHZpYSB0aGUgcXVldWUgYW5kIHRoZVxuICAgICAgICAgICAgLy8gY29uc3VtZXIgaWRlbXBvdGVudGx5IGVuc3VyZXMgdGhlIGhvb2tfcmVjZWl2ZWQgYmVmb3JlIHJlcGxheSwgc29cbiAgICAgICAgICAgIC8vIHN3YWxsb3cgcmF0aGVyIHRoYW4gZmFpbGluZyB0aGUgY2FsbGVyLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFByb2R1Y2VyIHRlbGVtZXRyeTogcmVjb3JkIHRoYXQgdGhlIGRpcmVjdCB3cml0ZSBkaWQgbm90IGxhbmQgYnV0XG4gICAgICAgICAgICAvLyB0aGUgcmVzdW1lIGlzIHN0aWxsIGd1YXJhbnRlZWQgdmlhIHF1ZXVlLWRlbGl2ZXJlZCBgaG9va0lucHV0YC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9wZXJhdGlvbmFsIHNpZ25hbCB0aGF0IHRoZSByZWNvdmVyeSBwYXRoIGZpcmVkLFxuICAgICAgICAgICAgLy8gc3VyZmFjZWQgYm90aCBvbiB0aGUgc3BhbiBhbmQgYXMgdGhlIHB1YmxpYyBgcmVzaWxpZW50UmVzdW1lYFxuICAgICAgICAgICAgLy8gZmxhZyBvbiB0aGUgcmV0dXJuZWQgaG9vayAodGhlIHJlc3VtZSBvdXRjb21lIGlzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBoYXBweSBwYXRoIGZyb20gdGhlIGNhbGxlcidzIHBlcnNwZWN0aXZlKS5cbiAgICAgICAgICAgIHJlc2lsaWVudFJlc3VtZSA9IHRydWU7XG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXNpbGllbnRSZXN1bWUodHJ1ZSksXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5ob29rLnJlc3VtZV9ldmVudF93cml0ZV9yZWNvdmVyZWQnOiB0cnVlLFxuICAgICAgICAgICAgICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfZXZlbnRfd3JpdGVfZXJyb3InOlxuICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAndW5rbm93bicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgJ0hvb2sgcmVzdW1lIGV2ZW50IHdyaXRlIGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIHJlLXRyaWdnZXJlZCB2aWEgJyArXG4gICAgICAgICAgICAgICAgJ3RoZSBxdWV1ZS4gVGhlIGhvb2tfcmVjZWl2ZWQgZXZlbnQgd2lsbCBiZSBlbnN1cmVkIGJ5IHRoZSAnICtcbiAgICAgICAgICAgICAgICAncXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgICAgaG9va0lkOiBob29rLmhvb2tJZCxcbiAgICAgICAgICAgICAgICByZXN1bWVJZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICByZXNpbGllbnRSZXN1bWUgPyB7IC4uLmhvb2ssIHJlc2lsaWVudFJlc3VtZTogdHJ1ZSB9IDogaG9va1xuICAgICAgICApIHNhdGlzZmllcyBSZXN1bWVkSG9vaztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKFxuICAgICAgICAgICAgdHlwZW9mIHRva2VuT3JIb29rID09PSAnc3RyaW5nJyA/IHRva2VuT3JIb29rIDogdG9rZW5Pckhvb2sudG9rZW5cbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rRm91bmQoZmFsc2UpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXN1bWVzIGEgd2ViaG9vayBieSBzZW5kaW5nIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0IHwgUmVxdWVzdH1cbiAqIG9iamVjdCB0byBhIGhvb2sgaWRlbnRpZmllZCBieSBpdHMgdG9rZW4uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXh0ZXJuYWxseSAoZS5nLiwgZnJvbSBhbiBBUEkgcm91dGUgb3Igc2VydmVyIGFjdGlvbilcbiAqIHRvIHNlbmQgYSByZXF1ZXN0IHRvIGEgd2ViaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIGhvb2tcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXNwb25zZVxuICogQHRocm93cyBFcnJvciBpZiB0aGUgaG9vayBpcyBub3QgZm91bmQgb3IgaWYgdGhlcmUncyBhbiBlcnJvciBkdXJpbmcgdGhlIHByb2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiAvLyBJbiBhbiBBUEkgcm91dGVcbiAqIGltcG9ydCB7IHJlc3VtZVdlYmhvb2sgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gKiAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICogICBjb25zdCB0b2tlbiA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd0b2tlbicpO1xuICpcbiAqICAgaWYgKCF0b2tlbikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ01pc3NpbmcgdG9rZW4nLCB7IHN0YXR1czogNDAwIH0pO1xuICogICB9XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdW1lV2ViaG9vayh0b2tlbiwgcmVxdWVzdCk7XG4gKiAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ1dlYmhvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVXZWJob29rKFxuICB0b2tlbjogc3RyaW5nLFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIC8vIFQwIG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93LiBFdmVyeXRoaW5nIGJlbG93ICh0aGUgYnktdG9rZW4gbG9va3VwLFxuICAvLyB0aGUgcnVuLWtleSByZXNvbHV0aW9uIGl0IG1heSB0cmlnZ2VyLCBhbmQgdGhlIGByZXNwb25kV2l0aGAgc2V0dXApIGlzXG4gIC8vIHJlYWwgcHJvZHVjZXItc2lkZSBsYXRlbmN5IG9uIHRoaXMgcGF0aCwgc28gdGhlIHdpbmRvdyBoYXMgdG8gb3BlbiBoZXJlXG4gIC8vIGFuZCBub3QgaW5zaWRlIGByZXN1bWVIb29rSW1wbGA7IG90aGVyd2lzZSB3ZWJob29rIHJlc3VtZXMgd291bGQgcmVwb3J0IGFcbiAgLy8gc3lzdGVtYXRpY2FsbHkgc2hvcnRlciB0b3RhbCB0aGFuIGByZXN1bWVIb29rYCBvbmVzIGludG8gdGhlIHNhbWUgbWV0cmljLlxuICBjb25zdCByZXN1bWVSZXF1ZXN0ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgeyBob29rLCBlbmNyeXB0aW9uS2V5IH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuXG4gIC8vIE9ubHkgd2ViaG9va3MgY2FuIGJlIHJlc3VtZWQgdmlhIHRoZSBwdWJsaWMgZW5kcG9pbnQuXG4gIC8vIElmIHRoZSBob29rIHdhcyBjcmVhdGVkIHZpYSBjcmVhdGVIb29rKCkgKGlzV2ViaG9vayAhPT0gdHJ1ZSksXG4gIC8vIHRocm93IHRoZSBzYW1lIFwibm90IGZvdW5kXCIgZXJyb3IgdGhlIHdvcmxkIHdvdWxkIHRocm93IGZvciBhIG1pc3NpbmdcbiAgLy8gdG9rZW4uIFRoaXMgcHJldmVudHMgbGVha2luZyB0aGF0IHRoZSB0b2tlbiBpcyB2YWxpZC5cbiAgaWYgKGhvb2suaXNXZWJob29rID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcih0b2tlbik7XG4gIH1cblxuICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVzcG9uc2VSZWFkYWJsZTogUmVhZGFibGVTdHJlYW08UmVzcG9uc2U+IHwgdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgaG9vay5tZXRhZGF0YSAmJlxuICAgIHR5cGVvZiBob29rLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICdyZXNwb25kV2l0aCcgaW4gaG9vay5tZXRhZGF0YVxuICApIHtcbiAgICBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCA9PT0gJ21hbnVhbCcpIHtcbiAgICAgIGNvbnN0IHsgcmVhZGFibGUsIHdyaXRhYmxlIH0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtPFJlc3BvbnNlLCBSZXNwb25zZT4oKTtcbiAgICAgIHJlc3BvbnNlUmVhZGFibGUgPSByZWFkYWJsZTtcblxuICAgICAgLy8gVGhlIHJlcXVlc3QgaW5zdGFuY2UgaW5jbHVkZXMgdGhlIHdyaXRhYmxlIHN0cmVhbSB3aGljaCB3aWxsIGJlIHVzZWRcbiAgICAgIC8vIHRvIHdyaXRlIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50IGZyb20gd2l0aGluIHRoZSB3b3JrZmxvdyBydW5cbiAgICAgIChyZXF1ZXN0IGFzIGFueSlbV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRV0gPSB3cml0YWJsZTtcbiAgICB9IGVsc2UgaWYgKGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGggaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgcmVzcG9uc2UgPSBob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFxcYHJlc3BvbmRXaXRoXFxgIHZhbHVlOiAke2hvb2subWV0YWRhdGEucmVzcG9uZFdpdGh9YCxcbiAgICAgICAgeyBzbHVnOiBFUlJPUl9TTFVHUy5XRUJIT09LX0lOVkFMSURfUkVTUE9ORF9XSVRIX1ZBTFVFIH1cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vIGByZXNwb25kV2l0aGAgdmFsdWUgaW1wbGllcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiByZXR1cm5pbmcgYSAyMDJcbiAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMjAyIH0pO1xuICB9XG5cbiAgLy8gYGhvb2tgIHdhcyBqdXN0IGZldGNoZWQgdmlhIGBnZXRIb29rQnlUb2tlbldpdGhLZXlgIChhIGZyZXNoIGJ5LXRva2VuXG4gIC8vIGxvb2t1cCkgYWJvdmUsIHNvIGl0cyByZXNwb25zZS1vbmx5IGByZXN1bWVDYXBhYmlsaXRpZXNgIHJlZmxlY3RzIHRoZSBsaXZlXG4gIC8vIGJhY2tlbmQuIENhbGwgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGZyZXNoIGF0dGVzdGF0aW9uIHNvXG4gIC8vIHRoZSBwYXJhbGxlbCBmYXN0IHBhdGggc3RheXMgYXZhaWxhYmxlIHdpdGhvdXQgYSBzZWNvbmQgR0VULiAoVGhlIHB1YmxpY1xuICAvLyBgcmVzdW1lSG9va2AgbmV2ZXIgc2V0cyB0aGlzLCBzbyBhIGNhbGxlciBjYW5ub3QgZm9yZ2UgaXQuKVxuICBhd2FpdCByZXN1bWVIb29rSW1wbChob29rLCByZXF1ZXN0LCBlbmNyeXB0aW9uS2V5LCB0cnVlLCByZXN1bWVSZXF1ZXN0ZWRBdE1zKTtcblxuICBpZiAocmVzcG9uc2VSZWFkYWJsZSkge1xuICAgIC8vIFdhaXQgZm9yIHRoZSByZWFkYWJsZSBzdHJlYW0gdG8gZW1pdCBvbmUgY2h1bmssXG4gICAgLy8gd2hpY2ggaXMgdGhlIGBSZXNwb25zZWAgb2JqZWN0XG4gICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2VSZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgICBjb25zdCBjaHVuayA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGNodW5rLnZhbHVlKSB7XG4gICAgICByZXNwb25zZSA9IGNodW5rLnZhbHVlO1xuICAgIH1cbiAgICByZWFkZXIuY2FuY2VsKCk7XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKCdXb3JrZmxvdyBydW4gZGlkIG5vdCBzZW5kIGEgcmVzcG9uc2UnLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5XRUJIT09LX1JFU1BPTlNFX05PVF9TRU5ULFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuIl19