@workflow/core 5.0.0-beta.43 → 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 (217) 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 +2 -2
  12. package/dist/create-hook.js +1 -1
  13. package/dist/define-hook.js +2 -2
  14. package/dist/describe-error.d.ts +7 -7
  15. package/dist/describe-error.js +8 -8
  16. package/dist/encryption.d.ts +5 -5
  17. package/dist/encryption.js +7 -7
  18. package/dist/events-consumer.d.ts +19 -7
  19. package/dist/events-consumer.d.ts.map +1 -1
  20. package/dist/events-consumer.js +33 -12
  21. package/dist/flushable-stream.d.ts +4 -4
  22. package/dist/flushable-stream.js +12 -12
  23. package/dist/global.d.ts +1 -1
  24. package/dist/global.js +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +2 -2
  27. package/dist/log-format.d.ts +2 -2
  28. package/dist/log-format.js +5 -5
  29. package/dist/logger.js +4 -4
  30. package/dist/private.d.ts +21 -65
  31. package/dist/private.d.ts.map +1 -1
  32. package/dist/private.js +160 -38
  33. package/dist/replay-payload-cache.d.ts +1 -1
  34. package/dist/replay-payload-cache.js +4 -4
  35. package/dist/runtime/compute-instance.d.ts +4 -3
  36. package/dist/runtime/compute-instance.d.ts.map +1 -1
  37. package/dist/runtime/compute-instance.js +5 -4
  38. package/dist/runtime/constants.d.ts +24 -24
  39. package/dist/runtime/constants.d.ts.map +1 -1
  40. package/dist/runtime/constants.js +49 -43
  41. package/dist/runtime/count-step-started-events.d.ts +7 -7
  42. package/dist/runtime/count-step-started-events.js +4 -4
  43. package/dist/runtime/deployment-guard.d.ts +7 -7
  44. package/dist/runtime/deployment-guard.js +8 -8
  45. package/dist/runtime/get-port-lazy.d.ts +2 -2
  46. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  47. package/dist/runtime/get-port-lazy.js +37 -30
  48. package/dist/runtime/get-world-lazy.d.ts +2 -2
  49. package/dist/runtime/get-world-lazy.js +3 -3
  50. package/dist/runtime/helpers.d.ts +18 -18
  51. package/dist/runtime/helpers.js +27 -27
  52. package/dist/runtime/quickjs-entrypoint.d.ts +21 -10
  53. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  54. package/dist/runtime/quickjs-entrypoint.js +199 -81
  55. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  56. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  57. package/dist/runtime/quickjs-runtime.js +126 -77
  58. package/dist/runtime/quickjs-serde.d.ts +10 -10
  59. package/dist/runtime/quickjs-serde.js +20 -20
  60. package/dist/runtime/replay-budget.d.ts +4 -4
  61. package/dist/runtime/replay-budget.js +5 -5
  62. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  63. package/dist/runtime/replay-recovery-reporter.js +2 -2
  64. package/dist/runtime/resume-hook.d.ts +2 -2
  65. package/dist/runtime/resume-hook.js +27 -27
  66. package/dist/runtime/resume-latency.d.ts +25 -25
  67. package/dist/runtime/resume-latency.d.ts.map +1 -1
  68. package/dist/runtime/resume-latency.js +4 -4
  69. package/dist/runtime/run-id-time.d.ts +2 -2
  70. package/dist/runtime/run-id-time.js +5 -5
  71. package/dist/runtime/run.d.ts +21 -4
  72. package/dist/runtime/run.d.ts.map +1 -1
  73. package/dist/runtime/run.js +104 -10
  74. package/dist/runtime/runs.d.ts +4 -4
  75. package/dist/runtime/runs.js +2 -2
  76. package/dist/runtime/start.d.ts +3 -3
  77. package/dist/runtime/start.d.ts.map +1 -1
  78. package/dist/runtime/start.js +27 -23
  79. package/dist/runtime/step-executor.d.ts +14 -14
  80. package/dist/runtime/step-executor.d.ts.map +1 -1
  81. package/dist/runtime/step-executor.js +54 -39
  82. package/dist/runtime/step-latency.d.ts +14 -14
  83. package/dist/runtime/step-latency.js +11 -11
  84. package/dist/runtime/step-ownership.d.ts +6 -6
  85. package/dist/runtime/step-ownership.js +8 -8
  86. package/dist/runtime/step-single-flight.d.ts +1 -1
  87. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  88. package/dist/runtime/step-single-flight.js +17 -11
  89. package/dist/runtime/suspension-handler.d.ts +29 -17
  90. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  91. package/dist/runtime/suspension-handler.js +206 -71
  92. package/dist/runtime/unserializable-step.d.ts +34 -0
  93. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  94. package/dist/runtime/unserializable-step.js +52 -0
  95. package/dist/runtime/vm-mode.d.ts +1 -1
  96. package/dist/runtime/vm-mode.js +2 -2
  97. package/dist/runtime/wait-continuation.d.ts +31 -9
  98. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  99. package/dist/runtime/wait-continuation.js +44 -13
  100. package/dist/runtime/wait-until.d.ts +1 -1
  101. package/dist/runtime/wait-until.js +2 -2
  102. package/dist/runtime/world-compatibility.d.ts +20 -9
  103. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  104. package/dist/runtime/world-compatibility.js +24 -13
  105. package/dist/runtime/world-init.d.ts +5 -5
  106. package/dist/runtime/world-init.js +6 -6
  107. package/dist/runtime/world.d.ts.map +1 -1
  108. package/dist/runtime/world.js +13 -3
  109. package/dist/runtime.d.ts.map +1 -1
  110. package/dist/runtime.js +300 -206
  111. package/dist/sealed-box.d.ts +7 -7
  112. package/dist/sealed-box.js +15 -15
  113. package/dist/serialization/client.js +2 -2
  114. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  115. package/dist/serialization/codec-devalue-vm.js +4 -4
  116. package/dist/serialization/codec-devalue.d.ts +1 -1
  117. package/dist/serialization/codec-devalue.js +2 -2
  118. package/dist/serialization/codec.d.ts +4 -4
  119. package/dist/serialization/codec.js +2 -2
  120. package/dist/serialization/compression.d.ts +12 -11
  121. package/dist/serialization/compression.d.ts.map +1 -1
  122. package/dist/serialization/compression.js +16 -15
  123. package/dist/serialization/encryption.d.ts +7 -7
  124. package/dist/serialization/encryption.d.ts.map +1 -1
  125. package/dist/serialization/encryption.js +8 -8
  126. package/dist/serialization/errors.js +2 -2
  127. package/dist/serialization/format.d.ts +6 -6
  128. package/dist/serialization/format.js +7 -7
  129. package/dist/serialization/hardened.d.ts +18 -18
  130. package/dist/serialization/hardened.d.ts.map +1 -1
  131. package/dist/serialization/hardened.js +41 -32
  132. package/dist/serialization/index.d.ts +1 -1
  133. package/dist/serialization/index.js +2 -2
  134. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  135. package/dist/serialization/reducers/class-vm.js +2 -2
  136. package/dist/serialization/reducers/class.js +2 -2
  137. package/dist/serialization/reducers/common-vm.js +12 -12
  138. package/dist/serialization/reducers/common.js +12 -12
  139. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  140. package/dist/serialization/reducers/step-function-vm.js +2 -2
  141. package/dist/serialization/reducers/step-function.js +2 -2
  142. package/dist/serialization/step.js +2 -2
  143. package/dist/serialization/types.d.ts +5 -5
  144. package/dist/serialization/types.js +2 -2
  145. package/dist/serialization/workflow-vm.d.ts +1 -1
  146. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  147. package/dist/serialization/workflow-vm.js +13 -10
  148. package/dist/serialization-format.d.ts +11 -11
  149. package/dist/serialization-format.d.ts.map +1 -1
  150. package/dist/serialization-format.js +29 -23
  151. package/dist/serialization.d.ts +10 -10
  152. package/dist/serialization.js +98 -98
  153. package/dist/set-attributes.js +2 -2
  154. package/dist/source-map.d.ts +1 -1
  155. package/dist/source-map.d.ts.map +1 -1
  156. package/dist/source-map.js +18 -12
  157. package/dist/step/context-storage.d.ts +5 -5
  158. package/dist/step/context-storage.js +1 -1
  159. package/dist/step/writable-stream.d.ts +3 -3
  160. package/dist/step/writable-stream.js +7 -7
  161. package/dist/step.js +12 -12
  162. package/dist/symbols.d.ts +2 -2
  163. package/dist/symbols.js +3 -3
  164. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  165. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  166. package/dist/telemetry/semantic-conventions.js +21 -15
  167. package/dist/telemetry.d.ts +3 -3
  168. package/dist/telemetry.d.ts.map +1 -1
  169. package/dist/telemetry.js +19 -10
  170. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  171. package/dist/test-support/orchestrator-context.js +12 -2
  172. package/dist/version.d.ts +1 -1
  173. package/dist/version.js +2 -2
  174. package/dist/vm/index.js +4 -4
  175. package/dist/vm/script-cache.d.ts.map +1 -1
  176. package/dist/vm/script-cache.js +23 -17
  177. package/dist/vm/uint8array-base64.js +1 -1
  178. package/dist/workflow/abort-controller.d.ts +1 -1
  179. package/dist/workflow/abort-controller.js +12 -12
  180. package/dist/workflow/create-hook.js +2 -2
  181. package/dist/workflow/get-workflow-metadata.js +2 -2
  182. package/dist/workflow/hook.js +16 -16
  183. package/dist/workflow/set-attributes.d.ts +1 -1
  184. package/dist/workflow/set-attributes.js +2 -2
  185. package/dist/workflow/sleep.js +2 -2
  186. package/dist/workflow/world-init-stub.d.ts +1 -1
  187. package/dist/workflow/world-init-stub.js +2 -2
  188. package/dist/workflow.d.ts +2 -2
  189. package/dist/workflow.js +21 -7
  190. package/docs/api-reference/create-hook.mdx +15 -15
  191. package/docs/api-reference/create-webhook.mdx +15 -15
  192. package/docs/api-reference/define-hook.mdx +10 -10
  193. package/docs/api-reference/fatal-error.mdx +2 -2
  194. package/docs/api-reference/fetch.mdx +7 -7
  195. package/docs/api-reference/get-step-metadata.mdx +2 -2
  196. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  197. package/docs/api-reference/get-writable.mdx +7 -7
  198. package/docs/api-reference/index.mdx +1 -1
  199. package/docs/api-reference/retryable-error.mdx +1 -1
  200. package/docs/api-reference/set-attributes.mdx +2 -2
  201. package/docs/api-reference/sleep.mdx +3 -3
  202. package/docs/foundations/cancellation.mdx +31 -31
  203. package/docs/foundations/errors-and-retries.mdx +42 -11
  204. package/docs/foundations/hooks.mdx +35 -35
  205. package/docs/foundations/idempotency.mdx +9 -9
  206. package/docs/foundations/serialization.mdx +21 -22
  207. package/docs/foundations/starting-workflows.mdx +36 -37
  208. package/docs/foundations/streaming.mdx +46 -41
  209. package/docs/foundations/versioning.mdx +3 -3
  210. package/docs/foundations/workflows-and-steps.mdx +9 -9
  211. package/docs/how-it-works/cancellation.mdx +62 -62
  212. package/docs/how-it-works/code-transform.mdx +66 -54
  213. package/docs/how-it-works/encryption.mdx +25 -21
  214. package/docs/how-it-works/event-sourcing.mdx +53 -35
  215. package/docs/how-it-works/framework-integrations.mdx +12 -12
  216. package/docs/how-it-works/understanding-directives.mdx +21 -21
  217. package/package.json +7 -7
@@ -1,9 +1,9 @@
1
1
  /**
2
- * QuickJS VM integration with the Workflow DevKit.
2
+ * QuickJS WebAssembly (WASM) VM integration with the Workflow DevKit.
3
3
  *
4
4
  * This module provides the entry point for running workflows in the
5
- * QuickJS WASM VM engine instead of the `node:vm` engine. Both engines
6
- * implement the same event-replay execution model every invocation:
5
+ * QuickJS VM engine instead of the `node:vm` engine. Both engines
6
+ * implement the same event-replay execution model, where every invocation:
7
7
  *
8
8
  * 1. Loads the full event log for the run
9
9
  * 2. Runs the workflow function from the top in a fresh QuickJS VM,
@@ -14,11 +14,11 @@
14
14
  */
15
15
  import { EntityConflictError, HookNotFoundError, MaxEventsExceededError, RunExpiredError, WorkflowNotRegisteredError, } from '@workflow/errors';
16
16
  import { parseWorkflowName } from '@workflow/utils/parse-name';
17
- import { ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, } from '@workflow/world';
17
+ import { ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
18
18
  import { classifyRunError, isRetryableWorldError } from '../classify-error.js';
19
19
  import { runtimeLogger } from '../logger.js';
20
20
  import { deriveRunPayloadKeys, encrypt as encryptSerializedData, } from '../serialization/encryption.js';
21
- import { dehydrateRunError, hydrateRunError, maybeEncrypt, } from '../serialization.js';
21
+ import { dehydrateRunError, dehydrateStepArguments, dehydrateStepError, hydrateRunError, maybeEncrypt, } from '../serialization.js';
22
22
  import { remapErrorStack, stripInlineSourceMap } from '../source-map.js';
23
23
  import * as Attribute from '../telemetry/semantic-conventions.js';
24
24
  import { serializeTraceCarrier } from '../telemetry.js';
@@ -29,15 +29,16 @@ import { BASELINE_BUNDLE_FILENAME, startQuickJSWorkflow, } from './quickjs-runti
29
29
  import { ReplayBudget } from './replay-budget.js';
30
30
  import { executeStep } from './step-executor.js';
31
31
  import { runStepSingleFlight } from './step-single-flight.js';
32
+ import { unserializableStepInputPlaceholder } from './unserializable-step.js';
32
33
  import { getWaitContinuationDispatch } from './wait-continuation.js';
33
34
  import { getWorld } from './world.js';
34
- /** Tiny ms timer using performance.now() already monotonic on Node. */
35
+ /** Tiny ms timer using performance.now(), already monotonic on Node. */
35
36
  function tick() {
36
37
  return performance.now();
37
38
  }
38
39
  /**
39
40
  * Returns true when the supplied preloaded events indicate this is the
40
- * first workflow handler invocation for the run i.e. the log contains
41
+ * first workflow handler invocation for the run, i.e. the log contains
41
42
  * nothing beyond `run_created` / `run_started`. In that case the
42
43
  * preloaded events ARE the complete event log and the `events.list`
43
44
  * round-trips can be skipped entirely.
@@ -76,7 +77,7 @@ async function queueStepMessage(params) {
76
77
  ...(stepInput !== undefined ? { stepInput: { input: stepInput } } : {}),
77
78
  }, {
78
79
  // The 'dispatch' key is step-identity-scoped (correlationId + hashed
79
- // step name) shared with the node engine's dispatch of the same step
80
+ // step name), shared with the node engine's dispatch of the same step
80
81
  // so the two stay mutually exclusive, without a revoked resilient
81
82
  // message absorbing a reassigned correlation id's legitimate dispatch.
82
83
  // See stepDispatchIdempotencyKey.
@@ -98,7 +99,7 @@ async function queueStepMessage(params) {
98
99
  * step_created (+ optional queueing), hook_created / hook_received (aborts),
99
100
  * attr_set, hook_disposed, and wait_created events.
100
101
  *
101
- * Steps are created but (usually) not queued here queueing (or inline
102
+ * Steps are created but (usually) not queued here: queueing (or inline
102
103
  * execution) is the caller's decision. Used both for suspension
103
104
  * processing (the inline loop) and for the terminal drain (flushing
104
105
  * leftover side effects when the workflow completed or failed, mirroring
@@ -107,7 +108,7 @@ async function queueStepMessage(params) {
107
108
  * The one exception is resilient step dispatch: for step cids named in
108
109
  * `queueStepCids` (the caller's overflow steps) that pass the eligibility
109
110
  * gates, the step_created write is parallelized with the step's queue
110
- * publish the message carries the serialized input (`stepInput`) so the
111
+ * publish: the message carries the serialized input (`stepInput`) so the
111
112
  * consumer can idempotently re-ensure the event if the direct write failed
112
113
  * transiently. Steps queued this way are reported in `queuedStepCids`; the
113
114
  * caller queues the rest itself.
@@ -121,6 +122,9 @@ async function dispatchPendingOps(params) {
121
122
  // parallel, message carrying `stepInput`). Reported to the caller so it
122
123
  // skips them in its own queueing pass.
123
124
  const queuedStepCids = new Set();
125
+ // Step cids finalized as step_created + step_failed because their input
126
+ // refused to serialize. See the `finalizeUnserializableSteps` param.
127
+ const failedSerializationStepCids = new Set();
124
128
  // Resilient step dispatch eligibility, shared by every step op below (the
125
129
  // per-step input-size check is applied inside the op): feature enabled and
126
130
  // a binary-safe (CBOR) queue transport for the run.
@@ -128,7 +132,7 @@ async function dispatchPendingOps(params) {
128
132
  // Unlike the node:vm suspension handler's gate (see
129
133
  // SuspensionHandlerParams.stepDispatch), there is NO precondition-guard
130
134
  // gate here: this engine's step_created writes are unguarded (no snapshot
131
- // is attached), so a guard-enforcing World can never 412-reject them
135
+ // is attached), so a guard-enforcing World can never 412-reject them:
132
136
  // the consumer's re-ensure therefore cannot materialize a step the guard
133
137
  // rejected. If this engine ever adopts guarded suspension writes, the
134
138
  // capability gate from the node:vm handler must be added here too.
@@ -143,7 +147,7 @@ async function dispatchPendingOps(params) {
143
147
  let createdGetConflictHook = false;
144
148
  // Set when a new attr_set event is written this invocation. The
145
149
  // workflow must be re-invoked to consume it (resolving the pending
146
- // setAttributes() promise), so the entrypoint requeues immediately
150
+ // setAttributes() promise), so the entrypoint requeues immediately,
147
151
  // same pattern as an elapsed wait.
148
152
  let createdAttributeEvent = false;
149
153
  const opsPromises = [];
@@ -162,7 +166,7 @@ async function dispatchPendingOps(params) {
162
166
  // `hook.metadata` is the format-prefixed devalue bytes
163
167
  // produced by `globalThis[Symbol.for('workflow-serialize')]
164
168
  // (options.metadata)` inside the VM. Encrypt on the host
165
- // side before writing matches the node:vm engine's
169
+ // side before writing, which matches the node:vm engine's
166
170
  // `dehydrateStepArguments` flow.
167
171
  //
168
172
  // No pre-check via hooks.list: with deterministic correlationIds
@@ -205,7 +209,7 @@ async function dispatchPendingOps(params) {
205
209
  }
206
210
  }
207
211
  catch (err) {
208
- // Already created by a concurrent invocation fall through
212
+ // Already created by a concurrent invocation, so fall through
209
213
  // to abort processing below (if any) instead of bailing.
210
214
  if (!EntityConflictError.is(err))
211
215
  throw err;
@@ -247,7 +251,7 @@ async function dispatchPendingOps(params) {
247
251
  await world.streams.close(runId, streamName);
248
252
  }
249
253
  catch {
250
- // Best-effort the hook event provides the durable
254
+ // Best-effort: the hook event provides the durable
251
255
  // fallback.
252
256
  runtimeLogger.debug('QuickJS runtime: failed to write abort stream packet', {
253
257
  workflowRunId: runId,
@@ -285,7 +289,7 @@ async function dispatchPendingOps(params) {
285
289
  // code order within each group, mirroring the node:vm suspension
286
290
  // handler (hookItemsByToken): a dispose() of an earlier hook must
287
291
  // release the token before a later same-token hook's creation is
288
- // validated by the world parallel dispatch would otherwise record a
292
+ // validated by the world: parallel dispatch would otherwise record a
289
293
  // spurious hook_conflict against the run's own disposed hook (e.g. a
290
294
  // dispose→recreate loop reusing one token). Different tokens have no
291
295
  // claim interaction, so token groups run in parallel with each other
@@ -298,7 +302,7 @@ async function dispatchPendingOps(params) {
298
302
  key = op.token;
299
303
  }
300
304
  else if (op.type === 'hook_dispose' && !op.hasCreatedEvent) {
301
- // Per-op fallback group when the token is unknown no ordering
305
+ // Per-op fallback group when the token is unknown: no ordering
302
306
  // guarantees, matching the previous parallel behavior.
303
307
  key = op.token ?? `__cid:${op.correlationId}`;
304
308
  }
@@ -330,16 +334,82 @@ async function dispatchPendingOps(params) {
330
334
  !skipStepCreation?.has(op.correlationId)) {
331
335
  const step = op;
332
336
  opsPromises.push((async () => {
337
+ // The step's input refused to serialize while dumping the VM's
338
+ // pending ops (see PendingStep.serializationError). Finalize it
339
+ // as step_created (placeholder input, since the world requires the
340
+ // step entity before a terminal event) + step_failed carrying
341
+ // the SerializationError, so the live-VM feed rejects the
342
+ // step's promise and workflow code can catch it. Never queue an
343
+ // execution message for it. Mirrors the node:vm engine's
344
+ // finalizeUnserializableStep. In the terminal drain
345
+ // (finalizeUnserializableSteps unset), skip entirely: see the
346
+ // param docs.
347
+ if (step.serializationError) {
348
+ if (!params.finalizeUnserializableSteps) {
349
+ return;
350
+ }
351
+ runtimeLogger.warn('Step arguments failed to serialize; failing the step so ' +
352
+ 'the workflow can observe the error', {
353
+ workflowRunId: runId,
354
+ correlationId: step.correlationId,
355
+ stepName: step.stepId,
356
+ error: step.serializationError.message,
357
+ });
358
+ try {
359
+ await world.events.create(runId, {
360
+ eventType: 'step_created',
361
+ specVersion: SPEC_VERSION_CURRENT,
362
+ correlationId: step.correlationId,
363
+ eventData: {
364
+ stepName: step.stepId,
365
+ input: (await dehydrateStepArguments(unserializableStepInputPlaceholder(), runId, encryptionKey, globalThis, false, (workflowRun.specVersion ?? 0) >=
366
+ SPEC_VERSION_SUPPORTS_COMPRESSION)),
367
+ },
368
+ });
369
+ }
370
+ catch (err) {
371
+ // Concurrent invocation hit the same deterministic failure
372
+ // and created it first, or the run already finished.
373
+ if (RunExpiredError.is(err))
374
+ return;
375
+ if (!EntityConflictError.is(err))
376
+ throw err;
377
+ }
378
+ try {
379
+ await world.events.create(runId, {
380
+ eventType: 'step_failed',
381
+ specVersion: SPEC_VERSION_CURRENT,
382
+ correlationId: step.correlationId,
383
+ eventData: {
384
+ stepName: step.stepId,
385
+ error: await dehydrateStepError(step.serializationError, runId, encryptionKey, [], globalThis, (workflowRun.specVersion ?? 0) >=
386
+ SPEC_VERSION_SUPPORTS_COMPRESSION),
387
+ },
388
+ });
389
+ }
390
+ catch (err) {
391
+ // Step already terminal or run already finished.
392
+ if (!EntityConflictError.is(err) && !RunExpiredError.is(err)) {
393
+ throw err;
394
+ }
395
+ }
396
+ failedSerializationStepCids.add(step.correlationId);
397
+ wfdiag('step_serialization_failed', {
398
+ stepId: step.stepId,
399
+ correlationId: step.correlationId,
400
+ });
401
+ return;
402
+ }
333
403
  // Create step_created event. `step.input` is the
334
404
  // format-prefixed devalue bytes ("devl" + devalue) produced
335
405
  // by `globalThis[Symbol.for('workflow-serialize')]({args,
336
406
  // closureVars, thisVal})` inside the VM. The VM has no
337
407
  // access to the CryptoKey, so encryption is applied here
338
- // on the host side matching what
408
+ // on the host side, matching what
339
409
  // `dehydrateStepArguments` does in the node:vm engine.
340
410
  const encryptedInput = await encryptSerializedData(step.input, encryptionKey);
341
411
  // Resilient step dispatch: fire the step_created write and the
342
- // step's queue publish in parallel the message carries the
412
+ // step's queue publish in parallel: the message carries the
343
413
  // same serialized input (`stepInput`) so the consumer can
344
414
  // idempotently re-ensure the event if the direct write failed
345
415
  // transiently. Mirrors the node:vm suspension handler and the
@@ -385,15 +455,15 @@ async function dispatchPendingOps(params) {
385
455
  if (createResult.status === 'rejected') {
386
456
  const err = createResult.reason;
387
457
  if (EntityConflictError.is(err)) {
388
- // Concurrent invocation wrote it first the message is
458
+ // Concurrent invocation wrote it first: the message is
389
459
  // already out; its duplicate publish dedupes on the
390
460
  // shared step-identity-scoped idempotency key.
391
461
  return;
392
462
  }
393
463
  if (isRetryableWorldError(err)) {
394
464
  // Resilient: the write failed transiently (429 / 5xx /
395
- // transport) but the step message carrying the same
396
- // serialized input was published, so the consumer
465
+ // transport) but the step message (carrying the same
466
+ // serialized input) was published, so the consumer
397
467
  // idempotently re-ensures the step_created before
398
468
  // executing.
399
469
  runtimeLogger.warn('Step creation event write failed, but the step was ' +
@@ -430,7 +500,7 @@ async function dispatchPendingOps(params) {
430
500
  return;
431
501
  throw err;
432
502
  }
433
- // NOTE: step queueing is otherwise the caller's decision the
503
+ // NOTE: step queueing is otherwise the caller's decision: the
434
504
  // inline loop executes fresh steps in the live VM and only
435
505
  // queues the overflow / retry / backstop cases (see
436
506
  // queueStepMessage).
@@ -456,7 +526,7 @@ async function dispatchPendingOps(params) {
456
526
  }
457
527
  catch (err) {
458
528
  if (EntityConflictError.is(err)) {
459
- // Event already exists (concurrent invocation) the
529
+ // Event already exists (concurrent invocation), but the
460
530
  // replay still needs to consume it, so requeue.
461
531
  createdAttributeEvent = true;
462
532
  return;
@@ -488,7 +558,12 @@ async function dispatchPendingOps(params) {
488
558
  }
489
559
  // Per-op dispatch runs in parallel.
490
560
  await Promise.all(opsPromises);
491
- return { createdAttributeEvent, createdGetConflictHook, queuedStepCids };
561
+ return {
562
+ createdAttributeEvent,
563
+ createdGetConflictHook,
564
+ queuedStepCids,
565
+ failedSerializationStepCids,
566
+ };
492
567
  }
493
568
  /**
494
569
  * Run a workflow using the QuickJS WASM VM engine.
@@ -496,17 +571,28 @@ async function dispatchPendingOps(params) {
496
571
  * This replaces the `node:vm` replay path (runWorkflow + EventsConsumer)
497
572
  * with a QuickJS VM invocation that performs the same full event replay.
498
573
  *
499
- * KNOWN GAP slot snapshot: unlike the node:vm path, no event write in
574
+ * KNOWN GAP (slot snapshot): unlike the node:vm path, no event write in
500
575
  * this file carries {@link CreateEventParams.eventCount}, so a World never
501
576
  * learns which events the writer had not seen and never reports them back.
502
577
  * The engine currently relies on per-(runId, correlationId) event
503
578
  * uniqueness (EntityConflictError dedup) alone. This is a deliberate
504
- * simplification while the engine is experimental wiring the snapshot is
579
+ * simplification while the engine is experimental: wiring the snapshot is
505
580
  * tracked follow-up work; anyone adding new write paths here should not
506
581
  * assume parity with the node engine on this axis.
507
582
  */
508
583
  export async function runWorkflowWithQuickJS(params) {
509
- const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, requestId, namespace, } = params;
584
+ const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, requestId, namespace, waitContinuation, } = params;
585
+ /**
586
+ * Attempt number for the continuation this invocation is about to arm for
587
+ * `correlationId`. One higher than the incoming continuation's when this
588
+ * invocation IS that continuation and the wait is still pending — the only
589
+ * situation in which the previous key is spent. Every other caller, and
590
+ * every other wait, starts at 0 and keys exactly as it did before attempts
591
+ * existed.
592
+ */
593
+ const nextWaitContinuationAttempt = (correlationId) => waitContinuation?.correlationId === correlationId
594
+ ? waitContinuation.attempt + 1
595
+ : 0;
510
596
  // Standalone-caller fallback (tests): without a runtime.ts carrier
511
597
  // accessor, fall back to the current invocation context.
512
598
  const nextTraceCarrier = params.nextTraceCarrier ?? (() => serializeTraceCarrier());
@@ -547,7 +633,7 @@ export async function runWorkflowWithQuickJS(params) {
547
633
  // The workflowName from the queue topic is already the full workflow ID
548
634
  // (e.g. "workflow//./workflows/1_simple//simple")
549
635
  const workflowId = workflowName;
550
- // Resolve the encryption key up front needed to decrypt event
636
+ // Resolve the encryption key up front: needed to decrypt event
551
637
  // payloads inside the VM and to encrypt event payloads written below.
552
638
  // Resolve the FULL capability (symmetric AES key + X25519 keypair), not
553
639
  // just `importKey(rawKey)`: a run reading its own event log can encounter
@@ -555,7 +641,7 @@ export async function runWorkflowWithQuickJS(params) {
555
641
  // wrote to it (sealing is presence-gated on the run's published
556
642
  // encryptionPublicKey, which the shared start() path stamps regardless of
557
643
  // engine). A bare symmetric key cannot open those and would wedge the run
558
- // right after hook_received the node:vm engine resolves the same full
644
+ // right after hook_received. The node:vm engine resolves the same full
559
645
  // capability via memoizeEncryptionKey.
560
646
  const rawKey = await world.getEncryptionKeyForRun?.(workflowRun);
561
647
  const encryptionKey = rawKey ? await deriveRunPayloadKeys(rawKey) : undefined;
@@ -588,7 +674,7 @@ export async function runWorkflowWithQuickJS(params) {
588
674
  eventsFetchedPages++;
589
675
  allEvents.push(...response.data);
590
676
  // Update the cursor to the last successfully fetched page's cursor.
591
- // Only update when we got results the final empty-page response
677
+ // Only update when we got results: the final empty-page response
592
678
  // returns cursor=null which we must NOT use (it would reset the cursor).
593
679
  if (response.cursor) {
594
680
  cursor = response.cursor;
@@ -598,7 +684,7 @@ export async function runWorkflowWithQuickJS(params) {
598
684
  events = allEvents;
599
685
  }
600
686
  // Event-limit guard: fail a runaway run once its log reaches the
601
- // server-supplied ceiling same enforcement point as the node:vm
687
+ // server-supplied ceiling, the same enforcement point as the node:vm
602
688
  // engine's replay loop.
603
689
  if (maxEventsLimit !== undefined && events.length >= maxEventsLimit) {
604
690
  throw new MaxEventsExceededError(events.length, maxEventsLimit);
@@ -649,7 +735,7 @@ export async function runWorkflowWithQuickJS(params) {
649
735
  }
650
736
  }
651
737
  // Resolve the workflow server port so `getWorkflowMetadata().url` inside
652
- // the VM matches what the step-side handler reports. Skipped on Vercel
738
+ // the VM matches what the step-side handler reports. Skipped on Vercel:
653
739
  // the VM reads VERCEL_URL directly in that environment.
654
740
  const isVercel = process.env.VERCEL_URL !== undefined;
655
741
  const port = isVercel ? undefined : await getPortLazy();
@@ -709,7 +795,7 @@ export async function runWorkflowWithQuickJS(params) {
709
795
  // hook_received for aborts) and complete elapsed waits.
710
796
  // 2. Feed all newly recorded events (attr_set, hook_created, elapsed
711
797
  // wait_completed, terminals written by concurrent invocations, ...)
712
- // into the LIVE VM via session.continueWithEvents resuming
798
+ // into the LIVE VM via session.continueWithEvents, resuming
713
799
  // execution exactly where it left off, no fresh-VM re-replay.
714
800
  // Cheap progress is fed BEFORE running step bodies so promise
715
801
  // chains that are not gated on steps (hook.getConflict(),
@@ -718,7 +804,7 @@ export async function runWorkflowWithQuickJS(params) {
718
804
  // 3. Once no cheap progress remains, execute up to
719
805
  // getMaxInlineSteps() steps created by THIS invocation inline (no
720
806
  // queue round-trip), in parallel, with the replay budget paused
721
- // during step bodies mirroring the node:vm engine's inline
807
+ // during step bodies, mirroring the node:vm engine's inline
722
808
  // replay loop. Overflow and retry/throttled steps are queued for
723
809
  // background execution. A delayed wait-continuation message is
724
810
  // enqueued for the soonest pending wait first, so racing timers
@@ -737,14 +823,14 @@ export async function runWorkflowWithQuickJS(params) {
737
823
  const executedStepIds = new Set();
738
824
  // Steps for which THIS invocation already sent a queue message.
739
825
  const queuedStepIds = new Set();
740
- // Aborts THIS invocation already recorded (hook_received written)
741
- // guards against re-recording when the VM-side flag has not been
826
+ // Aborts THIS invocation already recorded (hook_received written).
827
+ // Guards against re-recording when the VM-side flag has not been
742
828
  // cleared yet within the same iteration.
743
829
  const recordedAbortIds = new Set();
744
830
  // Waits for which THIS invocation already completed/scheduled work.
745
831
  const completedWaitIds2 = new Set();
746
832
  // Inline-ownership state per step correlationId, derived from every
747
- // event this invocation observes (initial log + every feed) the
833
+ // event this invocation observes (initial log + every feed): the
748
834
  // quickjs analog of the replay-derived ownership on the node engine's
749
835
  // StepInvocationQueueItem (see step-ownership.ts). Latest-wins:
750
836
  // events arrive in log order, so a later step_started overwrites the
@@ -789,7 +875,7 @@ export async function runWorkflowWithQuickJS(params) {
789
875
  let runGone = false;
790
876
  // Set when this invocation wrote an event the workflow must consume to
791
877
  // make progress (attr_set, getConflict-awaited hook_created) and the
792
- // loop has not yet read it back eventually-consistent listings can
878
+ // loop has not yet read it back, since eventually-consistent listings can
793
879
  // return 0 new events right after a write. If it is still set when the
794
880
  // loop exits suspended, the entrypoint requeues immediately instead of
795
881
  // exiting awaiting_external with the unblocking event already written
@@ -831,7 +917,7 @@ export async function runWorkflowWithQuickJS(params) {
831
917
  // each continueWithEvents, so a single invocation can otherwise grow
832
918
  // the log arbitrarily far past the operator's limit (the node engine
833
919
  // re-checks per replay for the same reason). `seenEventIds` counts
834
- // every event this invocation has observed initial log + all
920
+ // every event this invocation has observed: initial log + all
835
921
  // feeds.
836
922
  if (maxEventsLimit !== undefined && seenEventIds.size >= maxEventsLimit) {
837
923
  throw new MaxEventsExceededError(seenEventIds.size, maxEventsLimit);
@@ -839,7 +925,7 @@ export async function runWorkflowWithQuickJS(params) {
839
925
  const pendingOperations = result.suspended.pendingOperations;
840
926
  // Select this turn's inline candidates BEFORE dispatch: fresh steps
841
927
  // (no step_created yet) that this invocation hasn't already handled.
842
- // Their step_created is deliberately NOT written by dispatch the
928
+ // Their step_created is deliberately NOT written by dispatch: the
843
929
  // inline claim below is a lazy step_started carrying the input,
844
930
  // which the world applies as an atomic create-claim. A concurrent
845
931
  // invocation racing on the same fresh step loses that claim with
@@ -850,7 +936,14 @@ export async function runWorkflowWithQuickJS(params) {
850
936
  !op.hasCreatedEvent &&
851
937
  !executedStepIds.has(op.correlationId) &&
852
938
  !queuedStepIds.has(op.correlationId));
853
- const inlineCandidates = maxInlineSteps <= 0 ? [] : freshSteps.slice(0, maxInlineSteps);
939
+ // Steps whose input refused to serialize (see
940
+ // PendingStep.serializationError) never execute: they must not be
941
+ // inline-claimed (a lazy step_started would need the input that
942
+ // failed) nor queued. Dispatch below finalizes them as step_created
943
+ // + step_failed instead; only healthy steps compete for inline
944
+ // slots and overflow.
945
+ const healthySteps = freshSteps.filter((step) => !step.serializationError);
946
+ const inlineCandidates = maxInlineSteps <= 0 ? [] : healthySteps.slice(0, maxInlineSteps);
854
947
  const inlineClaimCids = new Set(inlineCandidates.map((step) => step.correlationId));
855
948
  // 1. Durable side effects for this suspension's pending ops.
856
949
  const opsToDispatch = pendingOperations.map((op) => op.type === 'hook' &&
@@ -866,17 +959,17 @@ export async function runWorkflowWithQuickJS(params) {
866
959
  // Steps beyond the inline cap are handed to the queue in the same
867
960
  // turn their step_created is written. Where eligible, the dispatch
868
961
  // below parallelizes each overflow step's step_created write with
869
- // its queue publish (resilient step dispatch the message carries
962
+ // its queue publish (resilient step dispatch: the message carries
870
963
  // `stepInput` so the consumer can re-ensure the event); the rest
871
964
  // are queued right after, in parallel. This must all happen BEFORE
872
- // the event feed below: the feed always observes those very
965
+ // the event feed below: the feed always observes those
873
966
  // step_created writes as unseen events and `continue`s, so a
874
967
  // handoff placed after it is unreachable on the only iteration
875
- // that still classifies these steps as fresh next turn they carry
968
+ // that still classifies these steps as fresh: next turn they carry
876
969
  // hasCreatedEvent and would never be queued at all (the wedge behind
877
970
  // promiseRaceStressTestWorkflow hanging in the quickjs CI legs). The
878
971
  // step-identity-scoped idempotency key makes repeats harmless.
879
- const overflowSteps = freshSteps.slice(inlineCandidates.length);
972
+ const overflowSteps = healthySteps.slice(inlineCandidates.length);
880
973
  const dispatched = await dispatchPendingOps({
881
974
  world,
882
975
  runId,
@@ -887,12 +980,26 @@ export async function runWorkflowWithQuickJS(params) {
887
980
  pendingOperations: opsToDispatch,
888
981
  skipStepCreation: inlineClaimCids,
889
982
  queueStepCids: new Set(overflowSteps.map((s) => s.correlationId)),
983
+ finalizeUnserializableSteps: true,
890
984
  wfdiag,
891
985
  });
892
986
  if (dispatched.createdAttributeEvent ||
893
987
  dispatched.createdGetConflictHook) {
894
988
  pendingRequeueSignal = true;
895
989
  }
990
+ // A finalized unserializable step has terminal events durably
991
+ // written but no execution message anywhere: if the feed below
992
+ // doesn't surface them (eventually-consistent listing) and the loop
993
+ // exits, nothing would ever re-invoke the run to observe the
994
+ // failure. Raise the requeue signal (same mechanism as inline
995
+ // terminals) and mark the steps handled so later turns don't
996
+ // re-finalize or backstop-queue them.
997
+ if (dispatched.failedSerializationStepCids.size > 0) {
998
+ pendingRequeueSignal = true;
999
+ for (const cid of dispatched.failedSerializationStepCids) {
1000
+ executedStepIds.add(cid);
1001
+ }
1002
+ }
896
1003
  for (const cid of dispatched.queuedStepCids) {
897
1004
  queuedStepIds.add(cid);
898
1005
  }
@@ -946,7 +1053,7 @@ export async function runWorkflowWithQuickJS(params) {
946
1053
  {
947
1054
  const newEvents = await fetchUnseenEvents();
948
1055
  if (newEvents.length > 0) {
949
- // The listing caught up with this invocation's writes any
1056
+ // The listing caught up with this invocation's writes, so any
950
1057
  // attr_set / getConflict hook_created has been (or is being)
951
1058
  // consumed by the live VM, so no external requeue is needed.
952
1059
  pendingRequeueSignal = false;
@@ -964,11 +1071,11 @@ export async function runWorkflowWithQuickJS(params) {
964
1071
  continue;
965
1072
  }
966
1073
  }
967
- // 3. No cheap progress left execute steps inline.
1074
+ // 3. No cheap progress left, so execute steps inline.
968
1075
  const stepOps = pendingOperations.filter((op) => op.type === 'step');
969
1076
  // Steps created by an EARLIER invocation (or an earlier turn) that
970
1077
  // are still pending, with no work owned by THIS invocation. Mirror
971
- // the node engine's ownership decision table (step-ownership.ts)
1078
+ // the node engine's ownership decision table (step-ownership.ts),
972
1079
  // NOT a deliveryAttempt gate: worlds advance the attempt counter on
973
1080
  // routine redeliveries (world-local counts every handled response),
974
1081
  // so attempt > 1 is the common case and would fire backstops at
@@ -1036,14 +1143,14 @@ export async function runWorkflowWithQuickJS(params) {
1036
1143
  }
1037
1144
  }
1038
1145
  if (inlineCandidates.length === 0) {
1039
- // No in-process progress possible the run awaits an external
1146
+ // No in-process progress possible: the run awaits an external
1040
1147
  // stimulus (hook payload, queued step, wait timer).
1041
1148
  break;
1042
1149
  }
1043
1150
  // Racing timers must fire on time while step bodies block this
1044
1151
  // invocation: enqueue a delayed continuation for the soonest
1045
1152
  // pending wait (a separate invocation writes its wait_completed at
1046
- // the right log position same mechanism as the node:vm engine's
1153
+ // the right log position, the same mechanism as the node:vm engine's
1047
1154
  // wait-continuation dispatch).
1048
1155
  let soonestWait;
1049
1156
  for (const op of pendingOperations) {
@@ -1053,7 +1160,7 @@ export async function runWorkflowWithQuickJS(params) {
1053
1160
  if (scheduledWaitContinuations.has(wait.correlationId))
1054
1161
  continue;
1055
1162
  // Waits whose wait_completed THIS invocation already wrote (the
1056
- // elapsed-wait pass above) are done the event just hasn't fed
1163
+ // elapsed-wait pass above) are done: the event just hasn't fed
1057
1164
  // back into the VM yet. No continuation needed.
1058
1165
  if (completedWaitIds2.has(wait.correlationId))
1059
1166
  continue;
@@ -1064,14 +1171,14 @@ export async function runWorkflowWithQuickJS(params) {
1064
1171
  // whose deadline falls between this iteration's elapsed-wait
1065
1172
  // pass (which saw it as still pending and wrote nothing) and
1066
1173
  // this sweep would otherwise get NEITHER a wait_completed NOR a
1067
- // continuation and the inline batch below then blocks this
1174
+ // continuation, and the inline batch below then blocks this
1068
1175
  // invocation for the full step duration with no wake armed
1069
1176
  // anywhere. For `Promise.race(step, sleep)` that silently hands
1070
1177
  // the race to the step: the sleep's wait_completed is never
1071
1178
  // written and the run completes with the wrong winner. The
1072
1179
  // window between the two checks spans this iteration's dispatch
1073
1180
  // + feed round-trips, so on network-backed worlds (world-vercel)
1074
- // a short sleep lands in it routinely observed as a ~50%
1181
+ // a short sleep lands in it routinely, observed as a ~50%
1075
1182
  // sleepWinsRaceWorkflow failure rate in the Vercel e2e legs,
1076
1183
  // while world-local's sub-ms round-trips masked it locally. The
1077
1184
  // continuation invocation's pre-VM elapsed check writes the
@@ -1083,22 +1190,28 @@ export async function runWorkflowWithQuickJS(params) {
1083
1190
  }
1084
1191
  if (soonestWait) {
1085
1192
  scheduledWaitContinuations.add(soonestWait.correlationId);
1193
+ const attempt = nextWaitContinuationAttempt(soonestWait.correlationId);
1086
1194
  await queueMessage(world, getWorkflowQueueName(workflowRun.workflowName, namespace), {
1087
1195
  runId,
1088
1196
  traceCarrier: await nextTraceCarrier(),
1089
1197
  requestedAt: new Date(),
1090
- }, getWaitContinuationDispatch(soonestWait.seconds, soonestWait.correlationId));
1198
+ waitContinuation: {
1199
+ correlationId: soonestWait.correlationId,
1200
+ attempt,
1201
+ },
1202
+ }, getWaitContinuationDispatch(soonestWait.seconds, soonestWait.correlationId, Date.now(), attempt));
1091
1203
  wfdiag('wait_continuation_scheduled', {
1092
1204
  correlationId: soonestWait.correlationId,
1093
1205
  delaySeconds: soonestWait.seconds,
1206
+ attempt,
1094
1207
  });
1095
1208
  }
1096
1209
  // Execute the inline batch in parallel. The replay budget is
1097
- // paused while step bodies run step duration is bounded by the
1210
+ // paused while step bodies run: step duration is bounded by the
1098
1211
  // platform function duration, not the replay timeout. NOTE (by
1099
1212
  // design): with the budget parked per batch, the only bound on how
1100
1213
  // many inline steps one invocation can chain is the platform's
1101
- // function timeout the SDK deliberately imposes no cap of its
1214
+ // function timeout: the SDK deliberately imposes no cap of its
1102
1215
  // own, matching the node:vm engine, where a long sequential
1103
1216
  // workflow likewise runs step-by-step until the platform reclaims
1104
1217
  // the invocation and a redelivery resumes from the log.
@@ -1119,7 +1232,7 @@ export async function runWorkflowWithQuickJS(params) {
1119
1232
  runSpecVersion: workflowRun.specVersion,
1120
1233
  // Lazy inline claim: step_created is deferred (dispatch
1121
1234
  // skipped it) and this step_started carries the input,
1122
- // so the world creates the step atomically
1235
+ // so the world creates the step atomically:
1123
1236
  // exactly-one-owner. A concurrent claimant gets
1124
1237
  // EntityConflictError → { type: 'skipped' } and never
1125
1238
  // runs the body. Mirrors the node engine's inline path.
@@ -1128,7 +1241,7 @@ export async function runWorkflowWithQuickJS(params) {
1128
1241
  // flight in this invocation and arm a delayed backstop
1129
1242
  // instead of immediately requeueing the step.
1130
1243
  ownerMessageId,
1131
- // A lazy step is brand-new by construction first
1244
+ // A lazy step is brand-new by construction: first
1132
1245
  // attempt.
1133
1246
  authoritativeAttempt: 1,
1134
1247
  }))())));
@@ -1142,7 +1255,7 @@ export async function runWorkflowWithQuickJS(params) {
1142
1255
  const outcome = outcomes[i];
1143
1256
  executedStepIds.add(step.correlationId);
1144
1257
  if (outcome.type === 'retry' || outcome.type === 'throttled') {
1145
- // Hand the step to the queue with the requested backoff
1258
+ // Hand the step to the queue with the requested backoff:
1146
1259
  // background delivery drives the retry from here.
1147
1260
  queuedStepIds.add(step.correlationId);
1148
1261
  await queueStepMessage({
@@ -1154,7 +1267,7 @@ export async function runWorkflowWithQuickJS(params) {
1154
1267
  namespace,
1155
1268
  nextTraceCarrier,
1156
1269
  // Suffixed key: this step was inline-claimed, so no dispatch
1157
- // publish exists under the dispatch key but suffixing
1270
+ // publish exists under the dispatch key, but suffixing
1158
1271
  // keeps the retry enqueueable even if a world retired a
1159
1272
  // historical key for this step (see the purpose docs above).
1160
1273
  purpose: 'retry:1',
@@ -1182,8 +1295,8 @@ export async function runWorkflowWithQuickJS(params) {
1182
1295
  // park the run 'running' with all its steps complete. Raise the
1183
1296
  // requeue signal so the suspended exit schedules a fresh immediate
1184
1297
  // invocation whose fresh read picks the terminals up. Outcomes that
1185
- // wrote no terminal ('skipped' a concurrent claimant owns the
1186
- // body; 'gone', retry/throttled a queue message exists) don't
1298
+ // wrote no terminal ('skipped': a concurrent claimant owns the
1299
+ // body; 'gone', retry/throttled: a queue message exists) don't
1187
1300
  // need it, but signaling on them too only costs a no-op invocation
1188
1301
  // in an already-rare lag window.
1189
1302
  const newEvents = await fetchUnseenEvents();
@@ -1221,7 +1334,7 @@ export async function runWorkflowWithQuickJS(params) {
1221
1334
  });
1222
1335
  // Flush leftover pending side effects (abort recordings, system-hook
1223
1336
  // disposals, fire-and-forget attribute/hook events) BEFORE writing
1224
- // run_completed mirrors the node:vm engine's drainPendingQueueItems.
1337
+ // run_completed. Mirrors the node:vm engine's drainPendingQueueItems.
1225
1338
  // Drain failures are swallowed: the workflow's own outcome is the
1226
1339
  // source of truth.
1227
1340
  if (result.completed.drainOperations?.length) {
@@ -1295,7 +1408,7 @@ export async function runWorkflowWithQuickJS(params) {
1295
1408
  ...Attribute.QuickJSPendingOpsCount(pendingOperations.length),
1296
1409
  });
1297
1410
  if (runGone) {
1298
- // The run no longer exists (expired / deleted) nothing to drive.
1411
+ // The run no longer exists (expired / deleted), so nothing to drive.
1299
1412
  wfdiag('exit_suspended', { action: 'run_gone' });
1300
1413
  return;
1301
1414
  }
@@ -1303,13 +1416,13 @@ export async function runWorkflowWithQuickJS(params) {
1303
1416
  // visibility-redelivery of the current message. Redelivering the
1304
1417
  // CURRENT message is a trap: a hook-resume delivery carries
1305
1418
  // `hookInput`, and its redelivery re-runs the lazy-resume re-ensure
1306
- // in the handler prologue if the workflow disposed that hook
1419
+ // in the handler prologue: if the workflow disposed that hook
1307
1420
  // during this invocation (dispose → sleep), a world that rejects
1308
1421
  // the re-ensure would ack the message as "nothing left to resume"
1309
1422
  // and the continuation it carried is silently lost. A fresh message
1310
1423
  // carries only `runId`, so its delivery always reaches replay (and
1311
1424
  // under turbo a reschedule would re-engage turbo against a stale
1312
- // preloaded log see the reinvoke() docs in runtime.ts).
1425
+ // preloaded log: see the reinvoke() docs in runtime.ts).
1313
1426
  const requeueImmediately = async () => {
1314
1427
  await queueMessage(world, getWorkflowQueueName(workflowRun.workflowName, namespace), {
1315
1428
  runId,
@@ -1319,7 +1432,7 @@ export async function runWorkflowWithQuickJS(params) {
1319
1432
  };
1320
1433
  if (budget.isExhausted()) {
1321
1434
  // The loop stopped on the replay budget with progress still
1322
- // possible continue in a fresh invocation.
1435
+ // possible, so continue in a fresh invocation.
1323
1436
  wfdiag('exit_suspended', { action: 'budget_exhausted_requeue' });
1324
1437
  await requeueImmediately();
1325
1438
  return;
@@ -1359,7 +1472,7 @@ export async function runWorkflowWithQuickJS(params) {
1359
1472
  // terminals) but the eventually-consistent listing never returned
1360
1473
  // them before the loop exited. Without a requeue the run would
1361
1474
  // park awaiting_external with its unblocking events already
1362
- // durably written and no future invocation coming requeue
1475
+ // durably written and no future invocation coming, so requeue
1363
1476
  // immediately so a fresh read picks them up. In the common case
1364
1477
  // the loop's own feed observes the writes and clears this flag, so
1365
1478
  // this only fires when the read actually lagged.
@@ -1371,7 +1484,7 @@ export async function runWorkflowWithQuickJS(params) {
1371
1484
  // Delayed continuation for the soonest pending wait the loop has
1372
1485
  // not already scheduled. The dispatch helper handles delay
1373
1486
  // clamping (long waits chain across hops) and idempotency-key
1374
- // dedup of re-observations of the same pending wait — see
1487
+ // dedup of re-observations of the same pending wait. See
1375
1488
  // runtime/wait-continuation.ts.
1376
1489
  wfdiag('exit_suspended', {
1377
1490
  action: 'schedule_wait_timeout',
@@ -1379,11 +1492,16 @@ export async function runWorkflowWithQuickJS(params) {
1379
1492
  waitCorrelationId: soonestWait.correlationId,
1380
1493
  });
1381
1494
  scheduledWaitContinuations.add(soonestWait.correlationId);
1495
+ const attempt = nextWaitContinuationAttempt(soonestWait.correlationId);
1382
1496
  await queueMessage(world, getWorkflowQueueName(workflowRun.workflowName, namespace), {
1383
1497
  runId,
1384
1498
  traceCarrier: await nextTraceCarrier(),
1385
1499
  requestedAt: new Date(),
1386
- }, getWaitContinuationDispatch(soonestWait.seconds, soonestWait.correlationId));
1500
+ waitContinuation: {
1501
+ correlationId: soonestWait.correlationId,
1502
+ attempt,
1503
+ },
1504
+ }, getWaitContinuationDispatch(soonestWait.seconds, soonestWait.correlationId, Date.now(), attempt));
1387
1505
  return;
1388
1506
  }
1389
1507
  wfdiag('exit_suspended', {
@@ -1392,11 +1510,11 @@ export async function runWorkflowWithQuickJS(params) {
1392
1510
  });
1393
1511
  }
1394
1512
  else if (result.failed) {
1395
- // Workflow failed remap stack trace using inline source maps.
1513
+ // Workflow failed, so remap stack trace using inline source maps.
1396
1514
  // Frames carry the run's workflowId as their filename on the fresh
1397
1515
  // path, but the workflow-independent BASELINE_BUNDLE_FILENAME on the
1398
1516
  // snapshot path (the name is baked into the shared baseline's
1399
- // compiled code at hydrate) remap against both. remapErrorStack
1517
+ // compiled code at hydrate), so remap against both. remapErrorStack
1400
1518
  // early-exits on a cheap includes() when a filename has no frames.
1401
1519
  let errorStack = result.failed.stack;
1402
1520
  if (errorStack) {
@@ -1411,7 +1529,7 @@ export async function runWorkflowWithQuickJS(params) {
1411
1529
  //
1412
1530
  // The VM serializes errors as `{ name, message, stack }`, so we
1413
1531
  // reconstruct a host-side Error of the correct class based on the
1414
- // VM-side `name` specific WorkflowRuntimeError subclasses need
1532
+ // VM-side `name`: specific WorkflowRuntimeError subclasses need
1415
1533
  // to be preserved so classifyRunError() tags them as RUNTIME_ERROR.
1416
1534
  const reconstructed = result.failed.name === 'WorkflowNotRegisteredError'
1417
1535
  ? new WorkflowNotRegisteredError(workflowName)
@@ -1431,7 +1549,7 @@ export async function runWorkflowWithQuickJS(params) {
1431
1549
  parentSpan?.setAttributes({
1432
1550
  ...Attribute.QuickJSOutcome('failed'),
1433
1551
  });
1434
- // Flush leftover pending side effects before writing run_failed
1552
+ // Flush leftover pending side effects before writing run_failed,
1435
1553
  // same drain semantics as the completed branch.
1436
1554
  if (result.failed.drainOperations?.length) {
1437
1555
  try {
@@ -1462,7 +1580,7 @@ export async function runWorkflowWithQuickJS(params) {
1462
1580
  // cause chain, plain object, primitive, etc.) using the VM's
1463
1581
  // workflow-serialize. Pass those bytes through directly so
1464
1582
  // type identity, cause chains, and non-Error throws survive.
1465
- // We just need to apply encryption if configured (the VM's
1583
+ // Apply encryption if configured (the VM's
1466
1584
  // serializer doesn't have access to the encryption key).
1467
1585
  // * Legacy fallback: reconstruct an Error from the host-visible
1468
1586
  // {name, message, stack} fields and run it through
@@ -1471,7 +1589,7 @@ export async function runWorkflowWithQuickJS(params) {
1471
1589
  let dehydratedError;
1472
1590
  if (result.failed.valueBytes) {
1473
1591
  // Hydrate the VM-side bytes, remap the error stack with the
1474
- // host-side source map (the VM can't do this it lacks both the
1592
+ // host-side source map (the VM can't do this: it lacks both the
1475
1593
  // source map and `remapErrorStack`), and re-dehydrate. This
1476
1594
  // preserves the original value's type identity / cause chain
1477
1595
  // while fixing up frames to point at the user's source files.
@@ -1484,7 +1602,7 @@ export async function runWorkflowWithQuickJS(params) {
1484
1602
  typeof hydrated.stack === 'string') {
1485
1603
  const parsedName = parseWorkflowName(workflowName);
1486
1604
  const filename = parsedName?.moduleSpecifier || workflowName;
1487
- // Both filename spaces see the failed-branch comment above.
1605
+ // Both filename spaces. See the failed-branch comment above.
1488
1606
  hydrated.stack = remapErrorStack(remapErrorStack(hydrated.stack, filename, workflowCode), BASELINE_BUNDLE_FILENAME, workflowCode);
1489
1607
  }
1490
1608
  // Walk the cause chain and remap nested stacks too.
@@ -1496,7 +1614,7 @@ export async function runWorkflowWithQuickJS(params) {
1496
1614
  if (typeof nodeStack === 'string') {
1497
1615
  const parsedName = parseWorkflowName(workflowName);
1498
1616
  const filename = parsedName?.moduleSpecifier || workflowName;
1499
- // Both filename spaces see the failed-branch comment above.
1617
+ // Both filename spaces. See the failed-branch comment above.
1500
1618
  node.stack = remapErrorStack(remapErrorStack(nodeStack, filename, workflowCode), BASELINE_BUNDLE_FILENAME, workflowCode);
1501
1619
  }
1502
1620
  node = node.cause;
@@ -1505,7 +1623,7 @@ export async function runWorkflowWithQuickJS(params) {
1505
1623
  }
1506
1624
  catch (rehydrateErr) {
1507
1625
  // If hydration / re-dehydration fails for any reason, fall
1508
- // back to passing through the original VM bytes (just apply
1626
+ // back to passing through the original VM bytes (applying
1509
1627
  // encryption if configured). Better to lose source-mapped
1510
1628
  // frames than to lose the error entirely.
1511
1629
  runtimeLogger.warn('QuickJS runtime: failed to remap workflow error stack, passing VM bytes through', {
@@ -1558,4 +1676,4 @@ export async function runWorkflowWithQuickJS(params) {
1558
1676
  wfdiag('exit_failed', { result: 'run_failed_written' });
1559
1677
  }
1560
1678
  }
1561
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxHQUUzQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixPQUFPLElBQUkscUJBQXFCLEdBRWpDLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLDhCQUE4QixHQUMvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlB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QWEsRUFBRSxJQUFJO2dCQUMvQixZQUFZLEVBQUcsR0FBYSxFQUFFLE9BQU87YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1aWNrSlMgVk0gaW50ZWdyYXRpb24gd2l0aCB0aGUgV29ya2Zsb3cgRGV2S2l0LlxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBlbnRyeSBwb2ludCBmb3IgcnVubmluZyB3b3JrZmxvd3MgaW4gdGhlXG4gKiBRdWlja0pTIFdBU00gVk0gZW5naW5lIGluc3RlYWQgb2YgdGhlIGBub2RlOnZtYCBlbmdpbmUuIEJvdGggZW5naW5lc1xuICogaW1wbGVtZW50IHRoZSBzYW1lIGV2ZW50LXJlcGxheSBleGVjdXRpb24gbW9kZWwg4oCUIGV2ZXJ5IGludm9jYXRpb246XG4gKlxuICogMS4gTG9hZHMgdGhlIGZ1bGwgZXZlbnQgbG9nIGZvciB0aGUgcnVuXG4gKiAyLiBSdW5zIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgaW4gYSBmcmVzaCBRdWlja0pTIFZNLFxuICogICAgcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgdG8gcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXNcbiAqIDMuIE9uIHN1c3BlbnNpb246IGNyZWF0ZXMgZXZlbnRzICsgcXVldWVzIHN0ZXBzIGZvciBuZXcgcGVuZGluZyBvcHNcbiAqIDQuIE9uIGNvbXBsZXRpb246IGNyZWF0ZXMgcnVuX2NvbXBsZXRlZFxuICogNS4gT24gZmFpbHVyZTogY3JlYXRlcyBydW5fZmFpbGVkXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICB0eXBlIFJ1bklucHV0LFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciwgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgZW5jcnlwdCBhcyBlbmNyeXB0U2VyaWFsaXplZERhdGEsXG4gIHR5cGUgUnVuUGF5bG9hZEtleXMsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVSdW5FcnJvcixcbiAgaHlkcmF0ZVJ1bkVycm9yLFxuICBtYXliZUVuY3J5cHQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrLCBzdHJpcElubGluZVNvdXJjZU1hcCB9IGZyb20gJy4uL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzLFxuICBnZXRNYXhJbmxpbmVTdGVwcyxcbiAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkLFxuICBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSDigJQgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4g4oCUIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2gg4oCUIHNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQgdXNlcyB0aGUgc3RlcC1pZGVudGl0eS1zY29wZWQgZGlzcGF0Y2gga2V5XG4gICAqIChzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSkgc28gaXQgc3RheXMgbXV0dWFsbHlcbiAgICogZXhjbHVzaXZlIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcDtcbiAgICogYGJhY2tzdG9wOjxlcG9jaD5gIGNvdmVycyBkZWxheWVkIGNyYXNoIGJhY2tzdG9wcywgc2NvcGVkIHRvIHRoZVxuICAgKiBvd25lcnNoaXAgZXBvY2ggc28gYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIE5FVyBiYWNrc3RvcCBpbnN0ZWFkXG4gICAqIG9mIGJlaW5nIGFic29yYmVkIGJ5IHRoZSBpbi1mbGlnaHQgb25lOyBgcmV0cnk6PG4+YCBjb3ZlcnMgZGVsYXllZFxuICAgKiByZXRyeS90aHJvdHRsZSByZS1lbnF1ZXVlcywgc2NvcGVkIHRvIHRoZSBhdHRlbXB0IHNvIGVhY2ggYmFja29mZlxuICAgKiBob3AgaXMgZW5xdWV1ZWFibGUuXG4gICAqL1xuICBwdXJwb3NlOiAnZGlzcGF0Y2gnIHwgYGJhY2tzdG9wOiR7c3RyaW5nfWAgfCBgcmV0cnk6JHtudW1iZXJ9YDtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgc2VyaWFsaXplZCAocG9zc2libHkgZW5jcnlwdGVkKSBzdGVwIGlucHV0XG4gICAqIHRvIGNhcnJ5IG9uIHRoZSBtZXNzYWdlIGFzIGBzdGVwSW5wdXRgLCBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseVxuICAgKiByZS1lbnN1cmUgdGhlIGBzdGVwX2NyZWF0ZWRgIGV2ZW50IGlmIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGRpcmVjdFxuICAgKiB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkuIE9ubHkgc2V0IG9uIGBkaXNwYXRjaGAgcHVibGlzaGVzIHRoYXRcbiAgICogZGlzcGF0Y2hQZW5kaW5nT3BzIHBhcmFsbGVsaXplcyB3aXRoIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUuXG4gICAqL1xuICBzdGVwSW5wdXQ/OiBVaW50OEFycmF5O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHN0ZXBJbnB1dCxcbiAgICB3ZmRpYWcsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgIHdvcmxkLFxuICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICB7XG4gICAgICBydW5JZCxcbiAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAuLi4oc3RlcElucHV0ICE9PSB1bmRlZmluZWQgPyB7IHN0ZXBJbnB1dDogeyBpbnB1dDogc3RlcElucHV0IH0gfSA6IHt9KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSAnZGlzcGF0Y2gnIGtleSBpcyBzdGVwLWlkZW50aXR5LXNjb3BlZCAoY29ycmVsYXRpb25JZCArIGhhc2hlZFxuICAgICAgLy8gc3RlcCBuYW1lKSDigJQgc2hhcmVkIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcFxuICAgICAgLy8gc28gdGhlIHR3byBzdGF5IG11dHVhbGx5IGV4Y2x1c2l2ZSwgd2l0aG91dCBhIHJldm9rZWQgcmVzaWxpZW50XG4gICAgICAvLyBtZXNzYWdlIGFic29yYmluZyBhIHJlYXNzaWduZWQgY29ycmVsYXRpb24gaWQncyBsZWdpdGltYXRlIGRpc3BhdGNoLlxuICAgICAgLy8gU2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICAgIHB1cnBvc2UgPT09ICdkaXNwYXRjaCdcbiAgICAgICAgICA/IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KHN0ZXAuY29ycmVsYXRpb25JZCwgc3RlcC5zdGVwSWQpXG4gICAgICAgICAgOiBgJHtzdGVwLmNvcnJlbGF0aW9uSWR9OiR7cHVycG9zZX1gLFxuICAgICAgLi4uKGRlbGF5U2Vjb25kcyAmJiBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHt9KSxcbiAgICB9XG4gICk7XG4gIHdmZGlhZygnc3RlcF9xdWV1ZWQnLCB7XG4gICAgc3RlcElkOiBzdGVwLnN0ZXBJZCxcbiAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgcHVycG9zZSxcbiAgICBkZWxheVNlY29uZHM6IGRlbGF5U2Vjb25kcyA/PyAwLFxuICAgIC4uLihzdGVwSW5wdXQgIT09IHVuZGVmaW5lZCA/IHsgcmVzaWxpZW50OiB0cnVlIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCAodXN1YWxseSkgbm90IHF1ZXVlZCBoZXJlIOKAlCBxdWV1ZWluZyAob3IgaW5saW5lXG4gKiBleGVjdXRpb24pIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbi4gVXNlZCBib3RoIGZvciBzdXNwZW5zaW9uXG4gKiBwcm9jZXNzaW5nICh0aGUgaW5saW5lIGxvb3ApIGFuZCBmb3IgdGhlIHRlcm1pbmFsIGRyYWluIChmbHVzaGluZ1xuICogbGVmdG92ZXIgc2lkZSBlZmZlY3RzIHdoZW4gdGhlIHdvcmtmbG93IGNvbXBsZXRlZCBvciBmYWlsZWQsIG1pcnJvcmluZ1xuICogdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcykuXG4gKlxuICogVGhlIG9uZSBleGNlcHRpb24gaXMgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZvciBzdGVwIGNpZHMgbmFtZWQgaW5cbiAqIGBxdWV1ZVN0ZXBDaWRzYCAodGhlIGNhbGxlcidzIG92ZXJmbG93IHN0ZXBzKSB0aGF0IHBhc3MgdGhlIGVsaWdpYmlsaXR5XG4gKiBnYXRlcywgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBpcyBwYXJhbGxlbGl6ZWQgd2l0aCB0aGUgc3RlcCdzIHF1ZXVlXG4gKiBwdWJsaXNoIOKAlCB0aGUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlXG4gKiBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlIGRpcmVjdCB3cml0ZSBmYWlsZWRcbiAqIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluIGBxdWV1ZWRTdGVwQ2lkc2A7IHRoZVxuICogY2FsbGVyIHF1ZXVlcyB0aGUgcmVzdCBpdHNlbGYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoUGVuZGluZ09wcyhwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBlbmNyeXB0aW9uS2V5OiBSdW5QYXlsb2FkS2V5cyB8IHVuZGVmaW5lZDtcbiAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgLyoqXG4gICAqIFN0ZXAgY2lkcyB3aG9zZSBgc3RlcF9jcmVhdGVkYCBtdXN0IE5PVCBiZSB3cml0dGVuIGhlcmU6IHRoZSBpbmxpbmVcbiAgICogbG9vcCBjbGFpbXMgdGhlc2UgYXRvbWljYWxseSB2aWEgYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIChjYXJyeWluZyB0aGVcbiAgICogaW5wdXQpLCBzbyBhIGNvbmN1cnJlbnQgY2xhaW1hbnQgbG9zZXMgd2l0aCBFbnRpdHlDb25mbGljdEVycm9yXG4gICAqIGluc3RlYWQgb2YgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0aW5nIHRoZSBzYW1lIHN0ZXAuXG4gICAqL1xuICBza2lwU3RlcENyZWF0aW9uPzogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgdGhlIGNhbGxlciBpbnRlbmRzIHRvIGhhbmQgdG8gdGhlIHF1ZXVlIHRoaXMgdHVybiAob3ZlcmZsb3dcbiAgICogc3RlcHMgYmV5b25kIHRoZSBpbmxpbmUgY2FwKS4gRWxpZ2libGUgb25lcyBhcmUgcHVibGlzaGVkIGhlcmUsIGluXG4gICAqIHBhcmFsbGVsIHdpdGggdGhlaXIgc3RlcF9jcmVhdGVkIHdyaXRlIChyZXNpbGllbnQgc3RlcCBkaXNwYXRjaCksIGFuZFxuICAgKiByZXBvcnRlZCBiYWNrIGluIGBxdWV1ZWRTdGVwQ2lkc2AuXG4gICAqL1xuICBxdWV1ZVN0ZXBDaWRzPzogU2V0PHN0cmluZz47XG4gIC8qKiBRdWV1ZSBuYW1lc3BhY2UgZm9yIGFsbCBtZXNzYWdlIHB1Ymxpc2hlcyAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHMuIEluIHRoZSBkZWZhdWx0XG4gICAqIGBsaW5rZWRgIHRyYWNlIG1vZGUgdGhpcyByZXR1cm5zIHRoZSBjYXJyaWVyIG9mIHRoZSBydW4ncyBPUklHSU5cbiAgICogY29udGV4dCAod29ya2Zsb3cuc3RhcnQpLCBzbyBldmVyeSBpbnZvY2F0aW9uIGxpbmtzIGJhY2sgdG8gdGhlXG4gICAqIHN0YXJ0IGluIGEgc3RhciDigJQgY2FwdHVyaW5nIHRoZSBjdXJyZW50IGNvbnRleHQgaGVyZSBpbnN0ZWFkIHdvdWxkXG4gICAqIGNoYWluIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luY1xuICAgKiBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx7XG4gIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudDogYm9vbGVhbjtcbiAgY3JlYXRlZEdldENvbmZsaWN0SG9vazogYm9vbGVhbjtcbiAgLyoqIFN0ZXAgY2lkcyBhbHJlYWR5IHB1Ymxpc2hlZCB2aWEgcmVzaWxpZW50IGRpc3BhdGNoIOKAlCBzZWUgYWJvdmUuICovXG4gIHF1ZXVlZFN0ZXBDaWRzOiBTZXQ8c3RyaW5nPjtcbn0+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHJ1bklkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcGVuZGluZ09wZXJhdGlvbnMsXG4gICAgbmFtZXNwYWNlLFxuICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNraXBTdGVwQ3JlYXRpb24gPSBwYXJhbXMuc2tpcFN0ZXBDcmVhdGlvbjtcbiAgY29uc3QgcXVldWVTdGVwQ2lkcyA9IHBhcmFtcy5xdWV1ZVN0ZXBDaWRzO1xuICBjb25zdCB3ZmRpYWcgPSBwYXJhbXMud2ZkaWFnO1xuICAvLyBTdGVwIGNpZHMgcHVibGlzaGVkIHZpYSByZXNpbGllbnQgZGlzcGF0Y2ggYmVsb3cgKGNyZWF0ZSArIHF1ZXVlIGluXG4gIC8vIHBhcmFsbGVsLCBtZXNzYWdlIGNhcnJ5aW5nIGBzdGVwSW5wdXRgKS4gUmVwb3J0ZWQgdG8gdGhlIGNhbGxlciBzbyBpdFxuICAvLyBza2lwcyB0aGVtIGluIGl0cyBvd24gcXVldWVpbmcgcGFzcy5cbiAgY29uc3QgcXVldWVkU3RlcENpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggZWxpZ2liaWxpdHksIHNoYXJlZCBieSBldmVyeSBzdGVwIG9wIGJlbG93ICh0aGVcbiAgLy8gcGVyLXN0ZXAgaW5wdXQtc2l6ZSBjaGVjayBpcyBhcHBsaWVkIGluc2lkZSB0aGUgb3ApOiBmZWF0dXJlIGVuYWJsZWQgYW5kXG4gIC8vIGEgYmluYXJ5LXNhZmUgKENCT1IpIHF1ZXVlIHRyYW5zcG9ydCBmb3IgdGhlIHJ1bi5cbiAgLy9cbiAgLy8gVW5saWtlIHRoZSBub2RlOnZtIHN1c3BlbnNpb24gaGFuZGxlcidzIGdhdGUgKHNlZVxuICAvLyBTdXNwZW5zaW9uSGFuZGxlclBhcmFtcy5zdGVwRGlzcGF0Y2gpLCB0aGVyZSBpcyBOTyBwcmVjb25kaXRpb24tZ3VhcmRcbiAgLy8gZ2F0ZSBoZXJlOiB0aGlzIGVuZ2luZSdzIHN0ZXBfY3JlYXRlZCB3cml0ZXMgYXJlIHVuZ3VhcmRlZCAobm8gc25hcHNob3RcbiAgLy8gaXMgYXR0YWNoZWQpLCBzbyBhIGd1YXJkLWVuZm9yY2luZyBXb3JsZCBjYW4gbmV2ZXIgNDEyLXJlamVjdCB0aGVtIOKAlFxuICAvLyB0aGUgY29uc3VtZXIncyByZS1lbnN1cmUgdGhlcmVmb3JlIGNhbm5vdCBtYXRlcmlhbGl6ZSBhIHN0ZXAgdGhlIGd1YXJkXG4gIC8vIHJlamVjdGVkLiBJZiB0aGlzIGVuZ2luZSBldmVyIGFkb3B0cyBndWFyZGVkIHN1c3BlbnNpb24gd3JpdGVzLCB0aGVcbiAgLy8gY2FwYWJpbGl0eSBnYXRlIGZyb20gdGhlIG5vZGU6dm0gaGFuZGxlciBtdXN0IGJlIGFkZGVkIGhlcmUgdG9vLlxuICBjb25zdCByZXNpbGllbnREaXNwYXRjaEVsaWdpYmxlID1cbiAgICBxdWV1ZVN0ZXBDaWRzICE9PSB1bmRlZmluZWQgJiZcbiAgICBxdWV1ZVN0ZXBDaWRzLnNpemUgPiAwICYmXG4gICAgaXNSZXNpbGllbnRTdGVwRGlzcGF0Y2hFbmFibGVkKCkgJiZcbiAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVDtcbiAgLy8gU2V0IHdoZW4gYSBob29rIHdpdGggYSBwYXJrZWQgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyIGhhZCBpdHNcbiAgLy8gaG9va19jcmVhdGVkIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGUgd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkXG4gIC8vIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgbGV0IGNyZWF0ZWRHZXRDb25mbGljdEhvb2sgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gYSBuZXcgYXR0cl9zZXQgZXZlbnQgaXMgd3JpdHRlbiB0aGlzIGludm9jYXRpb24uIFRoZVxuICAvLyB3b3JrZmxvdyBtdXN0IGJlIHJlLWludm9rZWQgdG8gY29uc3VtZSBpdCAocmVzb2x2aW5nIHRoZSBwZW5kaW5nXG4gIC8vIHNldEF0dHJpYnV0ZXMoKSBwcm9taXNlKSwgc28gdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHkg4oCUXG4gIC8vIHNhbWUgcGF0dGVybiBhcyBhbiBlbGFwc2VkIHdhaXQuXG4gIGxldCBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSBmYWxzZTtcbiAgY29uc3Qgb3BzUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rT3AgPSBhc3luYyAoaG9vazogUGVuZGluZ0hvb2spOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHByb2Nlc3NpbmcgaG9vayBvcCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICB0b2tlblR5cGU6IHR5cGVvZiBob29rLnRva2VuLFxuICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgIGlzU3lzdGVtOiBob29rLmlzU3lzdGVtLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBob29rLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIGFib3J0UmVxdWVzdGVkOiBob29rLmFib3J0UmVxdWVzdGVkLFxuICAgIH0pO1xuXG4gICAgaWYgKCFob29rLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgLy8gYGhvb2subWV0YWRhdGFgIGlzIHRoZSBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlc1xuICAgICAgLy8gcHJvZHVjZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldXG4gICAgICAvLyAob3B0aW9ucy5tZXRhZGF0YSlgIGluc2lkZSB0aGUgVk0uIEVuY3J5cHQgb24gdGhlIGhvc3RcbiAgICAgIC8vIHNpZGUgYmVmb3JlIHdyaXRpbmcg4oCUIG1hdGNoZXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIE5vIHByZS1jaGVjayB2aWEgaG9va3MubGlzdDogd2l0aCBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzXG4gICAgICAvLyAoc2FtZSBWTSBzZWVkIGFjcm9zcyByZXBsYXlzKSBhbmQgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZClcbiAgICAgIC8vIHVuaXF1ZW5lc3MgaW4gd29ybGRzLCB0aGUgc3RvcmFnZSBsYXllciByZWplY3RzIGR1cGxpY2F0ZXMgYXNcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IsIHdoaWNoIHdlIHN3YWxsb3cgYmVsb3cuIFRoaXMgZHJvcHMgb25lXG4gICAgICAvLyBuZXR3b3JrIHJvdW5kLXRyaXAgcGVyIHBlbmRpbmcgaG9vay5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZE1ldGFkYXRhID1cbiAgICAgICAgICB0eXBlb2YgaG9vay5tZXRhZGF0YSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShob29rLm1ldGFkYXRhLCBlbmNyeXB0aW9uS2V5KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY3JlYXRlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbDpcbiAgICAgICAgICAgICAgaG9vay50b2tlblJldGVudGlvblVudGlsID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoaG9vay50b2tlblJldGVudGlvblVudGlsKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBlbmNyeXB0ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIGlzV2ViaG9vayBleHBsaWNpdGx5LiBXb3JsZHMgZGVmYXVsdCBpdCB0b1xuICAgICAgICAgICAgLy8gYHRydWVgIHdoZW4gYWJzZW50LCB3aGljaCB3b3VsZCBicmVhayB0aGUgcHVibGljIHdlYmhvb2tcbiAgICAgICAgICAgIC8vIGVuZHBvaW50J3MgNDA0IGd1YXJkIGZvciBob29rcyBjcmVhdGVkIHZpYSBjcmVhdGVIb29rKCkuXG4gICAgICAgICAgICBpc1dlYmhvb2s6IGhvb2suaXNXZWJob29rLFxuICAgICAgICAgICAgLy8gU3lzdGVtIGhvb2tzIChBYm9ydENvbnRyb2xsZXIpIGFyZSBleGVtcHQgZnJvbSB1c2VyXG4gICAgICAgICAgICAvLyB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgICAgICAgICAgLi4uKGhvb2suaXNTeXN0ZW0gPyB7IGlzU3lzdGVtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHN0b3JhZ2UgZGV0ZWN0ZWQgYSByZWFsIHRva2VuIGNvbmZsaWN0IHdpdGggYW5vdGhlclxuICAgICAgICAvLyB3b3JrZmxvdydzIGhvb2ssIHJlLXF1ZXVlIHNvIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGNhblxuICAgICAgICAvLyBwcm9jZXNzIHRoZSBjb25mbGljdCBldmVudCBhbmQgZmFpbCBncmFjZWZ1bGx5LlxuICAgICAgICBpZiAocmVzdWx0LmV2ZW50Py5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGBob29rX2NvbmZsaWN0XyR7aG9vay5jb3JyZWxhdGlvbklkfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBbHJlYWR5IGNyZWF0ZWQgYnkgYSBjb25jdXJyZW50IGludm9jYXRpb24g4oCUIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyB0byBhYm9ydCBwcm9jZXNzaW5nIGJlbG93IChpZiBhbnkpIGluc3RlYWQgb2YgYmFpbGluZy5cbiAgICAgICAgaWYgKCFFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChob29rLmhhc0dldENvbmZsaWN0QXdhaXRlcikge1xuICAgICAgICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9vay5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgLy8gUmVjb3JkIHRoZSBhYm9ydCBkdXJhYmx5OiBhIGhvb2tfcmVjZWl2ZWQgZXZlbnQgY2FycnlpbmdcbiAgICAgIC8vIHRoZSBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkLFxuICAgICAgLy8gcGx1cyBhIGJlc3QtZWZmb3J0IHN0cmVhbSBwYWNrZXQgZm9yIHJlYWwtdGltZSBzdGVwXG4gICAgICAvLyBwcm9wYWdhdGlvbi4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBzdXNwZW5zaW9uXG4gICAgICAvLyBoYW5kbGVyIChob29rc05lZWRpbmdBYm9ydCkuXG4gICAgICBjb25zdCBhYm9ydFBheWxvYWQgPVxuICAgICAgICBob29rLmFib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgICA/ICgoYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICBob29rLmFib3J0UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKSkgYXMgVWludDhBcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgdG9rZW46IGhvb2sudG9rZW4sXG4gICAgICAgICAgICBwYXlsb2FkOiBhYm9ydFBheWxvYWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvLyBzdHJlYW1OYW1lIGlzIGRlcml2ZWQgZnJvbSB0aGUgYWJvcnQgaG9vayB0b2tlblxuICAgICAgLy8gKGBhYnJ0X3tpZH1gIOKGkiBgc3RybV97aWR9X3N5c3RlbV9hYm9ydGApLlxuICAgICAgaWYgKGhvb2sudG9rZW4uc3RhcnRzV2l0aCgnYWJydF8nKSAmJiBhYm9ydFBheWxvYWQpIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtTmFtZSA9IGBzdHJtXyR7aG9vay50b2tlbi5zbGljZSgnYWJydF8nLmxlbmd0aCl9X3N5c3RlbV9hYm9ydGA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShydW5JZCwgc3RyZWFtTmFtZSwgYWJvcnRQYXlsb2FkKTtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5zdHJlYW1zLmNsb3NlKHJ1bklkLCBzdHJlYW1OYW1lKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQg4oCUIHRoZSBob29rIGV2ZW50IHByb3ZpZGVzIHRoZSBkdXJhYmxlXG4gICAgICAgICAgLy8gZmFsbGJhY2suXG4gICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byB3cml0ZSBhYm9ydCBzdHJlYW0gcGFja2V0JyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2Fib3J0X3JlY29yZGVkJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NIb29rRGlzcG9zZU9wID0gYXN5bmMgKFxuICAgIG9wOiBQZW5kaW5nSG9va0Rpc3Bvc2VcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnaG9va19kaXNwb3NlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogb3AuY29ycmVsYXRpb25JZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgLy8gRGlzcG9zaW5nIGEgaG9vayB3aG9zZSBlbnRpdHkgbm8gbG9uZ2VyIChvciBuZXZlcikgZXhpc3RzIGlzIGFuXG4gICAgICAvLyBpZGVtcG90ZW50IG5vLW9wOiB0aGUgZW50aXR5IG1heSBoYXZlIGJlZW4gdG9ybiBkb3duIGJ5IGFcbiAgICAgIC8vIGNvbmN1cnJlbnQgcnVuIGNhbmNlbGxhdGlvbiwgb3IgdGhlIGhvb2sgbWF5IGhhdmUgbG9zdCBpdHNcbiAgICAgIC8vIHRva2VuIGNsYWltIHRvIGEgY29uZmxpY3QuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZWxlYXNlLlxuICAgICAgaWYgKEhvb2tOb3RGb3VuZEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG5cbiAgLy8gSG9vayBvcGVyYXRpb25zIGFyZSBncm91cGVkIGJ5IHRva2VuIGFuZCBwcm9jZXNzZWQgU0VRVUVOVElBTExZIGluXG4gIC8vIGNvZGUgb3JkZXIgd2l0aGluIGVhY2ggZ3JvdXAsIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBzdXNwZW5zaW9uXG4gIC8vIGhhbmRsZXIgKGhvb2tJdGVtc0J5VG9rZW4pOiBhIGRpc3Bvc2UoKSBvZiBhbiBlYXJsaWVyIGhvb2sgbXVzdFxuICAvLyByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmUgYSBsYXRlciBzYW1lLXRva2VuIGhvb2sncyBjcmVhdGlvbiBpc1xuICAvLyB2YWxpZGF0ZWQgYnkgdGhlIHdvcmxkIOKAlCBwYXJhbGxlbCBkaXNwYXRjaCB3b3VsZCBvdGhlcndpc2UgcmVjb3JkIGFcbiAgLy8gc3B1cmlvdXMgaG9va19jb25mbGljdCBhZ2FpbnN0IHRoZSBydW4ncyBvd24gZGlzcG9zZWQgaG9vayAoZS5nLiBhXG4gIC8vIGRpc3Bvc2XihpJyZWNyZWF0ZSBsb29wIHJldXNpbmcgb25lIHRva2VuKS4gRGlmZmVyZW50IHRva2VucyBoYXZlIG5vXG4gIC8vIGNsYWltIGludGVyYWN0aW9uLCBzbyB0b2tlbiBncm91cHMgcnVuIGluIHBhcmFsbGVsIHdpdGggZWFjaCBvdGhlclxuICAvLyBhbmQgd2l0aCB0aGUgbm9uLWhvb2sgb3BzIGJlbG93LlxuICBjb25zdCBob29rT3BzQnlUb2tlbiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIChQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSlbXVxuICA+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAoIW9wLmhhc0NyZWF0ZWRFdmVudCB8fCAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkKVxuICAgICkge1xuICAgICAga2V5ID0gKG9wIGFzIFBlbmRpbmdIb29rKS50b2tlbjtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09ICdob29rX2Rpc3Bvc2UnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIFBlci1vcCBmYWxsYmFjayBncm91cCB3aGVuIHRoZSB0b2tlbiBpcyB1bmtub3duIOKAlCBubyBvcmRlcmluZ1xuICAgICAgLy8gZ3VhcmFudGVlcywgbWF0Y2hpbmcgdGhlIHByZXZpb3VzIHBhcmFsbGVsIGJlaGF2aW9yLlxuICAgICAga2V5ID0gKG9wIGFzIFBlbmRpbmdIb29rRGlzcG9zZSkudG9rZW4gPz8gYF9fY2lkOiR7b3AuY29ycmVsYXRpb25JZH1gO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGdyb3VwID0gaG9va09wc0J5VG9rZW4uZ2V0KGtleSk7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBncm91cC5wdXNoKG9wIGFzIFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va09wc0J5VG9rZW4uc2V0KGtleSwgW29wIGFzIFBlbmRpbmdIb29rIHwgUGVuZGluZ0hvb2tEaXNwb3NlXSk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgaG9va09wc0J5VG9rZW4udmFsdWVzKCkpIHtcbiAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBvcCBvZiBncm91cCkge1xuICAgICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NIb29rT3Aob3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcChvcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICBpZiAoXG4gICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICFza2lwU3RlcENyZWF0aW9uPy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBvcCBhcyBQZW5kaW5nU3RlcDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHN0ZXBfY3JlYXRlZCBldmVudC4gYHN0ZXAuaW5wdXRgIGlzIHRoZVxuICAgICAgICAgIC8vIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzIChcImRldmxcIiArIGRldmFsdWUpIHByb2R1Y2VkXG4gICAgICAgICAgLy8gYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcignd29ya2Zsb3ctc2VyaWFsaXplJyldKHthcmdzLFxuICAgICAgICAgIC8vIGNsb3N1cmVWYXJzLCB0aGlzVmFsfSlgIGluc2lkZSB0aGUgVk0uIFRoZSBWTSBoYXMgbm9cbiAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhlIENyeXB0b0tleSwgc28gZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmVcbiAgICAgICAgICAvLyBvbiB0aGUgaG9zdCBzaWRlIOKAlCBtYXRjaGluZyB3aGF0XG4gICAgICAgICAgLy8gYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGRvZXMgaW4gdGhlIG5vZGU6dm0gZW5naW5lLlxuICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZElucHV0ID0gYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZpcmUgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3RlcCdzIHF1ZXVlIHB1Ymxpc2ggaW4gcGFyYWxsZWwg4oCUIHRoZSBtZXNzYWdlIGNhcnJpZXMgdGhlXG4gICAgICAgICAgLy8gc2FtZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlIGNvbnN1bWVyIGNhblxuICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmUgdGhlIGV2ZW50IGlmIHRoZSBkaXJlY3Qgd3JpdGUgZmFpbGVkXG4gICAgICAgICAgLy8gdHJhbnNpZW50bHkuIE1pcnJvcnMgdGhlIG5vZGU6dm0gc3VzcGVuc2lvbiBoYW5kbGVyIGFuZCB0aGVcbiAgICAgICAgICAvLyByZXNpbGllbnQgc3RhcnQgLyByZXNpbGllbnQgaG9vayByZXN1bWUgcGF0dGVybnMuIE9ubHkgZm9yXG4gICAgICAgICAgLy8gY2FsbGVyLWRlc2lnbmF0ZWQgb3ZlcmZsb3cgc3RlcHMgd2l0aCBpbnB1dHMgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gbWVzc2FnZSBjYW4gc2FmZWx5IGNhcnJ5IChiaW5hcnksIHVuZGVyIHRoZSBWUVMgc2l6ZSBjYXApLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc2lsaWVudERpc3BhdGNoRWxpZ2libGUgJiZcbiAgICAgICAgICAgIHF1ZXVlU3RlcENpZHM/LmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICBlbmNyeXB0ZWRJbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICAgIGVuY3J5cHRlZElucHV0LmJ5dGVMZW5ndGggPD0gTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbY3JlYXRlUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZElucHV0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICAgICAgc3RlcElucHV0OiBlbmNyeXB0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBRdWV1ZSBmYWlsdXJlIGlzIGFsd2F5cyBmYXRhbCBmb3IgdGhpcyBkaXNwYXRjaCBwYXNzOlxuICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgbWVzc2FnZSB0aGUgc3RlcCB3b3VsZCByZWx5IG9uIHRoZSBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFsb25lLCBhbmQgaWYgdGhlIGNyZWF0ZSBBTFNPIGZhaWxlZCB0aGVyZSB3b3VsZCBiZSBub1xuICAgICAgICAgICAgLy8gZHVyYWJsZSByZWNvcmQgYXQgYWxsLiBQcm9wYWdhdGluZyByZWRlbGl2ZXJzIHRoZVxuICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UsIHdoaWNoIHJlLWNyZWF0ZXMgdGhlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGFuZCByZS1kaXNwYXRjaGVzLlxuICAgICAgICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZWRTdGVwQ2lkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IGNyZWF0ZVJlc3VsdC5yZWFzb247XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGludm9jYXRpb24gd3JvdGUgaXQgZmlyc3Qg4oCUIHRoZSBtZXNzYWdlIGlzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBvdXQ7IGl0cyBkdXBsaWNhdGUgcHVibGlzaCBkZWR1cGVzIG9uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudDogdGhlIHdyaXRlIGZhaWxlZCB0cmFuc2llbnRseSAoNDI5IC8gNXh4IC9cbiAgICAgICAgICAgICAgICAvLyB0cmFuc3BvcnQpIGJ1dCB0aGUgc3RlcCBtZXNzYWdlIOKAlCBjYXJyeWluZyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgaW5wdXQg4oCUIHdhcyBwdWJsaXNoZWQsIHNvIHRoZSBjb25zdW1lclxuICAgICAgICAgICAgICAgIC8vIGlkZW1wb3RlbnRseSByZS1lbnN1cmVzIHRoZSBzdGVwX2NyZWF0ZWQgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nLlxuICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICdTdGVwIGNyZWF0aW9uIGV2ZW50IHdyaXRlIGZhaWxlZCwgYnV0IHRoZSBzdGVwIHdhcyAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BhdGNoZWQgdmlhIHRoZSBxdWV1ZS4gVGhlIHN0ZXBfY3JlYXRlZCBldmVudCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgZW5zdXJlZCBieSB0aGUgcXVldWUgY29uc3VtZXIuJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgd2ZkaWFnKCdzdGVwX3Jlc2lsaWVudF9kaXNwYXRjaF9yZWNvdmVyZWQnLCB7XG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkSW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIG90aGVyd2lzZSB0aGUgY2FsbGVyJ3MgZGVjaXNpb24g4oCUIHRoZVxuICAgICAgICAgIC8vIGlubGluZSBsb29wIGV4ZWN1dGVzIGZyZXNoIHN0ZXBzIGluIHRoZSBsaXZlIFZNIGFuZCBvbmx5XG4gICAgICAgICAgLy8gcXVldWVzIHRoZSBvdmVyZmxvdyAvIHJldHJ5IC8gYmFja3N0b3AgY2FzZXMgKHNlZVxuICAgICAgICAgIC8vIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSDigJQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCwgY3JlYXRlZEdldENvbmZsaWN0SG9vaywgcXVldWVkU3RlcENpZHMgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3b3JrZmxvdyB1c2luZyB0aGUgUXVpY2tKUyBXQVNNIFZNIGVuZ2luZS5cbiAqXG4gKiBUaGlzIHJlcGxhY2VzIHRoZSBgbm9kZTp2bWAgcmVwbGF5IHBhdGggKHJ1bldvcmtmbG93ICsgRXZlbnRzQ29uc3VtZXIpXG4gKiB3aXRoIGEgUXVpY2tKUyBWTSBpbnZvY2F0aW9uIHRoYXQgcGVyZm9ybXMgdGhlIHNhbWUgZnVsbCBldmVudCByZXBsYXkuXG4gKlxuICogS05PV04gR0FQIOKAlCBzbG90IHNuYXBzaG90OiB1bmxpa2UgdGhlIG5vZGU6dm0gcGF0aCwgbm8gZXZlbnQgd3JpdGUgaW5cbiAqIHRoaXMgZmlsZSBjYXJyaWVzIHtAbGluayBDcmVhdGVFdmVudFBhcmFtcy5ldmVudENvdW50fSwgc28gYSBXb3JsZCBuZXZlclxuICogbGVhcm5zIHdoaWNoIGV2ZW50cyB0aGUgd3JpdGVyIGhhZCBub3Qgc2VlbiBhbmQgbmV2ZXIgcmVwb3J0cyB0aGVtIGJhY2suXG4gKiBUaGUgZW5naW5lIGN1cnJlbnRseSByZWxpZXMgb24gcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgZXZlbnRcbiAqIHVuaXF1ZW5lc3MgKEVudGl0eUNvbmZsaWN0RXJyb3IgZGVkdXApIGFsb25lLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZVxuICogc2ltcGxpZmljYXRpb24gd2hpbGUgdGhlIGVuZ2luZSBpcyBleHBlcmltZW50YWwg4oCUIHdpcmluZyB0aGUgc25hcHNob3QgaXNcbiAqIHRyYWNrZWQgZm9sbG93LXVwIHdvcms7IGFueW9uZSBhZGRpbmcgbmV3IHdyaXRlIHBhdGhzIGhlcmUgc2hvdWxkIG5vdFxuICogYXNzdW1lIHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSBvbiB0aGlzIGF4aXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHBhcmFtczoge1xuICB3b3JrZmxvd0NvZGU6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgLyoqXG4gICAqIEV2ZW50cyByZXR1cm5lZCBpbmxpbmUgYnkgYGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJywgLi4uKWAgb3IgYnlcbiAgICogdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBgaG9va19yZWNlaXZlZGAgcHJlbG9hZC4gV2hlbiB0aGV5IGluZGljYXRlXG4gICAqIGEgZmlyc3QgaW52b2NhdGlvbiDigJQgb3Igd2hlbiBgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGVgIGF0dGVzdHMgdGhleVxuICAgKiBhcmUgdGhlIGNvbXBsZXRlIGxvZyDigJQgdGhleSBhcmUgdXNlZCBhcyB0aGUgZXZlbnQgbG9nIGluc3RlYWQgb2ZcbiAgICogZmV0Y2hpbmcgdmlhIGBldmVudHMubGlzdGAsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGZhc3QgcGF0aC5cbiAgICovXG4gIHByZWxvYWRlZEV2ZW50cz86IEV2ZW50W107XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIGNhbGxlciBoYXMgdmFsaWRhdGVkIHRoYXQgYHByZWxvYWRlZEV2ZW50c2AgaXMgdGhlIHJ1bidzXG4gICAqIENPTVBMRVRFIGV2ZW50IGxvZyAoZS5nLiB0aGUgbGF6eSBob29rIGZhc3QgcGF0aCdzIGhhc01vcmUtZmFsc2VcbiAgICogcmVwbGF5IHByZWxvYWQpLiBUaGUgZmlyc3QtaW52b2NhdGlvbiBoZXVyaXN0aWMgYmVsb3cgb25seSByZWNvZ25pemVzXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkLW9ubHkgcHJlbG9hZHMsIHNvIHdpdGhvdXQgdGhpcyBhdHRlc3RhdGlvbiBhXG4gICAqIGhvb2stcmVzdW1lIHByZWxvYWQgd291bGQgYmUgZGlzY2FyZGVkIGFuZCByZWZldGNoZWQuXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSdW4gaW5wdXQgY2FycmllZCB0aHJvdWdoIHRoZSBxdWV1ZSBtZXNzYWdlIG9uIGZpcnN0IGRlbGl2ZXJ5LiBVc2VkXG4gICAqIGFzIGEgbGFzdC1yZXNvcnQgZmFsbGJhY2sgZm9yIGBydW5fY3JlYXRlZC5ldmVudERhdGEuaW5wdXRgIHdoZW5cbiAgICogdGhlIGV2ZW50IGxvZyBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgT1RlbCBzcGFuICh0aGUgb3V0ZXIgYFdPUktGTE9XIHt3b3JrZmxvd05hbWV9YCBzcGFuIGZyb21cbiAgICogYHJ1bnRpbWUudHNgKS4gV2hlbiBzdXBwbGllZCwgVk0gbGlmZWN5Y2xlIGF0dHJpYnV0ZXMgYXJlIGF0dGFjaGVkXG4gICAqIHRvIGl0IGZvciBlbmQtdG8tZW5kIHZpc2liaWxpdHkuXG4gICAqL1xuICBwYXJlbnRTcGFuPzogU3BhbjtcbiAgLyoqXG4gICAqIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2VcbiAgICogKHVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQpLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIGd1YXJkOlxuICAgKiBhIHJ1bmF3YXkgcnVuIGlzIGZhaWxlZCBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGUgY2VpbGluZy4gVGhlIHRocm93XG4gICAqIHByb3BhZ2F0ZXMgdG8gdGhlIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyAodGhlIFF1aWNrSlNcbiAgICogZGlzcGF0Y2ggcnVucyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggY2xhc3NpZmllcyBpdCBhbmRcbiAgICogcmVjb3JkcyBydW5fZmFpbGVkIHdpdGggTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICovXG4gIG1heEV2ZW50c0xpbWl0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgZGVsaXZlcnkgYXR0ZW1wdCBvZiB0aGUgbWVzc2FnZSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiAoZnJvbVxuICAgKiB0aGUgcXVldWUgaGFuZGxlcidzIG1ldGFkYXRhOyAxID0gZmlyc3QgZGVsaXZlcnkpLiBTdXJmYWNlZCBpblxuICAgKiBkaWFnbm9zdGljczsgY3Jhc2ggcmVjb3ZlcnkgaXRzZWxmIGlzIGRyaXZlbiBieSB0aGUgb3duZXJzaGlwLWxlYXNlXG4gICAqIGRlY2lzaW9uIHRhYmxlIGluIHRoZSBsb29wLCBub3QgYnkgdGhlIGF0dGVtcHQgY291bnQuXG4gICAqL1xuICBkZWxpdmVyeUF0dGVtcHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBkZWxpdmVyeSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiwgc3RhbXBlZCBhc1xuICAgKiBgb3duZXJNZXNzYWdlSWRgIG9uIGlubGluZSBsYXp5IHN0ZXAgY2xhaW1zIHNvIHdha2UgcmVwbGF5cyBkZWZlciB0b1xuICAgKiB0aGUgaW4tZmxpZ2h0IGJvZHkgaW5zdGVhZCBvZiByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0IElEIG9mIHRoZSBxdWV1ZSBpbnZvY2F0aW9uLCB3aGVuIHRoZSBxdWV1ZSBwcm92aWRlcyBvbmUuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSByZXNvbHZlZCBhdCByb3V0ZSByZWdpc3RyYXRpb24gKHJ1bnRpbWUudHMpLiBNdXN0IGJlXG4gICAqIHRocmVhZGVkIGludG8gZXZlcnkgbWVzc2FnZSBwdWJsaXNoOiB0aGUgYnVpbGRlcnMgYmFrZSB0aGUgbmFtZXNwYWNlXG4gICAqIGludG8gZ2VuZXJhdGVkIHJvdXRlcywgc28gY29uc3VtZXJzIGxpc3RlbiBvbiBgX188bnM+X3drZl93b3JrZmxvd18qYFxuICAgKiDigJQgYSBwdWJsaXNoIHdpdGhvdXQgaXQgbGFuZHMgb24gYF9fd2tmX3dvcmtmbG93XypgIGFuZCBpcyBuZXZlclxuICAgKiBwaWNrZWQgdXAuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzXG4gICAqIChnZXROZXh0VHJhY2VDYXJyaWVyKS4gSW4gdGhlIGRlZmF1bHQgYGxpbmtlZGAgdHJhY2UgbW9kZSBldmVyeVxuICAgKiBpbnZvY2F0aW9uIG11c3QgbGluayBiYWNrIHRvIHRoZSBydW4ncyBvcmlnaW4gKHdvcmtmbG93LnN0YXJ0KSBpbiBhXG4gICAqIHN0YXI7IGNhcHR1cmluZyB0aGUgY3VycmVudCBpbnZvY2F0aW9uIGNvbnRleHQgaW5zdGVhZCB3b3VsZCBjaGFpblxuICAgKiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmMgcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2Fycmllcj86ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59KTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyIH0gfCB2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JrZmxvd0NvZGUsXG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIHByZWxvYWRlZEV2ZW50cyxcbiAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZSxcbiAgICBydW5JbnB1dCxcbiAgICBwYXJlbnRTcGFuLFxuICAgIG1heEV2ZW50c0xpbWl0LFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBvd25lck1lc3NhZ2VJZCxcbiAgICByZXF1ZXN0SWQsXG4gICAgbmFtZXNwYWNlLFxuICB9ID0gcGFyYW1zO1xuICAvLyBTdGFuZGFsb25lLWNhbGxlciBmYWxsYmFjayAodGVzdHMpOiB3aXRob3V0IGEgcnVudGltZS50cyBjYXJyaWVyXG4gIC8vIGFjY2Vzc29yLCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBjb250ZXh0LlxuICBjb25zdCBuZXh0VHJhY2VDYXJyaWVyID1cbiAgICBwYXJhbXMubmV4dFRyYWNlQ2FycmllciA/PyAoKCkgPT4gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkpO1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gIGNvbnN0IHJ1bklkID0gd29ya2Zsb3dSdW4ucnVuSWQ7XG4gIGNvbnN0IGludm9jYXRpb25TdGFydCA9IHRpY2soKTtcblxuICAvLyBTdHJpcCB0aGUgaW5saW5lIHNvdXJjZSBtYXAgY29tbWVudCBiZWZvcmUgZXZhbHVhdGluZyB0aGUgYnVuZGxlIGluXG4gIC8vIHRoZSBRdWlja0pTIFZNLiBUaGUgbWFwIGlzIHB1cmVseSBob3N0LXNpZGUgbWV0YWRhdGEgZm9yXG4gIC8vIGByZW1hcEVycm9yU3RhY2tgIChjYWxsZWQgYmVsb3cgb24gd29ya2Zsb3cgZmFpbHVyZXMsIGFnYWluc3QgdGhlXG4gIC8vIE9SSUdJTkFMIGB3b3JrZmxvd0NvZGVgKS4gUXVpY2tKUyByZXRhaW5zIHNvdXJjZSB0ZXh0IGZvclxuICAvLyBzdGFjay10cmFjZSBsaW5lIGxvb2t1cHMsIHNvIHRoZSBmZXctTUIgYmFzZTY0IGNvbW1lbnQgd291bGQgYmxvYXRcbiAgLy8gdGhlIFZNIGhlYXAgZm9yIG5vIGJlbmVmaXQuXG4gIGNvbnN0IHdvcmtmbG93Q29kZUZvclZNID0gc3RyaXBJbmxpbmVTb3VyY2VNYXAod29ya2Zsb3dDb2RlKTtcblxuICAvLyBQZXItaW52b2NhdGlvbiBkaWFnbm9zdGljIGlkIHNvIGRlYnVnIGxvZ3MgY2FuIGJlIGNvcnJlbGF0ZWQgZXZlbiBpZlxuICAvLyB0aGUgc2FtZSBydW5JZCBpcyBwcm9jZXNzZWQgYnkgb3ZlcmxhcHBpbmcgaW52b2NhdGlvbnMgb24gZGlmZmVyZW50XG4gIC8vIGZ1bmN0aW9uIGluc3RhbmNlcy5cbiAgY29uc3QgaW52b2NhdGlvbklkID0gYGludl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gO1xuXG4gIC8vIFN0cnVjdHVyZWQgcGVyLWNoZWNrcG9pbnQgZGlhZ25vc3RpYyBoZWxwZXIsIGdyZXAtZnJpZW5kbHkgYnkgcnVuSWQuXG4gIGNvbnN0IHdmZGlhZyA9IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRVUlDS0pTX1ZNX0RJQUcnLCB7XG4gICAgICBjaGVja3BvaW50LFxuICAgICAgcnVuSWQsXG4gICAgICBpbnZvY2F0aW9uSWQsXG4gICAgICB0RWxhcHNlZE1zOiBNYXRoLnJvdW5kKHRpY2soKSAtIGludm9jYXRpb25TdGFydCksXG4gICAgICAuLi5maWVsZHMsXG4gICAgfSk7XG4gIH07XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLldvcmtmbG93Vm0oJ3F1aWNranMnKSxcbiAgfSk7XG5cbiAgd2ZkaWFnKCdlbnRlcicsIHtcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIGhhc1ByZWxvYWRlZEV2ZW50czpcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJiBwcmVsb2FkZWRFdmVudHMubGVuZ3RoID4gMCxcbiAgICBwcmVsb2FkZWRFdmVudENvdW50OiBwcmVsb2FkZWRFdmVudHM/Lmxlbmd0aCA/PyAwLFxuICAgIGhhc1J1bklucHV0OiAhIXJ1bklucHV0LFxuICB9KTtcblxuICAvLyBUaGUgd29ya2Zsb3dOYW1lIGZyb20gdGhlIHF1ZXVlIHRvcGljIGlzIGFscmVhZHkgdGhlIGZ1bGwgd29ya2Zsb3cgSURcbiAgLy8gKGUuZy4gXCJ3b3JrZmxvdy8vLi93b3JrZmxvd3MvMV9zaW1wbGUvL3NpbXBsZVwiKVxuICBjb25zdCB3b3JrZmxvd0lkID0gd29ya2Zsb3dOYW1lO1xuXG4gIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IHVwIGZyb250IOKAlCBuZWVkZWQgdG8gZGVjcnlwdCBldmVudFxuICAvLyBwYXlsb2FkcyBpbnNpZGUgdGhlIFZNIGFuZCB0byBlbmNyeXB0IGV2ZW50IHBheWxvYWRzIHdyaXR0ZW4gYmVsb3cuXG4gIC8vIFJlc29sdmUgdGhlIEZVTEwgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgKyBYMjU1MTkga2V5cGFpciksIG5vdFxuICAvLyBqdXN0IGBpbXBvcnRLZXkocmF3S2V5KWA6IGEgcnVuIHJlYWRpbmcgaXRzIG93biBldmVudCBsb2cgY2FuIGVuY291bnRlclxuICAvLyBzZWFsZWQgKGBlbmNwYCkgaG9vayBwYXlsb2FkcyB0aGF0IGEgY3Jvc3MtZGVwbG95bWVudCBgcmVzdW1lSG9vaygpYFxuICAvLyB3cm90ZSB0byBpdCAoc2VhbGluZyBpcyBwcmVzZW5jZS1nYXRlZCBvbiB0aGUgcnVuJ3MgcHVibGlzaGVkXG4gIC8vIGVuY3J5cHRpb25QdWJsaWNLZXksIHdoaWNoIHRoZSBzaGFyZWQgc3RhcnQoKSBwYXRoIHN0YW1wcyByZWdhcmRsZXNzIG9mXG4gIC8vIGVuZ2luZSkuIEEgYmFyZSBzeW1tZXRyaWMga2V5IGNhbm5vdCBvcGVuIHRob3NlIGFuZCB3b3VsZCB3ZWRnZSB0aGUgcnVuXG4gIC8vIHJpZ2h0IGFmdGVyIGhvb2tfcmVjZWl2ZWQg4oCUIHRoZSBub2RlOnZtIGVuZ2luZSByZXNvbHZlcyB0aGUgc2FtZSBmdWxsXG4gIC8vIGNhcGFiaWxpdHkgdmlhIG1lbW9pemVFbmNyeXB0aW9uS2V5LlxuICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4od29ya2Zsb3dSdW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcblxuICAvLyBMb2FkIHRoZSBGVUxMIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gT24gZmlyc3QgaW52b2NhdGlvbiB0aGVcbiAgLy8gcHJlbG9hZGVkIGV2ZW50cyBmcm9tIHRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBhcmUgdGhlIGNvbXBsZXRlIGxvZ1xuICAvLyBhbmQgc2F2ZSB0aGUgZXZlbnRzLmxpc3Qgcm91bmQtdHJpcHM7IGEgY2FsbGVyLWF0dGVzdGVkIGNvbXBsZXRlXG4gIC8vIHByZWxvYWQgKGxhenkgaG9vayBmYXN0IHBhdGgpIGlzIHRydXN0ZWQgdGhlIHNhbWUgd2F5LlxuICBsZXQgZXZlbnRzOiBFdmVudFtdO1xuICBsZXQgZXZlbnRzRmV0Y2hlZFBhZ2VzID0gMDtcbiAgY29uc3QgdXNlUHJlbG9hZGVkID1cbiAgICAocHJlbG9hZGVkRXZlbnRzQ29tcGxldGUgPT09IHRydWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocHJlbG9hZGVkRXZlbnRzKSAmJlxuICAgICAgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgaXNGaXJzdEludm9jYXRpb24ocHJlbG9hZGVkRXZlbnRzKTtcbiAgaWYgKHVzZVByZWxvYWRlZCAmJiBwcmVsb2FkZWRFdmVudHMpIHtcbiAgICBldmVudHMgPSBwcmVsb2FkZWRFdmVudHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsRXZlbnRzOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuXG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBldmVudHNGZXRjaGVkUGFnZXMrKztcbiAgICAgIGFsbEV2ZW50cy5wdXNoKC4uLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgLy8gVXBkYXRlIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGZldGNoZWQgcGFnZSdzIGN1cnNvci5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gd2UgZ290IHJlc3VsdHMg4oCUIHRoZSBmaW5hbCBlbXB0eS1wYWdlIHJlc3BvbnNlXG4gICAgICAvLyByZXR1cm5zIGN1cnNvcj1udWxsIHdoaWNoIHdlIG11c3QgTk9UIHVzZSAoaXQgd291bGQgcmVzZXQgdGhlIGN1cnNvcikuXG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSB7XG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvcjtcbiAgICAgIH1cbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5kYXRhLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2UuY3Vyc29yICE9IG51bGw7XG4gICAgfVxuXG4gICAgZXZlbnRzID0gYWxsRXZlbnRzO1xuICB9XG5cbiAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGVcbiAgLy8gc2VydmVyLXN1cHBsaWVkIGNlaWxpbmcg4oCUIHNhbWUgZW5mb3JjZW1lbnQgcG9pbnQgYXMgdGhlIG5vZGU6dm1cbiAgLy8gZW5naW5lJ3MgcmVwbGF5IGxvb3AuXG4gIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihldmVudHMubGVuZ3RoLCBtYXhFdmVudHNMaW1pdCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c1ByZWxvYWRlZCh1c2VQcmVsb2FkZWQpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZENvdW50KGV2ZW50cy5sZW5ndGgpLFxuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzRmV0Y2hlZFBhZ2VzKGV2ZW50c0ZldGNoZWRQYWdlcyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZXZlbnRzX2ZldGNoZWQnLCB7XG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgICBldmVudHNGZXRjaGVkUGFnZXMsXG4gICAgdXNlUHJlbG9hZGVkLFxuICAgIGV2ZW50VHlwZXM6IGV2ZW50cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKGFjYywgZSkgPT4ge1xuICAgICAgYWNjW2UuZXZlbnRUeXBlXSA9IChhY2NbZS5ldmVudFR5cGVdID8/IDApICsgMTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pLFxuICB9KTtcblxuICAvLyBDaGVjayBmb3IgZWxhcHNlZCB3YWl0c1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldChcbiAgICBldmVudHNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICApO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhldmVudC5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgY29uc3QgZXZlbnREYXRhID1cbiAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnRcbiAgICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bWVBdCA9IGV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICBpZiAocmVzdW1lQXQgJiYgbm93ID49IG5ldyBEYXRlKHJlc3VtZUF0IGFzIHN0cmluZykuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LmV2ZW50KSBldmVudHMucHVzaChyZXN1bHQuZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSBjb250aW51ZTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSB3b3JrZmxvdyBzZXJ2ZXIgcG9ydCBzbyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpLnVybGAgaW5zaWRlXG4gIC8vIHRoZSBWTSBtYXRjaGVzIHdoYXQgdGhlIHN0ZXAtc2lkZSBoYW5kbGVyIHJlcG9ydHMuIFNraXBwZWQgb24gVmVyY2VsIOKAlFxuICAvLyB0aGUgVk0gcmVhZHMgVkVSQ0VMX1VSTCBkaXJlY3RseSBpbiB0aGF0IGVudmlyb25tZW50LlxuICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9ydCA9IGlzVmVyY2VsID8gdW5kZWZpbmVkIDogYXdhaXQgZ2V0UG9ydExhenkoKTtcblxuICAvLyBSdW4gdGhlIHdvcmtmbG93IGluIHRoZSBRdWlja0pTIFZNXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogaW52b2tpbmcgVk0nLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dJZCxcbiAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICB9KTtcblxuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3coe1xuICAgIC8vIFBhc3MgdGhlIFNUUklQUEVEIGJ1bmRsZSB0byB0aGUgVk0gc28gdGhlIGlubGluZSBzb3VyY2UgbWFwXG4gICAgLy8gZG9lc24ndCBlbmQgdXAgaW4gdGhlIFF1aWNrSlMgaGVhcC4gVGhlIG9yaWdpbmFsICh1bnN0cmlwcGVkKVxuICAgIC8vIGB3b3JrZmxvd0NvZGVgIGlzIHN0aWxsIGtlcHQgaW4gdGhpcyBob3N0LXNpZGUgc2NvcGUgYW5kIGlzIHVzZWRcbiAgICAvLyBieSBgcmVtYXBFcnJvclN0YWNrYCBvbiB3b3JrZmxvdyBmYWlsdXJlcyBiZWxvdy5cbiAgICB3b3JrZmxvd0NvZGU6IHdvcmtmbG93Q29kZUZvclZNLFxuICAgIHdvcmtmbG93SWQsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICBwb3J0LFxuICAgIHJ1bklucHV0LFxuICB9KTtcbiAgbGV0IHJlc3VsdCA9IHNlc3Npb24ucmVzdWx0O1xuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogVk0gcmV0dXJuZWQnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgY29tcGxldGVkOiAhIXJlc3VsdC5jb21wbGV0ZWQsXG4gICAgc3VzcGVuZGVkOiAhIXJlc3VsdC5zdXNwZW5kZWQsXG4gICAgZmFpbGVkOiAhIXJlc3VsdC5mYWlsZWQsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoLFxuICB9KTtcblxuICB3ZmRpYWcoJ3ZtX3JldHVybmVkJywge1xuICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgIDogcmVzdWx0LnN1c3BlbmRlZFxuICAgICAgICA/ICdzdXNwZW5kZWQnXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICA6ICd1bmtub3duJyxcbiAgICBwZW5kaW5nT3BzQ291bnQ6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5sZW5ndGggPz8gMCxcbiAgICBwZW5kaW5nT3BTdW1tYXJ5OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubWFwKChwKSA9PiAoe1xuICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgY29ycmVsYXRpb25JZDogcC5jb3JyZWxhdGlvbklkLFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgfSkpLFxuICAgIGZhaWx1cmVNZXNzYWdlOiByZXN1bHQuZmFpbGVkPy5tZXNzYWdlLFxuICAgIGZhaWx1cmVOYW1lOiByZXN1bHQuZmFpbGVkPy5uYW1lLFxuICB9KTtcblxuICAvLyAtLS0tIElubGluZSBjb250aW51YXRpb24gbG9vcCAtLS0tXG4gIC8vXG4gIC8vIFdoaWxlIHRoZSB3b3JrZmxvdyBpcyBzdXNwZW5kZWQsIHRoaXMgbG9vcCBrZWVwcyB0aGUgVk0gYWxpdmUgYW5kXG4gIC8vIG1ha2VzIGFzIG11Y2ggZm9yd2FyZCBwcm9ncmVzcyBhcyBwb3NzaWJsZSB3aXRoaW4gb25lIGludm9jYXRpb246XG4gIC8vXG4gIC8vICAgMS4gRGlzcGF0Y2ggZHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoZSBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHNcbiAgLy8gICAgICAoc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gYXR0cl9zZXQgLyB3YWl0X2NyZWF0ZWQgL1xuICAvLyAgICAgIGhvb2tfcmVjZWl2ZWQgZm9yIGFib3J0cykgYW5kIGNvbXBsZXRlIGVsYXBzZWQgd2FpdHMuXG4gIC8vICAgMi4gRmVlZCBhbGwgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIChhdHRyX3NldCwgaG9va19jcmVhdGVkLCBlbGFwc2VkXG4gIC8vICAgICAgd2FpdF9jb21wbGV0ZWQsIHRlcm1pbmFscyB3cml0dGVuIGJ5IGNvbmN1cnJlbnQgaW52b2NhdGlvbnMsIC4uLilcbiAgLy8gICAgICBpbnRvIHRoZSBMSVZFIFZNIHZpYSBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyDigJQgcmVzdW1pbmdcbiAgLy8gICAgICBleGVjdXRpb24gZXhhY3RseSB3aGVyZSBpdCBsZWZ0IG9mZiwgbm8gZnJlc2gtVk0gcmUtcmVwbGF5LlxuICAvLyAgICAgIENoZWFwIHByb2dyZXNzIGlzIGZlZCBCRUZPUkUgcnVubmluZyBzdGVwIGJvZGllcyBzbyBwcm9taXNlXG4gIC8vICAgICAgY2hhaW5zIHRoYXQgYXJlIG5vdCBnYXRlZCBvbiBzdGVwcyAoaG9vay5nZXRDb25mbGljdCgpLFxuICAvLyAgICAgIHNldEF0dHJpYnV0ZXMoKSwgcmFjaW5nIHNsZWVwcykgYWR2YW5jZSBmaXJzdCBhbmQgY2FuIHN1cmZhY2VcbiAgLy8gICAgICBhZGRpdGlvbmFsIHBlbmRpbmcgc3RlcHMgZm9yIHRoZSBzYW1lIGlubGluZSBiYXRjaC5cbiAgLy8gICAzLiBPbmNlIG5vIGNoZWFwIHByb2dyZXNzIHJlbWFpbnMsIGV4ZWN1dGUgdXAgdG9cbiAgLy8gICAgICBnZXRNYXhJbmxpbmVTdGVwcygpIHN0ZXBzIGNyZWF0ZWQgYnkgVEhJUyBpbnZvY2F0aW9uIGlubGluZSAobm9cbiAgLy8gICAgICBxdWV1ZSByb3VuZC10cmlwKSwgaW4gcGFyYWxsZWwsIHdpdGggdGhlIHJlcGxheSBidWRnZXQgcGF1c2VkXG4gIC8vICAgICAgZHVyaW5nIHN0ZXAgYm9kaWVzIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgaW5saW5lXG4gIC8vICAgICAgcmVwbGF5IGxvb3AuIE92ZXJmbG93IGFuZCByZXRyeS90aHJvdHRsZWQgc3RlcHMgYXJlIHF1ZXVlZCBmb3JcbiAgLy8gICAgICBiYWNrZ3JvdW5kIGV4ZWN1dGlvbi4gQSBkZWxheWVkIHdhaXQtY29udGludWF0aW9uIG1lc3NhZ2UgaXNcbiAgLy8gICAgICBlbnF1ZXVlZCBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IGZpcnN0LCBzbyByYWNpbmcgdGltZXJzXG4gIC8vICAgICAgZmlyZSBvbiB0aW1lIChpbiBhIHNlcGFyYXRlIGludm9jYXRpb24pIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrXG4gIC8vICAgICAgdGhpcyBvbmUuXG4gIC8vXG4gIC8vIFRoZSBsb29wIGV4aXRzIHdoZW4gdGhlIHdvcmtmbG93IHNldHRsZXMsIG5vIGZvcndhcmQgcHJvZ3Jlc3MgaXNcbiAgLy8gcG9zc2libGUgaW4tcHJvY2VzcywgdGhlIHJlcGxheSBidWRnZXQgaXMgZXhoYXVzdGVkLCBvciB0aGUgcnVuIGlzXG4gIC8vIGdvbmUuXG4gIGNvbnN0IHNlZW5FdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRJZCkgc2VlbkV2ZW50SWRzLmFkZChlLmV2ZW50SWQpO1xuICB9XG4gIC8vIFN0ZXAgY2lkcyBhbHJlYWR5IGV4ZWN1dGVkIGlubGluZSBieSB0aGlzIGludm9jYXRpb24uXG4gIGNvbnN0IGV4ZWN1dGVkU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBTdGVwcyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgc2VudCBhIHF1ZXVlIG1lc3NhZ2UuXG4gIGNvbnN0IHF1ZXVlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gQWJvcnRzIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHJlY29yZGVkIChob29rX3JlY2VpdmVkIHdyaXR0ZW4pIOKAlFxuICAvLyBndWFyZHMgYWdhaW5zdCByZS1yZWNvcmRpbmcgd2hlbiB0aGUgVk0tc2lkZSBmbGFnIGhhcyBub3QgYmVlblxuICAvLyBjbGVhcmVkIHlldCB3aXRoaW4gdGhlIHNhbWUgaXRlcmF0aW9uLlxuICBjb25zdCByZWNvcmRlZEFib3J0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFdhaXRzIGZvciB3aGljaCBUSElTIGludm9jYXRpb24gYWxyZWFkeSBjb21wbGV0ZWQvc2NoZWR1bGVkIHdvcmsuXG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMyID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIElubGluZS1vd25lcnNoaXAgc3RhdGUgcGVyIHN0ZXAgY29ycmVsYXRpb25JZCwgZGVyaXZlZCBmcm9tIGV2ZXJ5XG4gIC8vIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBvYnNlcnZlcyAoaW5pdGlhbCBsb2cgKyBldmVyeSBmZWVkKSDigJQgdGhlXG4gIC8vIHF1aWNranMgYW5hbG9nIG9mIHRoZSByZXBsYXktZGVyaXZlZCBvd25lcnNoaXAgb24gdGhlIG5vZGUgZW5naW5lJ3NcbiAgLy8gU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gKHNlZSBzdGVwLW93bmVyc2hpcC50cykuIExhdGVzdC13aW5zOlxuICAvLyBldmVudHMgYXJyaXZlIGluIGxvZyBvcmRlciwgc28gYSBsYXRlciBzdGVwX3N0YXJ0ZWQgb3ZlcndyaXRlcyB0aGVcbiAgLy8gc3RhbXA7IGEgc3RlcF9yZXRyeWluZyBsYXBzZXMgb3duZXJzaGlwIHBlcm1hbmVudGx5IGZvciB0aGUgaWQuXG4gIGNvbnN0IHN0ZXBPd25lcnNoaXAgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IG93bmVyPzogc3RyaW5nOyBzdGFydGVkQXRNcz86IG51bWJlcjsgc2F3UmV0cnlpbmc6IGJvb2xlYW4gfVxuICA+KCk7XG4gIGNvbnN0IG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAgPSAob2JzZXJ2ZWQ6IEV2ZW50W10pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb2JzZXJ2ZWQpIHtcbiAgICAgIGlmIChlLmNvcnJlbGF0aW9uSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgIGNvbnN0IG93bmVyID1cbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBlICYmXG4gICAgICAgICAgZS5ldmVudERhdGEgJiZcbiAgICAgICAgICAnb3duZXJNZXNzYWdlSWQnIGluIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHByaW9yID0gc3RlcE93bmVyc2hpcC5nZXQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgc3RlcE93bmVyc2hpcC5zZXQoZS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgc3RhcnRlZEF0TXM6IGUuY3JlYXRlZEF0ID8gK25ldyBEYXRlKGUuY3JlYXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzYXdSZXRyeWluZzogcHJpb3I/LnNhd1JldHJ5aW5nID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJykge1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIC4uLihwcmlvciA/PyB7fSksXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcChldmVudHMpO1xuICBjb25zdCBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhJbmxpbmVTdGVwcyA9IGdldE1heElubGluZVN0ZXBzKCk7XG4gIGNvbnN0IGJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcbiAgY29uc3Qgd29ya2Zsb3dTdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA/ICt3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICA6IERhdGUubm93KCk7XG4gIGNvbnN0IHJvb3RSdW5JZCA9XG4gICAgKHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LltcbiAgICAgIFJPT1RfUlVOX0lEX0FUVFJJQlVURVxuICAgIF0gPz8gcnVuSWQ7XG4gIGxldCBpbmxpbmVTdGVwc0V4ZWN1dGVkID0gMDtcbiAgbGV0IHJ1bkdvbmUgPSBmYWxzZTtcbiAgLy8gU2V0IHdoZW4gdGhpcyBpbnZvY2F0aW9uIHdyb3RlIGFuIGV2ZW50IHRoZSB3b3JrZmxvdyBtdXN0IGNvbnN1bWUgdG9cbiAgLy8gbWFrZSBwcm9ncmVzcyAoYXR0cl9zZXQsIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkKSBhbmQgdGhlXG4gIC8vIGxvb3AgaGFzIG5vdCB5ZXQgcmVhZCBpdCBiYWNrIOKAlCBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZ3MgY2FuXG4gIC8vIHJldHVybiAwIG5ldyBldmVudHMgcmlnaHQgYWZ0ZXIgYSB3cml0ZS4gSWYgaXQgaXMgc3RpbGwgc2V0IHdoZW4gdGhlXG4gIC8vIGxvb3AgZXhpdHMgc3VzcGVuZGVkLCB0aGUgZW50cnlwb2ludCByZXF1ZXVlcyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mXG4gIC8vIGV4aXRpbmcgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCB0aGUgdW5ibG9ja2luZyBldmVudCBhbHJlYWR5IHdyaXR0ZW5cbiAgLy8gYW5kIG5vdGhpbmcgc2NoZWR1bGVkIHRvIHJlYWQgaXQuXG4gIGxldCBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IGZhbHNlO1xuXG4gIC8qKiBGZXRjaCBhbGwgZXZlbnRzIG5vdCB5ZXQgcHJvY2Vzc2VkIGJ5IHRoZSBsaXZlIFZNIChsb2cgb3JkZXIpLiAqL1xuICBjb25zdCBmZXRjaFVuc2VlbkV2ZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEV2ZW50W10+ID0+IHtcbiAgICBjb25zdCB1bnNlZW46IEV2ZW50W10gPSBbXTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGUgb2YgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBpZiAoZS5ldmVudElkICYmIHNlZW5FdmVudElkcy5oYXMoZS5ldmVudElkKSkgY29udGludWU7XG4gICAgICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgdW5zZWVuLnB1c2goZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UuY3Vyc29yKSBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cbiAgICBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwKHVuc2Vlbik7XG4gICAgcmV0dXJuIHVuc2VlbjtcbiAgfTtcblxuICB0cnkge1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgIHdoaWxlIChyZXN1bHQuc3VzcGVuZGVkICYmICFydW5Hb25lICYmICFidWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgaXRlcmF0aW9uKys7XG4gICAgICAvLyBSZS1jaGVjayB0aGUgZXZlbnQgY2VpbGluZyBldmVyeSB0dXJuOiB0aGUgbG9vcCBhcHBlbmRzIGV2ZW50cyBvblxuICAgICAgLy8gZWFjaCBjb250aW51ZVdpdGhFdmVudHMsIHNvIGEgc2luZ2xlIGludm9jYXRpb24gY2FuIG90aGVyd2lzZSBncm93XG4gICAgICAvLyB0aGUgbG9nIGFyYml0cmFyaWx5IGZhciBwYXN0IHRoZSBvcGVyYXRvcidzIGxpbWl0ICh0aGUgbm9kZSBlbmdpbmVcbiAgICAgIC8vIHJlLWNoZWNrcyBwZXIgcmVwbGF5IGZvciB0aGUgc2FtZSByZWFzb24pLiBgc2VlbkV2ZW50SWRzYCBjb3VudHNcbiAgICAgIC8vIGV2ZXJ5IGV2ZW50IHRoaXMgaW52b2NhdGlvbiBoYXMgb2JzZXJ2ZWQg4oCUIGluaXRpYWwgbG9nICsgYWxsXG4gICAgICAvLyBmZWVkcy5cbiAgICAgIGlmIChtYXhFdmVudHNMaW1pdCAhPT0gdW5kZWZpbmVkICYmIHNlZW5FdmVudElkcy5zaXplID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKHNlZW5FdmVudElkcy5zaXplLCBtYXhFdmVudHNMaW1pdCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwZW5kaW5nT3BlcmF0aW9ucyA9IHJlc3VsdC5zdXNwZW5kZWQucGVuZGluZ09wZXJhdGlvbnM7XG5cbiAgICAgIC8vIFNlbGVjdCB0aGlzIHR1cm4ncyBpbmxpbmUgY2FuZGlkYXRlcyBCRUZPUkUgZGlzcGF0Y2g6IGZyZXNoIHN0ZXBzXG4gICAgICAvLyAobm8gc3RlcF9jcmVhdGVkIHlldCkgdGhhdCB0aGlzIGludm9jYXRpb24gaGFzbid0IGFscmVhZHkgaGFuZGxlZC5cbiAgICAgIC8vIFRoZWlyIHN0ZXBfY3JlYXRlZCBpcyBkZWxpYmVyYXRlbHkgTk9UIHdyaXR0ZW4gYnkgZGlzcGF0Y2gg4oCUIHRoZVxuICAgICAgLy8gaW5saW5lIGNsYWltIGJlbG93IGlzIGEgbGF6eSBzdGVwX3N0YXJ0ZWQgY2FycnlpbmcgdGhlIGlucHV0LFxuICAgICAgLy8gd2hpY2ggdGhlIHdvcmxkIGFwcGxpZXMgYXMgYW4gYXRvbWljIGNyZWF0ZS1jbGFpbS4gQSBjb25jdXJyZW50XG4gICAgICAvLyBpbnZvY2F0aW9uIHJhY2luZyBvbiB0aGUgc2FtZSBmcmVzaCBzdGVwIGxvc2VzIHRoYXQgY2xhaW0gd2l0aFxuICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciBhbmQgc2tpcHMsIHNvIHN0ZXAgYm9kaWVzIGNhbm5vdCBkb3VibGUtcnVuXG4gICAgICAvLyAocHJldmlvdXNseSBib3RoIGludm9jYXRpb25zIGJhcmUtc3RhcnRlZCB0aGUgc3RlcCBhZnRlciBvbmUgbG9zdFxuICAgICAgLy8gdGhlIHN3YWxsb3dlZCBzdGVwX2NyZWF0ZWQgcmFjZSkuXG4gICAgICBjb25zdCBmcmVzaFN0ZXBzID0gcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3ApOiBvcCBpcyBQZW5kaW5nU3RlcCA9PlxuICAgICAgICAgIG9wLnR5cGUgPT09ICdzdGVwJyAmJlxuICAgICAgICAgICFvcC5oYXNDcmVhdGVkRXZlbnQgJiZcbiAgICAgICAgICAhZXhlY3V0ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICFxdWV1ZWRTdGVwSWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlubGluZUNhbmRpZGF0ZXMgPVxuICAgICAgICBtYXhJbmxpbmVTdGVwcyA8PSAwID8gW10gOiBmcmVzaFN0ZXBzLnNsaWNlKDAsIG1heElubGluZVN0ZXBzKTtcbiAgICAgIGNvbnN0IGlubGluZUNsYWltQ2lkcyA9IG5ldyBTZXQoXG4gICAgICAgIGlubGluZUNhbmRpZGF0ZXMubWFwKChzdGVwKSA9PiBzdGVwLmNvcnJlbGF0aW9uSWQpXG4gICAgICApO1xuXG4gICAgICAvLyAxLiBEdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgdGhpcyBzdXNwZW5zaW9uJ3MgcGVuZGluZyBvcHMuXG4gICAgICBjb25zdCBvcHNUb0Rpc3BhdGNoID0gcGVuZGluZ09wZXJhdGlvbnMubWFwKChvcCkgPT5cbiAgICAgICAgb3AudHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICAgIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQgJiZcbiAgICAgICAgcmVjb3JkZWRBYm9ydElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICAgICA/ICh7IC4uLm9wLCBhYm9ydFJlcXVlc3RlZDogZmFsc2UgfSBhcyBQZW5kaW5nT3BlcmF0aW9uKVxuICAgICAgICAgIDogb3BcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlID09PSAnaG9vaycgJiYgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICAgIHJlY29yZGVkQWJvcnRJZHMuYWRkKG9wLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgYXJlIGhhbmRlZCB0byB0aGUgcXVldWUgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIGlzIHdyaXR0ZW4uIFdoZXJlIGVsaWdpYmxlLCB0aGUgZGlzcGF0Y2hcbiAgICAgIC8vIGJlbG93IHBhcmFsbGVsaXplcyBlYWNoIG92ZXJmbG93IHN0ZXAncyBzdGVwX2NyZWF0ZWQgd3JpdGUgd2l0aFxuICAgICAgLy8gaXRzIHF1ZXVlIHB1Ymxpc2ggKHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIOKAlCB0aGUgbWVzc2FnZSBjYXJyaWVzXG4gICAgICAvLyBgc3RlcElucHV0YCBzbyB0aGUgY29uc3VtZXIgY2FuIHJlLWVuc3VyZSB0aGUgZXZlbnQpOyB0aGUgcmVzdFxuICAgICAgLy8gYXJlIHF1ZXVlZCByaWdodCBhZnRlciwgaW4gcGFyYWxsZWwuIFRoaXMgbXVzdCBhbGwgaGFwcGVuIEJFRk9SRVxuICAgICAgLy8gdGhlIGV2ZW50IGZlZWQgYmVsb3c6IHRoZSBmZWVkIGFsd2F5cyBvYnNlcnZlcyB0aG9zZSB2ZXJ5XG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGVzIGFzIHVuc2VlbiBldmVudHMgYW5kIGBjb250aW51ZWBzLCBzbyBhXG4gICAgICAvLyBoYW5kb2ZmIHBsYWNlZCBhZnRlciBpdCBpcyB1bnJlYWNoYWJsZSBvbiB0aGUgb25seSBpdGVyYXRpb25cbiAgICAgIC8vIHRoYXQgc3RpbGwgY2xhc3NpZmllcyB0aGVzZSBzdGVwcyBhcyBmcmVzaCDigJQgbmV4dCB0dXJuIHRoZXkgY2FycnlcbiAgICAgIC8vIGhhc0NyZWF0ZWRFdmVudCBhbmQgd291bGQgbmV2ZXIgYmUgcXVldWVkIGF0IGFsbCAodGhlIHdlZGdlIGJlaGluZFxuICAgICAgLy8gcHJvbWlzZVJhY2VTdHJlc3NUZXN0V29ya2Zsb3cgaGFuZ2luZyBpbiB0aGUgcXVpY2tqcyBDSSBsZWdzKS4gVGhlXG4gICAgICAvLyBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgbWFrZXMgcmVwZWF0cyBoYXJtbGVzcy5cbiAgICAgIGNvbnN0IG92ZXJmbG93U3RlcHMgPSBmcmVzaFN0ZXBzLnNsaWNlKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZWQgPSBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICB3b3JsZCxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiBvcHNUb0Rpc3BhdGNoLFxuICAgICAgICBza2lwU3RlcENyZWF0aW9uOiBpbmxpbmVDbGFpbUNpZHMsXG4gICAgICAgIHF1ZXVlU3RlcENpZHM6IG5ldyBTZXQob3ZlcmZsb3dTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZCkpLFxuICAgICAgICB3ZmRpYWcsXG4gICAgICB9KTtcbiAgICAgIGlmIChcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkQXR0cmlidXRlRXZlbnQgfHxcbiAgICAgICAgZGlzcGF0Y2hlZC5jcmVhdGVkR2V0Q29uZmxpY3RIb29rXG4gICAgICApIHtcbiAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNpZCBvZiBkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzKSB7XG4gICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKGNpZCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgb3ZlcmZsb3dTdGVwc1xuICAgICAgICAgIC5maWx0ZXIoKHN0ZXApID0+ICFkaXNwYXRjaGVkLnF1ZXVlZFN0ZXBDaWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKVxuICAgICAgICAgIC5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgcHVycG9zZTogJ2Rpc3BhdGNoJyxcbiAgICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzIOKAlCBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQg4oCUIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cykg4oCUXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgLy8gICAgIG9yaWdpbmFsIGhhbmRvZmYuXG4gICAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG4gICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcE9wcykge1xuICAgICAgICBpZiAoIXN0ZXAuaGFzQ3JlYXRlZEV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChxdWV1ZWRTdGVwSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwID0gc3RlcE93bmVyc2hpcC5nZXQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgY29uc3Qgb3duZXJzaGlwQWN0aXZlID1cbiAgICAgICAgICBvd25lcnNoaXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIG93bmVyc2hpcC5vd25lciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgIW93bmVyc2hpcC5zYXdSZXRyeWluZztcbiAgICAgICAgbGV0IGxlYXNlUmVtYWluaW5nU2Vjb25kcyA9IDA7XG4gICAgICAgIGlmIChvd25lcnNoaXBBY3RpdmUgJiYgb3duZXJzaGlwLnN0YXJ0ZWRBdE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBsZWFzZVNlY29uZHMgPSBnZXRJbmxpbmVPd25lcnNoaXBMZWFzZVNlY29uZHMoKTtcbiAgICAgICAgICBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGxlYXNlU2Vjb25kcyxcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgKG93bmVyc2hpcC5zdGFydGVkQXRNcyArIGxlYXNlU2Vjb25kcyAqIDEwMDAgLSBub3dNcykgLyAxMDAwXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IG93bmVyTWVzc2FnZUlkICYmXG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbGVhc2VSZW1haW5pbmdTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6IGBiYWNrc3RvcDoke293bmVyc2hpcC5zdGFydGVkQXRNc31gLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIHB1cnBvc2U6ICdkaXNwYXRjaCcsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIE5vIGluLXByb2Nlc3MgcHJvZ3Jlc3MgcG9zc2libGUg4oCUIHRoZSBydW4gYXdhaXRzIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIHN0aW11bHVzIChob29rIHBheWxvYWQsIHF1ZXVlZCBzdGVwLCB3YWl0IHRpbWVyKS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIFJhY2luZyB0aW1lcnMgbXVzdCBmaXJlIG9uIHRpbWUgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2sgdGhpc1xuICAgICAgLy8gaW52b2NhdGlvbjogZW5xdWV1ZSBhIGRlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdFxuICAgICAgLy8gcGVuZGluZyB3YWl0IChhIHNlcGFyYXRlIGludm9jYXRpb24gd3JpdGVzIGl0cyB3YWl0X2NvbXBsZXRlZCBhdFxuICAgICAgLy8gdGhlIHJpZ2h0IGxvZyBwb3NpdGlvbiDigJQgc2FtZSBtZWNoYW5pc20gYXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIHdhaXQtY29udGludWF0aW9uIGRpc3BhdGNoKS5cbiAgICAgIGxldCBzb29uZXN0V2FpdDogeyBjb3JyZWxhdGlvbklkOiBzdHJpbmc7IHNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgICBpZiAoc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICAvLyBXYWl0cyB3aG9zZSB3YWl0X2NvbXBsZXRlZCBUSElTIGludm9jYXRpb24gYWxyZWFkeSB3cm90ZSAodGhlXG4gICAgICAgIC8vIGVsYXBzZWQtd2FpdCBwYXNzIGFib3ZlKSBhcmUgZG9uZSDigJQgdGhlIGV2ZW50IGp1c3QgaGFzbid0IGZlZFxuICAgICAgICAvLyBiYWNrIGludG8gdGhlIFZNIHlldC4gTm8gY29udGludWF0aW9uIG5lZWRlZC5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdhaXRJZHMyLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBBbiBhbHJlYWR5LWVsYXBzZWQgd2FpdCBNVVNUIHN0aWxsIGdldCBhIGNvbnRpbnVhdGlvbiAoY2xhbXBlZFxuICAgICAgICAvLyB0byB0aGUgMXMgbWluaW11bSwgZXhhY3RseSBsaWtlIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIGBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KWApLCBub3QgYmUgc2tpcHBlZDogYSB3YWl0XG4gICAgICAgIC8vIHdob3NlIGRlYWRsaW5lIGZhbGxzIGJldHdlZW4gdGhpcyBpdGVyYXRpb24ncyBlbGFwc2VkLXdhaXRcbiAgICAgICAgLy8gcGFzcyAod2hpY2ggc2F3IGl0IGFzIHN0aWxsIHBlbmRpbmcgYW5kIHdyb3RlIG5vdGhpbmcpIGFuZFxuICAgICAgICAvLyB0aGlzIHN3ZWVwIHdvdWxkIG90aGVyd2lzZSBnZXQgTkVJVEhFUiBhIHdhaXRfY29tcGxldGVkIE5PUiBhXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiDigJQgYW5kIHRoZSBpbmxpbmUgYmF0Y2ggYmVsb3cgdGhlbiBibG9ja3MgdGhpc1xuICAgICAgICAvLyBpbnZvY2F0aW9uIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uIHdpdGggbm8gd2FrZSBhcm1lZFxuICAgICAgICAvLyBhbnl3aGVyZS4gRm9yIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCB0aGF0IHNpbGVudGx5IGhhbmRzXG4gICAgICAgIC8vIHRoZSByYWNlIHRvIHRoZSBzdGVwOiB0aGUgc2xlZXAncyB3YWl0X2NvbXBsZXRlZCBpcyBuZXZlclxuICAgICAgICAvLyB3cml0dGVuIGFuZCB0aGUgcnVuIGNvbXBsZXRlcyB3aXRoIHRoZSB3cm9uZyB3aW5uZXIuIFRoZVxuICAgICAgICAvLyB3aW5kb3cgYmV0d2VlbiB0aGUgdHdvIGNoZWNrcyBzcGFucyB0aGlzIGl0ZXJhdGlvbidzIGRpc3BhdGNoXG4gICAgICAgIC8vICsgZmVlZCByb3VuZC10cmlwcywgc28gb24gbmV0d29yay1iYWNrZWQgd29ybGRzICh3b3JsZC12ZXJjZWwpXG4gICAgICAgIC8vIGEgc2hvcnQgc2xlZXAgbGFuZHMgaW4gaXQgcm91dGluZWx5IOKAlCBvYnNlcnZlZCBhcyBhIH41MCVcbiAgICAgICAgLy8gc2xlZXBXaW5zUmFjZVdvcmtmbG93IGZhaWx1cmUgcmF0ZSBpbiB0aGUgVmVyY2VsIGUyZSBsZWdzLFxuICAgICAgICAvLyB3aGlsZSB3b3JsZC1sb2NhbCdzIHN1Yi1tcyByb3VuZC10cmlwcyBtYXNrZWQgaXQgbG9jYWxseS4gVGhlXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiBpbnZvY2F0aW9uJ3MgcHJlLVZNIGVsYXBzZWQgY2hlY2sgd3JpdGVzIHRoZVxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCB+MXMgbGF0ZXIuXG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgc2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHsgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLCBzZWNvbmRzIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHdmZGlhZygnd2FpdF9jb250aW51YXRpb25fc2NoZWR1bGVkJywge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZGVsYXlTZWNvbmRzOiBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIGJhdGNoIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5IGJ1ZGdldCBpc1xuICAgICAgLy8gcGF1c2VkIHdoaWxlIHN0ZXAgYm9kaWVzIHJ1biDigJQgc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZVxuICAgICAgLy8gcGxhdGZvcm0gZnVuY3Rpb24gZHVyYXRpb24sIG5vdCB0aGUgcmVwbGF5IHRpbWVvdXQuIE5PVEUgKGJ5XG4gICAgICAvLyBkZXNpZ24pOiB3aXRoIHRoZSBidWRnZXQgcGFya2VkIHBlciBiYXRjaCwgdGhlIG9ubHkgYm91bmQgb24gaG93XG4gICAgICAvLyBtYW55IGlubGluZSBzdGVwcyBvbmUgaW52b2NhdGlvbiBjYW4gY2hhaW4gaXMgdGhlIHBsYXRmb3JtJ3NcbiAgICAgIC8vIGZ1bmN0aW9uIHRpbWVvdXQg4oCUIHRoZSBTREsgZGVsaWJlcmF0ZWx5IGltcG9zZXMgbm8gY2FwIG9mIGl0c1xuICAgICAgLy8gb3duLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoZXJlIGEgbG9uZyBzZXF1ZW50aWFsXG4gICAgICAvLyB3b3JrZmxvdyBsaWtld2lzZSBydW5zIHN0ZXAtYnktc3RlcCB1bnRpbCB0aGUgcGxhdGZvcm0gcmVjbGFpbXNcbiAgICAgIC8vIHRoZSBpbnZvY2F0aW9uIGFuZCBhIHJlZGVsaXZlcnkgcmVzdW1lcyBmcm9tIHRoZSBsb2cuXG4gICAgICBidWRnZXQucGF1c2UoKTtcbiAgICAgIGxldCBvdXRjb21lczogU3RlcEV4ZWN1dGlvblJlc3VsdFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3V0Y29tZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT5cbiAgICAgICAgICAgIHJ1blN0ZXBTaW5nbGVGbGlnaHQocnVuSWQsIHN0ZXAuY29ycmVsYXRpb25JZCwgKCkgPT5cbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkLFxuICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgY2xhaW06IHN0ZXBfY3JlYXRlZCBpcyBkZWZlcnJlZCAoZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgaXQpIGFuZCB0aGlzIHN0ZXBfc3RhcnRlZCBjYXJyaWVzIHRoZSBpbnB1dCxcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZSBzdGVwIGF0b21pY2FsbHkg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBleGFjdGx5LW9uZS1vd25lci4gQSBjb25jdXJyZW50IGNsYWltYW50IGdldHNcbiAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHsgdHlwZTogJ3NraXBwZWQnIH0gYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAvLyBydW5zIHRoZSBib2R5LiBNaXJyb3JzIHRoZSBub2RlIGVuZ2luZSdzIGlubGluZSBwYXRoLlxuICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHN0YW1wOiB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5IGFzIGluXG4gICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgaW4gdGhpcyBpbnZvY2F0aW9uIGFuZCBhcm0gYSBkZWxheWVkIGJhY2tzdG9wXG4gICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgdGhlIHN0ZXAuXG4gICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24g4oCUIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0LlxuICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IDEsXG4gICAgICAgICAgICAgICAgfSkpKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidWRnZXQucmVzdW1lKCk7XG4gICAgICB9XG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkICs9IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGlubGluZUNhbmRpZGF0ZXNbaV07XG4gICAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lc1tpXTtcbiAgICAgICAgZXhlY3V0ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBpZiAob3V0Y29tZS50eXBlID09PSAncmV0cnknIHx8IG91dGNvbWUudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAvLyBIYW5kIHRoZSBzdGVwIHRvIHRoZSBxdWV1ZSB3aXRoIHRoZSByZXF1ZXN0ZWQgYmFja29mZiDigJRcbiAgICAgICAgICAvLyBiYWNrZ3JvdW5kIGRlbGl2ZXJ5IGRyaXZlcyB0aGUgcmV0cnkgZnJvbSBoZXJlLlxuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBvdXRjb21lLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVkIGtleTogdGhpcyBzdGVwIHdhcyBpbmxpbmUtY2xhaW1lZCwgc28gbm8gZGlzcGF0Y2hcbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggZXhpc3RzIHVuZGVyIHRoZSBkaXNwYXRjaCBrZXkg4oCUIGJ1dCBzdWZmaXhpbmdcbiAgICAgICAgICAgIC8vIGtlZXBzIHRoZSByZXRyeSBlbnF1ZXVlYWJsZSBldmVuIGlmIGEgd29ybGQgcmV0aXJlZCBhXG4gICAgICAgICAgICAvLyBoaXN0b3JpY2FsIGtleSBmb3IgdGhpcyBzdGVwIChzZWUgdGhlIHB1cnBvc2UgZG9jcyBhYm92ZSkuXG4gICAgICAgICAgICBwdXJwb3NlOiAncmV0cnk6MScsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0Y29tZS50eXBlID09PSAnZ29uZScpIHtcbiAgICAgICAgICBydW5Hb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAnc2tpcHBlZCc6IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdvbiB0aGUgbGF6eSBjcmVhdGUtY2xhaW0gYW5kXG4gICAgICAgIC8vIG93bnMgdGhlIGJvZHkuIE1hcmtlZCBleGVjdXRlZCBhYm92ZSBzbyB0aGlzIGludm9jYXRpb24gbmV2ZXJcbiAgICAgICAgLy8gcmUtY2xhaW1zIGl0OyB0aGUgd2lubmVyJ3MgdGVybWluYWwgZXZlbnRzIGFycml2ZSB2aWEgdGhlIGZlZWRcbiAgICAgICAgLy8gKG9yIGRyaXZlIGEgc2VwYXJhdGUgaW52b2NhdGlvbikuXG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2lubGluZV9zdGVwc19leGVjdXRlZCcsIHtcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBjb3VudDogaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWVzOiBvdXRjb21lcy5tYXAoKG8pID0+IG8udHlwZSksXG4gICAgICB9KTtcblxuICAgICAgLy8gRmVlZCB0aGUgaW5saW5lIGJhdGNoJ3MgdGVybWluYWwgZXZlbnRzIGludG8gdGhlIGxpdmUgVk0uIFdoZW5cbiAgICAgIC8vIHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBoYXMgbm90IHN1cmZhY2VkIHRoZW0geWV0LFxuICAgICAgLy8gZXhpdGluZyBtdXN0IE5PVCBhY2sgc2lsZW50bHk6IHRoZSB0ZXJtaW5hbHMgdGhpcyBpbnZvY2F0aW9uIGp1c3RcbiAgICAgIC8vIGNhdXNlZCBhcmUgZHVyYWJseSB3cml0dGVuIHdpdGggbm8gcXVldWUgbWVzc2FnZSBsZWZ0IHRvIGNvbnN1bWVcbiAgICAgIC8vIHRoZW0gKGlubGluZSBzdGVwcyBoYXZlIG5vbmUpLCBzbyBhbiBhd2FpdGluZ19leHRlcm5hbCBleGl0IHdvdWxkXG4gICAgICAvLyBwYXJrIHRoZSBydW4gJ3J1bm5pbmcnIHdpdGggYWxsIGl0cyBzdGVwcyBjb21wbGV0ZS4gUmFpc2UgdGhlXG4gICAgICAvLyByZXF1ZXVlIHNpZ25hbCBzbyB0aGUgc3VzcGVuZGVkIGV4aXQgc2NoZWR1bGVzIGEgZnJlc2ggaW1tZWRpYXRlXG4gICAgICAvLyBpbnZvY2F0aW9uIHdob3NlIGZyZXNoIHJlYWQgcGlja3MgdGhlIHRlcm1pbmFscyB1cC4gT3V0Y29tZXMgdGhhdFxuICAgICAgLy8gd3JvdGUgbm8gdGVybWluYWwgKCdza2lwcGVkJyDigJQgYSBjb25jdXJyZW50IGNsYWltYW50IG93bnMgdGhlXG4gICAgICAvLyBib2R5OyAnZ29uZScsIHJldHJ5L3Rocm90dGxlZCDigJQgYSBxdWV1ZSBtZXNzYWdlIGV4aXN0cykgZG9uJ3RcbiAgICAgIC8vIG5lZWQgaXQsIGJ1dCBzaWduYWxpbmcgb24gdGhlbSB0b28gb25seSBjb3N0cyBhIG5vLW9wIGludm9jYXRpb25cbiAgICAgIC8vIGluIGFuIGFscmVhZHktcmFyZSBsYWcgd2luZG93LlxuICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgIGlmIChuZXdFdmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyhuZXdFdmVudHMpO1xuXG4gICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgcGhhc2U6ICdzdGVwcycsXG4gICAgICAgIGZlZEV2ZW50czogbmV3RXZlbnRzLmxlbmd0aCxcbiAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgIDogJ3N1c3BlbmRlZCcsXG4gICAgICAgIGJ1ZGdldEV4aGF1c3RlZDogYnVkZ2V0LmlzRXhoYXVzdGVkKCksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2Vzc2lvbi5kaXNwb3NlKCk7XG4gIH1cblxuICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0lubGluZVN0ZXBzKGlubGluZVN0ZXBzRXhlY3V0ZWQpLFxuICB9KTtcblxuICBpZiAocmVzdWx0LmNvbXBsZXRlZCkge1xuICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBjb21wbGV0ZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnY29tcGxldGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyAoYWJvcnQgcmVjb3JkaW5ncywgc3lzdGVtLWhvb2tcbiAgICAvLyBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldCBhdHRyaWJ1dGUvaG9vayBldmVudHMpIEJFRk9SRSB3cml0aW5nXG4gICAgLy8gcnVuX2NvbXBsZXRlZCDigJQgbWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zLlxuICAgIC8vIERyYWluIGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQ6IHRoZSB3b3JrZmxvdydzIG93biBvdXRjb21lIGlzIHRoZVxuICAgIC8vIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpZiAocmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZGlzcGF0Y2hQZW5kaW5nT3BzKHtcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiByZXN1bHQuY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucyxcbiAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignUXVpY2tKUyBydW50aW1lOiB0ZXJtaW5hbCBkcmFpbiBmYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgbWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBydW5fY29tcGxldGVkIGV2ZW50LlxuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIHRoZSB3b3JrZmxvdyByZXN1bHQgYXMgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAvLyAoXCJkZXZsXCIgKyBkZXZhbHVlKSB3aXRoIG5vIGVuY3J5cHRpb24gKHRoZSBWTSBoYXMgbm8gYWNjZXNzIHRvIHRoZVxuICAgIC8vIENyeXB0b0tleSkuIEhvc3Qtc2lkZSBlbmNyeXB0aW9uIGlzIGFwcGxpZWQgaGVyZSBzbyB0aGF0IGBydW5fY29tcGxldGVkYFxuICAgIC8vIGV2ZW50cyBoYXZlIHRoZSBzYW1lIGBlbmNyYC1wcmVmaXhlZCBwYXlsb2FkIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm1cbiAgICAvLyBlbmdpbmUncyBgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZWAgcHJvZHVjZXMuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgb3V0cHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoXG4gICAgICAgICAgICByZXN1bHQuY29tcGxldGVkLnJlc3VsdCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdydW5fY29tcGxldGVkX3dyaXR0ZW4nIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyZXN1bHQuc3VzcGVuZGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgc3RpbGwgc3VzcGVuZGVkIGFmdGVyIHRoZSBpbmxpbmUgbG9vcC4gQWxsIGR1cmFibGUgc2lkZVxuICAgIC8vIGVmZmVjdHMgZm9yIHRoZSBmaW5hbCBzdXNwZW5zaW9uIHN0YXRlIHdlcmUgYWxyZWFkeSBkaXNwYXRjaGVkIGJ5XG4gICAgLy8gdGhlIGxvb3A7IHdoYXQgcmVtYWlucyBpcyBkZWNpZGluZyBob3cgdGhlIHJ1biBnZXRzIHJlLWludm9rZWQuXG4gICAgY29uc3QgeyBwZW5kaW5nT3BlcmF0aW9ucyB9ID0gcmVzdWx0LnN1c3BlbmRlZDtcblxuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGlubGluZVN0ZXBzRXhlY3V0ZWQsXG4gICAgICBwZW5kaW5nU3RlcHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnc3RlcCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdXYWl0czogcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09ICd3YWl0JykubGVuZ3RoLFxuICAgICAgcGVuZGluZ09wczogcGVuZGluZ09wZXJhdGlvbnMubWFwKChwKSA9PiAoe1xuICAgICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBwLmhhc0NyZWF0ZWRFdmVudCxcbiAgICAgICAgLi4uKHAudHlwZSA9PT0gJ3N0ZXAnID8geyBzdGVwSWQ6IChwIGFzIFBlbmRpbmdTdGVwKS5zdGVwSWQgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdzdXNwZW5kZWQnKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTUGVuZGluZ09wc0NvdW50KHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCksXG4gICAgfSk7XG5cbiAgICBpZiAocnVuR29uZSkge1xuICAgICAgLy8gVGhlIHJ1biBubyBsb25nZXIgZXhpc3RzIChleHBpcmVkIC8gZGVsZXRlZCkg4oCUIG5vdGhpbmcgdG8gZHJpdmUuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdydW5fZ29uZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCByZXF1ZXVlcyBhcmUgRlJFU0ggbWVzc2FnZXMsIG5ldmVyIGEgYHsgdGltZW91dFNlY29uZHMgfWBcbiAgICAvLyB2aXNpYmlsaXR5LXJlZGVsaXZlcnkgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4gUmVkZWxpdmVyaW5nIHRoZVxuICAgIC8vIENVUlJFTlQgbWVzc2FnZSBpcyBhIHRyYXA6IGEgaG9vay1yZXN1bWUgZGVsaXZlcnkgY2Fycmllc1xuICAgIC8vIGBob29rSW5wdXRgLCBhbmQgaXRzIHJlZGVsaXZlcnkgcmUtcnVucyB0aGUgbGF6eS1yZXN1bWUgcmUtZW5zdXJlXG4gICAgLy8gaW4gdGhlIGhhbmRsZXIgcHJvbG9ndWUg4oCUIGlmIHRoZSB3b3JrZmxvdyBkaXNwb3NlZCB0aGF0IGhvb2tcbiAgICAvLyBkdXJpbmcgdGhpcyBpbnZvY2F0aW9uIChkaXNwb3NlIOKGkiBzbGVlcCksIGEgd29ybGQgdGhhdCByZWplY3RzXG4gICAgLy8gdGhlIHJlLWVuc3VyZSB3b3VsZCBhY2sgdGhlIG1lc3NhZ2UgYXMgXCJub3RoaW5nIGxlZnQgdG8gcmVzdW1lXCJcbiAgICAvLyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBpdCBjYXJyaWVkIGlzIHNpbGVudGx5IGxvc3QuIEEgZnJlc2ggbWVzc2FnZVxuICAgIC8vIGNhcnJpZXMgb25seSBgcnVuSWRgLCBzbyBpdHMgZGVsaXZlcnkgYWx3YXlzIHJlYWNoZXMgcmVwbGF5IChhbmRcbiAgICAvLyB1bmRlciB0dXJibyBhIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIGFnYWluc3QgYSBzdGFsZVxuICAgIC8vIHByZWxvYWRlZCBsb2cg4oCUIHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzIGluIHJ1bnRpbWUudHMpLlxuICAgIGNvbnN0IHJlcXVldWVJbW1lZGlhdGVseSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAoYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIC8vIFRoZSBsb29wIHN0b3BwZWQgb24gdGhlIHJlcGxheSBidWRnZXQgd2l0aCBwcm9ncmVzcyBzdGlsbFxuICAgICAgLy8gcG9zc2libGUg4oCUIGNvbnRpbnVlIGluIGEgZnJlc2ggaW52b2NhdGlvbi5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ2J1ZGdldF9leGhhdXN0ZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGl0IHdhaXQgc3dlZXAuIEEgd2FpdCB0aGF0IGVsYXBzZWQgaW4gdGhlIHdpbmRvdyBzaW5jZSB0aGVcbiAgICAvLyBsb29wJ3MgbGFzdCBjaGVjayByZXF1ZXVlcyBpbW1lZGlhdGVseSAoaXRzIHdhaXRfY29tcGxldGVkIGlzXG4gICAgLy8gd3JpdHRlbiBieSB0aGUgbmV4dCBpbnZvY2F0aW9uJ3MgZWxhcHNlZC13YWl0IHBhc3MpOyBwZW5kaW5nIHdhaXRzXG4gICAgLy8gd2hvc2UgY29udGludWF0aW9uIHRoZSBsb29wIGFscmVhZHkgZW5xdWV1ZWQgYXJlIHNraXBwZWQuXG4gICAgbGV0IHNvb25lc3RXYWl0OiB7IHNlY29uZHM6IG51bWJlcjsgY29ycmVsYXRpb25JZDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGhhc0VsYXBzZWRXYWl0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICBjb25zdCByZXN1bWVNcyA9IG5ldyBEYXRlKHdhaXQucmVzdW1lQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG4gICAgICBpZiAocmVzdW1lTXMgPD0gMCkge1xuICAgICAgICBoYXNFbGFwc2VkV2FpdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChyZXN1bWVNcyAvIDEwMDApKTtcbiAgICAgICAgaWYgKCFzb29uZXN0V2FpdCB8fCB0aW1lb3V0U2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHtcbiAgICAgICAgICAgIHNlY29uZHM6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRWxhcHNlZFdhaXQpIHtcbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3dhaXRfZWxhcHNlZF9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwZW5kaW5nUmVxdWV1ZVNpZ25hbCkge1xuICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIHdyb3RlIGV2ZW50cyB0aGUgd29ya2Zsb3cgbmVlZHMgdG8gY29uc3VtZVxuICAgICAgLy8gKGF0dHJfc2V0IC8gZ2V0Q29uZmxpY3QtYXdhaXRlZCBob29rX2NyZWF0ZWQgLyBpbmxpbmUgc3RlcFxuICAgICAgLy8gdGVybWluYWxzKSBidXQgdGhlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5nIG5ldmVyIHJldHVybmVkXG4gICAgICAvLyB0aGVtIGJlZm9yZSB0aGUgbG9vcCBleGl0ZWQuIFdpdGhvdXQgYSByZXF1ZXVlIHRoZSBydW4gd291bGRcbiAgICAgIC8vIHBhcmsgYXdhaXRpbmdfZXh0ZXJuYWwgd2l0aCBpdHMgdW5ibG9ja2luZyBldmVudHMgYWxyZWFkeVxuICAgICAgLy8gZHVyYWJseSB3cml0dGVuIGFuZCBubyBmdXR1cmUgaW52b2NhdGlvbiBjb21pbmcg4oCUIHJlcXVldWVcbiAgICAgIC8vIGltbWVkaWF0ZWx5IHNvIGEgZnJlc2ggcmVhZCBwaWNrcyB0aGVtIHVwLiBJbiB0aGUgY29tbW9uIGNhc2VcbiAgICAgIC8vIHRoZSBsb29wJ3Mgb3duIGZlZWQgb2JzZXJ2ZXMgdGhlIHdyaXRlcyBhbmQgY2xlYXJzIHRoaXMgZmxhZywgc29cbiAgICAgIC8vIHRoaXMgb25seSBmaXJlcyB3aGVuIHRoZSByZWFkIGFjdHVhbGx5IGxhZ2dlZC5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3VucmVhZF9zZWxmX3dyaXRlX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNvb25lc3RXYWl0KSB7XG4gICAgICAvLyBEZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3QgcGVuZGluZyB3YWl0IHRoZSBsb29wIGhhc1xuICAgICAgLy8gbm90IGFscmVhZHkgc2NoZWR1bGVkLiBUaGUgZGlzcGF0Y2ggaGVscGVyIGhhbmRsZXMgZGVsYXlcbiAgICAgIC8vIGNsYW1waW5nIChsb25nIHdhaXRzIGNoYWluIGFjcm9zcyBob3BzKSBhbmQgaWRlbXBvdGVuY3kta2V5XG4gICAgICAvLyBkZWR1cCBvZiByZS1vYnNlcnZhdGlvbnMgb2YgdGhlIHNhbWUgcGVuZGluZyB3YWl0IOKAlCBzZWVcbiAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywge1xuICAgICAgICBhY3Rpb246ICdzY2hlZHVsZV93YWl0X3RpbWVvdXQnLFxuICAgICAgICB0aW1lb3V0U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgd2FpdENvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmFkZChzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgICBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2goXG4gICAgICAgICAgc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgIGFjdGlvbjogJ2F3YWl0aW5nX2V4dGVybmFsJyxcbiAgICAgIHBlbmRpbmdPcHNDb3VudDogcGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5mYWlsZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBmYWlsZWQg4oCUIHJlbWFwIHN0YWNrIHRyYWNlIHVzaW5nIGlubGluZSBzb3VyY2UgbWFwcy5cbiAgICAvLyBGcmFtZXMgY2FycnkgdGhlIHJ1bidzIHdvcmtmbG93SWQgYXMgdGhlaXIgZmlsZW5hbWUgb24gdGhlIGZyZXNoXG4gICAgLy8gcGF0aCwgYnV0IHRoZSB3b3JrZmxvdy1pbmRlcGVuZGVudCBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUgb24gdGhlXG4gICAgLy8gc25hcHNob3QgcGF0aCAodGhlIG5hbWUgaXMgYmFrZWQgaW50byB0aGUgc2hhcmVkIGJhc2VsaW5lJ3NcbiAgICAvLyBjb21waWxlZCBjb2RlIGF0IGh5ZHJhdGUpIOKAlCByZW1hcCBhZ2FpbnN0IGJvdGguIHJlbWFwRXJyb3JTdGFja1xuICAgIC8vIGVhcmx5LWV4aXRzIG9uIGEgY2hlYXAgaW5jbHVkZXMoKSB3aGVuIGEgZmlsZW5hbWUgaGFzIG5vIGZyYW1lcy5cbiAgICBsZXQgZXJyb3JTdGFjayA9IHJlc3VsdC5mYWlsZWQuc3RhY2s7XG4gICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhlcnJvclN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvciBzbyBjb25zdW1lcnMgKGBydW4ucmV0dXJuVmFsdWVgLCBvYnNlcnZhYmlsaXR5KVxuICAgIC8vIGdldCBgVVNFUl9FUlJPUmAgLyBgUlVOVElNRV9FUlJPUmAgb24gYGVycm9yLmNhdXNlLmNvZGVgLCBtYXRjaGluZ1xuICAgIC8vIHdoYXQgdGhlIG5vZGU6dm0gZW5naW5lIGFscmVhZHkgZG9lcyBpbiBydW50aW1lLnRzLlxuICAgIC8vXG4gICAgLy8gVGhlIFZNIHNlcmlhbGl6ZXMgZXJyb3JzIGFzIGB7IG5hbWUsIG1lc3NhZ2UsIHN0YWNrIH1gLCBzbyB3ZVxuICAgIC8vIHJlY29uc3RydWN0IGEgaG9zdC1zaWRlIEVycm9yIG9mIHRoZSBjb3JyZWN0IGNsYXNzIGJhc2VkIG9uIHRoZVxuICAgIC8vIFZNLXNpZGUgYG5hbWVgIOKAlCBzcGVjaWZpYyBXb3JrZmxvd1J1bnRpbWVFcnJvciBzdWJjbGFzc2VzIG5lZWRcbiAgICAvLyB0byBiZSBwcmVzZXJ2ZWQgc28gY2xhc3NpZnlSdW5FcnJvcigpIHRhZ3MgdGhlbSBhcyBSVU5USU1FX0VSUk9SLlxuICAgIGNvbnN0IHJlY29uc3RydWN0ZWQ6IEVycm9yID1cbiAgICAgIHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ1dvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yJ1xuICAgICAgICA/IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd05hbWUpXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZC5uYW1lID09PSAnRXJyb3InXG4gICAgICAgICAgPyBuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKSwge1xuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHJlY29uc3RydWN0ZWQpO1xuXG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBmYWlsZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGVycm9yTmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZmFpbGVkLm1lc3NhZ2UsXG4gICAgICBlcnJvclN0YWNrLFxuICAgICAgZXJyb3JDb2RlLFxuICAgIH0pO1xuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdmYWlsZWQnKSxcbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGxlZnRvdmVyIHBlbmRpbmcgc2lkZSBlZmZlY3RzIGJlZm9yZSB3cml0aW5nIHJ1bl9mYWlsZWQg4oCUXG4gICAgLy8gc2FtZSBkcmFpbiBzZW1hbnRpY3MgYXMgdGhlIGNvbXBsZXRlZCBicmFuY2guXG4gICAgaWYgKHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmZhaWxlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2ZhaWxlZCBldmVudC4gU2VyaWFsaXplIHRoZSBlcnJvciB0aHJvdWdoIHRoZVxuICAgIC8vIGZpcnN0LWNsYXNzIGRlaHlkcmF0aW9uIHBpcGVsaW5lIHNvIGNvbnN1bWVycyAoQ0xJLCBvYnNlcnZhYmlsaXR5LFxuICAgIC8vIHJ1bi5yZXR1cm5WYWx1ZSkgZ2V0IHRoZSBzYW1lIGh5ZHJhdGVkIHZhbHVlIHNoYXBlIGFzIHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lIGVtaXRzLiBUd28gcGF0aHM6XG4gICAgLy8gICAqIE1vZGVybiAodmFsdWVCeXRlcyBwcmVzZW50KTogdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXJcbiAgICAvLyAgICAgc2VyaWFsaXplZCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIChFcnJvciBzdWJjbGFzcyB3aXRoXG4gICAgLy8gICAgIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikgdXNpbmcgdGhlIFZNJ3NcbiAgICAvLyAgICAgd29ya2Zsb3ctc2VyaWFsaXplLiBQYXNzIHRob3NlIGJ5dGVzIHRocm91Z2ggZGlyZWN0bHkgc29cbiAgICAvLyAgICAgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW5zLCBhbmQgbm9uLUVycm9yIHRocm93cyBzdXJ2aXZlLlxuICAgIC8vICAgICBXZSBqdXN0IG5lZWQgdG8gYXBwbHkgZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkICh0aGUgVk0nc1xuICAgIC8vICAgICBzZXJpYWxpemVyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGVuY3J5cHRpb24ga2V5KS5cbiAgICAvLyAgICogTGVnYWN5IGZhbGxiYWNrOiByZWNvbnN0cnVjdCBhbiBFcnJvciBmcm9tIHRoZSBob3N0LXZpc2libGVcbiAgICAvLyAgICAge25hbWUsIG1lc3NhZ2UsIHN0YWNrfSBmaWVsZHMgYW5kIHJ1biBpdCB0aHJvdWdoXG4gICAgLy8gICAgIGBkZWh5ZHJhdGVSdW5FcnJvcmAuIFVzZWQgd2hlbiB2YWx1ZUJ5dGVzIGlzIGFic2VudCAoZS5nLlxuICAgIC8vICAgICBleHRyYWN0RXJyb3IgcHNldWRvLWZhaWx1cmVzIGZyb20gVk0gYm9vdHN0cmFwKS5cbiAgICBsZXQgZGVoeWRyYXRlZEVycm9yOiBVaW50OEFycmF5O1xuICAgIGlmIChyZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMpIHtcbiAgICAgIC8vIEh5ZHJhdGUgdGhlIFZNLXNpZGUgYnl0ZXMsIHJlbWFwIHRoZSBlcnJvciBzdGFjayB3aXRoIHRoZVxuICAgICAgLy8gaG9zdC1zaWRlIHNvdXJjZSBtYXAgKHRoZSBWTSBjYW4ndCBkbyB0aGlzIOKAlCBpdCBsYWNrcyBib3RoIHRoZVxuICAgICAgLy8gc291cmNlIG1hcCBhbmQgYHJlbWFwRXJyb3JTdGFja2ApLCBhbmQgcmUtZGVoeWRyYXRlLiBUaGlzXG4gICAgICAvLyBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHZhbHVlJ3MgdHlwZSBpZGVudGl0eSAvIGNhdXNlIGNoYWluXG4gICAgICAvLyB3aGlsZSBmaXhpbmcgdXAgZnJhbWVzIHRvIHBvaW50IGF0IHRoZSB1c2VyJ3Mgc291cmNlIGZpbGVzLlxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHVuZGVmaW5lZCAvLyBWTSBieXRlcyBhcmUgdW5lbmNyeXB0ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGh5ZHJhdGVkICYmXG4gICAgICAgICAgdHlwZW9mIGh5ZHJhdGVkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICdzdGFjaycgaW4gKGh5ZHJhdGVkIGFzIG9iamVjdCkgJiZcbiAgICAgICAgICB0eXBlb2YgKGh5ZHJhdGVkIGFzIHsgc3RhY2s/OiB1bmtub3duIH0pLnN0YWNrID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgLy8gQm90aCBmaWxlbmFtZSBzcGFjZXMg4oCUIHNlZSB0aGUgZmFpbGVkLWJyYW5jaCBjb21tZW50IGFib3ZlLlxuICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAoaHlkcmF0ZWQgYXMgeyBzdGFjazogc3RyaW5nIH0pLnN0YWNrLFxuICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWxrIHRoZSBjYXVzZSBjaGFpbiBhbmQgcmVtYXAgbmVzdGVkIHN0YWNrcyB0b28uXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICAgIGxldCBub2RlID0gKGh5ZHJhdGVkIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pPy5jYXVzZTtcbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyhub2RlIGFzIG9iamVjdCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChub2RlIGFzIG9iamVjdCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVN0YWNrID0gKG5vZGUgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2s7XG4gICAgICAgICAgaWYgKHR5cGVvZiBub2RlU3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgIC8vIEJvdGggZmlsZW5hbWUgc3BhY2VzIOKAlCBzZWUgdGhlIGZhaWxlZC1icmFuY2ggY29tbWVudCBhYm92ZS5cbiAgICAgICAgICAgIChub2RlIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIHJlbWFwRXJyb3JTdGFjayhub2RlU3RhY2ssIGZpbGVuYW1lLCB3b3JrZmxvd0NvZGUpLFxuICAgICAgICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IChub2RlIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlO1xuICAgICAgICB9XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIGh5ZHJhdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHJlaHlkcmF0ZUVycikge1xuICAgICAgICAvLyBJZiBoeWRyYXRpb24gLyByZS1kZWh5ZHJhdGlvbiBmYWlscyBmb3IgYW55IHJlYXNvbiwgZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIHBhc3NpbmcgdGhyb3VnaCB0aGUgb3JpZ2luYWwgVk0gYnl0ZXMgKGp1c3QgYXBwbHlcbiAgICAgICAgLy8gZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkKS4gQmV0dGVyIHRvIGxvc2Ugc291cmNlLW1hcHBlZFxuICAgICAgICAvLyBmcmFtZXMgdGhhbiB0byBsb3NlIHRoZSBlcnJvciBlbnRpcmVseS5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byByZW1hcCB3b3JrZmxvdyBlcnJvciBzdGFjaywgcGFzc2luZyBWTSBieXRlcyB0aHJvdWdoJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChyZWh5ZHJhdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApKSBhcyBVaW50OEFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICByZWNvbnN0cnVjdGVkLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlY29uc3RydWN0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoc2VyRXJyKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIG1pbmltYWwgcGF5bG9hZCBzbyB0aGUgcnVuIHN0aWxsIHRlcm1pbmF0ZXNcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSBlcnJvciBpdHNlbGYgY29udGFpbnMgdW5zZXJpYWxpemFibGUgdmFsdWVzLlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIGRlaHlkcmF0ZSBydW4gZXJyb3IsIGZhbGxpbmcgYmFjayB0byBiYXJlIEVycm9yJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiAoc2VyRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBkZWh5ZHJhdGVkRXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2ZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ3J1bl9mYWlsZWRfd3JpdHRlbicgfSk7XG4gIH1cbn1cbiJdfQ==
1679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEVBQ3BCLDBDQUEwQyxFQUMxQyxpQ0FBaUMsR0FFbEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsT0FBTyxJQUFJLHFCQUFxQixHQUVqQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixpQkFBaUIsRUFDakIsOEJBQThCLEVBQzlCLDhCQUE4QixHQUMvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFB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QUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsYUFBYSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsRUFBRTtvQkFDbkUsYUFBYSxFQUFFLEtBQUs7aUJBQ3JCLENBQUMsQ0FBQztnQkFDSCxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztnQkFDdEQsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFCLFNBQVMsRUFBRyxHQUFhLEVBQUUsSUFBSTtnQkFDL0IsWUFBWSxFQUFHLEdBQWEsRUFBRSxPQUFPO2FBQ3RDLENBQUMsQ0FBQztZQUNILE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBRdWlja0pTIFdlYkFzc2VtYmx5IChXQVNNKSBWTSBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBXb3JrZmxvdyBEZXZLaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGVudHJ5IHBvaW50IGZvciBydW5uaW5nIHdvcmtmbG93cyBpbiB0aGVcbiAqIFF1aWNrSlMgVk0gZW5naW5lIGluc3RlYWQgb2YgdGhlIGBub2RlOnZtYCBlbmdpbmUuIEJvdGggZW5naW5lc1xuICogaW1wbGVtZW50IHRoZSBzYW1lIGV2ZW50LXJlcGxheSBleGVjdXRpb24gbW9kZWwsIHdoZXJlIGV2ZXJ5IGludm9jYXRpb246XG4gKlxuICogMS4gTG9hZHMgdGhlIGZ1bGwgZXZlbnQgbG9nIGZvciB0aGUgcnVuXG4gKiAyLiBSdW5zIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgaW4gYSBmcmVzaCBRdWlja0pTIFZNLFxuICogICAgcmVwbGF5aW5nIHRoZSBldmVudCBsb2cgdG8gcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXNcbiAqIDMuIE9uIHN1c3BlbnNpb246IGNyZWF0ZXMgZXZlbnRzICsgcXVldWVzIHN0ZXBzIGZvciBuZXcgcGVuZGluZyBvcHNcbiAqIDQuIE9uIGNvbXBsZXRpb246IGNyZWF0ZXMgcnVuX2NvbXBsZXRlZFxuICogNS4gT24gZmFpbHVyZTogY3JlYXRlcyBydW5fZmFpbGVkXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICB0eXBlIFJ1bklucHV0LFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjbGFzc2lmeVJ1bkVycm9yLCBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGRlcml2ZVJ1blBheWxvYWRLZXlzLFxuICBlbmNyeXB0IGFzIGVuY3J5cHRTZXJpYWxpemVkRGF0YSxcbiAgdHlwZSBSdW5QYXlsb2FkS2V5cyxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGRlaHlkcmF0ZVJ1bkVycm9yLFxuICBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBkZWh5ZHJhdGVTdGVwRXJyb3IsXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgbWF5YmVFbmNyeXB0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjaywgc3RyaXBJbmxpbmVTb3VyY2VNYXAgfSBmcm9tICcuLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplVHJhY2VDYXJyaWVyIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcyxcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG4gIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCxcbiAgTUFYX1JFU0lMSUVOVF9TVEVQX0lOUFVUX0JZVEVTLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRQb3J0TGF6eSB9IGZyb20gJy4vZ2V0LXBvcnQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgcXVldWVNZXNzYWdlLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgdHlwZSBQZW5kaW5nQXR0cmlidXRlLFxuICB0eXBlIFBlbmRpbmdIb29rLFxuICB0eXBlIFBlbmRpbmdIb29rRGlzcG9zZSxcbiAgdHlwZSBQZW5kaW5nT3BlcmF0aW9uLFxuICB0eXBlIFBlbmRpbmdTdGVwLFxuICB0eXBlIFBlbmRpbmdXYWl0LFxuICBzdGFydFF1aWNrSlNXb3JrZmxvdyxcbn0gZnJvbSAnLi9xdWlja2pzLXJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgUmVwbGF5QnVkZ2V0IH0gZnJvbSAnLi9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IGV4ZWN1dGVTdGVwLCB0eXBlIFN0ZXBFeGVjdXRpb25SZXN1bHQgfSBmcm9tICcuL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgcnVuU3RlcFNpbmdsZUZsaWdodCB9IGZyb20gJy4vc3RlcC1zaW5nbGUtZmxpZ2h0LmpzJztcbmltcG9ydCB7IHVuc2VyaWFsaXphYmxlU3RlcElucHV0UGxhY2Vob2xkZXIgfSBmcm9tICcuL3Vuc2VyaWFsaXphYmxlLXN0ZXAuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSwgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4sIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2guIFNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQgdXNlcyB0aGUgc3RlcC1pZGVudGl0eS1zY29wZWQgZGlzcGF0Y2gga2V5XG4gICAqIChzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSkgc28gaXQgc3RheXMgbXV0dWFsbHlcbiAgICogZXhjbHVzaXZlIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcDtcbiAgICogYGJhY2tzdG9wOjxlcG9jaD5gIGNvdmVycyBkZWxheWVkIGNyYXNoIGJhY2tzdG9wcywgc2NvcGVkIHRvIHRoZVxuICAgKiBvd25lcnNoaXAgZXBvY2ggc28gYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIE5FVyBiYWNrc3RvcCBpbnN0ZWFkXG4gICAqIG9mIGJlaW5nIGFic29yYmVkIGJ5IHRoZSBpbi1mbGlnaHQgb25lOyBgcmV0cnk6PG4+YCBjb3ZlcnMgZGVsYXllZFxuICAgKiByZXRyeS90aHJvdHRsZSByZS1lbnF1ZXVlcywgc2NvcGVkIHRvIHRoZSBhdHRlbXB0IHNvIGVhY2ggYmFja29mZlxuICAgKiBob3AgaXMgZW5xdWV1ZWFibGUuXG4gICAqL1xuICBwdXJwb3NlOiAnZGlzcGF0Y2gnIHwgYGJhY2tzdG9wOiR7c3RyaW5nfWAgfCBgcmV0cnk6JHtudW1iZXJ9YDtcbiAgLyoqXG4gICAqIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiB0aGUgc2VyaWFsaXplZCAocG9zc2libHkgZW5jcnlwdGVkKSBzdGVwIGlucHV0XG4gICAqIHRvIGNhcnJ5IG9uIHRoZSBtZXNzYWdlIGFzIGBzdGVwSW5wdXRgLCBzbyB0aGUgY29uc3VtZXIgY2FuIGlkZW1wb3RlbnRseVxuICAgKiByZS1lbnN1cmUgdGhlIGBzdGVwX2NyZWF0ZWRgIGV2ZW50IGlmIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGRpcmVjdFxuICAgKiB3cml0ZSBmYWlsZWQgdHJhbnNpZW50bHkuIE9ubHkgc2V0IG9uIGBkaXNwYXRjaGAgcHVibGlzaGVzIHRoYXRcbiAgICogZGlzcGF0Y2hQZW5kaW5nT3BzIHBhcmFsbGVsaXplcyB3aXRoIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUuXG4gICAqL1xuICBzdGVwSW5wdXQ/OiBVaW50OEFycmF5O1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHN0ZXBJbnB1dCxcbiAgICB3ZmRpYWcsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgIHdvcmxkLFxuICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICB7XG4gICAgICBydW5JZCxcbiAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAuLi4oc3RlcElucHV0ICE9PSB1bmRlZmluZWQgPyB7IHN0ZXBJbnB1dDogeyBpbnB1dDogc3RlcElucHV0IH0gfSA6IHt9KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSAnZGlzcGF0Y2gnIGtleSBpcyBzdGVwLWlkZW50aXR5LXNjb3BlZCAoY29ycmVsYXRpb25JZCArIGhhc2hlZFxuICAgICAgLy8gc3RlcCBuYW1lKSwgc2hhcmVkIHdpdGggdGhlIG5vZGUgZW5naW5lJ3MgZGlzcGF0Y2ggb2YgdGhlIHNhbWUgc3RlcFxuICAgICAgLy8gc28gdGhlIHR3byBzdGF5IG11dHVhbGx5IGV4Y2x1c2l2ZSwgd2l0aG91dCBhIHJldm9rZWQgcmVzaWxpZW50XG4gICAgICAvLyBtZXNzYWdlIGFic29yYmluZyBhIHJlYXNzaWduZWQgY29ycmVsYXRpb24gaWQncyBsZWdpdGltYXRlIGRpc3BhdGNoLlxuICAgICAgLy8gU2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICAgIHB1cnBvc2UgPT09ICdkaXNwYXRjaCdcbiAgICAgICAgICA/IHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KHN0ZXAuY29ycmVsYXRpb25JZCwgc3RlcC5zdGVwSWQpXG4gICAgICAgICAgOiBgJHtzdGVwLmNvcnJlbGF0aW9uSWR9OiR7cHVycG9zZX1gLFxuICAgICAgLi4uKGRlbGF5U2Vjb25kcyAmJiBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHt9KSxcbiAgICB9XG4gICk7XG4gIHdmZGlhZygnc3RlcF9xdWV1ZWQnLCB7XG4gICAgc3RlcElkOiBzdGVwLnN0ZXBJZCxcbiAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgcHVycG9zZSxcbiAgICBkZWxheVNlY29uZHM6IGRlbGF5U2Vjb25kcyA/PyAwLFxuICAgIC4uLihzdGVwSW5wdXQgIT09IHVuZGVmaW5lZCA/IHsgcmVzaWxpZW50OiB0cnVlIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCAodXN1YWxseSkgbm90IHF1ZXVlZCBoZXJlOiBxdWV1ZWluZyAob3IgaW5saW5lXG4gKiBleGVjdXRpb24pIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbi4gVXNlZCBib3RoIGZvciBzdXNwZW5zaW9uXG4gKiBwcm9jZXNzaW5nICh0aGUgaW5saW5lIGxvb3ApIGFuZCBmb3IgdGhlIHRlcm1pbmFsIGRyYWluIChmbHVzaGluZ1xuICogbGVmdG92ZXIgc2lkZSBlZmZlY3RzIHdoZW4gdGhlIHdvcmtmbG93IGNvbXBsZXRlZCBvciBmYWlsZWQsIG1pcnJvcmluZ1xuICogdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcykuXG4gKlxuICogVGhlIG9uZSBleGNlcHRpb24gaXMgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGZvciBzdGVwIGNpZHMgbmFtZWQgaW5cbiAqIGBxdWV1ZVN0ZXBDaWRzYCAodGhlIGNhbGxlcidzIG92ZXJmbG93IHN0ZXBzKSB0aGF0IHBhc3MgdGhlIGVsaWdpYmlsaXR5XG4gKiBnYXRlcywgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBpcyBwYXJhbGxlbGl6ZWQgd2l0aCB0aGUgc3RlcCdzIHF1ZXVlXG4gKiBwdWJsaXNoOiB0aGUgbWVzc2FnZSBjYXJyaWVzIHRoZSBzZXJpYWxpemVkIGlucHV0IChgc3RlcElucHV0YCkgc28gdGhlXG4gKiBjb25zdW1lciBjYW4gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlIGRpcmVjdCB3cml0ZSBmYWlsZWRcbiAqIHRyYW5zaWVudGx5LiBTdGVwcyBxdWV1ZWQgdGhpcyB3YXkgYXJlIHJlcG9ydGVkIGluIGBxdWV1ZWRTdGVwQ2lkc2A7IHRoZVxuICogY2FsbGVyIHF1ZXVlcyB0aGUgcmVzdCBpdHNlbGYuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoUGVuZGluZ09wcyhwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBlbmNyeXB0aW9uS2V5OiBSdW5QYXlsb2FkS2V5cyB8IHVuZGVmaW5lZDtcbiAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgLyoqXG4gICAqIFN0ZXAgY2lkcyB3aG9zZSBgc3RlcF9jcmVhdGVkYCBtdXN0IE5PVCBiZSB3cml0dGVuIGhlcmU6IHRoZSBpbmxpbmVcbiAgICogbG9vcCBjbGFpbXMgdGhlc2UgYXRvbWljYWxseSB2aWEgYSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIChjYXJyeWluZyB0aGVcbiAgICogaW5wdXQpLCBzbyBhIGNvbmN1cnJlbnQgY2xhaW1hbnQgbG9zZXMgd2l0aCBFbnRpdHlDb25mbGljdEVycm9yXG4gICAqIGluc3RlYWQgb2YgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0aW5nIHRoZSBzYW1lIHN0ZXAuXG4gICAqL1xuICBza2lwU3RlcENyZWF0aW9uPzogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgdGhlIGNhbGxlciBpbnRlbmRzIHRvIGhhbmQgdG8gdGhlIHF1ZXVlIHRoaXMgdHVybiAob3ZlcmZsb3dcbiAgICogc3RlcHMgYmV5b25kIHRoZSBpbmxpbmUgY2FwKS4gRWxpZ2libGUgb25lcyBhcmUgcHVibGlzaGVkIGhlcmUsIGluXG4gICAqIHBhcmFsbGVsIHdpdGggdGhlaXIgc3RlcF9jcmVhdGVkIHdyaXRlIChyZXNpbGllbnQgc3RlcCBkaXNwYXRjaCksIGFuZFxuICAgKiByZXBvcnRlZCBiYWNrIGluIGBxdWV1ZWRTdGVwQ2lkc2AuXG4gICAqL1xuICBxdWV1ZVN0ZXBDaWRzPzogU2V0PHN0cmluZz47XG4gIC8qKiBRdWV1ZSBuYW1lc3BhY2UgZm9yIGFsbCBtZXNzYWdlIHB1Ymxpc2hlcyAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHMuIEluIHRoZSBkZWZhdWx0XG4gICAqIGBsaW5rZWRgIHRyYWNlIG1vZGUgdGhpcyByZXR1cm5zIHRoZSBjYXJyaWVyIG9mIHRoZSBydW4ncyBPUklHSU5cbiAgICogY29udGV4dCAod29ya2Zsb3cuc3RhcnQpLCBzbyBldmVyeSBpbnZvY2F0aW9uIGxpbmtzIGJhY2sgdG8gdGhlXG4gICAqIHN0YXJ0IGluIGEgc3Rhci4gQ2FwdHVyaW5nIHRoZSBjdXJyZW50IGNvbnRleHQgaGVyZSBpbnN0ZWFkIHdvdWxkXG4gICAqIGNoYWluIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luY1xuICAgKiBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogV2hlbiB0cnVlICh0aGUgaW5saW5lIGxvb3ApLCBhIHN0ZXAgY2FycnlpbmcgYHNlcmlhbGl6YXRpb25FcnJvcmAgaXNcbiAgICogZmluYWxpemVkIGFzIHN0ZXBfY3JlYXRlZCAocGxhY2Vob2xkZXIgaW5wdXQpICsgc3RlcF9mYWlsZWQgc28gdGhlXG4gICAqIGxpdmUtVk0gZmVlZCByZWplY3RzIHRoZSBzdGVwJ3MgcHJvbWlzZSBhbmQgd29ya2Zsb3cgY29kZSBjYW4gY2F0Y2hcbiAgICogaXQsIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcC4gV2hlblxuICAgKiBmYWxzZSAodGhlIHRlcm1pbmFsIGRyYWluKSwgc3VjaCBzdGVwcyBhcmUgc2tpcHBlZCBlbnRpcmVseTogdGhlIHJ1blxuICAgKiBpcyBhbHJlYWR5IGNvbXBsZXRpbmcvZmFpbGluZywgbm8gcmVwbGF5IGZvbGxvd3MgdGhlIGRyYWluIHRvIG9ic2VydmVcbiAgICogdGhlIGZhaWx1cmUsIGFuZCBhIGNvbXBsZXRlZCBydW4gY2FycnlpbmcgYSBmYWlsZWQgc3RlcCB3b3VsZCByZWFkIGFzXG4gICAqIGEgYnVnIGZyb20gdGhlIGRhc2hib2FyZCwgbWF0Y2hpbmcgdGhlIG5vZGU6dm0gZHJhaW4ncyBiZWhhdmlvci5cbiAgICovXG4gIGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwcz86IGJvb2xlYW47XG4gIHdmZGlhZzogKGNoZWNrcG9pbnQ6IHN0cmluZywgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbn0pOiBQcm9taXNlPHtcbiAgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50OiBib29sZWFuO1xuICBjcmVhdGVkR2V0Q29uZmxpY3RIb29rOiBib29sZWFuO1xuICAvKiogU3RlcCBjaWRzIGFscmVhZHkgcHVibGlzaGVkIHZpYSByZXNpbGllbnQgZGlzcGF0Y2guIFNlZSBhYm92ZS4gKi9cbiAgcXVldWVkU3RlcENpZHM6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogU3RlcCBjaWRzIGZpbmFsaXplZCBhcyBmYWlsZWQgYmVjYXVzZSB0aGVpciBpbnB1dCByZWZ1c2VkIHRvXG4gICAqIHNlcmlhbGl6ZSAoc2VlIGBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcHNgKS4gTm8gZXhlY3V0aW9uIG1lc3NhZ2VcbiAgICogZXhpc3RzIGZvciB0aGVzZTsgdGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGUgcnVuIG9ic2VydmVzIHRoZVxuICAgKiB0ZXJtaW5hbCBldmVudCAodGhlIGlubGluZSBsb29wJ3MgZmVlZCwgb3IgdGhlIHJlcXVldWUgc2lnbmFsKS5cbiAgICovXG4gIGZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkczogU2V0PHN0cmluZz47XG59PiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHBlbmRpbmdPcGVyYXRpb25zLFxuICAgIG5hbWVzcGFjZSxcbiAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBza2lwU3RlcENyZWF0aW9uID0gcGFyYW1zLnNraXBTdGVwQ3JlYXRpb247XG4gIGNvbnN0IHF1ZXVlU3RlcENpZHMgPSBwYXJhbXMucXVldWVTdGVwQ2lkcztcbiAgY29uc3Qgd2ZkaWFnID0gcGFyYW1zLndmZGlhZztcbiAgLy8gU3RlcCBjaWRzIHB1Ymxpc2hlZCB2aWEgcmVzaWxpZW50IGRpc3BhdGNoIGJlbG93IChjcmVhdGUgKyBxdWV1ZSBpblxuICAvLyBwYXJhbGxlbCwgbWVzc2FnZSBjYXJyeWluZyBgc3RlcElucHV0YCkuIFJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgc28gaXRcbiAgLy8gc2tpcHMgdGhlbSBpbiBpdHMgb3duIHF1ZXVlaW5nIHBhc3MuXG4gIGNvbnN0IHF1ZXVlZFN0ZXBDaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFN0ZXAgY2lkcyBmaW5hbGl6ZWQgYXMgc3RlcF9jcmVhdGVkICsgc3RlcF9mYWlsZWQgYmVjYXVzZSB0aGVpciBpbnB1dFxuICAvLyByZWZ1c2VkIHRvIHNlcmlhbGl6ZS4gU2VlIHRoZSBgZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzYCBwYXJhbS5cbiAgY29uc3QgZmFpbGVkU2VyaWFsaXphdGlvblN0ZXBDaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIGVsaWdpYmlsaXR5LCBzaGFyZWQgYnkgZXZlcnkgc3RlcCBvcCBiZWxvdyAodGhlXG4gIC8vIHBlci1zdGVwIGlucHV0LXNpemUgY2hlY2sgaXMgYXBwbGllZCBpbnNpZGUgdGhlIG9wKTogZmVhdHVyZSBlbmFibGVkIGFuZFxuICAvLyBhIGJpbmFyeS1zYWZlIChDQk9SKSBxdWV1ZSB0cmFuc3BvcnQgZm9yIHRoZSBydW4uXG4gIC8vXG4gIC8vIFVubGlrZSB0aGUgbm9kZTp2bSBzdXNwZW5zaW9uIGhhbmRsZXIncyBnYXRlIChzZWVcbiAgLy8gU3VzcGVuc2lvbkhhbmRsZXJQYXJhbXMuc3RlcERpc3BhdGNoKSwgdGhlcmUgaXMgTk8gcHJlY29uZGl0aW9uLWd1YXJkXG4gIC8vIGdhdGUgaGVyZTogdGhpcyBlbmdpbmUncyBzdGVwX2NyZWF0ZWQgd3JpdGVzIGFyZSB1bmd1YXJkZWQgKG5vIHNuYXBzaG90XG4gIC8vIGlzIGF0dGFjaGVkKSwgc28gYSBndWFyZC1lbmZvcmNpbmcgV29ybGQgY2FuIG5ldmVyIDQxMi1yZWplY3QgdGhlbTpcbiAgLy8gdGhlIGNvbnN1bWVyJ3MgcmUtZW5zdXJlIHRoZXJlZm9yZSBjYW5ub3QgbWF0ZXJpYWxpemUgYSBzdGVwIHRoZSBndWFyZFxuICAvLyByZWplY3RlZC4gSWYgdGhpcyBlbmdpbmUgZXZlciBhZG9wdHMgZ3VhcmRlZCBzdXNwZW5zaW9uIHdyaXRlcywgdGhlXG4gIC8vIGNhcGFiaWxpdHkgZ2F0ZSBmcm9tIHRoZSBub2RlOnZtIGhhbmRsZXIgbXVzdCBiZSBhZGRlZCBoZXJlIHRvby5cbiAgY29uc3QgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSA9XG4gICAgcXVldWVTdGVwQ2lkcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgcXVldWVTdGVwQ2lkcy5zaXplID4gMCAmJlxuICAgIGlzUmVzaWxpZW50U3RlcERpc3BhdGNoRW5hYmxlZCgpICYmXG4gICAgKHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQ7XG4gIC8vIFNldCB3aGVuIGEgaG9vayB3aXRoIGEgcGFya2VkIGdldENvbmZsaWN0KCkgYXdhaXRlciBoYWQgaXRzXG4gIC8vIGhvb2tfY3JlYXRlZCB3cml0dGVuIHRoaXMgaW52b2NhdGlvbi4gVGhlIHdvcmtmbG93IG11c3QgYmUgcmUtaW52b2tlZFxuICAvLyBzbyByZXBsYXkgY2FuIGNvbmZpcm0gY3JlYXRpb24gYW5kIHJlc29sdmUgdGhlIGF3YWl0ZXIuXG4gIGxldCBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIGEgbmV3IGF0dHJfc2V0IGV2ZW50IGlzIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGVcbiAgLy8gd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkIHRvIGNvbnN1bWUgaXQgKHJlc29sdmluZyB0aGUgcGVuZGluZ1xuICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZSksIHNvIHRoZSBlbnRyeXBvaW50IHJlcXVldWVzIGltbWVkaWF0ZWx5LFxuICAvLyBzYW1lIHBhdHRlcm4gYXMgYW4gZWxhcHNlZCB3YWl0LlxuICBsZXQgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50ID0gZmFsc2U7XG4gIGNvbnN0IG9wc1Byb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICBjb25zdCBwcm9jZXNzSG9va09wID0gYXN5bmMgKGhvb2s6IFBlbmRpbmdIb29rKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2sgb3AnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgdG9rZW5UeXBlOiB0eXBlb2YgaG9vay50b2tlbixcbiAgICAgIGlzV2ViaG9vazogaG9vay5pc1dlYmhvb2ssXG4gICAgICBpc1N5c3RlbTogaG9vay5pc1N5c3RlbSxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogaG9vay5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICBhYm9ydFJlcXVlc3RlZDogaG9vay5hYm9ydFJlcXVlc3RlZCxcbiAgICB9KTtcblxuICAgIGlmICghaG9vay5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIGBob29rLm1ldGFkYXRhYCBpcyB0aGUgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAgIC8vIHByb2R1Y2VkIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXVxuICAgICAgLy8gKG9wdGlvbnMubWV0YWRhdGEpYCBpbnNpZGUgdGhlIFZNLiBFbmNyeXB0IG9uIHRoZSBob3N0XG4gICAgICAvLyBzaWRlIGJlZm9yZSB3cml0aW5nLCB3aGljaCBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyBgZGVoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBObyBwcmUtY2hlY2sgdmlhIGhvb2tzLmxpc3Q6IHdpdGggZGV0ZXJtaW5pc3RpYyBjb3JyZWxhdGlvbklkc1xuICAgICAgLy8gKHNhbWUgVk0gc2VlZCBhY3Jvc3MgcmVwbGF5cykgYW5kIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpXG4gICAgICAvLyB1bmlxdWVuZXNzIGluIHdvcmxkcywgdGhlIHN0b3JhZ2UgbGF5ZXIgcmVqZWN0cyBkdXBsaWNhdGVzIGFzXG4gICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aGljaCB3ZSBzd2FsbG93IGJlbG93LiBUaGlzIGRyb3BzIG9uZVxuICAgICAgLy8gbmV0d29yayByb3VuZC10cmlwIHBlciBwZW5kaW5nIGhvb2suXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRNZXRhZGF0YSA9XG4gICAgICAgICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoaG9vay5tZXRhZGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NyZWF0ZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgICAgICAgIHRva2VuUmV0ZW50aW9uVW50aWw6XG4gICAgICAgICAgICAgIGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCksXG4gICAgICAgICAgICBtZXRhZGF0YTogZW5jcnlwdGVkTWV0YWRhdGEsXG4gICAgICAgICAgICAvLyBBbHdheXMgaW5jbHVkZSBpc1dlYmhvb2sgZXhwbGljaXRseS4gV29ybGRzIGRlZmF1bHQgaXQgdG9cbiAgICAgICAgICAgIC8vIGB0cnVlYCB3aGVuIGFic2VudCwgd2hpY2ggd291bGQgYnJlYWsgdGhlIHB1YmxpYyB3ZWJob29rXG4gICAgICAgICAgICAvLyBlbmRwb2ludCdzIDQwNCBndWFyZCBmb3IgaG9va3MgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpLlxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgICAgICAgIC8vIFN5c3RlbSBob29rcyAoQWJvcnRDb250cm9sbGVyKSBhcmUgZXhlbXB0IGZyb20gdXNlclxuICAgICAgICAgICAgLy8gdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0IGNoZWNrcy5cbiAgICAgICAgICAgIC4uLihob29rLmlzU3lzdGVtID8geyBpc1N5c3RlbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBzdG9yYWdlIGRldGVjdGVkIGEgcmVhbCB0b2tlbiBjb25mbGljdCB3aXRoIGFub3RoZXJcbiAgICAgICAgLy8gd29ya2Zsb3cncyBob29rLCByZS1xdWV1ZSBzbyB0aGUgd29ya2Zsb3cgaGFuZGxlciBjYW5cbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgY29uZmxpY3QgZXZlbnQgYW5kIGZhaWwgZ3JhY2VmdWxseS5cbiAgICAgICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGlkZW1wb3RlbmN5S2V5OiBgaG9va19jb25mbGljdF8ke2hvb2suY29ycmVsYXRpb25JZH1gIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjcmVhdGVkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uLCBzbyBmYWxsIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWJvcnQgcHJvY2Vzc2luZyBiZWxvdyAoaWYgYW55KSBpbnN0ZWFkIG9mIGJhaWxpbmcuXG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpZiAoaG9vay5oYXNHZXRDb25mbGljdEF3YWl0ZXIpIHtcbiAgICAgICAgY3JlYXRlZEdldENvbmZsaWN0SG9vayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhvb2suYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgYWJvcnQgZHVyYWJseTogYSBob29rX3JlY2VpdmVkIGV2ZW50IGNhcnJ5aW5nXG4gICAgICAvLyB0aGUgVk0tc2VyaWFsaXplZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgcGF5bG9hZCxcbiAgICAgIC8vIHBsdXMgYSBiZXN0LWVmZm9ydCBzdHJlYW0gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcFxuICAgICAgLy8gcHJvcGFnYXRpb24uIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3Mgc3VzcGVuc2lvblxuICAgICAgLy8gaGFuZGxlciAoaG9va3NOZWVkaW5nQWJvcnQpLlxuICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID1cbiAgICAgICAgaG9vay5hYm9ydFBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgICAgPyAoKGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgaG9vay5hYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIFVpbnQ4QXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy8gc3RyZWFtTmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGFib3J0IGhvb2sgdG9rZW5cbiAgICAgIC8vIChgYWJydF97aWR9YCDihpIgYHN0cm1fe2lkfV9zeXN0ZW1fYWJvcnRgKS5cbiAgICAgIGlmIChob29rLnRva2VuLnN0YXJ0c1dpdGgoJ2FicnRfJykgJiYgYWJvcnRQYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBgc3RybV8ke2hvb2sudG9rZW4uc2xpY2UoJ2FicnRfJy5sZW5ndGgpfV9zeXN0ZW1fYWJvcnRgO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUocnVuSWQsIHN0cmVhbU5hbWUsIGFib3J0UGF5bG9hZCk7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgaG9vayBldmVudCBwcm92aWRlcyB0aGUgZHVyYWJsZVxuICAgICAgICAgIC8vIGZhbGxiYWNrLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdhYm9ydF9yZWNvcmRlZCcsIHtcbiAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcCA9IGFzeW5jIChcbiAgICBvcDogUGVuZGluZ0hvb2tEaXNwb3NlXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfZGlzcG9zZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IG9wLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIC8vIERpc3Bvc2luZyBhIGhvb2sgd2hvc2UgZW50aXR5IG5vIGxvbmdlciAob3IgbmV2ZXIpIGV4aXN0cyBpcyBhblxuICAgICAgLy8gaWRlbXBvdGVudCBuby1vcDogdGhlIGVudGl0eSBtYXkgaGF2ZSBiZWVuIHRvcm4gZG93biBieSBhXG4gICAgICAvLyBjb25jdXJyZW50IHJ1biBjYW5jZWxsYXRpb24sIG9yIHRoZSBob29rIG1heSBoYXZlIGxvc3QgaXRzXG4gICAgICAvLyB0b2tlbiBjbGFpbSB0byBhIGNvbmZsaWN0LiBUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVsZWFzZS5cbiAgICAgIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuXG4gIC8vIEhvb2sgb3BlcmF0aW9ucyBhcmUgZ3JvdXBlZCBieSB0b2tlbiBhbmQgcHJvY2Vzc2VkIFNFUVVFTlRJQUxMWSBpblxuICAvLyBjb2RlIG9yZGVyIHdpdGhpbiBlYWNoIGdyb3VwLCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gc3VzcGVuc2lvblxuICAvLyBoYW5kbGVyIChob29rSXRlbXNCeVRva2VuKTogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIG11c3RcbiAgLy8gcmVsZWFzZSB0aGUgdG9rZW4gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXNcbiAgLy8gdmFsaWRhdGVkIGJ5IHRoZSB3b3JsZDogcGFyYWxsZWwgZGlzcGF0Y2ggd291bGQgb3RoZXJ3aXNlIHJlY29yZCBhXG4gIC8vIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duIGRpc3Bvc2VkIGhvb2sgKGUuZy4gYVxuICAvLyBkaXNwb3Nl4oaScmVjcmVhdGUgbG9vcCByZXVzaW5nIG9uZSB0b2tlbikuIERpZmZlcmVudCB0b2tlbnMgaGF2ZSBub1xuICAvLyBjbGFpbSBpbnRlcmFjdGlvbiwgc28gdG9rZW4gZ3JvdXBzIHJ1biBpbiBwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXJcbiAgLy8gYW5kIHdpdGggdGhlIG5vbi1ob29rIG9wcyBiZWxvdy5cbiAgY29uc3QgaG9va09wc0J5VG9rZW4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICAoUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2UpW11cbiAgPigpO1xuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgKCFvcC5oYXNDcmVhdGVkRXZlbnQgfHwgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZClcbiAgICApIHtcbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9vaykudG9rZW47XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnaG9va19kaXNwb3NlJyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAvLyBQZXItb3AgZmFsbGJhY2sgZ3JvdXAgd2hlbiB0aGUgdG9rZW4gaXMgdW5rbm93bjogbm8gb3JkZXJpbmdcbiAgICAgIC8vIGd1YXJhbnRlZXMsIG1hdGNoaW5nIHRoZSBwcmV2aW91cyBwYXJhbGxlbCBiZWhhdmlvci5cbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9va0Rpc3Bvc2UpLnRva2VuID8/IGBfX2NpZDoke29wLmNvcnJlbGF0aW9uSWR9YDtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBncm91cCA9IGhvb2tPcHNCeVRva2VuLmdldChrZXkpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tPcHNCeVRva2VuLnNldChrZXksIFtvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZV0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGhvb2tPcHNCeVRva2VuLnZhbHVlcygpKSB7XG4gICAgb3BzUHJvbWlzZXMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb3Agb2YgZ3JvdXApIHtcbiAgICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va09wKG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0hvb2tEaXNwb3NlT3Aob3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ3N0ZXAnICYmXG4gICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAhc2tpcFN0ZXBDcmVhdGlvbj8uaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzdGVwID0gb3AgYXMgUGVuZGluZ1N0ZXA7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIFRoZSBzdGVwJ3MgaW5wdXQgcmVmdXNlZCB0byBzZXJpYWxpemUgd2hpbGUgZHVtcGluZyB0aGUgVk0nc1xuICAgICAgICAgIC8vIHBlbmRpbmcgb3BzIChzZWUgUGVuZGluZ1N0ZXAuc2VyaWFsaXphdGlvbkVycm9yKS4gRmluYWxpemUgaXRcbiAgICAgICAgICAvLyBhcyBzdGVwX2NyZWF0ZWQgKHBsYWNlaG9sZGVyIGlucHV0LCBzaW5jZSB0aGUgd29ybGQgcmVxdWlyZXMgdGhlXG4gICAgICAgICAgLy8gc3RlcCBlbnRpdHkgYmVmb3JlIGEgdGVybWluYWwgZXZlbnQpICsgc3RlcF9mYWlsZWQgY2FycnlpbmdcbiAgICAgICAgICAvLyB0aGUgU2VyaWFsaXphdGlvbkVycm9yLCBzbyB0aGUgbGl2ZS1WTSBmZWVkIHJlamVjdHMgdGhlXG4gICAgICAgICAgLy8gc3RlcCdzIHByb21pc2UgYW5kIHdvcmtmbG93IGNvZGUgY2FuIGNhdGNoIGl0LiBOZXZlciBxdWV1ZSBhblxuICAgICAgICAgIC8vIGV4ZWN1dGlvbiBtZXNzYWdlIGZvciBpdC4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUnc1xuICAgICAgICAgIC8vIGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwLiBJbiB0aGUgdGVybWluYWwgZHJhaW5cbiAgICAgICAgICAvLyAoZmluYWxpemVVbnNlcmlhbGl6YWJsZVN0ZXBzIHVuc2V0KSwgc2tpcCBlbnRpcmVseTogc2VlIHRoZVxuICAgICAgICAgIC8vIHBhcmFtIGRvY3MuXG4gICAgICAgICAgaWYgKHN0ZXAuc2VyaWFsaXphdGlvbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIXBhcmFtcy5maW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAnU3RlcCBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZTsgZmFpbGluZyB0aGUgc3RlcCBzbyAnICtcbiAgICAgICAgICAgICAgICAndGhlIHdvcmtmbG93IGNhbiBvYnNlcnZlIHRoZSBlcnJvcicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBzdGVwLnNlcmlhbGl6YXRpb25FcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiAoYXdhaXQgZGVoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgICAgdW5zZXJpYWxpemFibGVTdGVwSW5wdXRQbGFjZWhvbGRlcigpLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgKSkgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBDb25jdXJyZW50IGludm9jYXRpb24gaGl0IHRoZSBzYW1lIGRldGVybWluaXN0aWMgZmFpbHVyZVxuICAgICAgICAgICAgICAvLyBhbmQgY3JlYXRlZCBpdCBmaXJzdCwgb3IgdGhlIHJ1biBhbHJlYWR5IGZpbmlzaGVkLlxuICAgICAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgaWYgKCFFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuc2VyaWFsaXphdGlvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgdGVybWluYWwgb3IgcnVuIGFscmVhZHkgZmluaXNoZWQuXG4gICAgICAgICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpICYmICFSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmFpbGVkU2VyaWFsaXphdGlvblN0ZXBDaWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgd2ZkaWFnKCdzdGVwX3NlcmlhbGl6YXRpb25fZmFpbGVkJywge1xuICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc3RlcF9jcmVhdGVkIGV2ZW50LiBgc3RlcC5pbnB1dGAgaXMgdGhlXG4gICAgICAgICAgLy8gZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXMgKFwiZGV2bFwiICsgZGV2YWx1ZSkgcHJvZHVjZWRcbiAgICAgICAgICAvLyBieSBgZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1zZXJpYWxpemUnKV0oe2FyZ3MsXG4gICAgICAgICAgLy8gY2xvc3VyZVZhcnMsIHRoaXNWYWx9KWAgaW5zaWRlIHRoZSBWTS4gVGhlIFZNIGhhcyBub1xuICAgICAgICAgIC8vIGFjY2VzcyB0byB0aGUgQ3J5cHRvS2V5LCBzbyBlbmNyeXB0aW9uIGlzIGFwcGxpZWQgaGVyZVxuICAgICAgICAgIC8vIG9uIHRoZSBob3N0IHNpZGUsIG1hdGNoaW5nIHdoYXRcbiAgICAgICAgICAvLyBgZGVoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZG9lcyBpbiB0aGUgbm9kZTp2bSBlbmdpbmUuXG4gICAgICAgICAgY29uc3QgZW5jcnlwdGVkSW5wdXQgPSBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoXG4gICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogZmlyZSB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGFuZCB0aGVcbiAgICAgICAgICAvLyBzdGVwJ3MgcXVldWUgcHVibGlzaCBpbiBwYXJhbGxlbDogdGhlIG1lc3NhZ2UgY2FycmllcyB0aGVcbiAgICAgICAgICAvLyBzYW1lIHNlcmlhbGl6ZWQgaW5wdXQgKGBzdGVwSW5wdXRgKSBzbyB0aGUgY29uc3VtZXIgY2FuXG4gICAgICAgICAgLy8gaWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnQgaWYgdGhlIGRpcmVjdCB3cml0ZSBmYWlsZWRcbiAgICAgICAgICAvLyB0cmFuc2llbnRseS4gTWlycm9ycyB0aGUgbm9kZTp2bSBzdXNwZW5zaW9uIGhhbmRsZXIgYW5kIHRoZVxuICAgICAgICAgIC8vIHJlc2lsaWVudCBzdGFydCAvIHJlc2lsaWVudCBob29rIHJlc3VtZSBwYXR0ZXJucy4gT25seSBmb3JcbiAgICAgICAgICAvLyBjYWxsZXItZGVzaWduYXRlZCBvdmVyZmxvdyBzdGVwcyB3aXRoIGlucHV0cyB0aGUgcXVldWVcbiAgICAgICAgICAvLyBtZXNzYWdlIGNhbiBzYWZlbHkgY2FycnkgKGJpbmFyeSwgdW5kZXIgdGhlIFZRUyBzaXplIGNhcCkuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzaWxpZW50RGlzcGF0Y2hFbGlnaWJsZSAmJlxuICAgICAgICAgICAgcXVldWVTdGVwQ2lkcz8uaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgIGVuY3J5cHRlZElucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSAmJlxuICAgICAgICAgICAgZW5jcnlwdGVkSW5wdXQuYnl0ZUxlbmd0aCA8PSBNQVhfUkVTSUxJRU5UX1NURVBfSU5QVVRfQllURVNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IFtjcmVhdGVSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgcHVycG9zZTogJ2Rpc3BhdGNoJyxcbiAgICAgICAgICAgICAgICBzdGVwSW5wdXQ6IGVuY3J5cHRlZElucHV0LFxuICAgICAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIGZvciB0aGlzIGRpc3BhdGNoIHBhc3M6XG4gICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBtZXNzYWdlIHRoZSBzdGVwIHdvdWxkIHJlbHkgb24gdGhlIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYWxvbmUsIGFuZCBpZiB0aGUgY3JlYXRlIEFMU08gZmFpbGVkIHRoZXJlIHdvdWxkIGJlIG5vXG4gICAgICAgICAgICAvLyBkdXJhYmxlIHJlY29yZCBhdCBhbGwuIFByb3BhZ2F0aW5nIHJlZGVsaXZlcnMgdGhlXG4gICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSwgd2hpY2ggcmUtY3JlYXRlcyB0aGUgKGlkZW1wb3RlbnQpXG4gICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgYW5kIHJlLWRpc3BhdGNoZXMuXG4gICAgICAgICAgICBpZiAocXVldWVSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IHF1ZXVlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlZFN0ZXBDaWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgaWYgKGNyZWF0ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gY3JlYXRlUmVzdWx0LnJlYXNvbjtcbiAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgaW52b2NhdGlvbiB3cm90ZSBpdCBmaXJzdDogdGhlIG1lc3NhZ2UgaXNcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dDsgaXRzIGR1cGxpY2F0ZSBwdWJsaXNoIGRlZHVwZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgLy8gc2hhcmVkIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleS5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzaWxpZW50OiB0aGUgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5ICg0MjkgLyA1eHggL1xuICAgICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCkgYnV0IHRoZSBzdGVwIG1lc3NhZ2UgKGNhcnJ5aW5nIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgLy8gc2VyaWFsaXplZCBpbnB1dCkgd2FzIHB1Ymxpc2hlZCwgc28gdGhlIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgLy8gaWRlbXBvdGVudGx5IHJlLWVuc3VyZXMgdGhlIHN0ZXBfY3JlYXRlZCBiZWZvcmVcbiAgICAgICAgICAgICAgICAvLyBleGVjdXRpbmcuXG4gICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgJ1N0ZXAgY3JlYXRpb24gZXZlbnQgd3JpdGUgZmFpbGVkLCBidXQgdGhlIHN0ZXAgd2FzICcgK1xuICAgICAgICAgICAgICAgICAgICAnZGlzcGF0Y2hlZCB2aWEgdGhlIHF1ZXVlLiBUaGUgc3RlcF9jcmVhdGVkIGV2ZW50ICcgK1xuICAgICAgICAgICAgICAgICAgICAnd2lsbCBiZSBlbnN1cmVkIGJ5IHRoZSBxdWV1ZSBjb25zdW1lci4nLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB3ZmRpYWcoJ3N0ZXBfcmVzaWxpZW50X2Rpc3BhdGNoX3JlY292ZXJlZCcsIHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBlbmNyeXB0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5PVEU6IHN0ZXAgcXVldWVpbmcgaXMgb3RoZXJ3aXNlIHRoZSBjYWxsZXIncyBkZWNpc2lvbjogdGhlXG4gICAgICAgICAgLy8gaW5saW5lIGxvb3AgZXhlY3V0ZXMgZnJlc2ggc3RlcHMgaW4gdGhlIGxpdmUgVk0gYW5kIG9ubHlcbiAgICAgICAgICAvLyBxdWV1ZXMgdGhlIG92ZXJmbG93IC8gcmV0cnkgLyBiYWNrc3RvcCBjYXNlcyAoc2VlXG4gICAgICAgICAgLy8gcXVldWVTdGVwTWVzc2FnZSkuXG4gICAgICAgIH0pKClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnYXR0cmlidXRlJyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICBjb25zdCBhdHRyID0gb3AgYXMgUGVuZGluZ0F0dHJpYnV0ZTtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnYXR0cl9zZXQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGF0dHIuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgY2hhbmdlczogYXR0ci5jaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHdyaXRlcjogeyB0eXBlOiAnd29ya2Zsb3cnIH0sXG4gICAgICAgICAgICAgICAgLi4uKGF0dHIuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIEV2ZW50IGFscmVhZHkgZXhpc3RzIChjb25jdXJyZW50IGludm9jYXRpb24pLCBidXQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7XG4gICAgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50LFxuICAgIGNyZWF0ZWRHZXRDb25mbGljdEhvb2ssXG4gICAgcXVldWVkU3RlcENpZHMsXG4gICAgZmFpbGVkU2VyaWFsaXphdGlvblN0ZXBDaWRzLFxuICB9O1xufVxuXG4vKipcbiAqIFJ1biBhIHdvcmtmbG93IHVzaW5nIHRoZSBRdWlja0pTIFdBU00gVk0gZW5naW5lLlxuICpcbiAqIFRoaXMgcmVwbGFjZXMgdGhlIGBub2RlOnZtYCByZXBsYXkgcGF0aCAocnVuV29ya2Zsb3cgKyBFdmVudHNDb25zdW1lcilcbiAqIHdpdGggYSBRdWlja0pTIFZNIGludm9jYXRpb24gdGhhdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheS5cbiAqXG4gKiBLTk9XTiBHQVAgKHNsb3Qgc25hcHNob3QpOiB1bmxpa2UgdGhlIG5vZGU6dm0gcGF0aCwgbm8gZXZlbnQgd3JpdGUgaW5cbiAqIHRoaXMgZmlsZSBjYXJyaWVzIHtAbGluayBDcmVhdGVFdmVudFBhcmFtcy5ldmVudENvdW50fSwgc28gYSBXb3JsZCBuZXZlclxuICogbGVhcm5zIHdoaWNoIGV2ZW50cyB0aGUgd3JpdGVyIGhhZCBub3Qgc2VlbiBhbmQgbmV2ZXIgcmVwb3J0cyB0aGVtIGJhY2suXG4gKiBUaGUgZW5naW5lIGN1cnJlbnRseSByZWxpZXMgb24gcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgZXZlbnRcbiAqIHVuaXF1ZW5lc3MgKEVudGl0eUNvbmZsaWN0RXJyb3IgZGVkdXApIGFsb25lLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZVxuICogc2ltcGxpZmljYXRpb24gd2hpbGUgdGhlIGVuZ2luZSBpcyBleHBlcmltZW50YWw6IHdpcmluZyB0aGUgc25hcHNob3QgaXNcbiAqIHRyYWNrZWQgZm9sbG93LXVwIHdvcms7IGFueW9uZSBhZGRpbmcgbmV3IHdyaXRlIHBhdGhzIGhlcmUgc2hvdWxkIG5vdFxuICogYXNzdW1lIHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSBvbiB0aGlzIGF4aXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHBhcmFtczoge1xuICB3b3JrZmxvd0NvZGU6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgLyoqXG4gICAqIEV2ZW50cyByZXR1cm5lZCBpbmxpbmUgYnkgYGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJywgLi4uKWAgb3IgYnlcbiAgICogdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBgaG9va19yZWNlaXZlZGAgcHJlbG9hZC4gV2hlbiB0aGV5IGluZGljYXRlXG4gICAqIGEgZmlyc3QgaW52b2NhdGlvbiwgb3Igd2hlbiBgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGVgIGF0dGVzdHMgdGhleVxuICAgKiBhcmUgdGhlIGNvbXBsZXRlIGxvZywgdGhleSBhcmUgdXNlZCBhcyB0aGUgZXZlbnQgbG9nIGluc3RlYWQgb2ZcbiAgICogZmV0Y2hpbmcgdmlhIGBldmVudHMubGlzdGAsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGZhc3QgcGF0aC5cbiAgICovXG4gIHByZWxvYWRlZEV2ZW50cz86IEV2ZW50W107XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIGNhbGxlciBoYXMgdmFsaWRhdGVkIHRoYXQgYHByZWxvYWRlZEV2ZW50c2AgaXMgdGhlIHJ1bidzXG4gICAqIENPTVBMRVRFIGV2ZW50IGxvZyAoZS5nLiB0aGUgbGF6eSBob29rIGZhc3QgcGF0aCdzIGhhc01vcmUtZmFsc2VcbiAgICogcmVwbGF5IHByZWxvYWQpLiBUaGUgZmlyc3QtaW52b2NhdGlvbiBoZXVyaXN0aWMgYmVsb3cgb25seSByZWNvZ25pemVzXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkLW9ubHkgcHJlbG9hZHMsIHNvIHdpdGhvdXQgdGhpcyBhdHRlc3RhdGlvbiBhXG4gICAqIGhvb2stcmVzdW1lIHByZWxvYWQgd291bGQgYmUgZGlzY2FyZGVkIGFuZCByZWZldGNoZWQuXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSdW4gaW5wdXQgY2FycmllZCB0aHJvdWdoIHRoZSBxdWV1ZSBtZXNzYWdlIG9uIGZpcnN0IGRlbGl2ZXJ5LiBVc2VkXG4gICAqIGFzIGEgbGFzdC1yZXNvcnQgZmFsbGJhY2sgZm9yIGBydW5fY3JlYXRlZC5ldmVudERhdGEuaW5wdXRgIHdoZW5cbiAgICogdGhlIGV2ZW50IGxvZyBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgT1RlbCBzcGFuICh0aGUgb3V0ZXIgYFdPUktGTE9XIHt3b3JrZmxvd05hbWV9YCBzcGFuIGZyb21cbiAgICogYHJ1bnRpbWUudHNgKS4gV2hlbiBzdXBwbGllZCwgVk0gbGlmZWN5Y2xlIGF0dHJpYnV0ZXMgYXJlIGF0dGFjaGVkXG4gICAqIHRvIGl0IGZvciBlbmQtdG8tZW5kIHZpc2liaWxpdHkuXG4gICAqL1xuICBwYXJlbnRTcGFuPzogU3BhbjtcbiAgLyoqXG4gICAqIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2VcbiAgICogKHVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQpLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIGd1YXJkOlxuICAgKiBhIHJ1bmF3YXkgcnVuIGlzIGZhaWxlZCBvbmNlIGl0cyBsb2cgcmVhY2hlcyB0aGUgY2VpbGluZy4gVGhlIHRocm93XG4gICAqIHByb3BhZ2F0ZXMgdG8gdGhlIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyAodGhlIFF1aWNrSlNcbiAgICogZGlzcGF0Y2ggcnVucyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggY2xhc3NpZmllcyBpdCBhbmRcbiAgICogcmVjb3JkcyBydW5fZmFpbGVkIHdpdGggTUFYX0VWRU5UU19FWENFRURFRC5cbiAgICovXG4gIG1heEV2ZW50c0xpbWl0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgZGVsaXZlcnkgYXR0ZW1wdCBvZiB0aGUgbWVzc2FnZSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiAoZnJvbVxuICAgKiB0aGUgcXVldWUgaGFuZGxlcidzIG1ldGFkYXRhOyAxID0gZmlyc3QgZGVsaXZlcnkpLiBTdXJmYWNlZCBpblxuICAgKiBkaWFnbm9zdGljczsgY3Jhc2ggcmVjb3ZlcnkgaXRzZWxmIGlzIGRyaXZlbiBieSB0aGUgb3duZXJzaGlwLWxlYXNlXG4gICAqIGRlY2lzaW9uIHRhYmxlIGluIHRoZSBsb29wLCBub3QgYnkgdGhlIGF0dGVtcHQgY291bnQuXG4gICAqL1xuICBkZWxpdmVyeUF0dGVtcHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBkZWxpdmVyeSBkcml2aW5nIHRoaXMgaW52b2NhdGlvbiwgc3RhbXBlZCBhc1xuICAgKiBgb3duZXJNZXNzYWdlSWRgIG9uIGlubGluZSBsYXp5IHN0ZXAgY2xhaW1zIHNvIHdha2UgcmVwbGF5cyBkZWZlciB0b1xuICAgKiB0aGUgaW4tZmxpZ2h0IGJvZHkgaW5zdGVhZCBvZiByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBSZXF1ZXN0IElEIG9mIHRoZSBxdWV1ZSBpbnZvY2F0aW9uLCB3aGVuIHRoZSBxdWV1ZSBwcm92aWRlcyBvbmUuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSByZXNvbHZlZCBhdCByb3V0ZSByZWdpc3RyYXRpb24gKHJ1bnRpbWUudHMpLiBNdXN0IGJlXG4gICAqIHRocmVhZGVkIGludG8gZXZlcnkgbWVzc2FnZSBwdWJsaXNoOiB0aGUgYnVpbGRlcnMgYmFrZSB0aGUgbmFtZXNwYWNlXG4gICAqIGludG8gZ2VuZXJhdGVkIHJvdXRlcywgc28gY29uc3VtZXJzIGxpc3RlbiBvbiBgX188bnM+X3drZl93b3JrZmxvd18qYC5cbiAgICogQSBwdWJsaXNoIHdpdGhvdXQgaXQgbGFuZHMgb24gYF9fd2tmX3dvcmtmbG93XypgIGFuZCBpcyBuZXZlclxuICAgKiBwaWNrZWQgdXAuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzXG4gICAqIChnZXROZXh0VHJhY2VDYXJyaWVyKS4gSW4gdGhlIGRlZmF1bHQgYGxpbmtlZGAgdHJhY2UgbW9kZSBldmVyeVxuICAgKiBpbnZvY2F0aW9uIG11c3QgbGluayBiYWNrIHRvIHRoZSBydW4ncyBvcmlnaW4gKHdvcmtmbG93LnN0YXJ0KSBpbiBhXG4gICAqIHN0YXI7IGNhcHR1cmluZyB0aGUgY3VycmVudCBpbnZvY2F0aW9uIGNvbnRleHQgaW5zdGVhZCB3b3VsZCBjaGFpblxuICAgKiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmMgcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2Fycmllcj86ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIC8qKlxuICAgKiBUaGUgd2FpdCB0aGlzIGludm9jYXRpb24gaXMgdGhlIGRlbGF5ZWQgY29udGludWF0aW9uIGZvciwgaWYgaXQgaXMgb25lXG4gICAqIChgV29ya2Zsb3dJbnZva2VQYXlsb2FkLndhaXRDb250aW51YXRpb25gKS4gUmVhZCBvbmx5IHRvIGRlY2lkZSB0aGUgbmV4dFxuICAgKiBjb250aW51YXRpb24ncyBpZGVtcG90ZW5jeSBrZXk6IGEgY29udGludWF0aW9uIHRoYXQgZmluZHMgaXRzIG93biB3YWl0XG4gICAqIHN0aWxsIHBlbmRpbmcgaGFzIHNwZW50IGl0cyBrZXksIHNvIHRoZSByZS1hcm0gaGFzIHRvIGFkdmFuY2UgdGhlIGF0dGVtcHRcbiAgICogb3IgdGhlIHdvcmxkJ3MgZGVkdXBlIHdpbmRvdyBkcm9wcyBpdCBhbmQgdGhlIHdhaXQgbG9zZXMgaXRzIG9ubHkgdGltZXIuXG4gICAqL1xuICB3YWl0Q29udGludWF0aW9uPzogeyBjb3JyZWxhdGlvbklkOiBzdHJpbmc7IGF0dGVtcHQ6IG51bWJlciB9O1xufSk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kcz86IG51bWJlciB9IHwgdm9pZD4ge1xuICBjb25zdCB7XG4gICAgd29ya2Zsb3dDb2RlLFxuICAgIHdvcmtmbG93TmFtZSxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBwcmVsb2FkZWRFdmVudHMsXG4gICAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGUsXG4gICAgcnVuSW5wdXQsXG4gICAgcGFyZW50U3BhbixcbiAgICBtYXhFdmVudHNMaW1pdCxcbiAgICBkZWxpdmVyeUF0dGVtcHQsXG4gICAgb3duZXJNZXNzYWdlSWQsXG4gICAgcmVxdWVzdElkLFxuICAgIG5hbWVzcGFjZSxcbiAgICB3YWl0Q29udGludWF0aW9uLFxuICB9ID0gcGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IG51bWJlciBmb3IgdGhlIGNvbnRpbnVhdGlvbiB0aGlzIGludm9jYXRpb24gaXMgYWJvdXQgdG8gYXJtIGZvclxuICAgKiBgY29ycmVsYXRpb25JZGAuIE9uZSBoaWdoZXIgdGhhbiB0aGUgaW5jb21pbmcgY29udGludWF0aW9uJ3Mgd2hlbiB0aGlzXG4gICAqIGludm9jYXRpb24gSVMgdGhhdCBjb250aW51YXRpb24gYW5kIHRoZSB3YWl0IGlzIHN0aWxsIHBlbmRpbmcg4oCUIHRoZSBvbmx5XG4gICAqIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgcHJldmlvdXMga2V5IGlzIHNwZW50LiBFdmVyeSBvdGhlciBjYWxsZXIsIGFuZFxuICAgKiBldmVyeSBvdGhlciB3YWl0LCBzdGFydHMgYXQgMCBhbmQga2V5cyBleGFjdGx5IGFzIGl0IGRpZCBiZWZvcmUgYXR0ZW1wdHNcbiAgICogZXhpc3RlZC5cbiAgICovXG4gIGNvbnN0IG5leHRXYWl0Q29udGludWF0aW9uQXR0ZW1wdCA9IChjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBudW1iZXIgPT5cbiAgICB3YWl0Q29udGludWF0aW9uPy5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkXG4gICAgICA/IHdhaXRDb250aW51YXRpb24uYXR0ZW1wdCArIDFcbiAgICAgIDogMDtcbiAgLy8gU3RhbmRhbG9uZS1jYWxsZXIgZmFsbGJhY2sgKHRlc3RzKTogd2l0aG91dCBhIHJ1bnRpbWUudHMgY2FycmllclxuICAvLyBhY2Nlc3NvciwgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dC5cbiAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9XG4gICAgcGFyYW1zLm5leHRUcmFjZUNhcnJpZXIgPz8gKCgpID0+IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpKTtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICBjb25zdCBydW5JZCA9IHdvcmtmbG93UnVuLnJ1bklkO1xuICBjb25zdCBpbnZvY2F0aW9uU3RhcnQgPSB0aWNrKCk7XG5cbiAgLy8gU3RyaXAgdGhlIGlubGluZSBzb3VyY2UgbWFwIGNvbW1lbnQgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIGJ1bmRsZSBpblxuICAvLyB0aGUgUXVpY2tKUyBWTS4gVGhlIG1hcCBpcyBwdXJlbHkgaG9zdC1zaWRlIG1ldGFkYXRhIGZvclxuICAvLyBgcmVtYXBFcnJvclN0YWNrYCAoY2FsbGVkIGJlbG93IG9uIHdvcmtmbG93IGZhaWx1cmVzLCBhZ2FpbnN0IHRoZVxuICAvLyBPUklHSU5BTCBgd29ya2Zsb3dDb2RlYCkuIFF1aWNrSlMgcmV0YWlucyBzb3VyY2UgdGV4dCBmb3JcbiAgLy8gc3RhY2stdHJhY2UgbGluZSBsb29rdXBzLCBzbyB0aGUgZmV3LU1CIGJhc2U2NCBjb21tZW50IHdvdWxkIGJsb2F0XG4gIC8vIHRoZSBWTSBoZWFwIGZvciBubyBiZW5lZml0LlxuICBjb25zdCB3b3JrZmxvd0NvZGVGb3JWTSA9IHN0cmlwSW5saW5lU291cmNlTWFwKHdvcmtmbG93Q29kZSk7XG5cbiAgLy8gUGVyLWludm9jYXRpb24gZGlhZ25vc3RpYyBpZCBzbyBkZWJ1ZyBsb2dzIGNhbiBiZSBjb3JyZWxhdGVkIGV2ZW4gaWZcbiAgLy8gdGhlIHNhbWUgcnVuSWQgaXMgcHJvY2Vzc2VkIGJ5IG92ZXJsYXBwaW5nIGludm9jYXRpb25zIG9uIGRpZmZlcmVudFxuICAvLyBmdW5jdGlvbiBpbnN0YW5jZXMuXG4gIGNvbnN0IGludm9jYXRpb25JZCA9IGBpbnZfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcblxuICAvLyBTdHJ1Y3R1cmVkIHBlci1jaGVja3BvaW50IGRpYWdub3N0aWMgaGVscGVyLCBncmVwLWZyaWVuZGx5IGJ5IHJ1bklkLlxuICBjb25zdCB3ZmRpYWcgPSAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUVVJQ0tKU19WTV9ESUFHJywge1xuICAgICAgY2hlY2twb2ludCxcbiAgICAgIHJ1bklkLFxuICAgICAgaW52b2NhdGlvbklkLFxuICAgICAgdEVsYXBzZWRNczogTWF0aC5yb3VuZCh0aWNrKCkgLSBpbnZvY2F0aW9uU3RhcnQpLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICB9O1xuXG4gIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1ZtKCdxdWlja2pzJyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZW50ZXInLCB7XG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBoYXNQcmVsb2FkZWRFdmVudHM6XG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiYgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDAsXG4gICAgcHJlbG9hZGVkRXZlbnRDb3VudDogcHJlbG9hZGVkRXZlbnRzPy5sZW5ndGggPz8gMCxcbiAgICBoYXNSdW5JbnB1dDogISFydW5JbnB1dCxcbiAgfSk7XG5cbiAgLy8gVGhlIHdvcmtmbG93TmFtZSBmcm9tIHRoZSBxdWV1ZSB0b3BpYyBpcyBhbHJlYWR5IHRoZSBmdWxsIHdvcmtmbG93IElEXG4gIC8vIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIilcbiAgY29uc3Qgd29ya2Zsb3dJZCA9IHdvcmtmbG93TmFtZTtcblxuICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSB1cCBmcm9udDogbmVlZGVkIHRvIGRlY3J5cHQgZXZlbnRcbiAgLy8gcGF5bG9hZHMgaW5zaWRlIHRoZSBWTSBhbmQgdG8gZW5jcnlwdCBldmVudCBwYXlsb2FkcyB3cml0dGVuIGJlbG93LlxuICAvLyBSZXNvbHZlIHRoZSBGVUxMIGNhcGFiaWxpdHkgKHN5bW1ldHJpYyBBRVMga2V5ICsgWDI1NTE5IGtleXBhaXIpLCBub3RcbiAgLy8ganVzdCBgaW1wb3J0S2V5KHJhd0tleSlgOiBhIHJ1biByZWFkaW5nIGl0cyBvd24gZXZlbnQgbG9nIGNhbiBlbmNvdW50ZXJcbiAgLy8gc2VhbGVkIChgZW5jcGApIGhvb2sgcGF5bG9hZHMgdGhhdCBhIGNyb3NzLWRlcGxveW1lbnQgYHJlc3VtZUhvb2soKWBcbiAgLy8gd3JvdGUgdG8gaXQgKHNlYWxpbmcgaXMgcHJlc2VuY2UtZ2F0ZWQgb24gdGhlIHJ1bidzIHB1Ymxpc2hlZFxuICAvLyBlbmNyeXB0aW9uUHVibGljS2V5LCB3aGljaCB0aGUgc2hhcmVkIHN0YXJ0KCkgcGF0aCBzdGFtcHMgcmVnYXJkbGVzcyBvZlxuICAvLyBlbmdpbmUpLiBBIGJhcmUgc3ltbWV0cmljIGtleSBjYW5ub3Qgb3BlbiB0aG9zZSBhbmQgd291bGQgd2VkZ2UgdGhlIHJ1blxuICAvLyByaWdodCBhZnRlciBob29rX3JlY2VpdmVkLiBUaGUgbm9kZTp2bSBlbmdpbmUgcmVzb2x2ZXMgdGhlIHNhbWUgZnVsbFxuICAvLyBjYXBhYmlsaXR5IHZpYSBtZW1vaXplRW5jcnlwdGlvbktleS5cbiAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gTG9hZCB0aGUgRlVMTCBldmVudCBsb2cgZm9yIHRoZSBydW4uIE9uIGZpcnN0IGludm9jYXRpb24gdGhlXG4gIC8vIHByZWxvYWRlZCBldmVudHMgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2UgYXJlIHRoZSBjb21wbGV0ZSBsb2dcbiAgLy8gYW5kIHNhdmUgdGhlIGV2ZW50cy5saXN0IHJvdW5kLXRyaXBzOyBhIGNhbGxlci1hdHRlc3RlZCBjb21wbGV0ZVxuICAvLyBwcmVsb2FkIChsYXp5IGhvb2sgZmFzdCBwYXRoKSBpcyB0cnVzdGVkIHRoZSBzYW1lIHdheS5cbiAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgbGV0IGV2ZW50c0ZldGNoZWRQYWdlcyA9IDA7XG4gIGNvbnN0IHVzZVByZWxvYWRlZCA9XG4gICAgKHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID09PSB0cnVlICYmXG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiZcbiAgICAgIHByZWxvYWRlZEV2ZW50cy5sZW5ndGggPiAwKSB8fFxuICAgIGlzRmlyc3RJbnZvY2F0aW9uKHByZWxvYWRlZEV2ZW50cyk7XG4gIGlmICh1c2VQcmVsb2FkZWQgJiYgcHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcblxuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXZlbnRzRmV0Y2hlZFBhZ2VzKys7XG4gICAgICBhbGxFdmVudHMucHVzaCguLi5yZXNwb25zZS5kYXRhKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseSBmZXRjaGVkIHBhZ2UncyBjdXJzb3IuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIHdlIGdvdCByZXN1bHRzOiB0aGUgZmluYWwgZW1wdHktcGFnZSByZXNwb25zZVxuICAgICAgLy8gcmV0dXJucyBjdXJzb3I9bnVsbCB3aGljaCB3ZSBtdXN0IE5PVCB1c2UgKGl0IHdvdWxkIHJlc2V0IHRoZSBjdXJzb3IpLlxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikge1xuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICB9XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cblxuICAgIGV2ZW50cyA9IGFsbEV2ZW50cztcbiAgfVxuXG4gIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlXG4gIC8vIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nLCB0aGUgc2FtZSBlbmZvcmNlbWVudCBwb2ludCBhcyB0aGUgbm9kZTp2bVxuICAvLyBlbmdpbmUncyByZXBsYXkgbG9vcC5cbiAgaWYgKG1heEV2ZW50c0xpbWl0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnRzLmxlbmd0aCA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKGV2ZW50cy5sZW5ndGgsIG1heEV2ZW50c0xpbWl0KTtcbiAgfVxuXG4gIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTRXZlbnRzUHJlbG9hZGVkKHVzZVByZWxvYWRlZCksXG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNFdmVudHNGZXRjaGVkQ291bnQoZXZlbnRzLmxlbmd0aCksXG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNFdmVudHNGZXRjaGVkUGFnZXMoZXZlbnRzRmV0Y2hlZFBhZ2VzKSxcbiAgfSk7XG5cbiAgd2ZkaWFnKCdldmVudHNfZmV0Y2hlZCcsIHtcbiAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICAgIGV2ZW50c0ZldGNoZWRQYWdlcyxcbiAgICB1c2VQcmVsb2FkZWQsXG4gICAgZXZlbnRUeXBlczogZXZlbnRzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigoYWNjLCBlKSA9PiB7XG4gICAgICBhY2NbZS5ldmVudFR5cGVdID0gKGFjY1tlLmV2ZW50VHlwZV0gPz8gMCkgKyAxO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSksXG4gIH0pO1xuXG4gIC8vIENoZWNrIGZvciBlbGFwc2VkIHdhaXRzXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgIGV2ZW50c1xuICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCAmJlxuICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGV2ZW50LmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBldmVudERhdGEgPVxuICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudFxuICAgICAgICAgID8gKGV2ZW50LmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc3VtZUF0ID0gZXZlbnREYXRhPy5yZXN1bWVBdDtcbiAgICAgIGlmIChyZXN1bWVBdCAmJiBub3cgPj0gbmV3IERhdGUocmVzdW1lQXQgYXMgc3RyaW5nKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQuZXZlbnQpIGV2ZW50cy5wdXNoKHJlc3VsdC5ldmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIGNvbnRpbnVlO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHdvcmtmbG93IHNlcnZlciBwb3J0IHNvIGBnZXRXb3JrZmxvd01ldGFkYXRhKCkudXJsYCBpbnNpZGVcbiAgLy8gdGhlIFZNIG1hdGNoZXMgd2hhdCB0aGUgc3RlcC1zaWRlIGhhbmRsZXIgcmVwb3J0cy4gU2tpcHBlZCBvbiBWZXJjZWw6XG4gIC8vIHRoZSBWTSByZWFkcyBWRVJDRUxfVVJMIGRpcmVjdGx5IGluIHRoYXQgZW52aXJvbm1lbnQuXG4gIGNvbnN0IGlzVmVyY2VsID0gcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBwb3J0ID0gaXNWZXJjZWwgPyB1bmRlZmluZWQgOiBhd2FpdCBnZXRQb3J0TGF6eSgpO1xuXG4gIC8vIFJ1biB0aGUgd29ya2Zsb3cgaW4gdGhlIFF1aWNrSlMgVk1cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBpbnZva2luZyBWTScsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICB3b3JrZmxvd0lkLFxuICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gIH0pO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzdGFydFF1aWNrSlNXb3JrZmxvdyh7XG4gICAgLy8gUGFzcyB0aGUgU1RSSVBQRUQgYnVuZGxlIHRvIHRoZSBWTSBzbyB0aGUgaW5saW5lIHNvdXJjZSBtYXBcbiAgICAvLyBkb2Vzbid0IGVuZCB1cCBpbiB0aGUgUXVpY2tKUyBoZWFwLiBUaGUgb3JpZ2luYWwgKHVuc3RyaXBwZWQpXG4gICAgLy8gYHdvcmtmbG93Q29kZWAgaXMgc3RpbGwga2VwdCBpbiB0aGlzIGhvc3Qtc2lkZSBzY29wZSBhbmQgaXMgdXNlZFxuICAgIC8vIGJ5IGByZW1hcEVycm9yU3RhY2tgIG9uIHdvcmtmbG93IGZhaWx1cmVzIGJlbG93LlxuICAgIHdvcmtmbG93Q29kZTogd29ya2Zsb3dDb2RlRm9yVk0sXG4gICAgd29ya2Zsb3dJZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBldmVudHMsXG4gICAgd29ybGRDYXBhYmlsaXRpZXM6IHdvcmxkLmNhcGFiaWxpdGllcyxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHBvcnQsXG4gICAgcnVuSW5wdXQsXG4gIH0pO1xuICBsZXQgcmVzdWx0ID0gc2Vzc2lvbi5yZXN1bHQ7XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBWTSByZXR1cm5lZCcsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBjb21wbGV0ZWQ6ICEhcmVzdWx0LmNvbXBsZXRlZCxcbiAgICBzdXNwZW5kZWQ6ICEhcmVzdWx0LnN1c3BlbmRlZCxcbiAgICBmYWlsZWQ6ICEhcmVzdWx0LmZhaWxlZCxcbiAgICBwZW5kaW5nT3BzQ291bnQ6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5sZW5ndGgsXG4gIH0pO1xuXG4gIHdmZGlhZygndm1fcmV0dXJuZWQnLCB7XG4gICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgOiByZXN1bHQuc3VzcGVuZGVkXG4gICAgICAgID8gJ3N1c3BlbmRlZCdcbiAgICAgICAgOiByZXN1bHQuZmFpbGVkXG4gICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgIDogJ3Vua25vd24nLFxuICAgIHBlbmRpbmdPcHNDb3VudDogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lmxlbmd0aCA/PyAwLFxuICAgIHBlbmRpbmdPcFN1bW1hcnk6IHJlc3VsdC5zdXNwZW5kZWQ/LnBlbmRpbmdPcGVyYXRpb25zPy5tYXAoKHApID0+ICh7XG4gICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICBoYXNDcmVhdGVkRXZlbnQ6IHAuaGFzQ3JlYXRlZEV2ZW50LFxuICAgICAgLi4uKHAudHlwZSA9PT0gJ3N0ZXAnID8geyBzdGVwSWQ6IChwIGFzIFBlbmRpbmdTdGVwKS5zdGVwSWQgfSA6IHt9KSxcbiAgICB9KSksXG4gICAgZmFpbHVyZU1lc3NhZ2U6IHJlc3VsdC5mYWlsZWQ/Lm1lc3NhZ2UsXG4gICAgZmFpbHVyZU5hbWU6IHJlc3VsdC5mYWlsZWQ/Lm5hbWUsXG4gIH0pO1xuXG4gIC8vIC0tLS0gSW5saW5lIGNvbnRpbnVhdGlvbiBsb29wIC0tLS1cbiAgLy9cbiAgLy8gV2hpbGUgdGhlIHdvcmtmbG93IGlzIHN1c3BlbmRlZCwgdGhpcyBsb29wIGtlZXBzIHRoZSBWTSBhbGl2ZSBhbmRcbiAgLy8gbWFrZXMgYXMgbXVjaCBmb3J3YXJkIHByb2dyZXNzIGFzIHBvc3NpYmxlIHdpdGhpbiBvbmUgaW52b2NhdGlvbjpcbiAgLy9cbiAgLy8gICAxLiBEaXNwYXRjaCBkdXJhYmxlIHNpZGUgZWZmZWN0cyBmb3IgdGhlIHN1c3BlbnNpb24ncyBwZW5kaW5nIG9wc1xuICAvLyAgICAgIChzdGVwX2NyZWF0ZWQgLyBob29rX2NyZWF0ZWQgLyBhdHRyX3NldCAvIHdhaXRfY3JlYXRlZCAvXG4gIC8vICAgICAgaG9va19yZWNlaXZlZCBmb3IgYWJvcnRzKSBhbmQgY29tcGxldGUgZWxhcHNlZCB3YWl0cy5cbiAgLy8gICAyLiBGZWVkIGFsbCBuZXdseSByZWNvcmRlZCBldmVudHMgKGF0dHJfc2V0LCBob29rX2NyZWF0ZWQsIGVsYXBzZWRcbiAgLy8gICAgICB3YWl0X2NvbXBsZXRlZCwgdGVybWluYWxzIHdyaXR0ZW4gYnkgY29uY3VycmVudCBpbnZvY2F0aW9ucywgLi4uKVxuICAvLyAgICAgIGludG8gdGhlIExJVkUgVk0gdmlhIHNlc3Npb24uY29udGludWVXaXRoRXZlbnRzLCByZXN1bWluZ1xuICAvLyAgICAgIGV4ZWN1dGlvbiBleGFjdGx5IHdoZXJlIGl0IGxlZnQgb2ZmLCBubyBmcmVzaC1WTSByZS1yZXBsYXkuXG4gIC8vICAgICAgQ2hlYXAgcHJvZ3Jlc3MgaXMgZmVkIEJFRk9SRSBydW5uaW5nIHN0ZXAgYm9kaWVzIHNvIHByb21pc2VcbiAgLy8gICAgICBjaGFpbnMgdGhhdCBhcmUgbm90IGdhdGVkIG9uIHN0ZXBzIChob29rLmdldENvbmZsaWN0KCksXG4gIC8vICAgICAgc2V0QXR0cmlidXRlcygpLCByYWNpbmcgc2xlZXBzKSBhZHZhbmNlIGZpcnN0IGFuZCBjYW4gc3VyZmFjZVxuICAvLyAgICAgIGFkZGl0aW9uYWwgcGVuZGluZyBzdGVwcyBmb3IgdGhlIHNhbWUgaW5saW5lIGJhdGNoLlxuICAvLyAgIDMuIE9uY2Ugbm8gY2hlYXAgcHJvZ3Jlc3MgcmVtYWlucywgZXhlY3V0ZSB1cCB0b1xuICAvLyAgICAgIGdldE1heElubGluZVN0ZXBzKCkgc3RlcHMgY3JlYXRlZCBieSBUSElTIGludm9jYXRpb24gaW5saW5lIChub1xuICAvLyAgICAgIHF1ZXVlIHJvdW5kLXRyaXApLCBpbiBwYXJhbGxlbCwgd2l0aCB0aGUgcmVwbGF5IGJ1ZGdldCBwYXVzZWRcbiAgLy8gICAgICBkdXJpbmcgc3RlcCBib2RpZXMsIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBpbmxpbmVcbiAgLy8gICAgICByZXBsYXkgbG9vcC4gT3ZlcmZsb3cgYW5kIHJldHJ5L3Rocm90dGxlZCBzdGVwcyBhcmUgcXVldWVkIGZvclxuICAvLyAgICAgIGJhY2tncm91bmQgZXhlY3V0aW9uLiBBIGRlbGF5ZWQgd2FpdC1jb250aW51YXRpb24gbWVzc2FnZSBpc1xuICAvLyAgICAgIGVucXVldWVkIGZvciB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgZmlyc3QsIHNvIHJhY2luZyB0aW1lcnNcbiAgLy8gICAgICBmaXJlIG9uIHRpbWUgKGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbikgd2hpbGUgc3RlcCBib2RpZXMgYmxvY2tcbiAgLy8gICAgICB0aGlzIG9uZS5cbiAgLy9cbiAgLy8gVGhlIGxvb3AgZXhpdHMgd2hlbiB0aGUgd29ya2Zsb3cgc2V0dGxlcywgbm8gZm9yd2FyZCBwcm9ncmVzcyBpc1xuICAvLyBwb3NzaWJsZSBpbi1wcm9jZXNzLCB0aGUgcmVwbGF5IGJ1ZGdldCBpcyBleGhhdXN0ZWQsIG9yIHRoZSBydW4gaXNcbiAgLy8gZ29uZS5cbiAgY29uc3Qgc2VlbkV2ZW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5ldmVudElkKSBzZWVuRXZlbnRJZHMuYWRkKGUuZXZlbnRJZCk7XG4gIH1cbiAgLy8gU3RlcCBjaWRzIGFscmVhZHkgZXhlY3V0ZWQgaW5saW5lIGJ5IHRoaXMgaW52b2NhdGlvbi5cbiAgY29uc3QgZXhlY3V0ZWRTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIFN0ZXBzIGZvciB3aGljaCBUSElTIGludm9jYXRpb24gYWxyZWFkeSBzZW50IGEgcXVldWUgbWVzc2FnZS5cbiAgY29uc3QgcXVldWVkU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBBYm9ydHMgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgcmVjb3JkZWQgKGhvb2tfcmVjZWl2ZWQgd3JpdHRlbikuXG4gIC8vIEd1YXJkcyBhZ2FpbnN0IHJlLXJlY29yZGluZyB3aGVuIHRoZSBWTS1zaWRlIGZsYWcgaGFzIG5vdCBiZWVuXG4gIC8vIGNsZWFyZWQgeWV0IHdpdGhpbiB0aGUgc2FtZSBpdGVyYXRpb24uXG4gIGNvbnN0IHJlY29yZGVkQWJvcnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gV2FpdHMgZm9yIHdoaWNoIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IGNvbXBsZXRlZC9zY2hlZHVsZWQgd29yay5cbiAgY29uc3QgY29tcGxldGVkV2FpdElkczIgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gSW5saW5lLW93bmVyc2hpcCBzdGF0ZSBwZXIgc3RlcCBjb3JyZWxhdGlvbklkLCBkZXJpdmVkIGZyb20gZXZlcnlcbiAgLy8gZXZlbnQgdGhpcyBpbnZvY2F0aW9uIG9ic2VydmVzIChpbml0aWFsIGxvZyArIGV2ZXJ5IGZlZWQpOiB0aGVcbiAgLy8gcXVpY2tqcyBhbmFsb2cgb2YgdGhlIHJlcGxheS1kZXJpdmVkIG93bmVyc2hpcCBvbiB0aGUgbm9kZSBlbmdpbmUnc1xuICAvLyBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSAoc2VlIHN0ZXAtb3duZXJzaGlwLnRzKS4gTGF0ZXN0LXdpbnM6XG4gIC8vIGV2ZW50cyBhcnJpdmUgaW4gbG9nIG9yZGVyLCBzbyBhIGxhdGVyIHN0ZXBfc3RhcnRlZCBvdmVyd3JpdGVzIHRoZVxuICAvLyBzdGFtcDsgYSBzdGVwX3JldHJ5aW5nIGxhcHNlcyBvd25lcnNoaXAgcGVybWFuZW50bHkgZm9yIHRoZSBpZC5cbiAgY29uc3Qgc3RlcE93bmVyc2hpcCA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgb3duZXI/OiBzdHJpbmc7IHN0YXJ0ZWRBdE1zPzogbnVtYmVyOyBzYXdSZXRyeWluZzogYm9vbGVhbiB9XG4gID4oKTtcbiAgY29uc3Qgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcCA9IChvYnNlcnZlZDogRXZlbnRbXSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgZSBvZiBvYnNlcnZlZCkge1xuICAgICAgaWYgKGUuY29ycmVsYXRpb25JZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgICAgY29uc3Qgb3duZXIgPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGUgJiZcbiAgICAgICAgICBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAgICdvd25lck1lc3NhZ2VJZCcgaW4gZS5ldmVudERhdGEgJiZcbiAgICAgICAgICB0eXBlb2YgZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGUuZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcHJpb3IgPSBzdGVwT3duZXJzaGlwLmdldChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBzdGVwT3duZXJzaGlwLnNldChlLmNvcnJlbGF0aW9uSWQsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICBzdGFydGVkQXRNczogZS5jcmVhdGVkQXQgPyArbmV3IERhdGUoZS5jcmVhdGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNhd1JldHJ5aW5nOiBwcmlvcj8uc2F3UmV0cnlpbmcgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gc3RlcE93bmVyc2hpcC5nZXQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgc3RlcE93bmVyc2hpcC5zZXQoZS5jb3JyZWxhdGlvbklkLCB7XG4gICAgICAgICAgLi4uKHByaW9yID8/IHt9KSxcbiAgICAgICAgICBzYXdSZXRyeWluZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwKGV2ZW50cyk7XG4gIGNvbnN0IHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG1heElubGluZVN0ZXBzID0gZ2V0TWF4SW5saW5lU3RlcHMoKTtcbiAgY29uc3QgYnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuICBjb25zdCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgID8gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgIDogRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm9vdFJ1bklkID1cbiAgICAod29ya2Zsb3dSdW4uYXR0cmlidXRlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uW1xuICAgICAgUk9PVF9SVU5fSURfQVRUUklCVVRFXG4gICAgXSA/PyBydW5JZDtcbiAgbGV0IGlubGluZVN0ZXBzRXhlY3V0ZWQgPSAwO1xuICBsZXQgcnVuR29uZSA9IGZhbHNlO1xuICAvLyBTZXQgd2hlbiB0aGlzIGludm9jYXRpb24gd3JvdGUgYW4gZXZlbnQgdGhlIHdvcmtmbG93IG11c3QgY29uc3VtZSB0b1xuICAvLyBtYWtlIHByb2dyZXNzIChhdHRyX3NldCwgZ2V0Q29uZmxpY3QtYXdhaXRlZCBob29rX2NyZWF0ZWQpIGFuZCB0aGVcbiAgLy8gbG9vcCBoYXMgbm90IHlldCByZWFkIGl0IGJhY2ssIHNpbmNlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5ncyBjYW5cbiAgLy8gcmV0dXJuIDAgbmV3IGV2ZW50cyByaWdodCBhZnRlciBhIHdyaXRlLiBJZiBpdCBpcyBzdGlsbCBzZXQgd2hlbiB0aGVcbiAgLy8gbG9vcCBleGl0cyBzdXNwZW5kZWQsIHRoZSBlbnRyeXBvaW50IHJlcXVldWVzIGltbWVkaWF0ZWx5IGluc3RlYWQgb2ZcbiAgLy8gZXhpdGluZyBhd2FpdGluZ19leHRlcm5hbCB3aXRoIHRoZSB1bmJsb2NraW5nIGV2ZW50IGFscmVhZHkgd3JpdHRlblxuICAvLyBhbmQgbm90aGluZyBzY2hlZHVsZWQgdG8gcmVhZCBpdC5cbiAgbGV0IHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG5cbiAgLyoqIEZldGNoIGFsbCBldmVudHMgbm90IHlldCBwcm9jZXNzZWQgYnkgdGhlIGxpdmUgVk0gKGxvZyBvcmRlcikuICovXG4gIGNvbnN0IGZldGNoVW5zZWVuRXZlbnRzID0gYXN5bmMgKCk6IFByb21pc2U8RXZlbnRbXT4gPT4ge1xuICAgIGNvbnN0IHVuc2VlbjogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcbiAgICB3aGlsZSAoaGFzTW9yZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICBjdXJzb3I6IGN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZSBvZiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGlmIChlLmV2ZW50SWQgJiYgc2VlbkV2ZW50SWRzLmhhcyhlLmV2ZW50SWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGUuZXZlbnRJZCkgc2VlbkV2ZW50SWRzLmFkZChlLmV2ZW50SWQpO1xuICAgICAgICB1bnNlZW4ucHVzaChlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5jdXJzb3IpIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvcjtcbiAgICAgIGhhc01vcmUgPSByZXNwb25zZS5kYXRhLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2UuY3Vyc29yICE9IG51bGw7XG4gICAgfVxuICAgIG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAodW5zZWVuKTtcbiAgICByZXR1cm4gdW5zZWVuO1xuICB9O1xuXG4gIHRyeSB7XG4gICAgbGV0IGl0ZXJhdGlvbiA9IDA7XG4gICAgd2hpbGUgKHJlc3VsdC5zdXNwZW5kZWQgJiYgIXJ1bkdvbmUgJiYgIWJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICBpdGVyYXRpb24rKztcbiAgICAgIC8vIFJlLWNoZWNrIHRoZSBldmVudCBjZWlsaW5nIGV2ZXJ5IHR1cm46IHRoZSBsb29wIGFwcGVuZHMgZXZlbnRzIG9uXG4gICAgICAvLyBlYWNoIGNvbnRpbnVlV2l0aEV2ZW50cywgc28gYSBzaW5nbGUgaW52b2NhdGlvbiBjYW4gb3RoZXJ3aXNlIGdyb3dcbiAgICAgIC8vIHRoZSBsb2cgYXJiaXRyYXJpbHkgZmFyIHBhc3QgdGhlIG9wZXJhdG9yJ3MgbGltaXQgKHRoZSBub2RlIGVuZ2luZVxuICAgICAgLy8gcmUtY2hlY2tzIHBlciByZXBsYXkgZm9yIHRoZSBzYW1lIHJlYXNvbikuIGBzZWVuRXZlbnRJZHNgIGNvdW50c1xuICAgICAgLy8gZXZlcnkgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGhhcyBvYnNlcnZlZDogaW5pdGlhbCBsb2cgKyBhbGxcbiAgICAgIC8vIGZlZWRzLlxuICAgICAgaWYgKG1heEV2ZW50c0xpbWl0ICE9PSB1bmRlZmluZWQgJiYgc2VlbkV2ZW50SWRzLnNpemUgPj0gbWF4RXZlbnRzTGltaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3Ioc2VlbkV2ZW50SWRzLnNpemUsIG1heEV2ZW50c0xpbWl0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBlbmRpbmdPcGVyYXRpb25zID0gcmVzdWx0LnN1c3BlbmRlZC5wZW5kaW5nT3BlcmF0aW9ucztcblxuICAgICAgLy8gU2VsZWN0IHRoaXMgdHVybidzIGlubGluZSBjYW5kaWRhdGVzIEJFRk9SRSBkaXNwYXRjaDogZnJlc2ggc3RlcHNcbiAgICAgIC8vIChubyBzdGVwX2NyZWF0ZWQgeWV0KSB0aGF0IHRoaXMgaW52b2NhdGlvbiBoYXNuJ3QgYWxyZWFkeSBoYW5kbGVkLlxuICAgICAgLy8gVGhlaXIgc3RlcF9jcmVhdGVkIGlzIGRlbGliZXJhdGVseSBOT1Qgd3JpdHRlbiBieSBkaXNwYXRjaDogdGhlXG4gICAgICAvLyBpbmxpbmUgY2xhaW0gYmVsb3cgaXMgYSBsYXp5IHN0ZXBfc3RhcnRlZCBjYXJyeWluZyB0aGUgaW5wdXQsXG4gICAgICAvLyB3aGljaCB0aGUgd29ybGQgYXBwbGllcyBhcyBhbiBhdG9taWMgY3JlYXRlLWNsYWltLiBBIGNvbmN1cnJlbnRcbiAgICAgIC8vIGludm9jYXRpb24gcmFjaW5nIG9uIHRoZSBzYW1lIGZyZXNoIHN0ZXAgbG9zZXMgdGhhdCBjbGFpbSB3aXRoXG4gICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIGFuZCBza2lwcywgc28gc3RlcCBib2RpZXMgY2Fubm90IGRvdWJsZS1ydW5cbiAgICAgIC8vIChwcmV2aW91c2x5IGJvdGggaW52b2NhdGlvbnMgYmFyZS1zdGFydGVkIHRoZSBzdGVwIGFmdGVyIG9uZSBsb3N0XG4gICAgICAvLyB0aGUgc3dhbGxvd2VkIHN0ZXBfY3JlYXRlZCByYWNlKS5cbiAgICAgIGNvbnN0IGZyZXNoU3RlcHMgPSBwZW5kaW5nT3BlcmF0aW9ucy5maWx0ZXIoXG4gICAgICAgIChvcCk6IG9wIGlzIFBlbmRpbmdTdGVwID0+XG4gICAgICAgICAgb3AudHlwZSA9PT0gJ3N0ZXAnICYmXG4gICAgICAgICAgIW9wLmhhc0NyZWF0ZWRFdmVudCAmJlxuICAgICAgICAgICFleGVjdXRlZFN0ZXBJZHMuaGFzKG9wLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgIXF1ZXVlZFN0ZXBJZHMuaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgd2hvc2UgaW5wdXQgcmVmdXNlZCB0byBzZXJpYWxpemUgKHNlZVxuICAgICAgLy8gUGVuZGluZ1N0ZXAuc2VyaWFsaXphdGlvbkVycm9yKSBuZXZlciBleGVjdXRlOiB0aGV5IG11c3Qgbm90IGJlXG4gICAgICAvLyBpbmxpbmUtY2xhaW1lZCAoYSBsYXp5IHN0ZXBfc3RhcnRlZCB3b3VsZCBuZWVkIHRoZSBpbnB1dCB0aGF0XG4gICAgICAvLyBmYWlsZWQpIG5vciBxdWV1ZWQuIERpc3BhdGNoIGJlbG93IGZpbmFsaXplcyB0aGVtIGFzIHN0ZXBfY3JlYXRlZFxuICAgICAgLy8gKyBzdGVwX2ZhaWxlZCBpbnN0ZWFkOyBvbmx5IGhlYWx0aHkgc3RlcHMgY29tcGV0ZSBmb3IgaW5saW5lXG4gICAgICAvLyBzbG90cyBhbmQgb3ZlcmZsb3cuXG4gICAgICBjb25zdCBoZWFsdGh5U3RlcHMgPSBmcmVzaFN0ZXBzLmZpbHRlcihcbiAgICAgICAgKHN0ZXApID0+ICFzdGVwLnNlcmlhbGl6YXRpb25FcnJvclxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlubGluZUNhbmRpZGF0ZXMgPVxuICAgICAgICBtYXhJbmxpbmVTdGVwcyA8PSAwID8gW10gOiBoZWFsdGh5U3RlcHMuc2xpY2UoMCwgbWF4SW5saW5lU3RlcHMpO1xuICAgICAgY29uc3QgaW5saW5lQ2xhaW1DaWRzID0gbmV3IFNldChcbiAgICAgICAgaW5saW5lQ2FuZGlkYXRlcy5tYXAoKHN0ZXApID0+IHN0ZXAuY29ycmVsYXRpb25JZClcbiAgICAgICk7XG5cbiAgICAgIC8vIDEuIER1cmFibGUgc2lkZSBlZmZlY3RzIGZvciB0aGlzIHN1c3BlbnNpb24ncyBwZW5kaW5nIG9wcy5cbiAgICAgIGNvbnN0IG9wc1RvRGlzcGF0Y2ggPSBwZW5kaW5nT3BlcmF0aW9ucy5tYXAoKG9wKSA9PlxuICAgICAgICBvcC50eXBlID09PSAnaG9vaycgJiZcbiAgICAgICAgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZCAmJlxuICAgICAgICByZWNvcmRlZEFib3J0SWRzLmhhcyhvcC5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgID8gKHsgLi4ub3AsIGFib3J0UmVxdWVzdGVkOiBmYWxzZSB9IGFzIFBlbmRpbmdPcGVyYXRpb24pXG4gICAgICAgICAgOiBvcFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgPT09ICdob29rJyAmJiAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkKSB7XG4gICAgICAgICAgcmVjb3JkZWRBYm9ydElkcy5hZGQob3AuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN0ZXBzIGJleW9uZCB0aGUgaW5saW5lIGNhcCBhcmUgaGFuZGVkIHRvIHRoZSBxdWV1ZSBpbiB0aGUgc2FtZVxuICAgICAgLy8gdHVybiB0aGVpciBzdGVwX2NyZWF0ZWQgaXMgd3JpdHRlbi4gV2hlcmUgZWxpZ2libGUsIHRoZSBkaXNwYXRjaFxuICAgICAgLy8gYmVsb3cgcGFyYWxsZWxpemVzIGVhY2ggb3ZlcmZsb3cgc3RlcCdzIHN0ZXBfY3JlYXRlZCB3cml0ZSB3aXRoXG4gICAgICAvLyBpdHMgcXVldWUgcHVibGlzaCAocmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IHRoZSBtZXNzYWdlIGNhcnJpZXNcbiAgICAgIC8vIGBzdGVwSW5wdXRgIHNvIHRoZSBjb25zdW1lciBjYW4gcmUtZW5zdXJlIHRoZSBldmVudCk7IHRoZSByZXN0XG4gICAgICAvLyBhcmUgcXVldWVkIHJpZ2h0IGFmdGVyLCBpbiBwYXJhbGxlbC4gVGhpcyBtdXN0IGFsbCBoYXBwZW4gQkVGT1JFXG4gICAgICAvLyB0aGUgZXZlbnQgZmVlZCBiZWxvdzogdGhlIGZlZWQgYWx3YXlzIG9ic2VydmVzIHRob3NlXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGVzIGFzIHVuc2VlbiBldmVudHMgYW5kIGBjb250aW51ZWBzLCBzbyBhXG4gICAgICAvLyBoYW5kb2ZmIHBsYWNlZCBhZnRlciBpdCBpcyB1bnJlYWNoYWJsZSBvbiB0aGUgb25seSBpdGVyYXRpb25cbiAgICAgIC8vIHRoYXQgc3RpbGwgY2xhc3NpZmllcyB0aGVzZSBzdGVwcyBhcyBmcmVzaDogbmV4dCB0dXJuIHRoZXkgY2FycnlcbiAgICAgIC8vIGhhc0NyZWF0ZWRFdmVudCBhbmQgd291bGQgbmV2ZXIgYmUgcXVldWVkIGF0IGFsbCAodGhlIHdlZGdlIGJlaGluZFxuICAgICAgLy8gcHJvbWlzZVJhY2VTdHJlc3NUZXN0V29ya2Zsb3cgaGFuZ2luZyBpbiB0aGUgcXVpY2tqcyBDSSBsZWdzKS4gVGhlXG4gICAgICAvLyBzdGVwLWlkZW50aXR5LXNjb3BlZCBpZGVtcG90ZW5jeSBrZXkgbWFrZXMgcmVwZWF0cyBoYXJtbGVzcy5cbiAgICAgIGNvbnN0IG92ZXJmbG93U3RlcHMgPSBoZWFsdGh5U3RlcHMuc2xpY2UoaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgZGlzcGF0Y2hlZCA9IGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgIHdvcmxkLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IG9wc1RvRGlzcGF0Y2gsXG4gICAgICAgIHNraXBTdGVwQ3JlYXRpb246IGlubGluZUNsYWltQ2lkcyxcbiAgICAgICAgcXVldWVTdGVwQ2lkczogbmV3IFNldChvdmVyZmxvd1N0ZXBzLm1hcCgocykgPT4gcy5jb3JyZWxhdGlvbklkKSksXG4gICAgICAgIGZpbmFsaXplVW5zZXJpYWxpemFibGVTdGVwczogdHJ1ZSxcbiAgICAgICAgd2ZkaWFnLFxuICAgICAgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEF0dHJpYnV0ZUV2ZW50IHx8XG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEdldENvbmZsaWN0SG9va1xuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEEgZmluYWxpemVkIHVuc2VyaWFsaXphYmxlIHN0ZXAgaGFzIHRlcm1pbmFsIGV2ZW50cyBkdXJhYmx5XG4gICAgICAvLyB3cml0dGVuIGJ1dCBubyBleGVjdXRpb24gbWVzc2FnZSBhbnl3aGVyZTogaWYgdGhlIGZlZWQgYmVsb3dcbiAgICAgIC8vIGRvZXNuJ3Qgc3VyZmFjZSB0aGVtIChldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZykgYW5kIHRoZSBsb29wXG4gICAgICAvLyBleGl0cywgbm90aGluZyB3b3VsZCBldmVyIHJlLWludm9rZSB0aGUgcnVuIHRvIG9ic2VydmUgdGhlXG4gICAgICAvLyBmYWlsdXJlLiBSYWlzZSB0aGUgcmVxdWV1ZSBzaWduYWwgKHNhbWUgbWVjaGFuaXNtIGFzIGlubGluZVxuICAgICAgLy8gdGVybWluYWxzKSBhbmQgbWFyayB0aGUgc3RlcHMgaGFuZGxlZCBzbyBsYXRlciB0dXJucyBkb24ndFxuICAgICAgLy8gcmUtZmluYWxpemUgb3IgYmFja3N0b3AtcXVldWUgdGhlbS5cbiAgICAgIGlmIChkaXNwYXRjaGVkLmZhaWxlZFNlcmlhbGl6YXRpb25TdGVwQ2lkcy5zaXplID4gMCkge1xuICAgICAgICBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgY2lkIG9mIGRpc3BhdGNoZWQuZmFpbGVkU2VyaWFsaXphdGlvblN0ZXBDaWRzKSB7XG4gICAgICAgICAgZXhlY3V0ZWRTdGVwSWRzLmFkZChjaWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgY2lkIG9mIGRpc3BhdGNoZWQucXVldWVkU3RlcENpZHMpIHtcbiAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoY2lkKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBvdmVyZmxvd1N0ZXBzXG4gICAgICAgICAgLmZpbHRlcigoc3RlcCkgPT4gIWRpc3BhdGNoZWQucXVldWVkU3RlcENpZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpXG4gICAgICAgICAgLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0cyBzbyB0aGVpciB3YWl0X2NvbXBsZXRlZCBldmVudHMgYXJlIHBpY2tlZFxuICAgICAgLy8gdXAgYnkgdGhlIGZlZWQgYmVsb3cgKGluc3RlYWQgb2YgYSBxdWV1ZSByZS1pbnZvY2F0aW9uKS5cbiAgICAgIGNvbnN0IHdhaXRDb21wbGV0ZVByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgICAgaWYgKGNvbXBsZXRlZFdhaXRJZHMyLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5ldyBEYXRlKHdhaXQucmVzdW1lQXQpLmdldFRpbWUoKSAtIERhdGUubm93KCkgPiAwKSBjb250aW51ZTtcbiAgICAgICAgY29tcGxldGVkV2FpdElkczIuYWRkKHdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHdhaXRDb21wbGV0ZVByb21pc2VzLnB1c2goXG4gICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHdhaXRDb21wbGV0ZVByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdENvbXBsZXRlUHJvbWlzZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBDaGVhcCBwcm9ncmVzcyBmaXJzdDogZmVlZCBuZXdseSByZWNvcmRlZCBldmVudHMgaW50byB0aGUgbGl2ZVxuICAgICAgLy8gVk0gYmVmb3JlIGJsb2NraW5nIG9uIHN0ZXAgYm9kaWVzLlxuICAgICAge1xuICAgICAgICBjb25zdCBuZXdFdmVudHMgPSBhd2FpdCBmZXRjaFVuc2VlbkV2ZW50cygpO1xuICAgICAgICBpZiAobmV3RXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBUaGUgbGlzdGluZyBjYXVnaHQgdXAgd2l0aCB0aGlzIGludm9jYXRpb24ncyB3cml0ZXMsIHNvIGFueVxuICAgICAgICAgIC8vIGF0dHJfc2V0IC8gZ2V0Q29uZmxpY3QgaG9va19jcmVhdGVkIGhhcyBiZWVuIChvciBpcyBiZWluZylcbiAgICAgICAgICAvLyBjb25zdW1lZCBieSB0aGUgbGl2ZSBWTSwgc28gbm8gZXh0ZXJuYWwgcmVxdWV1ZSBpcyBuZWVkZWQuXG4gICAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSBmYWxzZTtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmNvbnRpbnVlV2l0aEV2ZW50cyhuZXdFdmVudHMpO1xuICAgICAgICAgIHdmZGlhZygnaW5saW5lX2l0ZXJhdGlvbicsIHtcbiAgICAgICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgICAgIHBoYXNlOiAnZmVlZCcsXG4gICAgICAgICAgICBmZWRFdmVudHM6IG5ld0V2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBvdXRjb21lOiByZXN1bHQuY29tcGxldGVkXG4gICAgICAgICAgICAgID8gJ2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgOiByZXN1bHQuZmFpbGVkXG4gICAgICAgICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgICAgICAgIDogJ3N1c3BlbmRlZCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gMy4gTm8gY2hlYXAgcHJvZ3Jlc3MgbGVmdCwgc28gZXhlY3V0ZSBzdGVwcyBpbmxpbmUuXG4gICAgICBjb25zdCBzdGVwT3BzID0gcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3ApOiBvcCBpcyBQZW5kaW5nU3RlcCA9PiBvcC50eXBlID09PSAnc3RlcCdcbiAgICAgICk7XG4gICAgICAvLyBTdGVwcyBjcmVhdGVkIGJ5IGFuIEVBUkxJRVIgaW52b2NhdGlvbiAob3IgYW4gZWFybGllciB0dXJuKSB0aGF0XG4gICAgICAvLyBhcmUgc3RpbGwgcGVuZGluZywgd2l0aCBubyB3b3JrIG93bmVkIGJ5IFRISVMgaW52b2NhdGlvbi4gTWlycm9yXG4gICAgICAvLyB0aGUgbm9kZSBlbmdpbmUncyBvd25lcnNoaXAgZGVjaXNpb24gdGFibGUgKHN0ZXAtb3duZXJzaGlwLnRzKSxcbiAgICAgIC8vIE5PVCBhIGRlbGl2ZXJ5QXR0ZW1wdCBnYXRlOiB3b3JsZHMgYWR2YW5jZSB0aGUgYXR0ZW1wdCBjb3VudGVyIG9uXG4gICAgICAvLyByb3V0aW5lIHJlZGVsaXZlcmllcyAod29ybGQtbG9jYWwgY291bnRzIGV2ZXJ5IGhhbmRsZWQgcmVzcG9uc2UpLFxuICAgICAgLy8gc28gYXR0ZW1wdCA+IDEgaXMgdGhlIGNvbW1vbiBjYXNlIGFuZCB3b3VsZCBmaXJlIGJhY2tzdG9wcyBhdFxuICAgICAgLy8gc3RlcHMgYWN0aXZlbHkgZXhlY3V0aW5nIGlubGluZSBpbiBhIGxpdmUgaW52b2NhdGlvbi5cbiAgICAgIC8vXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBBTk9USEVSIG1lc3NhZ2Ug4oaSIHRoZSBzdGVwIGlzXG4gICAgICAvLyAgICAgKHByZXN1bWFibHkpIGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uIEFybSBhXG4gICAgICAvLyAgICAgREVMQVlFRCBiYWNrc3RvcCBmb3IgdGhlIGxlYXNlIHJlbWFpbmRlciwga2V5ZWQgdG8gdGhlXG4gICAgICAvLyAgICAgb3duZXJzaGlwIGVwb2NoIChhIHJlZnJlc2hlZCBsZWFzZSByZS1hcm1zIGEgZnJlc2ggYmFja3N0b3BcbiAgICAgIC8vICAgICBpbnN0ZWFkIG9mIGRlZHVwaW5nIGFnYWluc3QgdGhlIGluLWZsaWdodCBvbmUpLiBJZiB0aGUgb3duZXJcbiAgICAgIC8vICAgICBjb21wbGV0ZXMgbm9ybWFsbHksIHRoZSBiYWNrc3RvcCBkZWxpdmVyeSByZXNvbHZlcyB0aGUgc3RlcFxuICAgICAgLy8gICAgIGFzICdza2lwcGVkJy5cbiAgICAgIC8vICAgLSBPd25lcnNoaXAgbGVhc2UgQUNUSVZFLCBoZWxkIGJ5IFRISVMgbWVzc2FnZSDihpIgdGhpcyBkZWxpdmVyeVxuICAgICAgLy8gICAgIGlzIHRoZSBvd25lcidzIHJlZGVsaXZlcnk7IHRoZSBjbGFpbWFudCBjcmFzaGVkXG4gICAgICAvLyAgICAgbWlkLWV4ZWN1dGlvbi4gRGlzcGF0Y2ggaW1tZWRpYXRlbHkgZm9yIGJhY2tncm91bmQgcmVjb3ZlcnkuXG4gICAgICAvLyAgIC0gTm8gc3RhbXAgLyBsZWFzZSBFWFBJUkVEIC8gc3RlcF9yZXRyeWluZyBvYnNlcnZlZCDihpIgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBpcyBxdWV1ZS1vd25lZCBvciBvcnBoYW5lZC4gRGlzcGF0Y2ggaW1tZWRpYXRlbHk7IHRoZVxuICAgICAgLy8gICAgIHN0ZXAtaWRlbnRpdHktc2NvcGVkIGlkZW1wb3RlbmN5IGtleSBkZWR1cGVzIGFnYWluc3QgdGhlXG4gICAgICAvLyAgICAgb3JpZ2luYWwgaGFuZG9mZi5cbiAgICAgIGNvbnN0IG5vd01zID0gRGF0ZS5ub3coKTtcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwT3BzKSB7XG4gICAgICAgIGlmICghc3RlcC5oYXNDcmVhdGVkRXZlbnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoZXhlY3V0ZWRTdGVwSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHF1ZXVlZFN0ZXBJZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvd25lcnNoaXAgPSBzdGVwT3duZXJzaGlwLmdldChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBjb25zdCBvd25lcnNoaXBBY3RpdmUgPVxuICAgICAgICAgIG93bmVyc2hpcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgb3duZXJzaGlwLm93bmVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAhb3duZXJzaGlwLnNhd1JldHJ5aW5nO1xuICAgICAgICBsZXQgbGVhc2VSZW1haW5pbmdTZWNvbmRzID0gMDtcbiAgICAgICAgaWYgKG93bmVyc2hpcEFjdGl2ZSAmJiBvd25lcnNoaXAuc3RhcnRlZEF0TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGxlYXNlU2Vjb25kcyA9IGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcygpO1xuICAgICAgICAgIGxlYXNlUmVtYWluaW5nU2Vjb25kcyA9IE1hdGgubWluKFxuICAgICAgICAgICAgbGVhc2VTZWNvbmRzLFxuICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICAgICAgICAob3duZXJzaGlwLnN0YXJ0ZWRBdE1zICsgbGVhc2VTZWNvbmRzICogMTAwMCAtIG5vd01zKSAvIDEwMDBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG93bmVyc2hpcEFjdGl2ZSAmJlxuICAgICAgICAgIG93bmVyc2hpcC5vd25lciAhPT0gb3duZXJNZXNzYWdlSWQgJiZcbiAgICAgICAgICBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHF1ZXVlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBsZWFzZVJlbWFpbmluZ1NlY29uZHMsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgcHVycG9zZTogYGJhY2tzdG9wOiR7b3duZXJzaGlwLnN0YXJ0ZWRBdE1zfWAsXG4gICAgICAgICAgICB3ZmRpYWcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBhd2FpdCBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgcHVycG9zZTogJ2Rpc3BhdGNoJyxcbiAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gTm8gaW4tcHJvY2VzcyBwcm9ncmVzcyBwb3NzaWJsZTogdGhlIHJ1biBhd2FpdHMgYW4gZXh0ZXJuYWxcbiAgICAgICAgLy8gc3RpbXVsdXMgKGhvb2sgcGF5bG9hZCwgcXVldWVkIHN0ZXAsIHdhaXQgdGltZXIpLlxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gUmFjaW5nIHRpbWVycyBtdXN0IGZpcmUgb24gdGltZSB3aGlsZSBzdGVwIGJvZGllcyBibG9jayB0aGlzXG4gICAgICAvLyBpbnZvY2F0aW9uOiBlbnF1ZXVlIGEgZGVsYXllZCBjb250aW51YXRpb24gZm9yIHRoZSBzb29uZXN0XG4gICAgICAvLyBwZW5kaW5nIHdhaXQgKGEgc2VwYXJhdGUgaW52b2NhdGlvbiB3cml0ZXMgaXRzIHdhaXRfY29tcGxldGVkIGF0XG4gICAgICAvLyB0aGUgcmlnaHQgbG9nIHBvc2l0aW9uLCB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAgIC8vIHdhaXQtY29udGludWF0aW9uIGRpc3BhdGNoKS5cbiAgICAgIGxldCBzb29uZXN0V2FpdDogeyBjb3JyZWxhdGlvbklkOiBzdHJpbmc7IHNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgICBpZiAoc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICAvLyBXYWl0cyB3aG9zZSB3YWl0X2NvbXBsZXRlZCBUSElTIGludm9jYXRpb24gYWxyZWFkeSB3cm90ZSAodGhlXG4gICAgICAgIC8vIGVsYXBzZWQtd2FpdCBwYXNzIGFib3ZlKSBhcmUgZG9uZTogdGhlIGV2ZW50IGp1c3QgaGFzbid0IGZlZFxuICAgICAgICAvLyBiYWNrIGludG8gdGhlIFZNIHlldC4gTm8gY29udGludWF0aW9uIG5lZWRlZC5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdhaXRJZHMyLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBBbiBhbHJlYWR5LWVsYXBzZWQgd2FpdCBNVVNUIHN0aWxsIGdldCBhIGNvbnRpbnVhdGlvbiAoY2xhbXBlZFxuICAgICAgICAvLyB0byB0aGUgMXMgbWluaW11bSwgZXhhY3RseSBsaWtlIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIGBNYXRoLm1heCgxMDAwLCByZXN1bWVBdE1zIC0gbm93KWApLCBub3QgYmUgc2tpcHBlZDogYSB3YWl0XG4gICAgICAgIC8vIHdob3NlIGRlYWRsaW5lIGZhbGxzIGJldHdlZW4gdGhpcyBpdGVyYXRpb24ncyBlbGFwc2VkLXdhaXRcbiAgICAgICAgLy8gcGFzcyAod2hpY2ggc2F3IGl0IGFzIHN0aWxsIHBlbmRpbmcgYW5kIHdyb3RlIG5vdGhpbmcpIGFuZFxuICAgICAgICAvLyB0aGlzIHN3ZWVwIHdvdWxkIG90aGVyd2lzZSBnZXQgTkVJVEhFUiBhIHdhaXRfY29tcGxldGVkIE5PUiBhXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiwgYW5kIHRoZSBpbmxpbmUgYmF0Y2ggYmVsb3cgdGhlbiBibG9ja3MgdGhpc1xuICAgICAgICAvLyBpbnZvY2F0aW9uIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uIHdpdGggbm8gd2FrZSBhcm1lZFxuICAgICAgICAvLyBhbnl3aGVyZS4gRm9yIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCB0aGF0IHNpbGVudGx5IGhhbmRzXG4gICAgICAgIC8vIHRoZSByYWNlIHRvIHRoZSBzdGVwOiB0aGUgc2xlZXAncyB3YWl0X2NvbXBsZXRlZCBpcyBuZXZlclxuICAgICAgICAvLyB3cml0dGVuIGFuZCB0aGUgcnVuIGNvbXBsZXRlcyB3aXRoIHRoZSB3cm9uZyB3aW5uZXIuIFRoZVxuICAgICAgICAvLyB3aW5kb3cgYmV0d2VlbiB0aGUgdHdvIGNoZWNrcyBzcGFucyB0aGlzIGl0ZXJhdGlvbidzIGRpc3BhdGNoXG4gICAgICAgIC8vICsgZmVlZCByb3VuZC10cmlwcywgc28gb24gbmV0d29yay1iYWNrZWQgd29ybGRzICh3b3JsZC12ZXJjZWwpXG4gICAgICAgIC8vIGEgc2hvcnQgc2xlZXAgbGFuZHMgaW4gaXQgcm91dGluZWx5LCBvYnNlcnZlZCBhcyBhIH41MCVcbiAgICAgICAgLy8gc2xlZXBXaW5zUmFjZVdvcmtmbG93IGZhaWx1cmUgcmF0ZSBpbiB0aGUgVmVyY2VsIGUyZSBsZWdzLFxuICAgICAgICAvLyB3aGlsZSB3b3JsZC1sb2NhbCdzIHN1Yi1tcyByb3VuZC10cmlwcyBtYXNrZWQgaXQgbG9jYWxseS4gVGhlXG4gICAgICAgIC8vIGNvbnRpbnVhdGlvbiBpbnZvY2F0aW9uJ3MgcHJlLVZNIGVsYXBzZWQgY2hlY2sgd3JpdGVzIHRoZVxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCB+MXMgbGF0ZXIuXG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgc2Vjb25kcyA8IHNvb25lc3RXYWl0LnNlY29uZHMpIHtcbiAgICAgICAgICBzb29uZXN0V2FpdCA9IHsgY29ycmVsYXRpb25JZDogd2FpdC5jb3JyZWxhdGlvbklkLCBzZWNvbmRzIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGF0dGVtcHQgPSBuZXh0V2FpdENvbnRpbnVhdGlvbkF0dGVtcHQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgd2FpdENvbnRpbnVhdGlvbjoge1xuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGF0dGVtcHRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHdmZGlhZygnd2FpdF9jb250aW51YXRpb25fc2NoZWR1bGVkJywge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZGVsYXlTZWNvbmRzOiBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgYmF0Y2ggaW4gcGFyYWxsZWwuIFRoZSByZXBsYXkgYnVkZ2V0IGlzXG4gICAgICAvLyBwYXVzZWQgd2hpbGUgc3RlcCBib2RpZXMgcnVuOiBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlXG4gICAgICAvLyBwbGF0Zm9ybSBmdW5jdGlvbiBkdXJhdGlvbiwgbm90IHRoZSByZXBsYXkgdGltZW91dC4gTk9URSAoYnlcbiAgICAgIC8vIGRlc2lnbik6IHdpdGggdGhlIGJ1ZGdldCBwYXJrZWQgcGVyIGJhdGNoLCB0aGUgb25seSBib3VuZCBvbiBob3dcbiAgICAgIC8vIG1hbnkgaW5saW5lIHN0ZXBzIG9uZSBpbnZvY2F0aW9uIGNhbiBjaGFpbiBpcyB0aGUgcGxhdGZvcm0nc1xuICAgICAgLy8gZnVuY3Rpb24gdGltZW91dDogdGhlIFNESyBkZWxpYmVyYXRlbHkgaW1wb3NlcyBubyBjYXAgb2YgaXRzXG4gICAgICAvLyBvd24sIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hlcmUgYSBsb25nIHNlcXVlbnRpYWxcbiAgICAgIC8vIHdvcmtmbG93IGxpa2V3aXNlIHJ1bnMgc3RlcC1ieS1zdGVwIHVudGlsIHRoZSBwbGF0Zm9ybSByZWNsYWltc1xuICAgICAgLy8gdGhlIGludm9jYXRpb24gYW5kIGEgcmVkZWxpdmVyeSByZXN1bWVzIGZyb20gdGhlIGxvZy5cbiAgICAgIGJ1ZGdldC5wYXVzZSgpO1xuICAgICAgbGV0IG91dGNvbWVzOiBTdGVwRXhlY3V0aW9uUmVzdWx0W107XG4gICAgICB0cnkge1xuICAgICAgICBvdXRjb21lcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGlubGluZUNhbmRpZGF0ZXMubWFwKChzdGVwKSA9PlxuICAgICAgICAgICAgcnVuU3RlcFNpbmdsZUZsaWdodChydW5JZCwgc3RlcC5jb3JyZWxhdGlvbklkLCAoKSA9PlxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT5cbiAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICByb290UnVuSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAvLyBMYXp5IGlubGluZSBjbGFpbTogc3RlcF9jcmVhdGVkIGlzIGRlZmVycmVkIChkaXNwYXRjaFxuICAgICAgICAgICAgICAgICAgLy8gc2tpcHBlZCBpdCkgYW5kIHRoaXMgc3RlcF9zdGFydGVkIGNhcnJpZXMgdGhlIGlucHV0LFxuICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlIHN0ZXAgYXRvbWljYWxseTpcbiAgICAgICAgICAgICAgICAgIC8vIGV4YWN0bHktb25lLW93bmVyLiBBIGNvbmN1cnJlbnQgY2xhaW1hbnQgZ2V0c1xuICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciDihpIgeyB0eXBlOiAnc2tpcHBlZCcgfSBhbmQgbmV2ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIGJvZHkuIE1pcnJvcnMgdGhlIG5vZGUgZW5naW5lJ3MgaW5saW5lIHBhdGguXG4gICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAvLyBPd25lcnNoaXAgc3RhbXA6IHdha2UgcmVwbGF5cyBzZWUgdGhlIGJvZHkgYXMgaW5cbiAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCBpbiB0aGlzIGludm9jYXRpb24gYW5kIGFybSBhIGRlbGF5ZWQgYmFja3N0b3BcbiAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgLy8gQSBsYXp5IHN0ZXAgaXMgYnJhbmQtbmV3IGJ5IGNvbnN0cnVjdGlvbjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQuXG4gICAgICAgICAgICAgICAgICBhdXRob3JpdGF0aXZlQXR0ZW1wdDogMSxcbiAgICAgICAgICAgICAgICB9KSkoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgIH1cbiAgICAgIGlubGluZVN0ZXBzRXhlY3V0ZWQgKz0gaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzdGVwID0gaW5saW5lQ2FuZGlkYXRlc1tpXTtcbiAgICAgICAgY29uc3Qgb3V0Y29tZSA9IG91dGNvbWVzW2ldO1xuICAgICAgICBleGVjdXRlZFN0ZXBJZHMuYWRkKHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGlmIChvdXRjb21lLnR5cGUgPT09ICdyZXRyeScgfHwgb3V0Y29tZS50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgIC8vIEhhbmQgdGhlIHN0ZXAgdG8gdGhlIHF1ZXVlIHdpdGggdGhlIHJlcXVlc3RlZCBiYWNrb2ZmOlxuICAgICAgICAgIC8vIGJhY2tncm91bmQgZGVsaXZlcnkgZHJpdmVzIHRoZSByZXRyeSBmcm9tIGhlcmUuXG4gICAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBhd2FpdCBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICBkZWxheVNlY29uZHM6IG91dGNvbWUudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLy8gU3VmZml4ZWQga2V5OiB0aGlzIHN0ZXAgd2FzIGlubGluZS1jbGFpbWVkLCBzbyBubyBkaXNwYXRjaFxuICAgICAgICAgICAgLy8gcHVibGlzaCBleGlzdHMgdW5kZXIgdGhlIGRpc3BhdGNoIGtleSwgYnV0IHN1ZmZpeGluZ1xuICAgICAgICAgICAgLy8ga2VlcHMgdGhlIHJldHJ5IGVucXVldWVhYmxlIGV2ZW4gaWYgYSB3b3JsZCByZXRpcmVkIGFcbiAgICAgICAgICAgIC8vIGhpc3RvcmljYWwga2V5IGZvciB0aGlzIHN0ZXAgKHNlZSB0aGUgcHVycG9zZSBkb2NzIGFib3ZlKS5cbiAgICAgICAgICAgIHB1cnBvc2U6ICdyZXRyeToxJyxcbiAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRjb21lLnR5cGUgPT09ICdnb25lJykge1xuICAgICAgICAgIHJ1bkdvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vICdza2lwcGVkJzogYSBjb25jdXJyZW50IGludm9jYXRpb24gd29uIHRoZSBsYXp5IGNyZWF0ZS1jbGFpbSBhbmRcbiAgICAgICAgLy8gb3ducyB0aGUgYm9keS4gTWFya2VkIGV4ZWN1dGVkIGFib3ZlIHNvIHRoaXMgaW52b2NhdGlvbiBuZXZlclxuICAgICAgICAvLyByZS1jbGFpbXMgaXQ7IHRoZSB3aW5uZXIncyB0ZXJtaW5hbCBldmVudHMgYXJyaXZlIHZpYSB0aGUgZmVlZFxuICAgICAgICAvLyAob3IgZHJpdmUgYSBzZXBhcmF0ZSBpbnZvY2F0aW9uKS5cbiAgICAgIH1cbiAgICAgIHdmZGlhZygnaW5saW5lX3N0ZXBzX2V4ZWN1dGVkJywge1xuICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgIGNvdW50OiBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aCxcbiAgICAgICAgb3V0Y29tZXM6IG91dGNvbWVzLm1hcCgobykgPT4gby50eXBlKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGZWVkIHRoZSBpbmxpbmUgYmF0Y2gncyB0ZXJtaW5hbCBldmVudHMgaW50byB0aGUgbGl2ZSBWTS4gV2hlblxuICAgICAgLy8gdGhlIGV2ZW50dWFsbHktY29uc2lzdGVudCBsaXN0aW5nIGhhcyBub3Qgc3VyZmFjZWQgdGhlbSB5ZXQsXG4gICAgICAvLyBleGl0aW5nIG11c3QgTk9UIGFjayBzaWxlbnRseTogdGhlIHRlcm1pbmFscyB0aGlzIGludm9jYXRpb24ganVzdFxuICAgICAgLy8gY2F1c2VkIGFyZSBkdXJhYmx5IHdyaXR0ZW4gd2l0aCBubyBxdWV1ZSBtZXNzYWdlIGxlZnQgdG8gY29uc3VtZVxuICAgICAgLy8gdGhlbSAoaW5saW5lIHN0ZXBzIGhhdmUgbm9uZSksIHNvIGFuIGF3YWl0aW5nX2V4dGVybmFsIGV4aXQgd291bGRcbiAgICAgIC8vIHBhcmsgdGhlIHJ1biAncnVubmluZycgd2l0aCBhbGwgaXRzIHN0ZXBzIGNvbXBsZXRlLiBSYWlzZSB0aGVcbiAgICAgIC8vIHJlcXVldWUgc2lnbmFsIHNvIHRoZSBzdXNwZW5kZWQgZXhpdCBzY2hlZHVsZXMgYSBmcmVzaCBpbW1lZGlhdGVcbiAgICAgIC8vIGludm9jYXRpb24gd2hvc2UgZnJlc2ggcmVhZCBwaWNrcyB0aGUgdGVybWluYWxzIHVwLiBPdXRjb21lcyB0aGF0XG4gICAgICAvLyB3cm90ZSBubyB0ZXJtaW5hbCAoJ3NraXBwZWQnOiBhIGNvbmN1cnJlbnQgY2xhaW1hbnQgb3ducyB0aGVcbiAgICAgIC8vIGJvZHk7ICdnb25lJywgcmV0cnkvdGhyb3R0bGVkOiBhIHF1ZXVlIG1lc3NhZ2UgZXhpc3RzKSBkb24ndFxuICAgICAgLy8gbmVlZCBpdCwgYnV0IHNpZ25hbGluZyBvbiB0aGVtIHRvbyBvbmx5IGNvc3RzIGEgbm8tb3AgaW52b2NhdGlvblxuICAgICAgLy8gaW4gYW4gYWxyZWFkeS1yYXJlIGxhZyB3aW5kb3cuXG4gICAgICBjb25zdCBuZXdFdmVudHMgPSBhd2FpdCBmZXRjaFVuc2VlbkV2ZW50cygpO1xuICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGVuZGluZ1JlcXVldWVTaWduYWwgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHNlc3Npb24uY29udGludWVXaXRoRXZlbnRzKG5ld0V2ZW50cyk7XG5cbiAgICAgIHdmZGlhZygnaW5saW5lX2l0ZXJhdGlvbicsIHtcbiAgICAgICAgaXRlcmF0aW9uLFxuICAgICAgICBwaGFzZTogJ3N0ZXBzJyxcbiAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICBvdXRjb21lOiByZXN1bHQuY29tcGxldGVkXG4gICAgICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgICAgOiAnc3VzcGVuZGVkJyxcbiAgICAgICAgYnVkZ2V0RXhoYXVzdGVkOiBidWRnZXQuaXNFeGhhdXN0ZWQoKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXNzaW9uLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTSW5saW5lU3RlcHMoaW5saW5lU3RlcHNFeGVjdXRlZCksXG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuY29tcGxldGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgY29tcGxldGVkXG4gICAgcnVudGltZUxvZ2dlci5pbmZvKCdRdWlja0pTIHJ1bnRpbWU6IHdvcmtmbG93IGNvbXBsZXRlZCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIH0pO1xuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdjb21wbGV0ZWQnKSxcbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGxlZnRvdmVyIHBlbmRpbmcgc2lkZSBlZmZlY3RzIChhYm9ydCByZWNvcmRpbmdzLCBzeXN0ZW0taG9va1xuICAgIC8vIGRpc3Bvc2FscywgZmlyZS1hbmQtZm9yZ2V0IGF0dHJpYnV0ZS9ob29rIGV2ZW50cykgQkVGT1JFIHdyaXRpbmdcbiAgICAvLyBydW5fY29tcGxldGVkLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMuXG4gICAgLy8gRHJhaW4gZmFpbHVyZXMgYXJlIHN3YWxsb3dlZDogdGhlIHdvcmtmbG93J3Mgb3duIG91dGNvbWUgaXMgdGhlXG4gICAgLy8gc291cmNlIG9mIHRydXRoLlxuICAgIGlmIChyZXN1bHQuY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IHJlc3VsdC5jb21wbGV0ZWQuZHJhaW5PcGVyYXRpb25zLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdRdWlja0pTIHJ1bnRpbWU6IHRlcm1pbmFsIGRyYWluIGZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBtZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJ1bl9jb21wbGV0ZWQgZXZlbnQuXG4gICAgLy8gVGhlIFZNIHNlcmlhbGl6ZXMgdGhlIHdvcmtmbG93IHJlc3VsdCBhcyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlc1xuICAgIC8vIChcImRldmxcIiArIGRldmFsdWUpIHdpdGggbm8gZW5jcnlwdGlvbiAodGhlIFZNIGhhcyBubyBhY2Nlc3MgdG8gdGhlXG4gICAgLy8gQ3J5cHRvS2V5KS4gSG9zdC1zaWRlIGVuY3J5cHRpb24gaXMgYXBwbGllZCBoZXJlIHNvIHRoYXQgYHJ1bl9jb21wbGV0ZWRgXG4gICAgLy8gZXZlbnRzIGhhdmUgdGhlIHNhbWUgYGVuY3JgLXByZWZpeGVkIHBheWxvYWQgc2hhcGUgdGhhdCB0aGUgbm9kZTp2bVxuICAgIC8vIGVuZ2luZSdzIGBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlYCBwcm9kdWNlcy5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBvdXRwdXQ6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgIHJlc3VsdC5jb21wbGV0ZWQucmVzdWx0LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWQnLCB7IHJlc3VsdDogJ3J1bl9jb21wbGV0ZWRfd3JpdHRlbicgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfY29tcGxldGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHJlc3VsdC5zdXNwZW5kZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBzdGlsbCBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGlubGluZSBsb29wLiBBbGwgZHVyYWJsZSBzaWRlXG4gICAgLy8gZWZmZWN0cyBmb3IgdGhlIGZpbmFsIHN1c3BlbnNpb24gc3RhdGUgd2VyZSBhbHJlYWR5IGRpc3BhdGNoZWQgYnlcbiAgICAvLyB0aGUgbG9vcDsgd2hhdCByZW1haW5zIGlzIGRlY2lkaW5nIGhvdyB0aGUgcnVuIGdldHMgcmUtaW52b2tlZC5cbiAgICBjb25zdCB7IHBlbmRpbmdPcGVyYXRpb25zIH0gPSByZXN1bHQuc3VzcGVuZGVkO1xuXG4gICAgcnVudGltZUxvZ2dlci5pbmZvKCdRdWlja0pTIHJ1bnRpbWU6IHdvcmtmbG93IHN1c3BlbmRlZCcsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgaW5saW5lU3RlcHNFeGVjdXRlZCxcbiAgICAgIHBlbmRpbmdTdGVwczogcGVuZGluZ09wZXJhdGlvbnMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09ICdzdGVwJykubGVuZ3RoLFxuICAgICAgcGVuZGluZ1dhaXRzOiBwZW5kaW5nT3BlcmF0aW9ucy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gJ3dhaXQnKS5sZW5ndGgsXG4gICAgICBwZW5kaW5nT3BzOiBwZW5kaW5nT3BlcmF0aW9ucy5tYXAoKHApID0+ICh7XG4gICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICBoYXNDcmVhdGVkRXZlbnQ6IHAuaGFzQ3JlYXRlZEV2ZW50LFxuICAgICAgICAuLi4ocC50eXBlID09PSAnc3RlcCcgPyB7IHN0ZXBJZDogKHAgYXMgUGVuZGluZ1N0ZXApLnN0ZXBJZCB9IDoge30pLFxuICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU091dGNvbWUoJ3N1c3BlbmRlZCcpLFxuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNQZW5kaW5nT3BzQ291bnQocGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoKSxcbiAgICB9KTtcblxuICAgIGlmIChydW5Hb25lKSB7XG4gICAgICAvLyBUaGUgcnVuIG5vIGxvbmdlciBleGlzdHMgKGV4cGlyZWQgLyBkZWxldGVkKSwgc28gbm90aGluZyB0byBkcml2ZS5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7IGFjdGlvbjogJ3J1bl9nb25lJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeGl0IHJlcXVldWVzIGFyZSBGUkVTSCBtZXNzYWdlcywgbmV2ZXIgYSBgeyB0aW1lb3V0U2Vjb25kcyB9YFxuICAgIC8vIHZpc2liaWxpdHktcmVkZWxpdmVyeSBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiBSZWRlbGl2ZXJpbmcgdGhlXG4gICAgLy8gQ1VSUkVOVCBtZXNzYWdlIGlzIGEgdHJhcDogYSBob29rLXJlc3VtZSBkZWxpdmVyeSBjYXJyaWVzXG4gICAgLy8gYGhvb2tJbnB1dGAsIGFuZCBpdHMgcmVkZWxpdmVyeSByZS1ydW5zIHRoZSBsYXp5LXJlc3VtZSByZS1lbnN1cmVcbiAgICAvLyBpbiB0aGUgaGFuZGxlciBwcm9sb2d1ZTogaWYgdGhlIHdvcmtmbG93IGRpc3Bvc2VkIHRoYXQgaG9va1xuICAgIC8vIGR1cmluZyB0aGlzIGludm9jYXRpb24gKGRpc3Bvc2Ug4oaSIHNsZWVwKSwgYSB3b3JsZCB0aGF0IHJlamVjdHNcbiAgICAvLyB0aGUgcmUtZW5zdXJlIHdvdWxkIGFjayB0aGUgbWVzc2FnZSBhcyBcIm5vdGhpbmcgbGVmdCB0byByZXN1bWVcIlxuICAgIC8vIGFuZCB0aGUgY29udGludWF0aW9uIGl0IGNhcnJpZWQgaXMgc2lsZW50bHkgbG9zdC4gQSBmcmVzaCBtZXNzYWdlXG4gICAgLy8gY2FycmllcyBvbmx5IGBydW5JZGAsIHNvIGl0cyBkZWxpdmVyeSBhbHdheXMgcmVhY2hlcyByZXBsYXkgKGFuZFxuICAgIC8vIHVuZGVyIHR1cmJvIGEgcmVzY2hlZHVsZSB3b3VsZCByZS1lbmdhZ2UgdHVyYm8gYWdhaW5zdCBhIHN0YWxlXG4gICAgLy8gcHJlbG9hZGVkIGxvZzogc2VlIHRoZSByZWludm9rZSgpIGRvY3MgaW4gcnVudGltZS50cykuXG4gICAgY29uc3QgcmVxdWV1ZUltbWVkaWF0ZWx5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICB3b3JsZCxcbiAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfTtcblxuICAgIGlmIChidWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgLy8gVGhlIGxvb3Agc3RvcHBlZCBvbiB0aGUgcmVwbGF5IGJ1ZGdldCB3aXRoIHByb2dyZXNzIHN0aWxsXG4gICAgICAvLyBwb3NzaWJsZSwgc28gY29udGludWUgaW4gYSBmcmVzaCBpbnZvY2F0aW9uLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAnYnVkZ2V0X2V4aGF1c3RlZF9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4aXQgd2FpdCBzd2VlcC4gQSB3YWl0IHRoYXQgZWxhcHNlZCBpbiB0aGUgd2luZG93IHNpbmNlIHRoZVxuICAgIC8vIGxvb3AncyBsYXN0IGNoZWNrIHJlcXVldWVzIGltbWVkaWF0ZWx5IChpdHMgd2FpdF9jb21wbGV0ZWQgaXNcbiAgICAvLyB3cml0dGVuIGJ5IHRoZSBuZXh0IGludm9jYXRpb24ncyBlbGFwc2VkLXdhaXQgcGFzcyk7IHBlbmRpbmcgd2FpdHNcbiAgICAvLyB3aG9zZSBjb250aW51YXRpb24gdGhlIGxvb3AgYWxyZWFkeSBlbnF1ZXVlZCBhcmUgc2tpcHBlZC5cbiAgICBsZXQgc29vbmVzdFdhaXQ6IHsgc2Vjb25kczogbnVtYmVyOyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaGFzRWxhcHNlZFdhaXQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICBpZiAob3AudHlwZSAhPT0gJ3dhaXQnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChyZXN1bWVNcyA8PSAwKSB7XG4gICAgICAgIGhhc0VsYXBzZWRXYWl0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHRpbWVvdXRTZWNvbmRzIDwgc29vbmVzdFdhaXQuc2Vjb25kcykge1xuICAgICAgICAgIHNvb25lc3RXYWl0ID0ge1xuICAgICAgICAgICAgc2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNFbGFwc2VkV2FpdCkge1xuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAnd2FpdF9lbGFwc2VkX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdSZXF1ZXVlU2lnbmFsKSB7XG4gICAgICAvLyBUaGlzIGludm9jYXRpb24gd3JvdGUgZXZlbnRzIHRoZSB3b3JrZmxvdyBuZWVkcyB0byBjb25zdW1lXG4gICAgICAvLyAoYXR0cl9zZXQgLyBnZXRDb25mbGljdC1hd2FpdGVkIGhvb2tfY3JlYXRlZCAvIGlubGluZSBzdGVwXG4gICAgICAvLyB0ZXJtaW5hbHMpIGJ1dCB0aGUgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcgbmV2ZXIgcmV0dXJuZWRcbiAgICAgIC8vIHRoZW0gYmVmb3JlIHRoZSBsb29wIGV4aXRlZC4gV2l0aG91dCBhIHJlcXVldWUgdGhlIHJ1biB3b3VsZFxuICAgICAgLy8gcGFyayBhd2FpdGluZ19leHRlcm5hbCB3aXRoIGl0cyB1bmJsb2NraW5nIGV2ZW50cyBhbHJlYWR5XG4gICAgICAvLyBkdXJhYmx5IHdyaXR0ZW4gYW5kIG5vIGZ1dHVyZSBpbnZvY2F0aW9uIGNvbWluZywgc28gcmVxdWV1ZVxuICAgICAgLy8gaW1tZWRpYXRlbHkgc28gYSBmcmVzaCByZWFkIHBpY2tzIHRoZW0gdXAuIEluIHRoZSBjb21tb24gY2FzZVxuICAgICAgLy8gdGhlIGxvb3AncyBvd24gZmVlZCBvYnNlcnZlcyB0aGUgd3JpdGVzIGFuZCBjbGVhcnMgdGhpcyBmbGFnLCBzb1xuICAgICAgLy8gdGhpcyBvbmx5IGZpcmVzIHdoZW4gdGhlIHJlYWQgYWN0dWFsbHkgbGFnZ2VkLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAndW5yZWFkX3NlbGZfd3JpdGVfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgIC8vIERlbGF5ZWQgY29udGludWF0aW9uIGZvciB0aGUgc29vbmVzdCBwZW5kaW5nIHdhaXQgdGhlIGxvb3AgaGFzXG4gICAgICAvLyBub3QgYWxyZWFkeSBzY2hlZHVsZWQuIFRoZSBkaXNwYXRjaCBoZWxwZXIgaGFuZGxlcyBkZWxheVxuICAgICAgLy8gY2xhbXBpbmcgKGxvbmcgd2FpdHMgY2hhaW4gYWNyb3NzIGhvcHMpIGFuZCBpZGVtcG90ZW5jeS1rZXlcbiAgICAgIC8vIGRlZHVwIG9mIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQuIFNlZVxuICAgICAgLy8gcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cy5cbiAgICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7XG4gICAgICAgIGFjdGlvbjogJ3NjaGVkdWxlX3dhaXRfdGltZW91dCcsXG4gICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICB3YWl0Q29ycmVsYXRpb25JZDogc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgY29uc3QgYXR0ZW1wdCA9IG5leHRXYWl0Q29udGludWF0aW9uQXR0ZW1wdChzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgd29ybGQsXG4gICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHdhaXRDb250aW51YXRpb246IHtcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICBzb29uZXN0V2FpdC5zZWNvbmRzLFxuICAgICAgICAgIHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgRGF0ZS5ub3coKSxcbiAgICAgICAgICBhdHRlbXB0XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgIGFjdGlvbjogJ2F3YWl0aW5nX2V4dGVybmFsJyxcbiAgICAgIHBlbmRpbmdPcHNDb3VudDogcGVuZGluZ09wZXJhdGlvbnMubGVuZ3RoLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5mYWlsZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBmYWlsZWQsIHNvIHJlbWFwIHN0YWNrIHRyYWNlIHVzaW5nIGlubGluZSBzb3VyY2UgbWFwcy5cbiAgICAvLyBGcmFtZXMgY2FycnkgdGhlIHJ1bidzIHdvcmtmbG93SWQgYXMgdGhlaXIgZmlsZW5hbWUgb24gdGhlIGZyZXNoXG4gICAgLy8gcGF0aCwgYnV0IHRoZSB3b3JrZmxvdy1pbmRlcGVuZGVudCBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUgb24gdGhlXG4gICAgLy8gc25hcHNob3QgcGF0aCAodGhlIG5hbWUgaXMgYmFrZWQgaW50byB0aGUgc2hhcmVkIGJhc2VsaW5lJ3NcbiAgICAvLyBjb21waWxlZCBjb2RlIGF0IGh5ZHJhdGUpLCBzbyByZW1hcCBhZ2FpbnN0IGJvdGguIHJlbWFwRXJyb3JTdGFja1xuICAgIC8vIGVhcmx5LWV4aXRzIG9uIGEgY2hlYXAgaW5jbHVkZXMoKSB3aGVuIGEgZmlsZW5hbWUgaGFzIG5vIGZyYW1lcy5cbiAgICBsZXQgZXJyb3JTdGFjayA9IHJlc3VsdC5mYWlsZWQuc3RhY2s7XG4gICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhlcnJvclN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvciBzbyBjb25zdW1lcnMgKGBydW4ucmV0dXJuVmFsdWVgLCBvYnNlcnZhYmlsaXR5KVxuICAgIC8vIGdldCBgVVNFUl9FUlJPUmAgLyBgUlVOVElNRV9FUlJPUmAgb24gYGVycm9yLmNhdXNlLmNvZGVgLCBtYXRjaGluZ1xuICAgIC8vIHdoYXQgdGhlIG5vZGU6dm0gZW5naW5lIGFscmVhZHkgZG9lcyBpbiBydW50aW1lLnRzLlxuICAgIC8vXG4gICAgLy8gVGhlIFZNIHNlcmlhbGl6ZXMgZXJyb3JzIGFzIGB7IG5hbWUsIG1lc3NhZ2UsIHN0YWNrIH1gLCBzbyB3ZVxuICAgIC8vIHJlY29uc3RydWN0IGEgaG9zdC1zaWRlIEVycm9yIG9mIHRoZSBjb3JyZWN0IGNsYXNzIGJhc2VkIG9uIHRoZVxuICAgIC8vIFZNLXNpZGUgYG5hbWVgOiBzcGVjaWZpYyBXb3JrZmxvd1J1bnRpbWVFcnJvciBzdWJjbGFzc2VzIG5lZWRcbiAgICAvLyB0byBiZSBwcmVzZXJ2ZWQgc28gY2xhc3NpZnlSdW5FcnJvcigpIHRhZ3MgdGhlbSBhcyBSVU5USU1FX0VSUk9SLlxuICAgIGNvbnN0IHJlY29uc3RydWN0ZWQ6IEVycm9yID1cbiAgICAgIHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ1dvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yJ1xuICAgICAgICA/IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd05hbWUpXG4gICAgICAgIDogcmVzdWx0LmZhaWxlZC5uYW1lID09PSAnRXJyb3InXG4gICAgICAgICAgPyBuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IocmVzdWx0LmZhaWxlZC5tZXNzYWdlKSwge1xuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHJlY29uc3RydWN0ZWQpO1xuXG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignUXVpY2tKUyBydW50aW1lOiB3b3JrZmxvdyBmYWlsZWQnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGVycm9yTmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZmFpbGVkLm1lc3NhZ2UsXG4gICAgICBlcnJvclN0YWNrLFxuICAgICAgZXJyb3JDb2RlLFxuICAgIH0pO1xuICAgIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlF1aWNrSlNPdXRjb21lKCdmYWlsZWQnKSxcbiAgICB9KTtcblxuICAgIC8vIEZsdXNoIGxlZnRvdmVyIHBlbmRpbmcgc2lkZSBlZmZlY3RzIGJlZm9yZSB3cml0aW5nIHJ1bl9mYWlsZWQsXG4gICAgLy8gc2FtZSBkcmFpbiBzZW1hbnRpY3MgYXMgdGhlIGNvbXBsZXRlZCBicmFuY2guXG4gICAgaWYgKHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmZhaWxlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2ZhaWxlZCBldmVudC4gU2VyaWFsaXplIHRoZSBlcnJvciB0aHJvdWdoIHRoZVxuICAgIC8vIGZpcnN0LWNsYXNzIGRlaHlkcmF0aW9uIHBpcGVsaW5lIHNvIGNvbnN1bWVycyAoQ0xJLCBvYnNlcnZhYmlsaXR5LFxuICAgIC8vIHJ1bi5yZXR1cm5WYWx1ZSkgZ2V0IHRoZSBzYW1lIGh5ZHJhdGVkIHZhbHVlIHNoYXBlIGFzIHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lIGVtaXRzLiBUd28gcGF0aHM6XG4gICAgLy8gICAqIE1vZGVybiAodmFsdWVCeXRlcyBwcmVzZW50KTogdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXJcbiAgICAvLyAgICAgc2VyaWFsaXplZCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIChFcnJvciBzdWJjbGFzcyB3aXRoXG4gICAgLy8gICAgIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikgdXNpbmcgdGhlIFZNJ3NcbiAgICAvLyAgICAgd29ya2Zsb3ctc2VyaWFsaXplLiBQYXNzIHRob3NlIGJ5dGVzIHRocm91Z2ggZGlyZWN0bHkgc29cbiAgICAvLyAgICAgdHlwZSBpZGVudGl0eSwgY2F1c2UgY2hhaW5zLCBhbmQgbm9uLUVycm9yIHRocm93cyBzdXJ2aXZlLlxuICAgIC8vICAgICBBcHBseSBlbmNyeXB0aW9uIGlmIGNvbmZpZ3VyZWQgKHRoZSBWTSdzXG4gICAgLy8gICAgIHNlcmlhbGl6ZXIgZG9lc24ndCBoYXZlIGFjY2VzcyB0byB0aGUgZW5jcnlwdGlvbiBrZXkpLlxuICAgIC8vICAgKiBMZWdhY3kgZmFsbGJhY2s6IHJlY29uc3RydWN0IGFuIEVycm9yIGZyb20gdGhlIGhvc3QtdmlzaWJsZVxuICAgIC8vICAgICB7bmFtZSwgbWVzc2FnZSwgc3RhY2t9IGZpZWxkcyBhbmQgcnVuIGl0IHRocm91Z2hcbiAgICAvLyAgICAgYGRlaHlkcmF0ZVJ1bkVycm9yYC4gVXNlZCB3aGVuIHZhbHVlQnl0ZXMgaXMgYWJzZW50IChlLmcuXG4gICAgLy8gICAgIGV4dHJhY3RFcnJvciBwc2V1ZG8tZmFpbHVyZXMgZnJvbSBWTSBib290c3RyYXApLlxuICAgIGxldCBkZWh5ZHJhdGVkRXJyb3I6IFVpbnQ4QXJyYXk7XG4gICAgaWYgKHJlc3VsdC5mYWlsZWQudmFsdWVCeXRlcykge1xuICAgICAgLy8gSHlkcmF0ZSB0aGUgVk0tc2lkZSBieXRlcywgcmVtYXAgdGhlIGVycm9yIHN0YWNrIHdpdGggdGhlXG4gICAgICAvLyBob3N0LXNpZGUgc291cmNlIG1hcCAodGhlIFZNIGNhbid0IGRvIHRoaXM6IGl0IGxhY2tzIGJvdGggdGhlXG4gICAgICAvLyBzb3VyY2UgbWFwIGFuZCBgcmVtYXBFcnJvclN0YWNrYCksIGFuZCByZS1kZWh5ZHJhdGUuIFRoaXNcbiAgICAgIC8vIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgdmFsdWUncyB0eXBlIGlkZW50aXR5IC8gY2F1c2UgY2hhaW5cbiAgICAgIC8vIHdoaWxlIGZpeGluZyB1cCBmcmFtZXMgdG8gcG9pbnQgYXQgdGhlIHVzZXIncyBzb3VyY2UgZmlsZXMuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoeWRyYXRlZCA9IGF3YWl0IGh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdW5kZWZpbmVkIC8vIFZNIGJ5dGVzIGFyZSB1bmVuY3J5cHRlZFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaHlkcmF0ZWQgJiZcbiAgICAgICAgICB0eXBlb2YgaHlkcmF0ZWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgJ3N0YWNrJyBpbiAoaHlkcmF0ZWQgYXMgb2JqZWN0KSAmJlxuICAgICAgICAgIHR5cGVvZiAoaHlkcmF0ZWQgYXMgeyBzdGFjaz86IHVua25vd24gfSkuc3RhY2sgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAvLyBCb3RoIGZpbGVuYW1lIHNwYWNlcy4gU2VlIHRoZSBmYWlsZWQtYnJhbmNoIGNvbW1lbnQgYWJvdmUuXG4gICAgICAgICAgKGh5ZHJhdGVkIGFzIHsgc3RhY2s/OiBzdHJpbmcgfSkuc3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgIChoeWRyYXRlZCBhcyB7IHN0YWNrOiBzdHJpbmcgfSkuc3RhY2ssXG4gICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhbGsgdGhlIGNhdXNlIGNoYWluIGFuZCByZW1hcCBuZXN0ZWQgc3RhY2tzIHRvby5cbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgICAgICAgbGV0IG5vZGUgPSAoaHlkcmF0ZWQgYXMgeyBjYXVzZT86IHVua25vd24gfSk/LmNhdXNlO1xuICAgICAgICB3aGlsZSAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKG5vZGUgYXMgb2JqZWN0KSkge1xuICAgICAgICAgIHNlZW4uYWRkKG5vZGUgYXMgb2JqZWN0KTtcbiAgICAgICAgICBjb25zdCBub2RlU3RhY2sgPSAobm9kZSBhcyB7IHN0YWNrPzogdW5rbm93biB9KS5zdGFjaztcbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGVTdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgLy8gQm90aCBmaWxlbmFtZSBzcGFjZXMuIFNlZSB0aGUgZmFpbGVkLWJyYW5jaCBjb21tZW50IGFib3ZlLlxuICAgICAgICAgICAgKG5vZGUgYXMgeyBzdGFjaz86IHN0cmluZyB9KS5zdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgcmVtYXBFcnJvclN0YWNrKG5vZGVTdGFjaywgZmlsZW5hbWUsIHdvcmtmbG93Q29kZSksXG4gICAgICAgICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gKG5vZGUgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gICAgICAgIH1cbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgaHlkcmF0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAocmVoeWRyYXRlRXJyKSB7XG4gICAgICAgIC8vIElmIGh5ZHJhdGlvbiAvIHJlLWRlaHlkcmF0aW9uIGZhaWxzIGZvciBhbnkgcmVhc29uLCBmYWxsXG4gICAgICAgIC8vIGJhY2sgdG8gcGFzc2luZyB0aHJvdWdoIHRoZSBvcmlnaW5hbCBWTSBieXRlcyAoYXBwbHlpbmdcbiAgICAgICAgLy8gZW5jcnlwdGlvbiBpZiBjb25maWd1cmVkKS4gQmV0dGVyIHRvIGxvc2Ugc291cmNlLW1hcHBlZFxuICAgICAgICAvLyBmcmFtZXMgdGhhbiB0byBsb3NlIHRoZSBlcnJvciBlbnRpcmVseS5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byByZW1hcCB3b3JrZmxvdyBlcnJvciBzdGFjaywgcGFzc2luZyBWTSBieXRlcyB0aHJvdWdoJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IChyZWh5ZHJhdGVFcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGVoeWRyYXRlZEVycm9yID0gKGF3YWl0IG1heWJlRW5jcnlwdChcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnZhbHVlQnl0ZXMsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApKSBhcyBVaW50OEFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICByZWNvbnN0cnVjdGVkLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlY29uc3RydWN0ZWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoc2VyRXJyKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBhIG1pbmltYWwgcGF5bG9hZCBzbyB0aGUgcnVuIHN0aWxsIHRlcm1pbmF0ZXNcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSBlcnJvciBpdHNlbGYgY29udGFpbnMgdW5zZXJpYWxpemFibGUgdmFsdWVzLlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIGRlaHlkcmF0ZSBydW4gZXJyb3IsIGZhbGxpbmcgYmFjayB0byBiYXJlIEVycm9yJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiAoc2VyRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBkZWh5ZHJhdGVkRXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignV29ya2Zsb3cgYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgcnVuX2ZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ2FscmVhZHlfZmluaXNoZWQnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkX2Vycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IChlcnIgYXMgRXJyb3IpPy5uYW1lLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHdmZGlhZygnZXhpdF9mYWlsZWQnLCB7IHJlc3VsdDogJ3J1bl9mYWlsZWRfd3JpdHRlbicgfSk7XG4gIH1cbn1cbiJdfQ==