@workflow/core 5.0.0-beta.41 → 5.0.0-beta.43

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 (65) hide show
  1. package/dist/create-hook.d.ts +9 -5
  2. package/dist/create-hook.d.ts.map +1 -1
  3. package/dist/create-hook.js +1 -1
  4. package/dist/events-consumer.d.ts +97 -0
  5. package/dist/events-consumer.d.ts.map +1 -1
  6. package/dist/events-consumer.js +147 -14
  7. package/dist/private.d.ts +31 -12
  8. package/dist/private.d.ts.map +1 -1
  9. package/dist/private.js +149 -26
  10. package/dist/runtime/constants.d.ts +62 -0
  11. package/dist/runtime/constants.d.ts.map +1 -1
  12. package/dist/runtime/constants.js +70 -1
  13. package/dist/runtime/helpers.d.ts +127 -93
  14. package/dist/runtime/helpers.d.ts.map +1 -1
  15. package/dist/runtime/helpers.js +149 -132
  16. package/dist/runtime/quickjs-entrypoint.d.ts +10 -9
  17. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  18. package/dist/runtime/quickjs-entrypoint.js +162 -38
  19. package/dist/runtime/replay-budget.d.ts +8 -0
  20. package/dist/runtime/replay-budget.d.ts.map +1 -1
  21. package/dist/runtime/replay-budget.js +3 -3
  22. package/dist/runtime/resume-hook.d.ts.map +1 -1
  23. package/dist/runtime/resume-hook.js +53 -13
  24. package/dist/runtime/resume-latency.d.ts +143 -0
  25. package/dist/runtime/resume-latency.d.ts.map +1 -0
  26. package/dist/runtime/resume-latency.js +153 -0
  27. package/dist/runtime/run.d.ts.map +1 -1
  28. package/dist/runtime/run.js +54 -29
  29. package/dist/runtime/step-executor.d.ts +76 -13
  30. package/dist/runtime/step-executor.d.ts.map +1 -1
  31. package/dist/runtime/step-executor.js +171 -19
  32. package/dist/runtime/step-latency.d.ts +6 -0
  33. package/dist/runtime/step-latency.d.ts.map +1 -1
  34. package/dist/runtime/step-latency.js +3 -1
  35. package/dist/runtime/suspension-handler.d.ts +119 -8
  36. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  37. package/dist/runtime/suspension-handler.js +643 -46
  38. package/dist/runtime/world-compatibility.d.ts +6 -5
  39. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  40. package/dist/runtime/world-compatibility.js +7 -6
  41. package/dist/runtime.d.ts.map +1 -1
  42. package/dist/runtime.js +583 -142
  43. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  44. package/dist/serialization/codec-devalue.js +15 -4
  45. package/dist/serialization.d.ts +10 -2
  46. package/dist/serialization.d.ts.map +1 -1
  47. package/dist/serialization.js +55 -8
  48. package/dist/telemetry/semantic-conventions.d.ts +81 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +67 -1
  51. package/dist/telemetry.d.ts +6 -0
  52. package/dist/telemetry.d.ts.map +1 -1
  53. package/dist/telemetry.js +22 -1
  54. package/dist/test-support/orchestrator-context.d.ts +25 -0
  55. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  56. package/dist/test-support/orchestrator-context.js +91 -0
  57. package/dist/version.d.ts +1 -1
  58. package/dist/version.js +2 -2
  59. package/dist/workflow/create-hook.js +2 -2
  60. package/dist/workflow/hook.js +3 -3
  61. package/dist/workflow.js +43 -2
  62. package/docs/foundations/hooks.mdx +2 -2
  63. package/docs/foundations/streaming.mdx +24 -0
  64. package/docs/how-it-works/event-sourcing.mdx +39 -1
  65. package/package.json +5 -5
@@ -14,17 +14,17 @@
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, } from '@workflow/world';
18
- import { classifyRunError } from '../classify-error.js';
17
+ import { ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, } from '@workflow/world';
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
21
  import { dehydrateRunError, 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';
25
- import { getInlineOwnershipLeaseSeconds, getMaxInlineSteps, } from './constants.js';
25
+ import { getInlineOwnershipLeaseSeconds, getMaxInlineSteps, isResilientStepDispatchEnabled, MAX_RESILIENT_STEP_INPUT_BYTES, } from './constants.js';
26
26
  import { getPortLazy } from './get-port-lazy.js';
27
- import { getWorkflowQueueName, queueMessage } from './helpers.js';
27
+ import { getWorkflowQueueName, queueMessage, stepDispatchIdempotencyKey, } from './helpers.js';
28
28
  import { BASELINE_BUNDLE_FILENAME, startQuickJSWorkflow, } from './quickjs-runtime.js';
29
29
  import { ReplayBudget } from './replay-budget.js';
30
30
  import { executeStep } from './step-executor.js';
@@ -65,7 +65,7 @@ export function isFirstInvocation(preloadedEvents) {
65
65
  * `delaySeconds` supports retry/throttle backoff.
66
66
  */
67
67
  async function queueStepMessage(params) {
68
- const { world, runId, workflowRun, step, delaySeconds, namespace, nextTraceCarrier, purpose, wfdiag, } = params;
68
+ const { world, runId, workflowRun, step, delaySeconds, namespace, nextTraceCarrier, purpose, stepInput, wfdiag, } = params;
69
69
  const traceCarrier = await nextTraceCarrier();
70
70
  await queueMessage(world, getWorkflowQueueName(workflowRun.workflowName, namespace), {
71
71
  runId,
@@ -73,9 +73,15 @@ async function queueStepMessage(params) {
73
73
  stepName: step.stepId,
74
74
  traceCarrier,
75
75
  requestedAt: new Date(),
76
+ ...(stepInput !== undefined ? { stepInput: { input: stepInput } } : {}),
76
77
  }, {
78
+ // The 'dispatch' key is step-identity-scoped (correlationId + hashed
79
+ // step name) — shared with the node engine's dispatch of the same step
80
+ // so the two stay mutually exclusive, without a revoked resilient
81
+ // message absorbing a reassigned correlation id's legitimate dispatch.
82
+ // See stepDispatchIdempotencyKey.
77
83
  idempotencyKey: purpose === 'dispatch'
78
- ? step.correlationId
84
+ ? stepDispatchIdempotencyKey(step.correlationId, step.stepId)
79
85
  : `${step.correlationId}:${purpose}`,
80
86
  ...(delaySeconds && delaySeconds > 0 ? { delaySeconds } : {}),
81
87
  });
@@ -84,6 +90,7 @@ async function queueStepMessage(params) {
84
90
  correlationId: step.correlationId,
85
91
  purpose,
86
92
  delaySeconds: delaySeconds ?? 0,
93
+ ...(stepInput !== undefined ? { resilient: true } : {}),
87
94
  });
88
95
  }
89
96
  /**
@@ -91,16 +98,45 @@ async function queueStepMessage(params) {
91
98
  * step_created (+ optional queueing), hook_created / hook_received (aborts),
92
99
  * attr_set, hook_disposed, and wait_created events.
93
100
  *
94
- * Steps are created but never queued here — queueing (or inline
101
+ * Steps are created but (usually) not queued here — queueing (or inline
95
102
  * execution) is the caller's decision. Used both for suspension
96
103
  * processing (the inline loop) and for the terminal drain (flushing
97
104
  * leftover side effects when the workflow completed or failed, mirroring
98
105
  * the node:vm engine's drainPendingQueueItems).
106
+ *
107
+ * The one exception is resilient step dispatch: for step cids named in
108
+ * `queueStepCids` (the caller's overflow steps) that pass the eligibility
109
+ * gates, the step_created write is parallelized with the step's queue
110
+ * publish — the message carries the serialized input (`stepInput`) so the
111
+ * consumer can idempotently re-ensure the event if the direct write failed
112
+ * transiently. Steps queued this way are reported in `queuedStepCids`; the
113
+ * caller queues the rest itself.
99
114
  */
100
115
  async function dispatchPendingOps(params) {
101
116
  const { world, runId, workflowRun, encryptionKey, pendingOperations, namespace, nextTraceCarrier, } = params;
102
117
  const skipStepCreation = params.skipStepCreation;
118
+ const queueStepCids = params.queueStepCids;
103
119
  const wfdiag = params.wfdiag;
120
+ // Step cids published via resilient dispatch below (create + queue in
121
+ // parallel, message carrying `stepInput`). Reported to the caller so it
122
+ // skips them in its own queueing pass.
123
+ const queuedStepCids = new Set();
124
+ // Resilient step dispatch eligibility, shared by every step op below (the
125
+ // per-step input-size check is applied inside the op): feature enabled and
126
+ // a binary-safe (CBOR) queue transport for the run.
127
+ //
128
+ // Unlike the node:vm suspension handler's gate (see
129
+ // SuspensionHandlerParams.stepDispatch), there is NO precondition-guard
130
+ // 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 —
132
+ // the consumer's re-ensure therefore cannot materialize a step the guard
133
+ // rejected. If this engine ever adopts guarded suspension writes, the
134
+ // capability gate from the node:vm handler must be added here too.
135
+ const resilientDispatchEligible = queueStepCids !== undefined &&
136
+ queueStepCids.size > 0 &&
137
+ isResilientStepDispatchEnabled() &&
138
+ (workflowRun.specVersion ?? 0) >=
139
+ SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT;
104
140
  // Set when a hook with a parked getConflict() awaiter had its
105
141
  // hook_created written this invocation. The workflow must be re-invoked
106
142
  // so replay can confirm creation and resolve the awaiter.
@@ -301,6 +337,83 @@ async function dispatchPendingOps(params) {
301
337
  // access to the CryptoKey, so encryption is applied here
302
338
  // on the host side — matching what
303
339
  // `dehydrateStepArguments` does in the node:vm engine.
340
+ const encryptedInput = await encryptSerializedData(step.input, encryptionKey);
341
+ // Resilient step dispatch: fire the step_created write and the
342
+ // step's queue publish in parallel — the message carries the
343
+ // same serialized input (`stepInput`) so the consumer can
344
+ // idempotently re-ensure the event if the direct write failed
345
+ // transiently. Mirrors the node:vm suspension handler and the
346
+ // resilient start / resilient hook resume patterns. Only for
347
+ // caller-designated overflow steps with inputs the queue
348
+ // message can safely carry (binary, under the VQS size cap).
349
+ if (resilientDispatchEligible &&
350
+ queueStepCids?.has(step.correlationId) &&
351
+ encryptedInput instanceof Uint8Array &&
352
+ encryptedInput.byteLength <= MAX_RESILIENT_STEP_INPUT_BYTES) {
353
+ const [createResult, queueResult] = await Promise.allSettled([
354
+ world.events.create(runId, {
355
+ eventType: 'step_created',
356
+ specVersion: SPEC_VERSION_CURRENT,
357
+ correlationId: step.correlationId,
358
+ eventData: {
359
+ stepName: step.stepId,
360
+ input: encryptedInput,
361
+ },
362
+ }),
363
+ queueStepMessage({
364
+ world,
365
+ runId,
366
+ workflowRun,
367
+ step,
368
+ namespace,
369
+ nextTraceCarrier,
370
+ purpose: 'dispatch',
371
+ stepInput: encryptedInput,
372
+ wfdiag,
373
+ }),
374
+ ]);
375
+ // Queue failure is always fatal for this dispatch pass:
376
+ // without the message the step would rely on the create
377
+ // alone, and if the create ALSO failed there would be no
378
+ // durable record at all. Propagating redelivers the
379
+ // orchestrator message, which re-creates the (idempotent)
380
+ // step_created and re-dispatches.
381
+ if (queueResult.status === 'rejected') {
382
+ throw queueResult.reason;
383
+ }
384
+ queuedStepCids.add(step.correlationId);
385
+ if (createResult.status === 'rejected') {
386
+ const err = createResult.reason;
387
+ if (EntityConflictError.is(err)) {
388
+ // Concurrent invocation wrote it first — the message is
389
+ // already out; its duplicate publish dedupes on the
390
+ // shared step-identity-scoped idempotency key.
391
+ return;
392
+ }
393
+ if (isRetryableWorldError(err)) {
394
+ // Resilient: the write failed transiently (429 / 5xx /
395
+ // transport) but the step message — carrying the same
396
+ // serialized input — was published, so the consumer
397
+ // idempotently re-ensures the step_created before
398
+ // executing.
399
+ runtimeLogger.warn('Step creation event write failed, but the step was ' +
400
+ 'dispatched via the queue. The step_created event ' +
401
+ 'will be ensured by the queue consumer.', {
402
+ workflowRunId: runId,
403
+ correlationId: step.correlationId,
404
+ stepName: step.stepId,
405
+ error: err instanceof Error ? err.message : String(err),
406
+ });
407
+ wfdiag('step_resilient_dispatch_recovered', {
408
+ stepId: step.stepId,
409
+ correlationId: step.correlationId,
410
+ });
411
+ return;
412
+ }
413
+ throw err;
414
+ }
415
+ return;
416
+ }
304
417
  try {
305
418
  await world.events.create(runId, {
306
419
  eventType: 'step_created',
@@ -308,7 +421,7 @@ async function dispatchPendingOps(params) {
308
421
  correlationId: step.correlationId,
309
422
  eventData: {
310
423
  stepName: step.stepId,
311
- input: await encryptSerializedData(step.input, encryptionKey),
424
+ input: encryptedInput,
312
425
  },
313
426
  });
314
427
  }
@@ -317,9 +430,10 @@ async function dispatchPendingOps(params) {
317
430
  return;
318
431
  throw err;
319
432
  }
320
- // NOTE: step queueing is the caller's decision — the inline
321
- // loop executes fresh steps in the live VM and only queues the
322
- // overflow / retry / backstop cases (see queueStepMessage).
433
+ // NOTE: step queueing is otherwise the caller's decision — the
434
+ // inline loop executes fresh steps in the live VM and only
435
+ // queues the overflow / retry / backstop cases (see
436
+ // queueStepMessage).
323
437
  })());
324
438
  }
325
439
  else if (op.type === 'attribute' && !op.hasCreatedEvent) {
@@ -374,7 +488,7 @@ async function dispatchPendingOps(params) {
374
488
  }
375
489
  // Per-op dispatch runs in parallel.
376
490
  await Promise.all(opsPromises);
377
- return { createdAttributeEvent, createdGetConflictHook };
491
+ return { createdAttributeEvent, createdGetConflictHook, queuedStepCids };
378
492
  }
379
493
  /**
380
494
  * Run a workflow using the QuickJS WASM VM engine.
@@ -382,18 +496,17 @@ async function dispatchPendingOps(params) {
382
496
  * This replaces the `node:vm` replay path (runWorkflow + EventsConsumer)
383
497
  * with a QuickJS VM invocation that performs the same full event replay.
384
498
  *
385
- * KNOWN GAP — precondition guard: unlike the node:vm path, no event write
386
- * in this file participates in the optimistic-concurrency precondition
387
- * guard (`withPreconditionRetry` + `stateUpdatedAtForCreate`), which
388
- * protects a writer holding a stale event-log snapshot from clobbering a
389
- * concurrent one. The engine currently relies on per-(runId,
390
- * correlationId) event uniqueness (EntityConflictError dedup) alone. This
391
- * is a deliberate simplification while the engine is experimental wiring
392
- * the guard is tracked follow-up work; anyone adding new write paths here
393
- * should not assume parity with the node engine on this axis.
499
+ * KNOWN GAP — slot snapshot: unlike the node:vm path, no event write in
500
+ * this file carries {@link CreateEventParams.eventCount}, so a World never
501
+ * learns which events the writer had not seen and never reports them back.
502
+ * The engine currently relies on per-(runId, correlationId) event
503
+ * uniqueness (EntityConflictError dedup) alone. This is a deliberate
504
+ * simplification while the engine is experimental — wiring the snapshot is
505
+ * tracked follow-up work; anyone adding new write paths here should not
506
+ * assume parity with the node engine on this axis.
394
507
  */
395
508
  export async function runWorkflowWithQuickJS(params) {
396
- const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, namespace, } = params;
509
+ const { workflowCode, workflowName, workflowRun, preloadedEvents, preloadedEventsComplete, runInput, parentSpan, maxEventsLimit, deliveryAttempt, ownerMessageId, requestId, namespace, } = params;
397
510
  // Standalone-caller fallback (tests): without a runtime.ts carrier
398
511
  // accessor, fall back to the current invocation context.
399
512
  const nextTraceCarrier = params.nextTraceCarrier ?? (() => serializeTraceCarrier());
@@ -750,6 +863,20 @@ export async function runWorkflowWithQuickJS(params) {
750
863
  recordedAbortIds.add(op.correlationId);
751
864
  }
752
865
  }
866
+ // Steps beyond the inline cap are handed to the queue in the same
867
+ // turn their step_created is written. Where eligible, the dispatch
868
+ // below parallelizes each overflow step's step_created write with
869
+ // its queue publish (resilient step dispatch — the message carries
870
+ // `stepInput` so the consumer can re-ensure the event); the rest
871
+ // are queued right after, in parallel. This must all happen BEFORE
872
+ // the event feed below: the feed always observes those very
873
+ // step_created writes as unseen events and `continue`s, so a
874
+ // handoff placed after it is unreachable on the only iteration
875
+ // that still classifies these steps as fresh — next turn they carry
876
+ // hasCreatedEvent and would never be queued at all (the wedge behind
877
+ // promiseRaceStressTestWorkflow hanging in the quickjs CI legs). The
878
+ // step-identity-scoped idempotency key makes repeats harmless.
879
+ const overflowSteps = freshSteps.slice(inlineCandidates.length);
753
880
  const dispatched = await dispatchPendingOps({
754
881
  world,
755
882
  runId,
@@ -759,25 +886,21 @@ export async function runWorkflowWithQuickJS(params) {
759
886
  nextTraceCarrier,
760
887
  pendingOperations: opsToDispatch,
761
888
  skipStepCreation: inlineClaimCids,
889
+ queueStepCids: new Set(overflowSteps.map((s) => s.correlationId)),
762
890
  wfdiag,
763
891
  });
764
892
  if (dispatched.createdAttributeEvent ||
765
893
  dispatched.createdGetConflictHook) {
766
894
  pendingRequeueSignal = true;
767
895
  }
768
- // Hand steps beyond the inline cap to the queue NOW — in the same
769
- // turn their step_created was written by the dispatch above. This
770
- // must happen BEFORE the event feed below: the feed always observes
771
- // those very step_created writes as unseen events and `continue`s,
772
- // so a handoff placed after it is unreachable on the only iteration
773
- // that still classifies these steps as fresh — next turn they carry
774
- // hasCreatedEvent and would never be queued at all (the wedge behind
775
- // promiseRaceStressTestWorkflow hanging in the quickjs CI legs). The
776
- // bare-correlationId idempotency key makes repeats harmless.
777
- const overflowSteps = freshSteps.slice(inlineCandidates.length);
778
- for (const step of overflowSteps) {
896
+ for (const cid of dispatched.queuedStepCids) {
897
+ queuedStepIds.add(cid);
898
+ }
899
+ await Promise.all(overflowSteps
900
+ .filter((step) => !dispatched.queuedStepCids.has(step.correlationId))
901
+ .map((step) => {
779
902
  queuedStepIds.add(step.correlationId);
780
- await queueStepMessage({
903
+ return queueStepMessage({
781
904
  world,
782
905
  runId,
783
906
  workflowRun,
@@ -787,7 +910,7 @@ export async function runWorkflowWithQuickJS(params) {
787
910
  purpose: 'dispatch',
788
911
  wfdiag,
789
912
  });
790
- }
913
+ }));
791
914
  // Complete elapsed waits so their wait_completed events are picked
792
915
  // up by the feed below (instead of a queue re-invocation).
793
916
  const waitCompletePromises = [];
@@ -863,7 +986,7 @@ export async function runWorkflowWithQuickJS(params) {
863
986
  // mid-execution. Dispatch immediately for background recovery.
864
987
  // - No stamp / lease EXPIRED / step_retrying observed → the step
865
988
  // is queue-owned or orphaned. Dispatch immediately; the
866
- // bare-correlationId idempotency key dedupes against the
989
+ // step-identity-scoped idempotency key dedupes against the
867
990
  // original handoff.
868
991
  const nowMs = Date.now();
869
992
  for (const step of stepOps) {
@@ -988,6 +1111,7 @@ export async function runWorkflowWithQuickJS(params) {
988
1111
  workflowDeploymentId: workflowRun.deploymentId,
989
1112
  workflowName: workflowRun.workflowName,
990
1113
  workflowStartedAt,
1114
+ requestId,
991
1115
  rootRunId,
992
1116
  stepId: step.correlationId,
993
1117
  stepName: step.stepId,
@@ -1030,7 +1154,7 @@ export async function runWorkflowWithQuickJS(params) {
1030
1154
  namespace,
1031
1155
  nextTraceCarrier,
1032
1156
  // Suffixed key: this step was inline-claimed, so no dispatch
1033
- // publish exists under the bare correlationId — but suffixing
1157
+ // publish exists under the dispatch key — but suffixing
1034
1158
  // keeps the retry enqueueable even if a world retired a
1035
1159
  // historical key for this step (see the purpose docs above).
1036
1160
  purpose: 'retry:1',
@@ -1434,4 +1558,4 @@ export async function runWorkflowWithQuickJS(params) {
1434
1558
  wfdiag('exit_failed', { result: 'run_failed_written' });
1435
1559
  }
1436
1560
  }
1437
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1lbnRyeXBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxxQkFBcUIsRUFFckIsb0JBQW9CLEdBRXJCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLE9BQU8sSUFBSSxxQkFBcUIsR0FFakMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixZQUFZLEdBQ2IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCx3QkFBd0IsRUFPeEIs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QUFDLEVBQUU7b0JBQzlDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUk7aUJBQ3pCLENBQUMsRUFDRixLQUFLLEVBQ0wsYUFBYSxDQUNkLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO2dCQUMvQixTQUFTLEVBQUUsWUFBWTtnQkFDdkIsV0FBVyxFQUFFLG9CQUFvQjtnQkFDakMsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRSxlQUFlO29CQUN0QixTQUFTO2lCQUNWO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELEVBQUU7b0JBQ25FLGFBQWEsRUFBRSxLQUFLO2lCQUNyQixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxDQUFDLG1CQUFtQixFQUFFO2dCQUMxQixTQUFTLEVBQUcsR0FBYSxFQUFFLElBQUk7Z0JBQy9CLFlBQVksRUFBRyxHQUFhLEVBQUUsT0FBTzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVpY2tKUyBWTSBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBXb3JrZmxvdyBEZXZLaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGVudHJ5IHBvaW50IGZvciBydW5uaW5nIHdvcmtmbG93cyBpbiB0aGVcbiAqIFF1aWNrSlMgV0FTTSBWTSBlbmdpbmUgaW5zdGVhZCBvZiB0aGUgYG5vZGU6dm1gIGVuZ2luZS4gQm90aCBlbmdpbmVzXG4gKiBpbXBsZW1lbnQgdGhlIHNhbWUgZXZlbnQtcmVwbGF5IGV4ZWN1dGlvbiBtb2RlbCDigJQgZXZlcnkgaW52b2NhdGlvbjpcbiAqXG4gKiAxLiBMb2FkcyB0aGUgZnVsbCBldmVudCBsb2cgZm9yIHRoZSBydW5cbiAqIDIuIFJ1bnMgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGZyb20gdGhlIHRvcCBpbiBhIGZyZXNoIFF1aWNrSlMgVk0sXG4gKiAgICByZXBsYXlpbmcgdGhlIGV2ZW50IGxvZyB0byByZXNvbHZlIGF3YWl0ZWQgcHJpbWl0aXZlc1xuICogMy4gT24gc3VzcGVuc2lvbjogY3JlYXRlcyBldmVudHMgKyBxdWV1ZXMgc3RlcHMgZm9yIG5ldyBwZW5kaW5nIG9wc1xuICogNC4gT24gY29tcGxldGlvbjogY3JlYXRlcyBydW5fY29tcGxldGVkXG4gKiA1LiBPbiBmYWlsdXJlOiBjcmVhdGVzIHJ1bl9mYWlsZWRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICB0eXBlIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdFNlcmlhbGl6ZWREYXRhLFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlUnVuRXJyb3IsXG4gIGh5ZHJhdGVSdW5FcnJvcixcbiAgbWF5YmVFbmNyeXB0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjaywgc3RyaXBJbmxpbmVTb3VyY2VNYXAgfSBmcm9tICcuLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplVHJhY2VDYXJyaWVyIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcyxcbiAgZ2V0TWF4SW5saW5lU3RlcHMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9nZXQtcG9ydC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBxdWV1ZU1lc3NhZ2UgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICB0eXBlIFBlbmRpbmdBdHRyaWJ1dGUsXG4gIHR5cGUgUGVuZGluZ0hvb2ssXG4gIHR5cGUgUGVuZGluZ0hvb2tEaXNwb3NlLFxuICB0eXBlIFBlbmRpbmdPcGVyYXRpb24sXG4gIHR5cGUgUGVuZGluZ1N0ZXAsXG4gIHR5cGUgUGVuZGluZ1dhaXQsXG4gIHN0YXJ0UXVpY2tKU1dvcmtmbG93LFxufSBmcm9tICcuL3F1aWNranMtcnVudGltZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlCdWRnZXQgfSBmcm9tICcuL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZVN0ZXAsIHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCB9IGZyb20gJy4vc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBydW5TdGVwU2luZ2xlRmxpZ2h0IH0gZnJvbSAnLi9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vd29ybGQuanMnO1xuXG4vKiogVGlueSBtcyB0aW1lciB1c2luZyBwZXJmb3JtYW5jZS5ub3coKSDigJQgYWxyZWFkeSBtb25vdG9uaWMgb24gTm9kZS4gKi9cbmZ1bmN0aW9uIHRpY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBzdXBwbGllZCBwcmVsb2FkZWQgZXZlbnRzIGluZGljYXRlIHRoaXMgaXMgdGhlXG4gKiBmaXJzdCB3b3JrZmxvdyBoYW5kbGVyIGludm9jYXRpb24gZm9yIHRoZSBydW4g4oCUIGkuZS4gdGhlIGxvZyBjb250YWluc1xuICogbm90aGluZyBiZXlvbmQgYHJ1bl9jcmVhdGVkYCAvIGBydW5fc3RhcnRlZGAuIEluIHRoYXQgY2FzZSB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgQVJFIHRoZSBjb21wbGV0ZSBldmVudCBsb2cgYW5kIHRoZSBgZXZlbnRzLmxpc3RgXG4gKiByb3VuZC10cmlwcyBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSB3b3JsZCBiYWNrZmlsbGVkIGEgbWlzc2luZyBgcnVuX2NyZWF0ZWRgIHZpYSB0aGVcbiAqIHJlc2lsaWVudCBzdGFydCBwYXRoLCBgcHJlbG9hZGVkRXZlbnRzYCBjb250YWlucyBpdCBldmVuIHdoZW4gYSBmcmVzaFxuICogYGV2ZW50cy5saXN0YCBtaWdodCBub3QgKGV2ZW50dWFsIGNvbnNpc3RlbmN5KSwgc28gcHJlZmVycmluZyB0aGVcbiAqIHByZWxvYWRlZCBldmVudHMgb24gZmlyc3QgaW52b2NhdGlvbiBpcyBhbHNvIHRoZSBtb3JlIGNvcnJlY3QgY2hvaWNlLlxuICpcbiAqIFJldHVybnMgZmFsc2Ugd2hlbiBgcHJlbG9hZGVkRXZlbnRzYCBpcyBtaXNzaW5nL2VtcHR5IHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBmZXRjaCBwYXRoLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpcnN0SW52b2NhdGlvbihcbiAgcHJlbG9hZGVkRXZlbnRzOiByZWFkb25seSBFdmVudFtdIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgfHwgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gcHJlbG9hZGVkRXZlbnRzLmV2ZXJ5KFxuICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJ1xuICApO1xufVxuXG4vKipcbiAqIFF1ZXVlIGEgc3RlcCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gdmlhIHRoZSB1bmlmaWVkIHdvcmtmbG93IHF1ZXVlXG4gKiAoVjIgYXJjaGl0ZWN0dXJlKS4gVGhlIGNvbWJpbmVkIGhhbmRsZXIgaW4gcnVudGltZS50cyBkaXNwYXRjaGVzXG4gKiBtZXNzYWdlcyB3aXRoIGBzdGVwSWRgIHRvIGV4ZWN1dGVTdGVwLCB3aGljaCB3b3JrcyBmb3IgYm90aCBWTSBlbmdpbmVzLlxuICogYGRlbGF5U2Vjb25kc2Agc3VwcG9ydHMgcmV0cnkvdGhyb3R0bGUgYmFja29mZi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcXVldWVTdGVwTWVzc2FnZShwYXJhbXM6IHtcbiAgd29ybGQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ybGQ+PjtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICBzdGVwOiBQZW5kaW5nU3RlcDtcbiAgZGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciB0aGUgcHVibGlzaCAoc2VlIHJ1bnRpbWUudHMpLiAqL1xuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciAoc2VlIHJ1bldvcmtmbG93V2l0aFF1aWNrSlMpLiAqL1xuICBuZXh0VHJhY2VDYXJyaWVyOiAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICAvKipcbiAgICogUHVibGlzaCBwdXJwb3NlLCB1c2VkIHRvIGJ1Y2tldCB0aGUgaWRlbXBvdGVuY3kga2V5LiBXb3JsZHMgcmV0aXJlXG4gICAqIHVzZWQga2V5cyAoVlFTIHJldGVudGlvbiBUVEwsIHdvcmxkLXBvc3RncmVzIGNvbXBsZXRlZC1rZXlzIGNhY2hlKSxcbiAgICogc28gYSBrZXkgc2hhcmVkIGFjcm9zcyBwdXJwb3NlcyBzaWxlbnRseSBzd2FsbG93cyB0aGUgc2Vjb25kXG4gICAqIHB1Ymxpc2gg4oCUIHNlZSB3YWl0LWNvbnRpbnVhdGlvbi50cyBmb3IgdGhlIHNhbWUgaGF6YXJkIG9uIHdhaXRcbiAgICoga2V5cy4gYGRpc3BhdGNoYCBpcyB0aGUgcGxhaW4gYmFja2dyb3VuZCBoYW5kb2ZmIChvdmVyZmxvdyAvIGNyYXNoXG4gICAqIHJlY292ZXJ5KSBhbmQga2VlcHMgdGhlIGJhcmUgY29ycmVsYXRpb25JZCBzbyBpdCBzdGF5cyBtdXR1YWxseVxuICAgKiBleGNsdXNpdmUgd2l0aCB0aGUgbm9kZSBlbmdpbmUncyBkaXNwYXRjaCBvZiB0aGUgc2FtZSBzdGVwO1xuICAgKiBgYmFja3N0b3A6PGVwb2NoPmAgY292ZXJzIGRlbGF5ZWQgY3Jhc2ggYmFja3N0b3BzLCBzY29wZWQgdG8gdGhlXG4gICAqIG93bmVyc2hpcCBlcG9jaCBzbyBhIHJlZnJlc2hlZCBsZWFzZSByZS1hcm1zIGEgTkVXIGJhY2tzdG9wIGluc3RlYWRcbiAgICogb2YgYmVpbmcgYWJzb3JiZWQgYnkgdGhlIGluLWZsaWdodCBvbmU7IGByZXRyeTo8bj5gIGNvdmVycyBkZWxheWVkXG4gICAqIHJldHJ5L3Rocm90dGxlIHJlLWVucXVldWVzLCBzY29wZWQgdG8gdGhlIGF0dGVtcHQgc28gZWFjaCBiYWNrb2ZmXG4gICAqIGhvcCBpcyBlbnF1ZXVlYWJsZS5cbiAgICovXG4gIHB1cnBvc2U6ICdkaXNwYXRjaCcgfCBgYmFja3N0b3A6JHtzdHJpbmd9YCB8IGByZXRyeToke251bWJlcn1gO1xuICB3ZmRpYWc6IChjaGVja3BvaW50OiBzdHJpbmcsIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBzdGVwLFxuICAgIGRlbGF5U2Vjb25kcyxcbiAgICBuYW1lc3BhY2UsXG4gICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICBwdXJwb3NlLFxuICAgIHdmZGlhZyxcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgd29ybGQsXG4gICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgIHtcbiAgICAgIHJ1bklkLFxuICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICBzdGVwTmFtZTogc3RlcC5zdGVwSWQsXG4gICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkZW1wb3RlbmN5S2V5OlxuICAgICAgICBwdXJwb3NlID09PSAnZGlzcGF0Y2gnXG4gICAgICAgICAgPyBzdGVwLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICA6IGAke3N0ZXAuY29ycmVsYXRpb25JZH06JHtwdXJwb3NlfWAsXG4gICAgICAuLi4oZGVsYXlTZWNvbmRzICYmIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDoge30pLFxuICAgIH1cbiAgKTtcbiAgd2ZkaWFnKCdzdGVwX3F1ZXVlZCcsIHtcbiAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICBwdXJwb3NlLFxuICAgIGRlbGF5U2Vjb25kczogZGVsYXlTZWNvbmRzID8/IDAsXG4gIH0pO1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciBhIHNldCBvZiBwZW5kaW5nIFZNIG9wZXJhdGlvbnM6XG4gKiBzdGVwX2NyZWF0ZWQgKCsgb3B0aW9uYWwgcXVldWVpbmcpLCBob29rX2NyZWF0ZWQgLyBob29rX3JlY2VpdmVkIChhYm9ydHMpLFxuICogYXR0cl9zZXQsIGhvb2tfZGlzcG9zZWQsIGFuZCB3YWl0X2NyZWF0ZWQgZXZlbnRzLlxuICpcbiAqIFN0ZXBzIGFyZSBjcmVhdGVkIGJ1dCBuZXZlciBxdWV1ZWQgaGVyZSDigJQgcXVldWVpbmcgKG9yIGlubGluZVxuICogZXhlY3V0aW9uKSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24uIFVzZWQgYm90aCBmb3Igc3VzcGVuc2lvblxuICogcHJvY2Vzc2luZyAodGhlIGlubGluZSBsb29wKSBhbmQgZm9yIHRoZSB0ZXJtaW5hbCBkcmFpbiAoZmx1c2hpbmdcbiAqIGxlZnRvdmVyIHNpZGUgZWZmZWN0cyB3aGVuIHRoZSB3b3JrZmxvdyBjb21wbGV0ZWQgb3IgZmFpbGVkLCBtaXJyb3JpbmdcbiAqIHRoZSBub2RlOnZtIGVuZ2luZSdzIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNwYXRjaFBlbmRpbmdPcHMocGFyYW1zOiB7XG4gIHdvcmxkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmxkPj47XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgZW5jcnlwdGlvbktleTogUnVuUGF5bG9hZEtleXMgfCB1bmRlZmluZWQ7XG4gIHBlbmRpbmdPcGVyYXRpb25zOiBQZW5kaW5nT3BlcmF0aW9uW107XG4gIC8qKlxuICAgKiBTdGVwIGNpZHMgd2hvc2UgYHN0ZXBfY3JlYXRlZGAgbXVzdCBOT1QgYmUgd3JpdHRlbiBoZXJlOiB0aGUgaW5saW5lXG4gICAqIGxvb3AgY2xhaW1zIHRoZXNlIGF0b21pY2FsbHkgdmlhIGEgbGF6eSBgc3RlcF9zdGFydGVkYCAoY2FycnlpbmcgdGhlXG4gICAqIGlucHV0KSwgc28gYSBjb25jdXJyZW50IGNsYWltYW50IGxvc2VzIHdpdGggRW50aXR5Q29uZmxpY3RFcnJvclxuICAgKiBpbnN0ZWFkIG9mIGJvdGggaW52b2NhdGlvbnMgYmFyZS1zdGFydGluZyB0aGUgc2FtZSBzdGVwLlxuICAgKi9cbiAgc2tpcFN0ZXBDcmVhdGlvbj86IFNldDxzdHJpbmc+O1xuICAvKiogUXVldWUgbmFtZXNwYWNlIGZvciBhbGwgbWVzc2FnZSBwdWJsaXNoZXMgKHNlZSBydW50aW1lLnRzKS4gKi9cbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSdW4tb3JpZ2luIHRyYWNlIGNhcnJpZXIgYWNjZXNzb3IgZnJvbSBydW50aW1lLnRzLiBJbiB0aGUgZGVmYXVsdFxuICAgKiBgbGlua2VkYCB0cmFjZSBtb2RlIHRoaXMgcmV0dXJucyB0aGUgY2FycmllciBvZiB0aGUgcnVuJ3MgT1JJR0lOXG4gICAqIGNvbnRleHQgKHdvcmtmbG93LnN0YXJ0KSwgc28gZXZlcnkgaW52b2NhdGlvbiBsaW5rcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFydCBpbiBhIHN0YXIg4oCUIGNhcHR1cmluZyB0aGUgY3VycmVudCBjb250ZXh0IGhlcmUgaW5zdGVhZCB3b3VsZFxuICAgKiBjaGFpbiBpbnZvY2F0aW9ucyB0byBlYWNoIG90aGVyIGFuZCBmcmFnbWVudCB0aGUgcnVuIHZpZXcgb24gYXN5bmNcbiAgICogcXVldWVzLlxuICAgKi9cbiAgbmV4dFRyYWNlQ2FycmllcjogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgd2ZkaWFnOiAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xufSk6IFByb21pc2U8e1xuICBjcmVhdGVkQXR0cmlidXRlRXZlbnQ6IGJvb2xlYW47XG4gIGNyZWF0ZWRHZXRDb25mbGljdEhvb2s6IGJvb2xlYW47XG59PiB7XG4gIGNvbnN0IHtcbiAgICB3b3JsZCxcbiAgICBydW5JZCxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHBlbmRpbmdPcGVyYXRpb25zLFxuICAgIG5hbWVzcGFjZSxcbiAgICBuZXh0VHJhY2VDYXJyaWVyLFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBza2lwU3RlcENyZWF0aW9uID0gcGFyYW1zLnNraXBTdGVwQ3JlYXRpb247XG4gIGNvbnN0IHdmZGlhZyA9IHBhcmFtcy53ZmRpYWc7XG4gIC8vIFNldCB3aGVuIGEgaG9vayB3aXRoIGEgcGFya2VkIGdldENvbmZsaWN0KCkgYXdhaXRlciBoYWQgaXRzXG4gIC8vIGhvb2tfY3JlYXRlZCB3cml0dGVuIHRoaXMgaW52b2NhdGlvbi4gVGhlIHdvcmtmbG93IG11c3QgYmUgcmUtaW52b2tlZFxuICAvLyBzbyByZXBsYXkgY2FuIGNvbmZpcm0gY3JlYXRpb24gYW5kIHJlc29sdmUgdGhlIGF3YWl0ZXIuXG4gIGxldCBjcmVhdGVkR2V0Q29uZmxpY3RIb29rID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIGEgbmV3IGF0dHJfc2V0IGV2ZW50IGlzIHdyaXR0ZW4gdGhpcyBpbnZvY2F0aW9uLiBUaGVcbiAgLy8gd29ya2Zsb3cgbXVzdCBiZSByZS1pbnZva2VkIHRvIGNvbnN1bWUgaXQgKHJlc29sdmluZyB0aGUgcGVuZGluZ1xuICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZSksIHNvIHRoZSBlbnRyeXBvaW50IHJlcXVldWVzIGltbWVkaWF0ZWx5IOKAlFxuICAvLyBzYW1lIHBhdHRlcm4gYXMgYW4gZWxhcHNlZCB3YWl0LlxuICBsZXQgY3JlYXRlZEF0dHJpYnV0ZUV2ZW50ID0gZmFsc2U7XG4gIGNvbnN0IG9wc1Byb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICBjb25zdCBwcm9jZXNzSG9va09wID0gYXN5bmMgKGhvb2s6IFBlbmRpbmdIb29rKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2sgb3AnLCB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgdG9rZW5UeXBlOiB0eXBlb2YgaG9vay50b2tlbixcbiAgICAgIGlzV2ViaG9vazogaG9vay5pc1dlYmhvb2ssXG4gICAgICBpc1N5c3RlbTogaG9vay5pc1N5c3RlbSxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogaG9vay5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICBhYm9ydFJlcXVlc3RlZDogaG9vay5hYm9ydFJlcXVlc3RlZCxcbiAgICB9KTtcblxuICAgIGlmICghaG9vay5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIC8vIGBob29rLm1ldGFkYXRhYCBpcyB0aGUgZm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXNcbiAgICAgIC8vIHByb2R1Y2VkIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXVxuICAgICAgLy8gKG9wdGlvbnMubWV0YWRhdGEpYCBpbnNpZGUgdGhlIFZNLiBFbmNyeXB0IG9uIHRoZSBob3N0XG4gICAgICAvLyBzaWRlIGJlZm9yZSB3cml0aW5nIOKAlCBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyBgZGVoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBObyBwcmUtY2hlY2sgdmlhIGhvb2tzLmxpc3Q6IHdpdGggZGV0ZXJtaW5pc3RpYyBjb3JyZWxhdGlvbklkc1xuICAgICAgLy8gKHNhbWUgVk0gc2VlZCBhY3Jvc3MgcmVwbGF5cykgYW5kIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpXG4gICAgICAvLyB1bmlxdWVuZXNzIGluIHdvcmxkcywgdGhlIHN0b3JhZ2UgbGF5ZXIgcmVqZWN0cyBkdXBsaWNhdGVzIGFzXG4gICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aGljaCB3ZSBzd2FsbG93IGJlbG93LiBUaGlzIGRyb3BzIG9uZVxuICAgICAgLy8gbmV0d29yayByb3VuZC10cmlwIHBlciBwZW5kaW5nIGhvb2suXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRNZXRhZGF0YSA9XG4gICAgICAgICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoaG9vay5tZXRhZGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NyZWF0ZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgICAgICAgIHRva2VuUmV0ZW50aW9uVW50aWw6XG4gICAgICAgICAgICAgIGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKGhvb2sudG9rZW5SZXRlbnRpb25VbnRpbCksXG4gICAgICAgICAgICBtZXRhZGF0YTogZW5jcnlwdGVkTWV0YWRhdGEsXG4gICAgICAgICAgICAvLyBBbHdheXMgaW5jbHVkZSBpc1dlYmhvb2sgZXhwbGljaXRseS4gV29ybGRzIGRlZmF1bHQgaXQgdG9cbiAgICAgICAgICAgIC8vIGB0cnVlYCB3aGVuIGFic2VudCwgd2hpY2ggd291bGQgYnJlYWsgdGhlIHB1YmxpYyB3ZWJob29rXG4gICAgICAgICAgICAvLyBlbmRwb2ludCdzIDQwNCBndWFyZCBmb3IgaG9va3MgY3JlYXRlZCB2aWEgY3JlYXRlSG9vaygpLlxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayxcbiAgICAgICAgICAgIC8vIFN5c3RlbSBob29rcyAoQWJvcnRDb250cm9sbGVyKSBhcmUgZXhlbXB0IGZyb20gdXNlclxuICAgICAgICAgICAgLy8gdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0IGNoZWNrcy5cbiAgICAgICAgICAgIC4uLihob29rLmlzU3lzdGVtID8geyBpc1N5c3RlbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBzdG9yYWdlIGRldGVjdGVkIGEgcmVhbCB0b2tlbiBjb25mbGljdCB3aXRoIGFub3RoZXJcbiAgICAgICAgLy8gd29ya2Zsb3cncyBob29rLCByZS1xdWV1ZSBzbyB0aGUgd29ya2Zsb3cgaGFuZGxlciBjYW5cbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgY29uZmxpY3QgZXZlbnQgYW5kIGZhaWwgZ3JhY2VmdWxseS5cbiAgICAgICAgaWYgKHJlc3VsdC5ldmVudD8uZXZlbnRUeXBlID09PSAnaG9va19jb25mbGljdCcpIHtcbiAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGlkZW1wb3RlbmN5S2V5OiBgaG9va19jb25mbGljdF8ke2hvb2suY29ycmVsYXRpb25JZH1gIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjcmVhdGVkIGJ5IGEgY29uY3VycmVudCBpbnZvY2F0aW9uIOKAlCBmYWxsIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWJvcnQgcHJvY2Vzc2luZyBiZWxvdyAoaWYgYW55KSBpbnN0ZWFkIG9mIGJhaWxpbmcuXG4gICAgICAgIGlmICghRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBpZiAoaG9vay5oYXNHZXRDb25mbGljdEF3YWl0ZXIpIHtcbiAgICAgICAgY3JlYXRlZEdldENvbmZsaWN0SG9vayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhvb2suYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgIC8vIFJlY29yZCB0aGUgYWJvcnQgZHVyYWJseTogYSBob29rX3JlY2VpdmVkIGV2ZW50IGNhcnJ5aW5nXG4gICAgICAvLyB0aGUgVk0tc2VyaWFsaXplZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgcGF5bG9hZCxcbiAgICAgIC8vIHBsdXMgYSBiZXN0LWVmZm9ydCBzdHJlYW0gcGFja2V0IGZvciByZWFsLXRpbWUgc3RlcFxuICAgICAgLy8gcHJvcGFnYXRpb24uIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3Mgc3VzcGVuc2lvblxuICAgICAgLy8gaGFuZGxlciAoaG9va3NOZWVkaW5nQWJvcnQpLlxuICAgICAgY29uc3QgYWJvcnRQYXlsb2FkID1cbiAgICAgICAgaG9vay5hYm9ydFBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICAgICAgPyAoKGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgaG9vay5hYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICkpIGFzIFVpbnQ4QXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19yZWNlaXZlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHRva2VuOiBob29rLnRva2VuLFxuICAgICAgICAgICAgcGF5bG9hZDogYWJvcnRQYXlsb2FkLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy8gc3RyZWFtTmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGFib3J0IGhvb2sgdG9rZW5cbiAgICAgIC8vIChgYWJydF97aWR9YCDihpIgYHN0cm1fe2lkfV9zeXN0ZW1fYWJvcnRgKS5cbiAgICAgIGlmIChob29rLnRva2VuLnN0YXJ0c1dpdGgoJ2FicnRfJykgJiYgYWJvcnRQYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBgc3RybV8ke2hvb2sudG9rZW4uc2xpY2UoJ2FicnRfJy5sZW5ndGgpfV9zeXN0ZW1fYWJvcnRgO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUocnVuSWQsIHN0cmVhbU5hbWUsIGFib3J0UGF5bG9hZCk7XG4gICAgICAgICAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShydW5JZCwgc3RyZWFtTmFtZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IOKAlCB0aGUgaG9vayBldmVudCBwcm92aWRlcyB0aGUgZHVyYWJsZVxuICAgICAgICAgIC8vIGZhbGxiYWNrLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gd3JpdGUgYWJvcnQgc3RyZWFtIHBhY2tldCcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdhYm9ydF9yZWNvcmRlZCcsIHtcbiAgICAgICAgY29ycmVsYXRpb25JZDogaG9vay5jb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwcm9jZXNzSG9va0Rpc3Bvc2VPcCA9IGFzeW5jIChcbiAgICBvcDogUGVuZGluZ0hvb2tEaXNwb3NlXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfZGlzcG9zZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IG9wLmNvcnJlbGF0aW9uSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgIC8vIERpc3Bvc2luZyBhIGhvb2sgd2hvc2UgZW50aXR5IG5vIGxvbmdlciAob3IgbmV2ZXIpIGV4aXN0cyBpcyBhblxuICAgICAgLy8gaWRlbXBvdGVudCBuby1vcDogdGhlIGVudGl0eSBtYXkgaGF2ZSBiZWVuIHRvcm4gZG93biBieSBhXG4gICAgICAvLyBjb25jdXJyZW50IHJ1biBjYW5jZWxsYXRpb24sIG9yIHRoZSBob29rIG1heSBoYXZlIGxvc3QgaXRzXG4gICAgICAvLyB0b2tlbiBjbGFpbSB0byBhIGNvbmZsaWN0LiBUaGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gcmVsZWFzZS5cbiAgICAgIGlmIChIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpKSByZXR1cm47XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9O1xuXG4gIC8vIEhvb2sgb3BlcmF0aW9ucyBhcmUgZ3JvdXBlZCBieSB0b2tlbiBhbmQgcHJvY2Vzc2VkIFNFUVVFTlRJQUxMWSBpblxuICAvLyBjb2RlIG9yZGVyIHdpdGhpbiBlYWNoIGdyb3VwLCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gc3VzcGVuc2lvblxuICAvLyBoYW5kbGVyIChob29rSXRlbXNCeVRva2VuKTogYSBkaXNwb3NlKCkgb2YgYW4gZWFybGllciBob29rIG11c3RcbiAgLy8gcmVsZWFzZSB0aGUgdG9rZW4gYmVmb3JlIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXNcbiAgLy8gdmFsaWRhdGVkIGJ5IHRoZSB3b3JsZCDigJQgcGFyYWxsZWwgZGlzcGF0Y2ggd291bGQgb3RoZXJ3aXNlIHJlY29yZCBhXG4gIC8vIHNwdXJpb3VzIGhvb2tfY29uZmxpY3QgYWdhaW5zdCB0aGUgcnVuJ3Mgb3duIGRpc3Bvc2VkIGhvb2sgKGUuZy4gYVxuICAvLyBkaXNwb3Nl4oaScmVjcmVhdGUgbG9vcCByZXVzaW5nIG9uZSB0b2tlbikuIERpZmZlcmVudCB0b2tlbnMgaGF2ZSBub1xuICAvLyBjbGFpbSBpbnRlcmFjdGlvbiwgc28gdG9rZW4gZ3JvdXBzIHJ1biBpbiBwYXJhbGxlbCB3aXRoIGVhY2ggb3RoZXJcbiAgLy8gYW5kIHdpdGggdGhlIG5vbi1ob29rIG9wcyBiZWxvdy5cbiAgY29uc3QgaG9va09wc0J5VG9rZW4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICAoUGVuZGluZ0hvb2sgfCBQZW5kaW5nSG9va0Rpc3Bvc2UpW11cbiAgPigpO1xuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgKCFvcC5oYXNDcmVhdGVkRXZlbnQgfHwgKG9wIGFzIFBlbmRpbmdIb29rKS5hYm9ydFJlcXVlc3RlZClcbiAgICApIHtcbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9vaykudG9rZW47XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnaG9va19kaXNwb3NlJyAmJiAhb3AuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAvLyBQZXItb3AgZmFsbGJhY2sgZ3JvdXAgd2hlbiB0aGUgdG9rZW4gaXMgdW5rbm93biDigJQgbm8gb3JkZXJpbmdcbiAgICAgIC8vIGd1YXJhbnRlZXMsIG1hdGNoaW5nIHRoZSBwcmV2aW91cyBwYXJhbGxlbCBiZWhhdmlvci5cbiAgICAgIGtleSA9IChvcCBhcyBQZW5kaW5nSG9va0Rpc3Bvc2UpLnRva2VuID8/IGBfX2NpZDoke29wLmNvcnJlbGF0aW9uSWR9YDtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBncm91cCA9IGhvb2tPcHNCeVRva2VuLmdldChrZXkpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tPcHNCeVRva2VuLnNldChrZXksIFtvcCBhcyBQZW5kaW5nSG9vayB8IFBlbmRpbmdIb29rRGlzcG9zZV0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGhvb2tPcHNCeVRva2VuLnZhbHVlcygpKSB7XG4gICAgb3BzUHJvbWlzZXMucHVzaChcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb3Agb2YgZ3JvdXApIHtcbiAgICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzSG9va09wKG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgcHJvY2Vzc0hvb2tEaXNwb3NlT3Aob3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgb3AudHlwZSA9PT0gJ3N0ZXAnICYmXG4gICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAhc2tpcFN0ZXBDcmVhdGlvbj8uaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzdGVwID0gb3AgYXMgUGVuZGluZ1N0ZXA7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIC8vIENyZWF0ZSBzdGVwX2NyZWF0ZWQgZXZlbnQuIGBzdGVwLmlucHV0YCBpcyB0aGVcbiAgICAgICAgICAvLyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAoXCJkZXZsXCIgKyBkZXZhbHVlKSBwcm9kdWNlZFxuICAgICAgICAgIC8vIGJ5IGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoJ3dvcmtmbG93LXNlcmlhbGl6ZScpXSh7YXJncyxcbiAgICAgICAgICAvLyBjbG9zdXJlVmFycywgdGhpc1ZhbH0pYCBpbnNpZGUgdGhlIFZNLiBUaGUgVk0gaGFzIG5vXG4gICAgICAgICAgLy8gYWNjZXNzIHRvIHRoZSBDcnlwdG9LZXksIHNvIGVuY3J5cHRpb24gaXMgYXBwbGllZCBoZXJlXG4gICAgICAgICAgLy8gb24gdGhlIGhvc3Qgc2lkZSDigJQgbWF0Y2hpbmcgd2hhdFxuICAgICAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBkb2VzIGluIHRoZSBub2RlOnZtIGVuZ2luZS5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBhd2FpdCBlbmNyeXB0U2VyaWFsaXplZERhdGEoc3RlcC5pbnB1dCwgZW5jcnlwdGlvbktleSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBOT1RFOiBzdGVwIHF1ZXVlaW5nIGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbiDigJQgdGhlIGlubGluZVxuICAgICAgICAgIC8vIGxvb3AgZXhlY3V0ZXMgZnJlc2ggc3RlcHMgaW4gdGhlIGxpdmUgVk0gYW5kIG9ubHkgcXVldWVzIHRoZVxuICAgICAgICAgIC8vIG92ZXJmbG93IC8gcmV0cnkgLyBiYWNrc3RvcCBjYXNlcyAoc2VlIHF1ZXVlU3RlcE1lc3NhZ2UpLlxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2F0dHJpYnV0ZScgJiYgIW9wLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgY29uc3QgYXR0ciA9IG9wIGFzIFBlbmRpbmdBdHRyaWJ1dGU7XG4gICAgICBvcHNQcm9taXNlcy5wdXNoKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2F0dHJfc2V0JyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBhdHRyLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6IGF0dHIuY2hhbmdlcyxcbiAgICAgICAgICAgICAgICB3cml0ZXI6IHsgdHlwZTogJ3dvcmtmbG93JyB9LFxuICAgICAgICAgICAgICAgIC4uLihhdHRyLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBFdmVudCBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBpbnZvY2F0aW9uKSDigJQgdGhlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBzdGlsbCBuZWVkcyB0byBjb25zdW1lIGl0LCBzbyByZXF1ZXVlLlxuICAgICAgICAgICAgICBjcmVhdGVkQXR0cmlidXRlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ3dhaXQnICYmICFvcC5oYXNDcmVhdGVkRXZlbnQpIHtcbiAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgIG9wc1Byb21pc2VzLnB1c2goXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgIHJlc3VtZUF0OiBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBQZXItb3AgZGlzcGF0Y2ggcnVucyBpbiBwYXJhbGxlbC5cbiAgYXdhaXQgUHJvbWlzZS5hbGwob3BzUHJvbWlzZXMpO1xuXG4gIHJldHVybiB7IGNyZWF0ZWRBdHRyaWJ1dGVFdmVudCwgY3JlYXRlZEdldENvbmZsaWN0SG9vayB9O1xufVxuXG4vKipcbiAqIFJ1biBhIHdvcmtmbG93IHVzaW5nIHRoZSBRdWlja0pTIFdBU00gVk0gZW5naW5lLlxuICpcbiAqIFRoaXMgcmVwbGFjZXMgdGhlIGBub2RlOnZtYCByZXBsYXkgcGF0aCAocnVuV29ya2Zsb3cgKyBFdmVudHNDb25zdW1lcilcbiAqIHdpdGggYSBRdWlja0pTIFZNIGludm9jYXRpb24gdGhhdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheS5cbiAqXG4gKiBLTk9XTiBHQVAg4oCUIHByZWNvbmRpdGlvbiBndWFyZDogdW5saWtlIHRoZSBub2RlOnZtIHBhdGgsIG5vIGV2ZW50IHdyaXRlXG4gKiBpbiB0aGlzIGZpbGUgcGFydGljaXBhdGVzIGluIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IHByZWNvbmRpdGlvblxuICogZ3VhcmQgKGB3aXRoUHJlY29uZGl0aW9uUmV0cnlgICsgYHN0YXRlVXBkYXRlZEF0Rm9yQ3JlYXRlYCksIHdoaWNoXG4gKiBwcm90ZWN0cyBhIHdyaXRlciBob2xkaW5nIGEgc3RhbGUgZXZlbnQtbG9nIHNuYXBzaG90IGZyb20gY2xvYmJlcmluZyBhXG4gKiBjb25jdXJyZW50IG9uZS4gVGhlIGVuZ2luZSBjdXJyZW50bHkgcmVsaWVzIG9uIHBlci0ocnVuSWQsXG4gKiBjb3JyZWxhdGlvbklkKSBldmVudCB1bmlxdWVuZXNzIChFbnRpdHlDb25mbGljdEVycm9yIGRlZHVwKSBhbG9uZS4gVGhpc1xuICogaXMgYSBkZWxpYmVyYXRlIHNpbXBsaWZpY2F0aW9uIHdoaWxlIHRoZSBlbmdpbmUgaXMgZXhwZXJpbWVudGFsIOKAlCB3aXJpbmdcbiAqIHRoZSBndWFyZCBpcyB0cmFja2VkIGZvbGxvdy11cCB3b3JrOyBhbnlvbmUgYWRkaW5nIG5ldyB3cml0ZSBwYXRocyBoZXJlXG4gKiBzaG91bGQgbm90IGFzc3VtZSBwYXJpdHkgd2l0aCB0aGUgbm9kZSBlbmdpbmUgb24gdGhpcyBheGlzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dXaXRoUXVpY2tKUyhwYXJhbXM6IHtcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIC8qKlxuICAgKiBFdmVudHMgcmV0dXJuZWQgaW5saW5lIGJ5IGBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcsIC4uLilgIG9yIGJ5XG4gICAqIHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoJ3MgYGhvb2tfcmVjZWl2ZWRgIHByZWxvYWQuIFdoZW4gdGhleSBpbmRpY2F0ZVxuICAgKiBhIGZpcnN0IGludm9jYXRpb24g4oCUIG9yIHdoZW4gYHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlYCBhdHRlc3RzIHRoZXlcbiAgICogYXJlIHRoZSBjb21wbGV0ZSBsb2cg4oCUIHRoZXkgYXJlIHVzZWQgYXMgdGhlIGV2ZW50IGxvZyBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIHZpYSBgZXZlbnRzLmxpc3RgLCBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBmYXN0IHBhdGguXG4gICAqL1xuICBwcmVsb2FkZWRFdmVudHM/OiBFdmVudFtdO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBjYWxsZXIgaGFzIHZhbGlkYXRlZCB0aGF0IGBwcmVsb2FkZWRFdmVudHNgIGlzIHRoZSBydW4nc1xuICAgKiBDT01QTEVURSBldmVudCBsb2cgKGUuZy4gdGhlIGxhenkgaG9vayBmYXN0IHBhdGgncyBoYXNNb3JlLWZhbHNlXG4gICAqIHJlcGxheSBwcmVsb2FkKS4gVGhlIGZpcnN0LWludm9jYXRpb24gaGV1cmlzdGljIGJlbG93IG9ubHkgcmVjb2duaXplc1xuICAgKiBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZC1vbmx5IHByZWxvYWRzLCBzbyB3aXRob3V0IHRoaXMgYXR0ZXN0YXRpb24gYVxuICAgKiBob29rLXJlc3VtZSBwcmVsb2FkIHdvdWxkIGJlIGRpc2NhcmRlZCBhbmQgcmVmZXRjaGVkLlxuICAgKi9cbiAgcHJlbG9hZGVkRXZlbnRzQ29tcGxldGU/OiBib29sZWFuO1xuICAvKipcbiAgICogUnVuIGlucHV0IGNhcnJpZWQgdGhyb3VnaCB0aGUgcXVldWUgbWVzc2FnZSBvbiBmaXJzdCBkZWxpdmVyeS4gVXNlZFxuICAgKiBhcyBhIGxhc3QtcmVzb3J0IGZhbGxiYWNrIGZvciBgcnVuX2NyZWF0ZWQuZXZlbnREYXRhLmlucHV0YCB3aGVuXG4gICAqIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIHJ1bklucHV0PzogUnVuSW5wdXQ7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IE9UZWwgc3BhbiAodGhlIG91dGVyIGBXT1JLRkxPVyB7d29ya2Zsb3dOYW1lfWAgc3BhbiBmcm9tXG4gICAqIGBydW50aW1lLnRzYCkuIFdoZW4gc3VwcGxpZWQsIFZNIGxpZmVjeWNsZSBhdHRyaWJ1dGVzIGFyZSBhdHRhY2hlZFxuICAgKiB0byBpdCBmb3IgZW5kLXRvLWVuZCB2aXNpYmlsaXR5LlxuICAgKi9cbiAgcGFyZW50U3Bhbj86IFNwYW47XG4gIC8qKlxuICAgKiBTZXJ2ZXItc3VwcGxpZWQgcGVyLXJ1biBldmVudCBjZWlsaW5nIGZyb20gdGhlIHJ1bl9zdGFydGVkIHJlc3BvbnNlXG4gICAqICh1bmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50KS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyBndWFyZDpcbiAgICogYSBydW5hd2F5IHJ1biBpcyBmYWlsZWQgb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlIGNlaWxpbmcuIFRoZSB0aHJvd1xuICAgKiBwcm9wYWdhdGVzIHRvIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMgKHRoZSBRdWlja0pTXG4gICAqIGRpc3BhdGNoIHJ1bnMgaW5zaWRlIHRoYXQgbG9vcCdzIHRyeSksIHdoaWNoIGNsYXNzaWZpZXMgaXQgYW5kXG4gICAqIHJlY29yZHMgcnVuX2ZhaWxlZCB3aXRoIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAqL1xuICBtYXhFdmVudHNMaW1pdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHQgb2YgdGhlIG1lc3NhZ2UgZHJpdmluZyB0aGlzIGludm9jYXRpb24gKGZyb21cbiAgICogdGhlIHF1ZXVlIGhhbmRsZXIncyBtZXRhZGF0YTsgMSA9IGZpcnN0IGRlbGl2ZXJ5KS4gU3VyZmFjZWQgaW5cbiAgICogZGlhZ25vc3RpY3M7IGNyYXNoIHJlY292ZXJ5IGl0c2VsZiBpcyBkcml2ZW4gYnkgdGhlIG93bmVyc2hpcC1sZWFzZVxuICAgKiBkZWNpc2lvbiB0YWJsZSBpbiB0aGUgbG9vcCwgbm90IGJ5IHRoZSBhdHRlbXB0IGNvdW50LlxuICAgKi9cbiAgZGVsaXZlcnlBdHRlbXB0PzogbnVtYmVyO1xuICAvKipcbiAgICogUXVldWUgbWVzc2FnZSBJRCBvZiB0aGUgZGVsaXZlcnkgZHJpdmluZyB0aGlzIGludm9jYXRpb24sIHN0YW1wZWQgYXNcbiAgICogYG93bmVyTWVzc2FnZUlkYCBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXMgZGVmZXIgdG9cbiAgICogdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2YgcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICovXG4gIG93bmVyTWVzc2FnZUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIHJlc29sdmVkIGF0IHJvdXRlIHJlZ2lzdHJhdGlvbiAocnVudGltZS50cykuIE11c3QgYmVcbiAgICogdGhyZWFkZWQgaW50byBldmVyeSBtZXNzYWdlIHB1Ymxpc2g6IHRoZSBidWlsZGVycyBiYWtlIHRoZSBuYW1lc3BhY2VcbiAgICogaW50byBnZW5lcmF0ZWQgcm91dGVzLCBzbyBjb25zdW1lcnMgbGlzdGVuIG9uIGBfXzxucz5fd2tmX3dvcmtmbG93XypgXG4gICAqIOKAlCBhIHB1Ymxpc2ggd2l0aG91dCBpdCBsYW5kcyBvbiBgX193a2Zfd29ya2Zsb3dfKmAgYW5kIGlzIG5ldmVyXG4gICAqIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFJ1bi1vcmlnaW4gdHJhY2UgY2FycmllciBhY2Nlc3NvciBmcm9tIHJ1bnRpbWUudHNcbiAgICogKGdldE5leHRUcmFjZUNhcnJpZXIpLiBJbiB0aGUgZGVmYXVsdCBgbGlua2VkYCB0cmFjZSBtb2RlIGV2ZXJ5XG4gICAqIGludm9jYXRpb24gbXVzdCBsaW5rIGJhY2sgdG8gdGhlIHJ1bidzIG9yaWdpbiAod29ya2Zsb3cuc3RhcnQpIGluIGFcbiAgICogc3RhcjsgY2FwdHVyaW5nIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dCBpbnN0ZWFkIHdvdWxkIGNoYWluXG4gICAqIGludm9jYXRpb25zIHRvIGVhY2ggb3RoZXIgYW5kIGZyYWdtZW50IHRoZSBydW4gdmlldyBvbiBhc3luYyBxdWV1ZXMuXG4gICAqL1xuICBuZXh0VHJhY2VDYXJyaWVyPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn0pOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM/OiBudW1iZXIgfSB8IHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgcHJlbG9hZGVkRXZlbnRzLFxuICAgIHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlLFxuICAgIHJ1bklucHV0LFxuICAgIHBhcmVudFNwYW4sXG4gICAgbWF4RXZlbnRzTGltaXQsXG4gICAgZGVsaXZlcnlBdHRlbXB0LFxuICAgIG93bmVyTWVzc2FnZUlkLFxuICAgIG5hbWVzcGFjZSxcbiAgfSA9IHBhcmFtcztcbiAgLy8gU3RhbmRhbG9uZS1jYWxsZXIgZmFsbGJhY2sgKHRlc3RzKTogd2l0aG91dCBhIHJ1bnRpbWUudHMgY2FycmllclxuICAvLyBhY2Nlc3NvciwgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGludm9jYXRpb24gY29udGV4dC5cbiAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9XG4gICAgcGFyYW1zLm5leHRUcmFjZUNhcnJpZXIgPz8gKCgpID0+IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpKTtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICBjb25zdCBydW5JZCA9IHdvcmtmbG93UnVuLnJ1bklkO1xuICBjb25zdCBpbnZvY2F0aW9uU3RhcnQgPSB0aWNrKCk7XG5cbiAgLy8gU3RyaXAgdGhlIGlubGluZSBzb3VyY2UgbWFwIGNvbW1lbnQgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIGJ1bmRsZSBpblxuICAvLyB0aGUgUXVpY2tKUyBWTS4gVGhlIG1hcCBpcyBwdXJlbHkgaG9zdC1zaWRlIG1ldGFkYXRhIGZvclxuICAvLyBgcmVtYXBFcnJvclN0YWNrYCAoY2FsbGVkIGJlbG93IG9uIHdvcmtmbG93IGZhaWx1cmVzLCBhZ2FpbnN0IHRoZVxuICAvLyBPUklHSU5BTCBgd29ya2Zsb3dDb2RlYCkuIFF1aWNrSlMgcmV0YWlucyBzb3VyY2UgdGV4dCBmb3JcbiAgLy8gc3RhY2stdHJhY2UgbGluZSBsb29rdXBzLCBzbyB0aGUgZmV3LU1CIGJhc2U2NCBjb21tZW50IHdvdWxkIGJsb2F0XG4gIC8vIHRoZSBWTSBoZWFwIGZvciBubyBiZW5lZml0LlxuICBjb25zdCB3b3JrZmxvd0NvZGVGb3JWTSA9IHN0cmlwSW5saW5lU291cmNlTWFwKHdvcmtmbG93Q29kZSk7XG5cbiAgLy8gUGVyLWludm9jYXRpb24gZGlhZ25vc3RpYyBpZCBzbyBkZWJ1ZyBsb2dzIGNhbiBiZSBjb3JyZWxhdGVkIGV2ZW4gaWZcbiAgLy8gdGhlIHNhbWUgcnVuSWQgaXMgcHJvY2Vzc2VkIGJ5IG92ZXJsYXBwaW5nIGludm9jYXRpb25zIG9uIGRpZmZlcmVudFxuICAvLyBmdW5jdGlvbiBpbnN0YW5jZXMuXG4gIGNvbnN0IGludm9jYXRpb25JZCA9IGBpbnZfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcblxuICAvLyBTdHJ1Y3R1cmVkIHBlci1jaGVja3BvaW50IGRpYWdub3N0aWMgaGVscGVyLCBncmVwLWZyaWVuZGx5IGJ5IHJ1bklkLlxuICBjb25zdCB3ZmRpYWcgPSAoY2hlY2twb2ludDogc3RyaW5nLCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUVVJQ0tKU19WTV9ESUFHJywge1xuICAgICAgY2hlY2twb2ludCxcbiAgICAgIHJ1bklkLFxuICAgICAgaW52b2NhdGlvbklkLFxuICAgICAgdEVsYXBzZWRNczogTWF0aC5yb3VuZCh0aWNrKCkgLSBpbnZvY2F0aW9uU3RhcnQpLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICB9O1xuXG4gIHBhcmVudFNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1ZtKCdxdWlja2pzJyksXG4gIH0pO1xuXG4gIHdmZGlhZygnZW50ZXInLCB7XG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIGRlbGl2ZXJ5QXR0ZW1wdCxcbiAgICBoYXNQcmVsb2FkZWRFdmVudHM6XG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiYgcHJlbG9hZGVkRXZlbnRzLmxlbmd0aCA+IDAsXG4gICAgcHJlbG9hZGVkRXZlbnRDb3VudDogcHJlbG9hZGVkRXZlbnRzPy5sZW5ndGggPz8gMCxcbiAgICBoYXNSdW5JbnB1dDogISFydW5JbnB1dCxcbiAgfSk7XG5cbiAgLy8gVGhlIHdvcmtmbG93TmFtZSBmcm9tIHRoZSBxdWV1ZSB0b3BpYyBpcyBhbHJlYWR5IHRoZSBmdWxsIHdvcmtmbG93IElEXG4gIC8vIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIilcbiAgY29uc3Qgd29ya2Zsb3dJZCA9IHdvcmtmbG93TmFtZTtcblxuICAvLyBSZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSB1cCBmcm9udCDigJQgbmVlZGVkIHRvIGRlY3J5cHQgZXZlbnRcbiAgLy8gcGF5bG9hZHMgaW5zaWRlIHRoZSBWTSBhbmQgdG8gZW5jcnlwdCBldmVudCBwYXlsb2FkcyB3cml0dGVuIGJlbG93LlxuICAvLyBSZXNvbHZlIHRoZSBGVUxMIGNhcGFiaWxpdHkgKHN5bW1ldHJpYyBBRVMga2V5ICsgWDI1NTE5IGtleXBhaXIpLCBub3RcbiAgLy8ganVzdCBgaW1wb3J0S2V5KHJhd0tleSlgOiBhIHJ1biByZWFkaW5nIGl0cyBvd24gZXZlbnQgbG9nIGNhbiBlbmNvdW50ZXJcbiAgLy8gc2VhbGVkIChgZW5jcGApIGhvb2sgcGF5bG9hZHMgdGhhdCBhIGNyb3NzLWRlcGxveW1lbnQgYHJlc3VtZUhvb2soKWBcbiAgLy8gd3JvdGUgdG8gaXQgKHNlYWxpbmcgaXMgcHJlc2VuY2UtZ2F0ZWQgb24gdGhlIHJ1bidzIHB1Ymxpc2hlZFxuICAvLyBlbmNyeXB0aW9uUHVibGljS2V5LCB3aGljaCB0aGUgc2hhcmVkIHN0YXJ0KCkgcGF0aCBzdGFtcHMgcmVnYXJkbGVzcyBvZlxuICAvLyBlbmdpbmUpLiBBIGJhcmUgc3ltbWV0cmljIGtleSBjYW5ub3Qgb3BlbiB0aG9zZSBhbmQgd291bGQgd2VkZ2UgdGhlIHJ1blxuICAvLyByaWdodCBhZnRlciBob29rX3JlY2VpdmVkIOKAlCB0aGUgbm9kZTp2bSBlbmdpbmUgcmVzb2x2ZXMgdGhlIHNhbWUgZnVsbFxuICAvLyBjYXBhYmlsaXR5IHZpYSBtZW1vaXplRW5jcnlwdGlvbktleS5cbiAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gTG9hZCB0aGUgRlVMTCBldmVudCBsb2cgZm9yIHRoZSBydW4uIE9uIGZpcnN0IGludm9jYXRpb24gdGhlXG4gIC8vIHByZWxvYWRlZCBldmVudHMgZnJvbSB0aGUgcnVuX3N0YXJ0ZWQgcmVzcG9uc2UgYXJlIHRoZSBjb21wbGV0ZSBsb2dcbiAgLy8gYW5kIHNhdmUgdGhlIGV2ZW50cy5saXN0IHJvdW5kLXRyaXBzOyBhIGNhbGxlci1hdHRlc3RlZCBjb21wbGV0ZVxuICAvLyBwcmVsb2FkIChsYXp5IGhvb2sgZmFzdCBwYXRoKSBpcyB0cnVzdGVkIHRoZSBzYW1lIHdheS5cbiAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgbGV0IGV2ZW50c0ZldGNoZWRQYWdlcyA9IDA7XG4gIGNvbnN0IHVzZVByZWxvYWRlZCA9XG4gICAgKHByZWxvYWRlZEV2ZW50c0NvbXBsZXRlID09PSB0cnVlICYmXG4gICAgICBBcnJheS5pc0FycmF5KHByZWxvYWRlZEV2ZW50cykgJiZcbiAgICAgIHByZWxvYWRlZEV2ZW50cy5sZW5ndGggPiAwKSB8fFxuICAgIGlzRmlyc3RJbnZvY2F0aW9uKHByZWxvYWRlZEV2ZW50cyk7XG4gIGlmICh1c2VQcmVsb2FkZWQgJiYgcHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgZXZlbnRzID0gcHJlbG9hZGVkRXZlbnRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNNb3JlID0gdHJ1ZTtcblxuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXZlbnRzRmV0Y2hlZFBhZ2VzKys7XG4gICAgICBhbGxFdmVudHMucHVzaCguLi5yZXNwb25zZS5kYXRhKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3Vyc29yIHRvIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseSBmZXRjaGVkIHBhZ2UncyBjdXJzb3IuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIHdlIGdvdCByZXN1bHRzIOKAlCB0aGUgZmluYWwgZW1wdHktcGFnZSByZXNwb25zZVxuICAgICAgLy8gcmV0dXJucyBjdXJzb3I9bnVsbCB3aGljaCB3ZSBtdXN0IE5PVCB1c2UgKGl0IHdvdWxkIHJlc2V0IHRoZSBjdXJzb3IpLlxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikge1xuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3I7XG4gICAgICB9XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuZGF0YS5sZW5ndGggPiAwICYmIHJlc3BvbnNlLmN1cnNvciAhPSBudWxsO1xuICAgIH1cblxuICAgIGV2ZW50cyA9IGFsbEV2ZW50cztcbiAgfVxuXG4gIC8vIEV2ZW50LWxpbWl0IGd1YXJkOiBmYWlsIGEgcnVuYXdheSBydW4gb25jZSBpdHMgbG9nIHJlYWNoZXMgdGhlXG4gIC8vIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nIOKAlCBzYW1lIGVuZm9yY2VtZW50IHBvaW50IGFzIHRoZSBub2RlOnZtXG4gIC8vIGVuZ2luZSdzIHJlcGxheSBsb29wLlxuICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBldmVudHMubGVuZ3RoID49IG1heEV2ZW50c0xpbWl0KSB7XG4gICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IoZXZlbnRzLmxlbmd0aCwgbWF4RXZlbnRzTGltaXQpO1xuICB9XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNFdmVudHNQcmVsb2FkZWQodXNlUHJlbG9hZGVkKSxcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c0ZldGNoZWRDb3VudChldmVudHMubGVuZ3RoKSxcbiAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU0V2ZW50c0ZldGNoZWRQYWdlcyhldmVudHNGZXRjaGVkUGFnZXMpLFxuICB9KTtcblxuICB3ZmRpYWcoJ2V2ZW50c19mZXRjaGVkJywge1xuICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgZXZlbnRzRmV0Y2hlZFBhZ2VzLFxuICAgIHVzZVByZWxvYWRlZCxcbiAgICBldmVudFR5cGVzOiBldmVudHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KChhY2MsIGUpID0+IHtcbiAgICAgIGFjY1tlLmV2ZW50VHlwZV0gPSAoYWNjW2UuZXZlbnRUeXBlXSA/PyAwKSArIDE7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KSxcbiAgfSk7XG5cbiAgLy8gQ2hlY2sgZm9yIGVsYXBzZWQgd2FpdHNcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgZXZlbnRzXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICBldmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZXZlbnQuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAgICdldmVudERhdGEnIGluIGV2ZW50XG4gICAgICAgICAgPyAoZXZlbnQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzdW1lQXQgPSBldmVudERhdGE/LnJlc3VtZUF0O1xuICAgICAgaWYgKHJlc3VtZUF0ICYmIG5vdyA+PSBuZXcgRGF0ZShyZXN1bWVBdCBhcyBzdHJpbmcpLmdldFRpbWUoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3dhaXRfY29tcGxldGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5ldmVudCkgZXZlbnRzLnB1c2gocmVzdWx0LmV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgY29udGludWU7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzb2x2ZSB0aGUgd29ya2Zsb3cgc2VydmVyIHBvcnQgc28gYGdldFdvcmtmbG93TWV0YWRhdGEoKS51cmxgIGluc2lkZVxuICAvLyB0aGUgVk0gbWF0Y2hlcyB3aGF0IHRoZSBzdGVwLXNpZGUgaGFuZGxlciByZXBvcnRzLiBTa2lwcGVkIG9uIFZlcmNlbCDigJRcbiAgLy8gdGhlIFZNIHJlYWRzIFZFUkNFTF9VUkwgZGlyZWN0bHkgaW4gdGhhdCBlbnZpcm9ubWVudC5cbiAgY29uc3QgaXNWZXJjZWwgPSBwcm9jZXNzLmVudi5WRVJDRUxfVVJMICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcnQgPSBpc1ZlcmNlbCA/IHVuZGVmaW5lZCA6IGF3YWl0IGdldFBvcnRMYXp5KCk7XG5cbiAgLy8gUnVuIHRoZSB3b3JrZmxvdyBpbiB0aGUgUXVpY2tKUyBWTVxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IGludm9raW5nIFZNJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIHdvcmtmbG93SWQsXG4gICAgZXZlbnRDb3VudDogZXZlbnRzLmxlbmd0aCxcbiAgfSk7XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0UXVpY2tKU1dvcmtmbG93KHtcbiAgICAvLyBQYXNzIHRoZSBTVFJJUFBFRCBidW5kbGUgdG8gdGhlIFZNIHNvIHRoZSBpbmxpbmUgc291cmNlIG1hcFxuICAgIC8vIGRvZXNuJ3QgZW5kIHVwIGluIHRoZSBRdWlja0pTIGhlYXAuIFRoZSBvcmlnaW5hbCAodW5zdHJpcHBlZClcbiAgICAvLyBgd29ya2Zsb3dDb2RlYCBpcyBzdGlsbCBrZXB0IGluIHRoaXMgaG9zdC1zaWRlIHNjb3BlIGFuZCBpcyB1c2VkXG4gICAgLy8gYnkgYHJlbWFwRXJyb3JTdGFja2Agb24gd29ya2Zsb3cgZmFpbHVyZXMgYmVsb3cuXG4gICAgd29ya2Zsb3dDb2RlOiB3b3JrZmxvd0NvZGVGb3JWTSxcbiAgICB3b3JrZmxvd0lkLFxuICAgIHdvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICB3b3JsZENhcGFiaWxpdGllczogd29ybGQuY2FwYWJpbGl0aWVzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcG9ydCxcbiAgICBydW5JbnB1dCxcbiAgfSk7XG4gIGxldCByZXN1bHQgPSBzZXNzaW9uLnJlc3VsdDtcblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IFZNIHJldHVybmVkJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGNvbXBsZXRlZDogISFyZXN1bHQuY29tcGxldGVkLFxuICAgIHN1c3BlbmRlZDogISFyZXN1bHQuc3VzcGVuZGVkLFxuICAgIGZhaWxlZDogISFyZXN1bHQuZmFpbGVkLFxuICAgIHBlbmRpbmdPcHNDb3VudDogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lmxlbmd0aCxcbiAgfSk7XG5cbiAgd2ZkaWFnKCd2bV9yZXR1cm5lZCcsIHtcbiAgICBvdXRjb21lOiByZXN1bHQuY29tcGxldGVkXG4gICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICA6IHJlc3VsdC5zdXNwZW5kZWRcbiAgICAgICAgPyAnc3VzcGVuZGVkJ1xuICAgICAgICA6IHJlc3VsdC5mYWlsZWRcbiAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgOiAndW5rbm93bicsXG4gICAgcGVuZGluZ09wc0NvdW50OiByZXN1bHQuc3VzcGVuZGVkPy5wZW5kaW5nT3BlcmF0aW9ucz8ubGVuZ3RoID8/IDAsXG4gICAgcGVuZGluZ09wU3VtbWFyeTogcmVzdWx0LnN1c3BlbmRlZD8ucGVuZGluZ09wZXJhdGlvbnM/Lm1hcCgocCkgPT4gKHtcbiAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgIGhhc0NyZWF0ZWRFdmVudDogcC5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICAuLi4ocC50eXBlID09PSAnc3RlcCcgPyB7IHN0ZXBJZDogKHAgYXMgUGVuZGluZ1N0ZXApLnN0ZXBJZCB9IDoge30pLFxuICAgIH0pKSxcbiAgICBmYWlsdXJlTWVzc2FnZTogcmVzdWx0LmZhaWxlZD8ubWVzc2FnZSxcbiAgICBmYWlsdXJlTmFtZTogcmVzdWx0LmZhaWxlZD8ubmFtZSxcbiAgfSk7XG5cbiAgLy8gLS0tLSBJbmxpbmUgY29udGludWF0aW9uIGxvb3AgLS0tLVxuICAvL1xuICAvLyBXaGlsZSB0aGUgd29ya2Zsb3cgaXMgc3VzcGVuZGVkLCB0aGlzIGxvb3Aga2VlcHMgdGhlIFZNIGFsaXZlIGFuZFxuICAvLyBtYWtlcyBhcyBtdWNoIGZvcndhcmQgcHJvZ3Jlc3MgYXMgcG9zc2libGUgd2l0aGluIG9uZSBpbnZvY2F0aW9uOlxuICAvL1xuICAvLyAgIDEuIERpc3BhdGNoIGR1cmFibGUgc2lkZSBlZmZlY3RzIGZvciB0aGUgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzXG4gIC8vICAgICAgKHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIGF0dHJfc2V0IC8gd2FpdF9jcmVhdGVkIC9cbiAgLy8gICAgICBob29rX3JlY2VpdmVkIGZvciBhYm9ydHMpIGFuZCBjb21wbGV0ZSBlbGFwc2VkIHdhaXRzLlxuICAvLyAgIDIuIEZlZWQgYWxsIG5ld2x5IHJlY29yZGVkIGV2ZW50cyAoYXR0cl9zZXQsIGhvb2tfY3JlYXRlZCwgZWxhcHNlZFxuICAvLyAgICAgIHdhaXRfY29tcGxldGVkLCB0ZXJtaW5hbHMgd3JpdHRlbiBieSBjb25jdXJyZW50IGludm9jYXRpb25zLCAuLi4pXG4gIC8vICAgICAgaW50byB0aGUgTElWRSBWTSB2aWEgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMg4oCUIHJlc3VtaW5nXG4gIC8vICAgICAgZXhlY3V0aW9uIGV4YWN0bHkgd2hlcmUgaXQgbGVmdCBvZmYsIG5vIGZyZXNoLVZNIHJlLXJlcGxheS5cbiAgLy8gICAgICBDaGVhcCBwcm9ncmVzcyBpcyBmZWQgQkVGT1JFIHJ1bm5pbmcgc3RlcCBib2RpZXMgc28gcHJvbWlzZVxuICAvLyAgICAgIGNoYWlucyB0aGF0IGFyZSBub3QgZ2F0ZWQgb24gc3RlcHMgKGhvb2suZ2V0Q29uZmxpY3QoKSxcbiAgLy8gICAgICBzZXRBdHRyaWJ1dGVzKCksIHJhY2luZyBzbGVlcHMpIGFkdmFuY2UgZmlyc3QgYW5kIGNhbiBzdXJmYWNlXG4gIC8vICAgICAgYWRkaXRpb25hbCBwZW5kaW5nIHN0ZXBzIGZvciB0aGUgc2FtZSBpbmxpbmUgYmF0Y2guXG4gIC8vICAgMy4gT25jZSBubyBjaGVhcCBwcm9ncmVzcyByZW1haW5zLCBleGVjdXRlIHVwIHRvXG4gIC8vICAgICAgZ2V0TWF4SW5saW5lU3RlcHMoKSBzdGVwcyBjcmVhdGVkIGJ5IFRISVMgaW52b2NhdGlvbiBpbmxpbmUgKG5vXG4gIC8vICAgICAgcXVldWUgcm91bmQtdHJpcCksIGluIHBhcmFsbGVsLCB3aXRoIHRoZSByZXBsYXkgYnVkZ2V0IHBhdXNlZFxuICAvLyAgICAgIGR1cmluZyBzdGVwIGJvZGllcyDigJQgbWlycm9yaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIGlubGluZVxuICAvLyAgICAgIHJlcGxheSBsb29wLiBPdmVyZmxvdyBhbmQgcmV0cnkvdGhyb3R0bGVkIHN0ZXBzIGFyZSBxdWV1ZWQgZm9yXG4gIC8vICAgICAgYmFja2dyb3VuZCBleGVjdXRpb24uIEEgZGVsYXllZCB3YWl0LWNvbnRpbnVhdGlvbiBtZXNzYWdlIGlzXG4gIC8vICAgICAgZW5xdWV1ZWQgZm9yIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCBmaXJzdCwgc28gcmFjaW5nIHRpbWVyc1xuICAvLyAgICAgIGZpcmUgb24gdGltZSAoaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uKSB3aGlsZSBzdGVwIGJvZGllcyBibG9ja1xuICAvLyAgICAgIHRoaXMgb25lLlxuICAvL1xuICAvLyBUaGUgbG9vcCBleGl0cyB3aGVuIHRoZSB3b3JrZmxvdyBzZXR0bGVzLCBubyBmb3J3YXJkIHByb2dyZXNzIGlzXG4gIC8vIHBvc3NpYmxlIGluLXByb2Nlc3MsIHRoZSByZXBsYXkgYnVkZ2V0IGlzIGV4aGF1c3RlZCwgb3IgdGhlIHJ1biBpc1xuICAvLyBnb25lLlxuICBjb25zdCBzZWVuRXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50SWQpIHNlZW5FdmVudElkcy5hZGQoZS5ldmVudElkKTtcbiAgfVxuICAvLyBTdGVwIGNpZHMgYWxyZWFkeSBleGVjdXRlZCBpbmxpbmUgYnkgdGhpcyBpbnZvY2F0aW9uLlxuICBjb25zdCBleGVjdXRlZFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gU3RlcHMgZm9yIHdoaWNoIFRISVMgaW52b2NhdGlvbiBhbHJlYWR5IHNlbnQgYSBxdWV1ZSBtZXNzYWdlLlxuICBjb25zdCBxdWV1ZWRTdGVwSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIEFib3J0cyBUSElTIGludm9jYXRpb24gYWxyZWFkeSByZWNvcmRlZCAoaG9va19yZWNlaXZlZCB3cml0dGVuKSDigJRcbiAgLy8gZ3VhcmRzIGFnYWluc3QgcmUtcmVjb3JkaW5nIHdoZW4gdGhlIFZNLXNpZGUgZmxhZyBoYXMgbm90IGJlZW5cbiAgLy8gY2xlYXJlZCB5ZXQgd2l0aGluIHRoZSBzYW1lIGl0ZXJhdGlvbi5cbiAgY29uc3QgcmVjb3JkZWRBYm9ydElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBXYWl0cyBmb3Igd2hpY2ggVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgY29tcGxldGVkL3NjaGVkdWxlZCB3b3JrLlxuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzMiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YXRlIHBlciBzdGVwIGNvcnJlbGF0aW9uSWQsIGRlcml2ZWQgZnJvbSBldmVyeVxuICAvLyBldmVudCB0aGlzIGludm9jYXRpb24gb2JzZXJ2ZXMgKGluaXRpYWwgbG9nICsgZXZlcnkgZmVlZCkg4oCUIHRoZVxuICAvLyBxdWlja2pzIGFuYWxvZyBvZiB0aGUgcmVwbGF5LWRlcml2ZWQgb3duZXJzaGlwIG9uIHRoZSBub2RlIGVuZ2luZSdzXG4gIC8vIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtIChzZWUgc3RlcC1vd25lcnNoaXAudHMpLiBMYXRlc3Qtd2luczpcbiAgLy8gZXZlbnRzIGFycml2ZSBpbiBsb2cgb3JkZXIsIHNvIGEgbGF0ZXIgc3RlcF9zdGFydGVkIG92ZXJ3cml0ZXMgdGhlXG4gIC8vIHN0YW1wOyBhIHN0ZXBfcmV0cnlpbmcgbGFwc2VzIG93bmVyc2hpcCBwZXJtYW5lbnRseSBmb3IgdGhlIGlkLlxuICBjb25zdCBzdGVwT3duZXJzaGlwID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBvd25lcj86IHN0cmluZzsgc3RhcnRlZEF0TXM/OiBudW1iZXI7IHNhd1JldHJ5aW5nOiBib29sZWFuIH1cbiAgPigpO1xuICBjb25zdCBvYnNlcnZlRXZlbnRzRm9yT3duZXJzaGlwID0gKG9ic2VydmVkOiBFdmVudFtdKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBlIG9mIG9ic2VydmVkKSB7XG4gICAgICBpZiAoZS5jb3JyZWxhdGlvbklkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgICBjb25zdCBvd25lciA9XG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZSAmJlxuICAgICAgICAgIGUuZXZlbnREYXRhICYmXG4gICAgICAgICAgJ293bmVyTWVzc2FnZUlkJyBpbiBlLmV2ZW50RGF0YSAmJlxuICAgICAgICAgIHR5cGVvZiBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBwcmlvciA9IHN0ZXBPd25lcnNoaXAuZ2V0KGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIHN0ZXBPd25lcnNoaXAuc2V0KGUuY29ycmVsYXRpb25JZCwge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHN0YXJ0ZWRBdE1zOiBlLmNyZWF0ZWRBdCA/ICtuZXcgRGF0ZShlLmNyZWF0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2F3UmV0cnlpbmc6IHByaW9yPy5zYXdSZXRyeWluZyA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgICAgY29uc3QgcHJpb3IgPSBzdGVwT3duZXJzaGlwLmdldChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBzdGVwT3duZXJzaGlwLnNldChlLmNvcnJlbGF0aW9uSWQsIHtcbiAgICAgICAgICAuLi4ocHJpb3IgPz8ge30pLFxuICAgICAgICAgIHNhd1JldHJ5aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIG9ic2VydmVFdmVudHNGb3JPd25lcnNoaXAoZXZlbnRzKTtcbiAgY29uc3Qgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWF4SW5saW5lU3RlcHMgPSBnZXRNYXhJbmxpbmVTdGVwcygpO1xuICBjb25zdCBidWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG4gIGNvbnN0IHdvcmtmbG93U3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0XG4gICAgPyArd29ya2Zsb3dSdW4uc3RhcnRlZEF0XG4gICAgOiBEYXRlLm5vdygpO1xuICBjb25zdCByb290UnVuSWQgPVxuICAgICh3b3JrZmxvd1J1bi5hdHRyaWJ1dGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5bXG4gICAgICBST09UX1JVTl9JRF9BVFRSSUJVVEVcbiAgICBdID8/IHJ1bklkO1xuICBsZXQgaW5saW5lU3RlcHNFeGVjdXRlZCA9IDA7XG4gIGxldCBydW5Hb25lID0gZmFsc2U7XG4gIC8vIFNldCB3aGVuIHRoaXMgaW52b2NhdGlvbiB3cm90ZSBhbiBldmVudCB0aGUgd29ya2Zsb3cgbXVzdCBjb25zdW1lIHRvXG4gIC8vIG1ha2UgcHJvZ3Jlc3MgKGF0dHJfc2V0LCBnZXRDb25mbGljdC1hd2FpdGVkIGhvb2tfY3JlYXRlZCkgYW5kIHRoZVxuICAvLyBsb29wIGhhcyBub3QgeWV0IHJlYWQgaXQgYmFjayDigJQgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmdzIGNhblxuICAvLyByZXR1cm4gMCBuZXcgZXZlbnRzIHJpZ2h0IGFmdGVyIGEgd3JpdGUuIElmIGl0IGlzIHN0aWxsIHNldCB3aGVuIHRoZVxuICAvLyBsb29wIGV4aXRzIHN1c3BlbmRlZCwgdGhlIGVudHJ5cG9pbnQgcmVxdWV1ZXMgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZlxuICAvLyBleGl0aW5nIGF3YWl0aW5nX2V4dGVybmFsIHdpdGggdGhlIHVuYmxvY2tpbmcgZXZlbnQgYWxyZWFkeSB3cml0dGVuXG4gIC8vIGFuZCBub3RoaW5nIHNjaGVkdWxlZCB0byByZWFkIGl0LlxuICBsZXQgcGVuZGluZ1JlcXVldWVTaWduYWwgPSBmYWxzZTtcblxuICAvKiogRmV0Y2ggYWxsIGV2ZW50cyBub3QgeWV0IHByb2Nlc3NlZCBieSB0aGUgbGl2ZSBWTSAobG9nIG9yZGVyKS4gKi9cbiAgY29uc3QgZmV0Y2hVbnNlZW5FdmVudHMgPSBhc3luYyAoKTogUHJvbWlzZTxFdmVudFtdPiA9PiB7XG4gICAgY29uc3QgdW5zZWVuOiBFdmVudFtdID0gW107XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlIG9mIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgaWYgKGUuZXZlbnRJZCAmJiBzZWVuRXZlbnRJZHMuaGFzKGUuZXZlbnRJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoZS5ldmVudElkKSBzZWVuRXZlbnRJZHMuYWRkKGUuZXZlbnRJZCk7XG4gICAgICAgIHVuc2Vlbi5wdXNoKGUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLmN1cnNvcikgY3Vyc29yID0gcmVzcG9uc2UuY3Vyc29yO1xuICAgICAgaGFzTW9yZSA9IHJlc3BvbnNlLmRhdGEubGVuZ3RoID4gMCAmJiByZXNwb25zZS5jdXJzb3IgIT0gbnVsbDtcbiAgICB9XG4gICAgb2JzZXJ2ZUV2ZW50c0Zvck93bmVyc2hpcCh1bnNlZW4pO1xuICAgIHJldHVybiB1bnNlZW47XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICB3aGlsZSAocmVzdWx0LnN1c3BlbmRlZCAmJiAhcnVuR29uZSAmJiAhYnVkZ2V0LmlzRXhoYXVzdGVkKCkpIHtcbiAgICAgIGl0ZXJhdGlvbisrO1xuICAgICAgLy8gUmUtY2hlY2sgdGhlIGV2ZW50IGNlaWxpbmcgZXZlcnkgdHVybjogdGhlIGxvb3AgYXBwZW5kcyBldmVudHMgb25cbiAgICAgIC8vIGVhY2ggY29udGludWVXaXRoRXZlbnRzLCBzbyBhIHNpbmdsZSBpbnZvY2F0aW9uIGNhbiBvdGhlcndpc2UgZ3Jvd1xuICAgICAgLy8gdGhlIGxvZyBhcmJpdHJhcmlseSBmYXIgcGFzdCB0aGUgb3BlcmF0b3IncyBsaW1pdCAodGhlIG5vZGUgZW5naW5lXG4gICAgICAvLyByZS1jaGVja3MgcGVyIHJlcGxheSBmb3IgdGhlIHNhbWUgcmVhc29uKS4gYHNlZW5FdmVudElkc2AgY291bnRzXG4gICAgICAvLyBldmVyeSBldmVudCB0aGlzIGludm9jYXRpb24gaGFzIG9ic2VydmVkIOKAlCBpbml0aWFsIGxvZyArIGFsbFxuICAgICAgLy8gZmVlZHMuXG4gICAgICBpZiAobWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJiBzZWVuRXZlbnRJZHMuc2l6ZSA+PSBtYXhFdmVudHNMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcihzZWVuRXZlbnRJZHMuc2l6ZSwgbWF4RXZlbnRzTGltaXQpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGVuZGluZ09wZXJhdGlvbnMgPSByZXN1bHQuc3VzcGVuZGVkLnBlbmRpbmdPcGVyYXRpb25zO1xuXG4gICAgICAvLyBTZWxlY3QgdGhpcyB0dXJuJ3MgaW5saW5lIGNhbmRpZGF0ZXMgQkVGT1JFIGRpc3BhdGNoOiBmcmVzaCBzdGVwc1xuICAgICAgLy8gKG5vIHN0ZXBfY3JlYXRlZCB5ZXQpIHRoYXQgdGhpcyBpbnZvY2F0aW9uIGhhc24ndCBhbHJlYWR5IGhhbmRsZWQuXG4gICAgICAvLyBUaGVpciBzdGVwX2NyZWF0ZWQgaXMgZGVsaWJlcmF0ZWx5IE5PVCB3cml0dGVuIGJ5IGRpc3BhdGNoIOKAlCB0aGVcbiAgICAgIC8vIGlubGluZSBjbGFpbSBiZWxvdyBpcyBhIGxhenkgc3RlcF9zdGFydGVkIGNhcnJ5aW5nIHRoZSBpbnB1dCxcbiAgICAgIC8vIHdoaWNoIHRoZSB3b3JsZCBhcHBsaWVzIGFzIGFuIGF0b21pYyBjcmVhdGUtY2xhaW0uIEEgY29uY3VycmVudFxuICAgICAgLy8gaW52b2NhdGlvbiByYWNpbmcgb24gdGhlIHNhbWUgZnJlc2ggc3RlcCBsb3NlcyB0aGF0IGNsYWltIHdpdGhcbiAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IgYW5kIHNraXBzLCBzbyBzdGVwIGJvZGllcyBjYW5ub3QgZG91YmxlLXJ1blxuICAgICAgLy8gKHByZXZpb3VzbHkgYm90aCBpbnZvY2F0aW9ucyBiYXJlLXN0YXJ0ZWQgdGhlIHN0ZXAgYWZ0ZXIgb25lIGxvc3RcbiAgICAgIC8vIHRoZSBzd2FsbG93ZWQgc3RlcF9jcmVhdGVkIHJhY2UpLlxuICAgICAgY29uc3QgZnJlc2hTdGVwcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT5cbiAgICAgICAgICBvcC50eXBlID09PSAnc3RlcCcgJiZcbiAgICAgICAgICAhb3AuaGFzQ3JlYXRlZEV2ZW50ICYmXG4gICAgICAgICAgIWV4ZWN1dGVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAhcXVldWVkU3RlcElkcy5oYXMob3AuY29ycmVsYXRpb25JZClcbiAgICAgICk7XG4gICAgICBjb25zdCBpbmxpbmVDYW5kaWRhdGVzID1cbiAgICAgICAgbWF4SW5saW5lU3RlcHMgPD0gMCA/IFtdIDogZnJlc2hTdGVwcy5zbGljZSgwLCBtYXhJbmxpbmVTdGVwcyk7XG4gICAgICBjb25zdCBpbmxpbmVDbGFpbUNpZHMgPSBuZXcgU2V0KFxuICAgICAgICBpbmxpbmVDYW5kaWRhdGVzLm1hcCgoc3RlcCkgPT4gc3RlcC5jb3JyZWxhdGlvbklkKVxuICAgICAgKTtcblxuICAgICAgLy8gMS4gRHVyYWJsZSBzaWRlIGVmZmVjdHMgZm9yIHRoaXMgc3VzcGVuc2lvbidzIHBlbmRpbmcgb3BzLlxuICAgICAgY29uc3Qgb3BzVG9EaXNwYXRjaCA9IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgob3ApID0+XG4gICAgICAgIG9wLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgICAob3AgYXMgUGVuZGluZ0hvb2spLmFib3J0UmVxdWVzdGVkICYmXG4gICAgICAgIHJlY29yZGVkQWJvcnRJZHMuaGFzKG9wLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgPyAoeyAuLi5vcCwgYWJvcnRSZXF1ZXN0ZWQ6IGZhbHNlIH0gYXMgUGVuZGluZ09wZXJhdGlvbilcbiAgICAgICAgICA6IG9wXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBwZW5kaW5nT3BlcmF0aW9ucykge1xuICAgICAgICBpZiAob3AudHlwZSA9PT0gJ2hvb2snICYmIChvcCBhcyBQZW5kaW5nSG9vaykuYWJvcnRSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICByZWNvcmRlZEFib3J0SWRzLmFkZChvcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZGlzcGF0Y2hlZCA9IGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgIHdvcmxkLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IG9wc1RvRGlzcGF0Y2gsXG4gICAgICAgIHNraXBTdGVwQ3JlYXRpb246IGlubGluZUNsYWltQ2lkcyxcbiAgICAgICAgd2ZkaWFnLFxuICAgICAgfSk7XG4gICAgICBpZiAoXG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEF0dHJpYnV0ZUV2ZW50IHx8XG4gICAgICAgIGRpc3BhdGNoZWQuY3JlYXRlZEdldENvbmZsaWN0SG9va1xuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZCBzdGVwcyBiZXlvbmQgdGhlIGlubGluZSBjYXAgdG8gdGhlIHF1ZXVlIE5PVyDigJQgaW4gdGhlIHNhbWVcbiAgICAgIC8vIHR1cm4gdGhlaXIgc3RlcF9jcmVhdGVkIHdhcyB3cml0dGVuIGJ5IHRoZSBkaXNwYXRjaCBhYm92ZS4gVGhpc1xuICAgICAgLy8gbXVzdCBoYXBwZW4gQkVGT1JFIHRoZSBldmVudCBmZWVkIGJlbG93OiB0aGUgZmVlZCBhbHdheXMgb2JzZXJ2ZXNcbiAgICAgIC8vIHRob3NlIHZlcnkgc3RlcF9jcmVhdGVkIHdyaXRlcyBhcyB1bnNlZW4gZXZlbnRzIGFuZCBgY29udGludWVgcyxcbiAgICAgIC8vIHNvIGEgaGFuZG9mZiBwbGFjZWQgYWZ0ZXIgaXQgaXMgdW5yZWFjaGFibGUgb24gdGhlIG9ubHkgaXRlcmF0aW9uXG4gICAgICAvLyB0aGF0IHN0aWxsIGNsYXNzaWZpZXMgdGhlc2Ugc3RlcHMgYXMgZnJlc2gg4oCUIG5leHQgdHVybiB0aGV5IGNhcnJ5XG4gICAgICAvLyBoYXNDcmVhdGVkRXZlbnQgYW5kIHdvdWxkIG5ldmVyIGJlIHF1ZXVlZCBhdCBhbGwgKHRoZSB3ZWRnZSBiZWhpbmRcbiAgICAgIC8vIHByb21pc2VSYWNlU3RyZXNzVGVzdFdvcmtmbG93IGhhbmdpbmcgaW4gdGhlIHF1aWNranMgQ0kgbGVncykuIFRoZVxuICAgICAgLy8gYmFyZS1jb3JyZWxhdGlvbklkIGlkZW1wb3RlbmN5IGtleSBtYWtlcyByZXBlYXRzIGhhcm1sZXNzLlxuICAgICAgY29uc3Qgb3ZlcmZsb3dTdGVwcyA9IGZyZXNoU3RlcHMuc2xpY2UoaW5saW5lQ2FuZGlkYXRlcy5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIG92ZXJmbG93U3RlcHMpIHtcbiAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYXdhaXQgcXVldWVTdGVwTWVzc2FnZSh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHMgc28gdGhlaXIgd2FpdF9jb21wbGV0ZWQgZXZlbnRzIGFyZSBwaWNrZWRcbiAgICAgIC8vIHVwIGJ5IHRoZSBmZWVkIGJlbG93IChpbnN0ZWFkIG9mIGEgcXVldWUgcmUtaW52b2NhdGlvbikuXG4gICAgICBjb25zdCB3YWl0Q29tcGxldGVQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHBlbmRpbmdPcGVyYXRpb25zKSB7XG4gICAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB3YWl0ID0gb3AgYXMgUGVuZGluZ1dhaXQ7XG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCkgY29udGludWU7XG4gICAgICAgIGNvbXBsZXRlZFdhaXRJZHMyLmFkZCh3YWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB3YWl0Q29tcGxldGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh3YWl0Q29tcGxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRDb21wbGV0ZVByb21pc2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQ2hlYXAgcHJvZ3Jlc3MgZmlyc3Q6IGZlZWQgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGludG8gdGhlIGxpdmVcbiAgICAgIC8vIFZNIGJlZm9yZSBibG9ja2luZyBvbiBzdGVwIGJvZGllcy5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgbmV3RXZlbnRzID0gYXdhaXQgZmV0Y2hVbnNlZW5FdmVudHMoKTtcbiAgICAgICAgaWYgKG5ld0V2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gVGhlIGxpc3RpbmcgY2F1Z2h0IHVwIHdpdGggdGhpcyBpbnZvY2F0aW9uJ3Mgd3JpdGVzIOKAlCBhbnlcbiAgICAgICAgICAvLyBhdHRyX3NldCAvIGdldENvbmZsaWN0IGhvb2tfY3JlYXRlZCBoYXMgYmVlbiAob3IgaXMgYmVpbmcpXG4gICAgICAgICAgLy8gY29uc3VtZWQgYnkgdGhlIGxpdmUgVk0sIHNvIG5vIGV4dGVybmFsIHJlcXVldWUgaXMgbmVlZGVkLlxuICAgICAgICAgIHBlbmRpbmdSZXF1ZXVlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcbiAgICAgICAgICB3ZmRpYWcoJ2lubGluZV9pdGVyYXRpb24nLCB7XG4gICAgICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgICAgICBwaGFzZTogJ2ZlZWQnLFxuICAgICAgICAgICAgZmVkRXZlbnRzOiBuZXdFdmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgb3V0Y29tZTogcmVzdWx0LmNvbXBsZXRlZFxuICAgICAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgICAgIDogcmVzdWx0LmZhaWxlZFxuICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vIGNoZWFwIHByb2dyZXNzIGxlZnQg4oCUIGV4ZWN1dGUgc3RlcHMgaW5saW5lLlxuICAgICAgY29uc3Qgc3RlcE9wcyA9IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKTogb3AgaXMgUGVuZGluZ1N0ZXAgPT4gb3AudHlwZSA9PT0gJ3N0ZXAnXG4gICAgICApO1xuICAgICAgLy8gU3RlcHMgY3JlYXRlZCBieSBhbiBFQVJMSUVSIGludm9jYXRpb24gKG9yIGFuIGVhcmxpZXIgdHVybikgdGhhdFxuICAgICAgLy8gYXJlIHN0aWxsIHBlbmRpbmcsIHdpdGggbm8gd29yayBvd25lZCBieSBUSElTIGludm9jYXRpb24uIE1pcnJvclxuICAgICAgLy8gdGhlIG5vZGUgZW5naW5lJ3Mgb3duZXJzaGlwIGRlY2lzaW9uIHRhYmxlIChzdGVwLW93bmVyc2hpcC50cykg4oCUXG4gICAgICAvLyBOT1QgYSBkZWxpdmVyeUF0dGVtcHQgZ2F0ZTogd29ybGRzIGFkdmFuY2UgdGhlIGF0dGVtcHQgY291bnRlciBvblxuICAgICAgLy8gcm91dGluZSByZWRlbGl2ZXJpZXMgKHdvcmxkLWxvY2FsIGNvdW50cyBldmVyeSBoYW5kbGVkIHJlc3BvbnNlKSxcbiAgICAgIC8vIHNvIGF0dGVtcHQgPiAxIGlzIHRoZSBjb21tb24gY2FzZSBhbmQgd291bGQgZmlyZSBiYWNrc3RvcHMgYXRcbiAgICAgIC8vIHN0ZXBzIGFjdGl2ZWx5IGV4ZWN1dGluZyBpbmxpbmUgaW4gYSBsaXZlIGludm9jYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gICAtIE93bmVyc2hpcCBsZWFzZSBBQ1RJVkUsIGhlbGQgYnkgQU5PVEhFUiBtZXNzYWdlIOKGkiB0aGUgc3RlcCBpc1xuICAgICAgLy8gICAgIChwcmVzdW1hYmx5KSBleGVjdXRpbmcgaW5saW5lIGluIGEgbGl2ZSBpbnZvY2F0aW9uLiBBcm0gYVxuICAgICAgLy8gICAgIERFTEFZRUQgYmFja3N0b3AgZm9yIHRoZSBsZWFzZSByZW1haW5kZXIsIGtleWVkIHRvIHRoZVxuICAgICAgLy8gICAgIG93bmVyc2hpcCBlcG9jaCAoYSByZWZyZXNoZWQgbGVhc2UgcmUtYXJtcyBhIGZyZXNoIGJhY2tzdG9wXG4gICAgICAvLyAgICAgaW5zdGVhZCBvZiBkZWR1cGluZyBhZ2FpbnN0IHRoZSBpbi1mbGlnaHQgb25lKS4gSWYgdGhlIG93bmVyXG4gICAgICAvLyAgICAgY29tcGxldGVzIG5vcm1hbGx5LCB0aGUgYmFja3N0b3AgZGVsaXZlcnkgcmVzb2x2ZXMgdGhlIHN0ZXBcbiAgICAgIC8vICAgICBhcyAnc2tpcHBlZCcuXG4gICAgICAvLyAgIC0gT3duZXJzaGlwIGxlYXNlIEFDVElWRSwgaGVsZCBieSBUSElTIG1lc3NhZ2Ug4oaSIHRoaXMgZGVsaXZlcnlcbiAgICAgIC8vICAgICBpcyB0aGUgb3duZXIncyByZWRlbGl2ZXJ5OyB0aGUgY2xhaW1hbnQgY3Jhc2hlZFxuICAgICAgLy8gICAgIG1pZC1leGVjdXRpb24uIERpc3BhdGNoIGltbWVkaWF0ZWx5IGZvciBiYWNrZ3JvdW5kIHJlY292ZXJ5LlxuICAgICAgLy8gICAtIE5vIHN0YW1wIC8gbGVhc2UgRVhQSVJFRCAvIHN0ZXBfcmV0cnlpbmcgb2JzZXJ2ZWQg4oaSIHRoZSBzdGVwXG4gICAgICAvLyAgICAgaXMgcXVldWUtb3duZWQgb3Igb3JwaGFuZWQuIERpc3BhdGNoIGltbWVkaWF0ZWx5OyB0aGVcbiAgICAgIC8vICAgICBiYXJlLWNvcnJlbGF0aW9uSWQgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgIC8vICAgICBvcmlnaW5hbCBoYW5kb2ZmLlxuICAgICAgY29uc3Qgbm93TXMgPSBEYXRlLm5vdygpO1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBPcHMpIHtcbiAgICAgICAgaWYgKCFzdGVwLmhhc0NyZWF0ZWRFdmVudCkgY29udGludWU7XG4gICAgICAgIGlmIChleGVjdXRlZFN0ZXBJZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVldWVkU3RlcElkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG93bmVyc2hpcCA9IHN0ZXBPd25lcnNoaXAuZ2V0KHN0ZXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IG93bmVyc2hpcEFjdGl2ZSA9XG4gICAgICAgICAgb3duZXJzaGlwICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBvd25lcnNoaXAub3duZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICFvd25lcnNoaXAuc2F3UmV0cnlpbmc7XG4gICAgICAgIGxldCBsZWFzZVJlbWFpbmluZ1NlY29uZHMgPSAwO1xuICAgICAgICBpZiAob3duZXJzaGlwQWN0aXZlICYmIG93bmVyc2hpcC5zdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgbGVhc2VTZWNvbmRzID0gZ2V0SW5saW5lT3duZXJzaGlwTGVhc2VTZWNvbmRzKCk7XG4gICAgICAgICAgbGVhc2VSZW1haW5pbmdTZWNvbmRzID0gTWF0aC5taW4oXG4gICAgICAgICAgICBsZWFzZVNlY29uZHMsXG4gICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgIChvd25lcnNoaXAuc3RhcnRlZEF0TXMgKyBsZWFzZVNlY29uZHMgKiAxMDAwIC0gbm93TXMpIC8gMTAwMFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3duZXJzaGlwQWN0aXZlICYmXG4gICAgICAgICAgb3duZXJzaGlwLm93bmVyICE9PSBvd25lck1lc3NhZ2VJZCAmJlxuICAgICAgICAgIGxlYXNlUmVtYWluaW5nU2Vjb25kcyA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcXVldWVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBhd2FpdCBxdWV1ZVN0ZXBNZXNzYWdlKHtcbiAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICBkZWxheVNlY29uZHM6IGxlYXNlUmVtYWluaW5nU2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICBwdXJwb3NlOiBgYmFja3N0b3A6JHtvd25lcnNoaXAuc3RhcnRlZEF0TXN9YCxcbiAgICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICBwdXJwb3NlOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBObyBpbi1wcm9jZXNzIHByb2dyZXNzIHBvc3NpYmxlIOKAlCB0aGUgcnVuIGF3YWl0cyBhbiBleHRlcm5hbFxuICAgICAgICAvLyBzdGltdWx1cyAoaG9vayBwYXlsb2FkLCBxdWV1ZWQgc3RlcCwgd2FpdCB0aW1lcikuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBSYWNpbmcgdGltZXJzIG11c3QgZmlyZSBvbiB0aW1lIHdoaWxlIHN0ZXAgYm9kaWVzIGJsb2NrIHRoaXNcbiAgICAgIC8vIGludm9jYXRpb246IGVucXVldWUgYSBkZWxheWVkIGNvbnRpbnVhdGlvbiBmb3IgdGhlIHNvb25lc3RcbiAgICAgIC8vIHBlbmRpbmcgd2FpdCAoYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIHdyaXRlcyBpdHMgd2FpdF9jb21wbGV0ZWQgYXRcbiAgICAgIC8vIHRoZSByaWdodCBsb2cgcG9zaXRpb24g4oCUIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICAvLyB3YWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaCkuXG4gICAgICBsZXQgc29vbmVzdFdhaXQ6IHsgY29ycmVsYXRpb25JZDogc3RyaW5nOyBzZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wLnR5cGUgIT09ICd3YWl0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IHdhaXQgPSBvcCBhcyBQZW5kaW5nV2FpdDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZFdhaXRDb250aW51YXRpb25zLmhhcyh3YWl0LmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgLy8gV2FpdHMgd2hvc2Ugd2FpdF9jb21wbGV0ZWQgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgd3JvdGUgKHRoZVxuICAgICAgICAvLyBlbGFwc2VkLXdhaXQgcGFzcyBhYm92ZSkgYXJlIGRvbmUg4oCUIHRoZSBldmVudCBqdXN0IGhhc24ndCBmZWRcbiAgICAgICAgLy8gYmFjayBpbnRvIHRoZSBWTSB5ZXQuIE5vIGNvbnRpbnVhdGlvbiBuZWVkZWQuXG4gICAgICAgIGlmIChjb21wbGV0ZWRXYWl0SWRzMi5oYXMod2FpdC5jb3JyZWxhdGlvbklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJlc3VtZU1zID0gbmV3IERhdGUod2FpdC5yZXN1bWVBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQW4gYWxyZWFkeS1lbGFwc2VkIHdhaXQgTVVTVCBzdGlsbCBnZXQgYSBjb250aW51YXRpb24gKGNsYW1wZWRcbiAgICAgICAgLy8gdG8gdGhlIDFzIG1pbmltdW0sIGV4YWN0bHkgbGlrZSB0aGUgbm9kZSBlbmdpbmUnc1xuICAgICAgICAvLyBgTWF0aC5tYXgoMTAwMCwgcmVzdW1lQXRNcyAtIG5vdylgKSwgbm90IGJlIHNraXBwZWQ6IGEgd2FpdFxuICAgICAgICAvLyB3aG9zZSBkZWFkbGluZSBmYWxscyBiZXR3ZWVuIHRoaXMgaXRlcmF0aW9uJ3MgZWxhcHNlZC13YWl0XG4gICAgICAgIC8vIHBhc3MgKHdoaWNoIHNhdyBpdCBhcyBzdGlsbCBwZW5kaW5nIGFuZCB3cm90ZSBub3RoaW5nKSBhbmRcbiAgICAgICAgLy8gdGhpcyBzd2VlcCB3b3VsZCBvdGhlcndpc2UgZ2V0IE5FSVRIRVIgYSB3YWl0X2NvbXBsZXRlZCBOT1IgYVxuICAgICAgICAvLyBjb250aW51YXRpb24g4oCUIGFuZCB0aGUgaW5saW5lIGJhdGNoIGJlbG93IHRoZW4gYmxvY2tzIHRoaXNcbiAgICAgICAgLy8gaW52b2NhdGlvbiBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiB3aXRoIG5vIHdha2UgYXJtZWRcbiAgICAgICAgLy8gYW55d2hlcmUuIEZvciBgUHJvbWlzZS5yYWNlKHN0ZXAsIHNsZWVwKWAgdGhhdCBzaWxlbnRseSBoYW5kc1xuICAgICAgICAvLyB0aGUgcmFjZSB0byB0aGUgc3RlcDogdGhlIHNsZWVwJ3Mgd2FpdF9jb21wbGV0ZWQgaXMgbmV2ZXJcbiAgICAgICAgLy8gd3JpdHRlbiBhbmQgdGhlIHJ1biBjb21wbGV0ZXMgd2l0aCB0aGUgd3Jvbmcgd2lubmVyLiBUaGVcbiAgICAgICAgLy8gd2luZG93IGJldHdlZW4gdGhlIHR3byBjaGVja3Mgc3BhbnMgdGhpcyBpdGVyYXRpb24ncyBkaXNwYXRjaFxuICAgICAgICAvLyArIGZlZWQgcm91bmQtdHJpcHMsIHNvIG9uIG5ldHdvcmstYmFja2VkIHdvcmxkcyAod29ybGQtdmVyY2VsKVxuICAgICAgICAvLyBhIHNob3J0IHNsZWVwIGxhbmRzIGluIGl0IHJvdXRpbmVseSDigJQgb2JzZXJ2ZWQgYXMgYSB+NTAlXG4gICAgICAgIC8vIHNsZWVwV2luc1JhY2VXb3JrZmxvdyBmYWlsdXJlIHJhdGUgaW4gdGhlIFZlcmNlbCBlMmUgbGVncyxcbiAgICAgICAgLy8gd2hpbGUgd29ybGQtbG9jYWwncyBzdWItbXMgcm91bmQtdHJpcHMgbWFza2VkIGl0IGxvY2FsbHkuIFRoZVxuICAgICAgICAvLyBjb250aW51YXRpb24gaW52b2NhdGlvbidzIHByZS1WTSBlbGFwc2VkIGNoZWNrIHdyaXRlcyB0aGVcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQgfjFzIGxhdGVyLlxuICAgICAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHJlc3VtZU1zIC8gMTAwMCkpO1xuICAgICAgICBpZiAoIXNvb25lc3RXYWl0IHx8IHNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7IGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCwgc2Vjb25kcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc29vbmVzdFdhaXQpIHtcbiAgICAgICAgc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuYWRkKHNvb25lc3RXYWl0LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgICBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB3ZmRpYWcoJ3dhaXRfY29udGludWF0aW9uX3NjaGVkdWxlZCcsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGRlbGF5U2Vjb25kczogc29vbmVzdFdhaXQuc2Vjb25kcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBiYXRjaCBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheSBidWRnZXQgaXNcbiAgICAgIC8vIHBhdXNlZCB3aGlsZSBzdGVwIGJvZGllcyBydW4g4oCUIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGVcbiAgICAgIC8vIHBsYXRmb3JtIGZ1bmN0aW9uIGR1cmF0aW9uLCBub3QgdGhlIHJlcGxheSB0aW1lb3V0LiBOT1RFIChieVxuICAgICAgLy8gZGVzaWduKTogd2l0aCB0aGUgYnVkZ2V0IHBhcmtlZCBwZXIgYmF0Y2gsIHRoZSBvbmx5IGJvdW5kIG9uIGhvd1xuICAgICAgLy8gbWFueSBpbmxpbmUgc3RlcHMgb25lIGludm9jYXRpb24gY2FuIGNoYWluIGlzIHRoZSBwbGF0Zm9ybSdzXG4gICAgICAvLyBmdW5jdGlvbiB0aW1lb3V0IOKAlCB0aGUgU0RLIGRlbGliZXJhdGVseSBpbXBvc2VzIG5vIGNhcCBvZiBpdHNcbiAgICAgIC8vIG93biwgbWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lLCB3aGVyZSBhIGxvbmcgc2VxdWVudGlhbFxuICAgICAgLy8gd29ya2Zsb3cgbGlrZXdpc2UgcnVucyBzdGVwLWJ5LXN0ZXAgdW50aWwgdGhlIHBsYXRmb3JtIHJlY2xhaW1zXG4gICAgICAvLyB0aGUgaW52b2NhdGlvbiBhbmQgYSByZWRlbGl2ZXJ5IHJlc3VtZXMgZnJvbSB0aGUgbG9nLlxuICAgICAgYnVkZ2V0LnBhdXNlKCk7XG4gICAgICBsZXQgb3V0Y29tZXM6IFN0ZXBFeGVjdXRpb25SZXN1bHRbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dGNvbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaW5saW5lQ2FuZGlkYXRlcy5tYXAoKHN0ZXApID0+XG4gICAgICAgICAgICBydW5TdGVwU2luZ2xlRmxpZ2h0KHJ1bklkLCBzdGVwLmNvcnJlbGF0aW9uSWQsICgpID0+XG4gICAgICAgICAgICAgIChhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgIHJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcElkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIGNsYWltOiBzdGVwX2NyZWF0ZWQgaXMgZGVmZXJyZWQgKGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGl0KSBhbmQgdGhpcyBzdGVwX3N0YXJ0ZWQgY2FycmllcyB0aGUgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAvLyBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGUgc3RlcCBhdG9taWNhbGx5IOKAlFxuICAgICAgICAgICAgICAgICAgLy8gZXhhY3RseS1vbmUtb3duZXIuIEEgY29uY3VycmVudCBjbGFpbWFudCBnZXRzXG4gICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIOKGkiB7IHR5cGU6ICdza2lwcGVkJyB9IGFuZCBuZXZlclxuICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgYm9keS4gTWlycm9ycyB0aGUgbm9kZSBlbmdpbmUncyBpbmxpbmUgcGF0aC5cbiAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IGF3YWl0IGVuY3J5cHRTZXJpYWxpemVkRGF0YShcbiAgICAgICAgICAgICAgICAgICAgc3RlcC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIC8vIE93bmVyc2hpcCBzdGFtcDogd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keSBhcyBpblxuICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IGluIHRoaXMgaW52b2NhdGlvbiBhbmQgYXJtIGEgZGVsYXllZCBiYWNrc3RvcFxuICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBpbW1lZGlhdGVseSByZXF1ZXVlaW5nIHRoZSBzdGVwLlxuICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgc3RlcCBpcyBicmFuZC1uZXcgYnkgY29uc3RydWN0aW9uIOKAlCBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdC5cbiAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OiAxLFxuICAgICAgICAgICAgICAgIH0pKSgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgfVxuICAgICAgaW5saW5lU3RlcHNFeGVjdXRlZCArPSBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVDYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBpbmxpbmVDYW5kaWRhdGVzW2ldO1xuICAgICAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZXNbaV07XG4gICAgICAgIGV4ZWN1dGVkU3RlcElkcy5hZGQoc3RlcC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKG91dGNvbWUudHlwZSA9PT0gJ3JldHJ5JyB8fCBvdXRjb21lLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgLy8gSGFuZCB0aGUgc3RlcCB0byB0aGUgcXVldWUgd2l0aCB0aGUgcmVxdWVzdGVkIGJhY2tvZmYg4oCUXG4gICAgICAgICAgLy8gYmFja2dyb3VuZCBkZWxpdmVyeSBkcml2ZXMgdGhlIHJldHJ5IGZyb20gaGVyZS5cbiAgICAgICAgICBxdWV1ZWRTdGVwSWRzLmFkZChzdGVwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGF3YWl0IHF1ZXVlU3RlcE1lc3NhZ2Uoe1xuICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgIGRlbGF5U2Vjb25kczogb3V0Y29tZS50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAvLyBTdWZmaXhlZCBrZXk6IHRoaXMgc3RlcCB3YXMgaW5saW5lLWNsYWltZWQsIHNvIG5vIGRpc3BhdGNoXG4gICAgICAgICAgICAvLyBwdWJsaXNoIGV4aXN0cyB1bmRlciB0aGUgYmFyZSBjb3JyZWxhdGlvbklkIOKAlCBidXQgc3VmZml4aW5nXG4gICAgICAgICAgICAvLyBrZWVwcyB0aGUgcmV0cnkgZW5xdWV1ZWFibGUgZXZlbiBpZiBhIHdvcmxkIHJldGlyZWQgYVxuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBrZXkgZm9yIHRoaXMgc3RlcCAoc2VlIHRoZSBwdXJwb3NlIGRvY3MgYWJvdmUpLlxuICAgICAgICAgICAgcHVycG9zZTogJ3JldHJ5OjEnLFxuICAgICAgICAgICAgd2ZkaWFnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG91dGNvbWUudHlwZSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgcnVuR29uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gJ3NraXBwZWQnOiBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3b24gdGhlIGxhenkgY3JlYXRlLWNsYWltIGFuZFxuICAgICAgICAvLyBvd25zIHRoZSBib2R5LiBNYXJrZWQgZXhlY3V0ZWQgYWJvdmUgc28gdGhpcyBpbnZvY2F0aW9uIG5ldmVyXG4gICAgICAgIC8vIHJlLWNsYWltcyBpdDsgdGhlIHdpbm5lcidzIHRlcm1pbmFsIGV2ZW50cyBhcnJpdmUgdmlhIHRoZSBmZWVkXG4gICAgICAgIC8vIChvciBkcml2ZSBhIHNlcGFyYXRlIGludm9jYXRpb24pLlxuICAgICAgfVxuICAgICAgd2ZkaWFnKCdpbmxpbmVfc3RlcHNfZXhlY3V0ZWQnLCB7XG4gICAgICAgIGl0ZXJhdGlvbixcbiAgICAgICAgY291bnQ6IGlubGluZUNhbmRpZGF0ZXMubGVuZ3RoLFxuICAgICAgICBvdXRjb21lczogb3V0Y29tZXMubWFwKChvKSA9PiBvLnR5cGUpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZlZWQgdGhlIGlubGluZSBiYXRjaCdzIHRlcm1pbmFsIGV2ZW50cyBpbnRvIHRoZSBsaXZlIFZNLiBXaGVuXG4gICAgICAvLyB0aGUgZXZlbnR1YWxseS1jb25zaXN0ZW50IGxpc3RpbmcgaGFzIG5vdCBzdXJmYWNlZCB0aGVtIHlldCxcbiAgICAgIC8vIGV4aXRpbmcgbXVzdCBOT1QgYWNrIHNpbGVudGx5OiB0aGUgdGVybWluYWxzIHRoaXMgaW52b2NhdGlvbiBqdXN0XG4gICAgICAvLyBjYXVzZWQgYXJlIGR1cmFibHkgd3JpdHRlbiB3aXRoIG5vIHF1ZXVlIG1lc3NhZ2UgbGVmdCB0byBjb25zdW1lXG4gICAgICAvLyB0aGVtIChpbmxpbmUgc3RlcHMgaGF2ZSBub25lKSwgc28gYW4gYXdhaXRpbmdfZXh0ZXJuYWwgZXhpdCB3b3VsZFxuICAgICAgLy8gcGFyayB0aGUgcnVuICdydW5uaW5nJyB3aXRoIGFsbCBpdHMgc3RlcHMgY29tcGxldGUuIFJhaXNlIHRoZVxuICAgICAgLy8gcmVxdWV1ZSBzaWduYWwgc28gdGhlIHN1c3BlbmRlZCBleGl0IHNjaGVkdWxlcyBhIGZyZXNoIGltbWVkaWF0ZVxuICAgICAgLy8gaW52b2NhdGlvbiB3aG9zZSBmcmVzaCByZWFkIHBpY2tzIHRoZSB0ZXJtaW5hbHMgdXAuIE91dGNvbWVzIHRoYXRcbiAgICAgIC8vIHdyb3RlIG5vIHRlcm1pbmFsICgnc2tpcHBlZCcg4oCUIGEgY29uY3VycmVudCBjbGFpbWFudCBvd25zIHRoZVxuICAgICAgLy8gYm9keTsgJ2dvbmUnLCByZXRyeS90aHJvdHRsZWQg4oCUIGEgcXVldWUgbWVzc2FnZSBleGlzdHMpIGRvbid0XG4gICAgICAvLyBuZWVkIGl0LCBidXQgc2lnbmFsaW5nIG9uIHRoZW0gdG9vIG9ubHkgY29zdHMgYSBuby1vcCBpbnZvY2F0aW9uXG4gICAgICAvLyBpbiBhbiBhbHJlYWR5LXJhcmUgbGFnIHdpbmRvdy5cbiAgICAgIGNvbnN0IG5ld0V2ZW50cyA9IGF3YWl0IGZldGNoVW5zZWVuRXZlbnRzKCk7XG4gICAgICBpZiAobmV3RXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwZW5kaW5nUmVxdWV1ZVNpZ25hbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvbi5jb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzKTtcblxuICAgICAgd2ZkaWFnKCdpbmxpbmVfaXRlcmF0aW9uJywge1xuICAgICAgICBpdGVyYXRpb24sXG4gICAgICAgIHBoYXNlOiAnc3RlcHMnLFxuICAgICAgICBmZWRFdmVudHM6IG5ld0V2ZW50cy5sZW5ndGgsXG4gICAgICAgIG91dGNvbWU6IHJlc3VsdC5jb21wbGV0ZWRcbiAgICAgICAgICA/ICdjb21wbGV0ZWQnXG4gICAgICAgICAgOiByZXN1bHQuZmFpbGVkXG4gICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICA6ICdzdXNwZW5kZWQnLFxuICAgICAgICBidWRnZXRFeGhhdXN0ZWQ6IGJ1ZGdldC5pc0V4aGF1c3RlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNlc3Npb24uZGlzcG9zZSgpO1xuICB9XG5cbiAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0cmlidXRlLlF1aWNrSlNJbmxpbmVTdGVwcyhpbmxpbmVTdGVwc0V4ZWN1dGVkKSxcbiAgfSk7XG5cbiAgaWYgKHJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWRcbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgY29tcGxldGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgfSk7XG4gICAgcGFyZW50U3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU091dGNvbWUoJ2NvbXBsZXRlZCcpLFxuICAgIH0pO1xuXG4gICAgLy8gRmx1c2ggbGVmdG92ZXIgcGVuZGluZyBzaWRlIGVmZmVjdHMgKGFib3J0IHJlY29yZGluZ3MsIHN5c3RlbS1ob29rXG4gICAgLy8gZGlzcG9zYWxzLCBmaXJlLWFuZC1mb3JnZXQgYXR0cmlidXRlL2hvb2sgZXZlbnRzKSBCRUZPUkUgd3JpdGluZ1xuICAgIC8vIHJ1bl9jb21wbGV0ZWQg4oCUIG1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3MgZHJhaW5QZW5kaW5nUXVldWVJdGVtcy5cbiAgICAvLyBEcmFpbiBmYWlsdXJlcyBhcmUgc3dhbGxvd2VkOiB0aGUgd29ya2Zsb3cncyBvd24gb3V0Y29tZSBpcyB0aGVcbiAgICAvLyBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaWYgKHJlc3VsdC5jb21wbGV0ZWQuZHJhaW5PcGVyYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRpc3BhdGNoUGVuZGluZ09wcyh7XG4gICAgICAgICAgd29ybGQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcmVzdWx0LmNvbXBsZXRlZC5kcmFpbk9wZXJhdGlvbnMsXG4gICAgICAgICAgd2ZkaWFnLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1F1aWNrSlMgcnVudGltZTogdGVybWluYWwgZHJhaW4gZmFpbGVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnIgYXMgRXJyb3IpPy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcnVuX2NvbXBsZXRlZCBldmVudC5cbiAgICAvLyBUaGUgVk0gc2VyaWFsaXplcyB0aGUgd29ya2Zsb3cgcmVzdWx0IGFzIGZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlIGJ5dGVzXG4gICAgLy8gKFwiZGV2bFwiICsgZGV2YWx1ZSkgd2l0aCBubyBlbmNyeXB0aW9uICh0aGUgVk0gaGFzIG5vIGFjY2VzcyB0byB0aGVcbiAgICAvLyBDcnlwdG9LZXkpLiBIb3N0LXNpZGUgZW5jcnlwdGlvbiBpcyBhcHBsaWVkIGhlcmUgc28gdGhhdCBgcnVuX2NvbXBsZXRlZGBcbiAgICAvLyBldmVudHMgaGF2ZSB0aGUgc2FtZSBgZW5jcmAtcHJlZml4ZWQgcGF5bG9hZCBzaGFwZSB0aGF0IHRoZSBub2RlOnZtXG4gICAgLy8gZW5naW5lJ3MgYGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWVgIHByb2R1Y2VzLlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIG91dHB1dDogYXdhaXQgZW5jcnlwdFNlcmlhbGl6ZWREYXRhKFxuICAgICAgICAgICAgcmVzdWx0LmNvbXBsZXRlZC5yZXN1bHQsXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZCcsIHsgcmVzdWx0OiAncnVuX2NvbXBsZXRlZF93cml0dGVuJyB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBydW5fY29tcGxldGVkJyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgKTtcbiAgICAgICAgd2ZkaWFnKCdleGl0X2NvbXBsZXRlZCcsIHsgcmVzdWx0OiAnYWxyZWFkeV9maW5pc2hlZCcgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdmZGlhZygnZXhpdF9jb21wbGV0ZWRfZXJyb3InLCB7XG4gICAgICAgIGVycm9yTmFtZTogKGVyciBhcyBFcnJvcik/Lm5hbWUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH0gZWxzZSBpZiAocmVzdWx0LnN1c3BlbmRlZCkge1xuICAgIC8vIFdvcmtmbG93IHN0aWxsIHN1c3BlbmRlZCBhZnRlciB0aGUgaW5saW5lIGxvb3AuIEFsbCBkdXJhYmxlIHNpZGVcbiAgICAvLyBlZmZlY3RzIGZvciB0aGUgZmluYWwgc3VzcGVuc2lvbiBzdGF0ZSB3ZXJlIGFscmVhZHkgZGlzcGF0Y2hlZCBieVxuICAgIC8vIHRoZSBsb29wOyB3aGF0IHJlbWFpbnMgaXMgZGVjaWRpbmcgaG93IHRoZSBydW4gZ2V0cyByZS1pbnZva2VkLlxuICAgIGNvbnN0IHsgcGVuZGluZ09wZXJhdGlvbnMgfSA9IHJlc3VsdC5zdXNwZW5kZWQ7XG5cbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBpbmxpbmVTdGVwc0V4ZWN1dGVkLFxuICAgICAgcGVuZGluZ1N0ZXBzOiBwZW5kaW5nT3BlcmF0aW9ucy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gJ3N0ZXAnKS5sZW5ndGgsXG4gICAgICBwZW5kaW5nV2FpdHM6IHBlbmRpbmdPcGVyYXRpb25zLmZpbHRlcigocCkgPT4gcC50eXBlID09PSAnd2FpdCcpLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPcHM6IHBlbmRpbmdPcGVyYXRpb25zLm1hcCgocCkgPT4gKHtcbiAgICAgICAgdHlwZTogcC50eXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogcC5oYXNDcmVhdGVkRXZlbnQsXG4gICAgICAgIC4uLihwLnR5cGUgPT09ICdzdGVwJyA/IHsgc3RlcElkOiAocCBhcyBQZW5kaW5nU3RlcCkuc3RlcElkIH0gOiB7fSksXG4gICAgICB9KSksXG4gICAgfSk7XG5cbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnc3VzcGVuZGVkJyksXG4gICAgICAuLi5BdHRyaWJ1dGUuUXVpY2tKU1BlbmRpbmdPcHNDb3VudChwZW5kaW5nT3BlcmF0aW9ucy5sZW5ndGgpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJ1bkdvbmUpIHtcbiAgICAgIC8vIFRoZSBydW4gbm8gbG9uZ2VyIGV4aXN0cyAoZXhwaXJlZCAvIGRlbGV0ZWQpIOKAlCBub3RoaW5nIHRvIGRyaXZlLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHsgYWN0aW9uOiAncnVuX2dvbmUnIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4aXQgcmVxdWV1ZXMgYXJlIEZSRVNIIG1lc3NhZ2VzLCBuZXZlciBhIGB7IHRpbWVvdXRTZWNvbmRzIH1gXG4gICAgLy8gdmlzaWJpbGl0eS1yZWRlbGl2ZXJ5IG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlZGVsaXZlcmluZyB0aGVcbiAgICAvLyBDVVJSRU5UIG1lc3NhZ2UgaXMgYSB0cmFwOiBhIGhvb2stcmVzdW1lIGRlbGl2ZXJ5IGNhcnJpZXNcbiAgICAvLyBgaG9va0lucHV0YCwgYW5kIGl0cyByZWRlbGl2ZXJ5IHJlLXJ1bnMgdGhlIGxhenktcmVzdW1lIHJlLWVuc3VyZVxuICAgIC8vIGluIHRoZSBoYW5kbGVyIHByb2xvZ3VlIOKAlCBpZiB0aGUgd29ya2Zsb3cgZGlzcG9zZWQgdGhhdCBob29rXG4gICAgLy8gZHVyaW5nIHRoaXMgaW52b2NhdGlvbiAoZGlzcG9zZSDihpIgc2xlZXApLCBhIHdvcmxkIHRoYXQgcmVqZWN0c1xuICAgIC8vIHRoZSByZS1lbnN1cmUgd291bGQgYWNrIHRoZSBtZXNzYWdlIGFzIFwibm90aGluZyBsZWZ0IHRvIHJlc3VtZVwiXG4gICAgLy8gYW5kIHRoZSBjb250aW51YXRpb24gaXQgY2FycmllZCBpcyBzaWxlbnRseSBsb3N0LiBBIGZyZXNoIG1lc3NhZ2VcbiAgICAvLyBjYXJyaWVzIG9ubHkgYHJ1bklkYCwgc28gaXRzIGRlbGl2ZXJ5IGFsd2F5cyByZWFjaGVzIHJlcGxheSAoYW5kXG4gICAgLy8gdW5kZXIgdHVyYm8gYSByZXNjaGVkdWxlIHdvdWxkIHJlLWVuZ2FnZSB0dXJibyBhZ2FpbnN0IGEgc3RhbGVcbiAgICAvLyBwcmVsb2FkZWQgbG9nIOKAlCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jcyBpbiBydW50aW1lLnRzKS5cbiAgICBjb25zdCByZXF1ZXVlSW1tZWRpYXRlbHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKGJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAvLyBUaGUgbG9vcCBzdG9wcGVkIG9uIHRoZSByZXBsYXkgYnVkZ2V0IHdpdGggcHJvZ3Jlc3Mgc3RpbGxcbiAgICAgIC8vIHBvc3NpYmxlIOKAlCBjb250aW51ZSBpbiBhIGZyZXNoIGludm9jYXRpb24uXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICdidWRnZXRfZXhoYXVzdGVkX3JlcXVldWUnIH0pO1xuICAgICAgYXdhaXQgcmVxdWV1ZUltbWVkaWF0ZWx5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhpdCB3YWl0IHN3ZWVwLiBBIHdhaXQgdGhhdCBlbGFwc2VkIGluIHRoZSB3aW5kb3cgc2luY2UgdGhlXG4gICAgLy8gbG9vcCdzIGxhc3QgY2hlY2sgcmVxdWV1ZXMgaW1tZWRpYXRlbHkgKGl0cyB3YWl0X2NvbXBsZXRlZCBpc1xuICAgIC8vIHdyaXR0ZW4gYnkgdGhlIG5leHQgaW52b2NhdGlvbidzIGVsYXBzZWQtd2FpdCBwYXNzKTsgcGVuZGluZyB3YWl0c1xuICAgIC8vIHdob3NlIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBhbHJlYWR5IGVucXVldWVkIGFyZSBza2lwcGVkLlxuICAgIGxldCBzb29uZXN0V2FpdDogeyBzZWNvbmRzOiBudW1iZXI7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCBoYXNFbGFwc2VkV2FpdCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgcGVuZGluZ09wZXJhdGlvbnMpIHtcbiAgICAgIGlmIChvcC50eXBlICE9PSAnd2FpdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgd2FpdCA9IG9wIGFzIFBlbmRpbmdXYWl0O1xuICAgICAgY29uc3QgcmVzdW1lTXMgPSBuZXcgRGF0ZSh3YWl0LnJlc3VtZUF0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHJlc3VtZU1zIDw9IDApIHtcbiAgICAgICAgaGFzRWxhcHNlZFdhaXQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghc2NoZWR1bGVkV2FpdENvbnRpbnVhdGlvbnMuaGFzKHdhaXQuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwocmVzdW1lTXMgLyAxMDAwKSk7XG4gICAgICAgIGlmICghc29vbmVzdFdhaXQgfHwgdGltZW91dFNlY29uZHMgPCBzb29uZXN0V2FpdC5zZWNvbmRzKSB7XG4gICAgICAgICAgc29vbmVzdFdhaXQgPSB7XG4gICAgICAgICAgICBzZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHdhaXQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0VsYXBzZWRXYWl0KSB7XG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICd3YWl0X2VsYXBzZWRfcmVxdWV1ZScgfSk7XG4gICAgICBhd2FpdCByZXF1ZXVlSW1tZWRpYXRlbHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGVuZGluZ1JlcXVldWVTaWduYWwpIHtcbiAgICAgIC8vIFRoaXMgaW52b2NhdGlvbiB3cm90ZSBldmVudHMgdGhlIHdvcmtmbG93IG5lZWRzIHRvIGNvbnN1bWVcbiAgICAgIC8vIChhdHRyX3NldCAvIGdldENvbmZsaWN0LWF3YWl0ZWQgaG9va19jcmVhdGVkIC8gaW5saW5lIHN0ZXBcbiAgICAgIC8vIHRlcm1pbmFscykgYnV0IHRoZSBldmVudHVhbGx5LWNvbnNpc3RlbnQgbGlzdGluZyBuZXZlciByZXR1cm5lZFxuICAgICAgLy8gdGhlbSBiZWZvcmUgdGhlIGxvb3AgZXhpdGVkLiBXaXRob3V0IGEgcmVxdWV1ZSB0aGUgcnVuIHdvdWxkXG4gICAgICAvLyBwYXJrIGF3YWl0aW5nX2V4dGVybmFsIHdpdGggaXRzIHVuYmxvY2tpbmcgZXZlbnRzIGFscmVhZHlcbiAgICAgIC8vIGR1cmFibHkgd3JpdHRlbiBhbmQgbm8gZnV0dXJlIGludm9jYXRpb24gY29taW5nIOKAlCByZXF1ZXVlXG4gICAgICAvLyBpbW1lZGlhdGVseSBzbyBhIGZyZXNoIHJlYWQgcGlja3MgdGhlbSB1cC4gSW4gdGhlIGNvbW1vbiBjYXNlXG4gICAgICAvLyB0aGUgbG9vcCdzIG93biBmZWVkIG9ic2VydmVzIHRoZSB3cml0ZXMgYW5kIGNsZWFycyB0aGlzIGZsYWcsIHNvXG4gICAgICAvLyB0aGlzIG9ubHkgZmlyZXMgd2hlbiB0aGUgcmVhZCBhY3R1YWxseSBsYWdnZWQuXG4gICAgICB3ZmRpYWcoJ2V4aXRfc3VzcGVuZGVkJywgeyBhY3Rpb246ICd1bnJlYWRfc2VsZl93cml0ZV9yZXF1ZXVlJyB9KTtcbiAgICAgIGF3YWl0IHJlcXVldWVJbW1lZGlhdGVseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzb29uZXN0V2FpdCkge1xuICAgICAgLy8gRGVsYXllZCBjb250aW51YXRpb24gZm9yIHRoZSBzb29uZXN0IHBlbmRpbmcgd2FpdCB0aGUgbG9vcCBoYXNcbiAgICAgIC8vIG5vdCBhbHJlYWR5IHNjaGVkdWxlZC4gVGhlIGRpc3BhdGNoIGhlbHBlciBoYW5kbGVzIGRlbGF5XG4gICAgICAvLyBjbGFtcGluZyAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3MgaG9wcykgYW5kIGlkZW1wb3RlbmN5LWtleVxuICAgICAgLy8gZGVkdXAgb2YgcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCDigJQgc2VlXG4gICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzLlxuICAgICAgd2ZkaWFnKCdleGl0X3N1c3BlbmRlZCcsIHtcbiAgICAgICAgYWN0aW9uOiAnc2NoZWR1bGVfd2FpdF90aW1lb3V0JyxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgIHdhaXRDb3JyZWxhdGlvbklkOiBzb29uZXN0V2FpdC5jb3JyZWxhdGlvbklkLFxuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZWRXYWl0Q29udGludWF0aW9ucy5hZGQoc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZCk7XG4gICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgIHdvcmxkLFxuICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgIHNvb25lc3RXYWl0LnNlY29uZHMsXG4gICAgICAgICAgc29vbmVzdFdhaXQuY29ycmVsYXRpb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdmZGlhZygnZXhpdF9zdXNwZW5kZWQnLCB7XG4gICAgICBhY3Rpb246ICdhd2FpdGluZ19leHRlcm5hbCcsXG4gICAgICBwZW5kaW5nT3BzQ291bnQ6IHBlbmRpbmdPcGVyYXRpb25zLmxlbmd0aCxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQuZmFpbGVkKSB7XG4gICAgLy8gV29ya2Zsb3cgZmFpbGVkIOKAlCByZW1hcCBzdGFjayB0cmFjZSB1c2luZyBpbmxpbmUgc291cmNlIG1hcHMuXG4gICAgLy8gRnJhbWVzIGNhcnJ5IHRoZSBydW4ncyB3b3JrZmxvd0lkIGFzIHRoZWlyIGZpbGVuYW1lIG9uIHRoZSBmcmVzaFxuICAgIC8vIHBhdGgsIGJ1dCB0aGUgd29ya2Zsb3ctaW5kZXBlbmRlbnQgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FIG9uIHRoZVxuICAgIC8vIHNuYXBzaG90IHBhdGggKHRoZSBuYW1lIGlzIGJha2VkIGludG8gdGhlIHNoYXJlZCBiYXNlbGluZSdzXG4gICAgLy8gY29tcGlsZWQgY29kZSBhdCBoeWRyYXRlKSDigJQgcmVtYXAgYWdhaW5zdCBib3RoLiByZW1hcEVycm9yU3RhY2tcbiAgICAvLyBlYXJseS1leGl0cyBvbiBhIGNoZWFwIGluY2x1ZGVzKCkgd2hlbiBhIGZpbGVuYW1lIGhhcyBubyBmcmFtZXMuXG4gICAgbGV0IGVycm9yU3RhY2sgPSByZXN1bHQuZmFpbGVkLnN0YWNrO1xuICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soZXJyb3JTdGFjaywgZmlsZW5hbWUsIHdvcmtmbG93Q29kZSk7XG4gICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUsXG4gICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3Igc28gY29uc3VtZXJzIChgcnVuLnJldHVyblZhbHVlYCwgb2JzZXJ2YWJpbGl0eSlcbiAgICAvLyBnZXQgYFVTRVJfRVJST1JgIC8gYFJVTlRJTUVfRVJST1JgIG9uIGBlcnJvci5jYXVzZS5jb2RlYCwgbWF0Y2hpbmdcbiAgICAvLyB3aGF0IHRoZSBub2RlOnZtIGVuZ2luZSBhbHJlYWR5IGRvZXMgaW4gcnVudGltZS50cy5cbiAgICAvL1xuICAgIC8vIFRoZSBWTSBzZXJpYWxpemVzIGVycm9ycyBhcyBgeyBuYW1lLCBtZXNzYWdlLCBzdGFjayB9YCwgc28gd2VcbiAgICAvLyByZWNvbnN0cnVjdCBhIGhvc3Qtc2lkZSBFcnJvciBvZiB0aGUgY29ycmVjdCBjbGFzcyBiYXNlZCBvbiB0aGVcbiAgICAvLyBWTS1zaWRlIGBuYW1lYCDigJQgc3BlY2lmaWMgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3NlcyBuZWVkXG4gICAgLy8gdG8gYmUgcHJlc2VydmVkIHNvIGNsYXNzaWZ5UnVuRXJyb3IoKSB0YWdzIHRoZW0gYXMgUlVOVElNRV9FUlJPUi5cbiAgICBjb25zdCByZWNvbnN0cnVjdGVkOiBFcnJvciA9XG4gICAgICByZXN1bHQuZmFpbGVkLm5hbWUgPT09ICdXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcidcbiAgICAgICAgPyBuZXcgV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3Iod29ya2Zsb3dOYW1lKVxuICAgICAgICA6IHJlc3VsdC5mYWlsZWQubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICAgID8gbmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSlcbiAgICAgICAgICA6IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHJlc3VsdC5mYWlsZWQubWVzc2FnZSksIHtcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0LmZhaWxlZC5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihyZWNvbnN0cnVjdGVkKTtcblxuICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgZmFpbGVkJywge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBlcnJvck5hbWU6IHJlc3VsdC5mYWlsZWQubmFtZSxcbiAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0LmZhaWxlZC5tZXNzYWdlLFxuICAgICAgZXJyb3JTdGFjayxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9KTtcbiAgICBwYXJlbnRTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5RdWlja0pTT3V0Y29tZSgnZmFpbGVkJyksXG4gICAgfSk7XG5cbiAgICAvLyBGbHVzaCBsZWZ0b3ZlciBwZW5kaW5nIHNpZGUgZWZmZWN0cyBiZWZvcmUgd3JpdGluZyBydW5fZmFpbGVkIOKAlFxuICAgIC8vIHNhbWUgZHJhaW4gc2VtYW50aWNzIGFzIHRoZSBjb21wbGV0ZWQgYnJhbmNoLlxuICAgIGlmIChyZXN1bHQuZmFpbGVkLmRyYWluT3BlcmF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkaXNwYXRjaFBlbmRpbmdPcHMoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcGVuZGluZ09wZXJhdGlvbnM6IHJlc3VsdC5mYWlsZWQuZHJhaW5PcGVyYXRpb25zLFxuICAgICAgICAgIHdmZGlhZyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKCdRdWlja0pTIHJ1bnRpbWU6IHRlcm1pbmFsIGRyYWluIGZhaWxlZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBtZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHJ1bl9mYWlsZWQgZXZlbnQuIFNlcmlhbGl6ZSB0aGUgZXJyb3IgdGhyb3VnaCB0aGVcbiAgICAvLyBmaXJzdC1jbGFzcyBkZWh5ZHJhdGlvbiBwaXBlbGluZSBzbyBjb25zdW1lcnMgKENMSSwgb2JzZXJ2YWJpbGl0eSxcbiAgICAvLyBydW4ucmV0dXJuVmFsdWUpIGdldCB0aGUgc2FtZSBoeWRyYXRlZCB2YWx1ZSBzaGFwZSBhcyB0aGUgbm9kZTp2bVxuICAgIC8vIGVuZ2luZSBlbWl0cy4gVHdvIHBhdGhzOlxuICAgIC8vICAgKiBNb2Rlcm4gKHZhbHVlQnl0ZXMgcHJlc2VudCk6IHRoZSBWTS1zaWRlIHJlamVjdGlvbiBoYW5kbGVyXG4gICAgLy8gICAgIHNlcmlhbGl6ZWQgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSAoRXJyb3Igc3ViY2xhc3Mgd2l0aFxuICAgIC8vICAgICBjYXVzZSBjaGFpbiwgcGxhaW4gb2JqZWN0LCBwcmltaXRpdmUsIGV0Yy4pIHVzaW5nIHRoZSBWTSdzXG4gICAgLy8gICAgIHdvcmtmbG93LXNlcmlhbGl6ZS4gUGFzcyB0aG9zZSBieXRlcyB0aHJvdWdoIGRpcmVjdGx5IHNvXG4gICAgLy8gICAgIHR5cGUgaWRlbnRpdHksIGNhdXNlIGNoYWlucywgYW5kIG5vbi1FcnJvciB0aHJvd3Mgc3Vydml2ZS5cbiAgICAvLyAgICAgV2UganVzdCBuZWVkIHRvIGFwcGx5IGVuY3J5cHRpb24gaWYgY29uZmlndXJlZCAodGhlIFZNJ3NcbiAgICAvLyAgICAgc2VyaWFsaXplciBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBlbmNyeXB0aW9uIGtleSkuXG4gICAgLy8gICAqIExlZ2FjeSBmYWxsYmFjazogcmVjb25zdHJ1Y3QgYW4gRXJyb3IgZnJvbSB0aGUgaG9zdC12aXNpYmxlXG4gICAgLy8gICAgIHtuYW1lLCBtZXNzYWdlLCBzdGFja30gZmllbGRzIGFuZCBydW4gaXQgdGhyb3VnaFxuICAgIC8vICAgICBgZGVoeWRyYXRlUnVuRXJyb3JgLiBVc2VkIHdoZW4gdmFsdWVCeXRlcyBpcyBhYnNlbnQgKGUuZy5cbiAgICAvLyAgICAgZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcyBmcm9tIFZNIGJvb3RzdHJhcCkuXG4gICAgbGV0IGRlaHlkcmF0ZWRFcnJvcjogVWludDhBcnJheTtcbiAgICBpZiAocmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzKSB7XG4gICAgICAvLyBIeWRyYXRlIHRoZSBWTS1zaWRlIGJ5dGVzLCByZW1hcCB0aGUgZXJyb3Igc3RhY2sgd2l0aCB0aGVcbiAgICAgIC8vIGhvc3Qtc2lkZSBzb3VyY2UgbWFwICh0aGUgVk0gY2FuJ3QgZG8gdGhpcyDigJQgaXQgbGFja3MgYm90aCB0aGVcbiAgICAgIC8vIHNvdXJjZSBtYXAgYW5kIGByZW1hcEVycm9yU3RhY2tgKSwgYW5kIHJlLWRlaHlkcmF0ZS4gVGhpc1xuICAgICAgLy8gcHJlc2VydmVzIHRoZSBvcmlnaW5hbCB2YWx1ZSdzIHR5cGUgaWRlbnRpdHkgLyBjYXVzZSBjaGFpblxuICAgICAgLy8gd2hpbGUgZml4aW5nIHVwIGZyYW1lcyB0byBwb2ludCBhdCB0aGUgdXNlcidzIHNvdXJjZSBmaWxlcy5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gYXdhaXQgaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQudmFsdWVCeXRlcyxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB1bmRlZmluZWQgLy8gVk0gYnl0ZXMgYXJlIHVuZW5jcnlwdGVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBoeWRyYXRlZCAmJlxuICAgICAgICAgIHR5cGVvZiBoeWRyYXRlZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAnc3RhY2snIGluIChoeWRyYXRlZCBhcyBvYmplY3QpICYmXG4gICAgICAgICAgdHlwZW9mIChoeWRyYXRlZCBhcyB7IHN0YWNrPzogdW5rbm93biB9KS5zdGFjayA9PT0gJ3N0cmluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgIC8vIEJvdGggZmlsZW5hbWUgc3BhY2VzIOKAlCBzZWUgdGhlIGZhaWxlZC1icmFuY2ggY29tbWVudCBhYm92ZS5cbiAgICAgICAgICAoaHlkcmF0ZWQgYXMgeyBzdGFjaz86IHN0cmluZyB9KS5zdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgIHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgKGh5ZHJhdGVkIGFzIHsgc3RhY2s6IHN0cmluZyB9KS5zdGFjayxcbiAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSxcbiAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FsayB0aGUgY2F1c2UgY2hhaW4gYW5kIHJlbWFwIG5lc3RlZCBzdGFja3MgdG9vLlxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgICBsZXQgbm9kZSA9IChoeWRyYXRlZCBhcyB7IGNhdXNlPzogdW5rbm93biB9KT8uY2F1c2U7XG4gICAgICAgIHdoaWxlIChub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiAhc2Vlbi5oYXMobm9kZSBhcyBvYmplY3QpKSB7XG4gICAgICAgICAgc2Vlbi5hZGQobm9kZSBhcyBvYmplY3QpO1xuICAgICAgICAgIGNvbnN0IG5vZGVTdGFjayA9IChub2RlIGFzIHsgc3RhY2s/OiB1bmtub3duIH0pLnN0YWNrO1xuICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZVN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAvLyBCb3RoIGZpbGVuYW1lIHNwYWNlcyDigJQgc2VlIHRoZSBmYWlsZWQtYnJhbmNoIGNvbW1lbnQgYWJvdmUuXG4gICAgICAgICAgICAobm9kZSBhcyB7IHN0YWNrPzogc3RyaW5nIH0pLnN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICByZW1hcEVycm9yU3RhY2sobm9kZVN0YWNrLCBmaWxlbmFtZSwgd29ya2Zsb3dDb2RlKSxcbiAgICAgICAgICAgICAgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLFxuICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSAobm9kZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZTtcbiAgICAgICAgfVxuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICBoeWRyYXRlZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChyZWh5ZHJhdGVFcnIpIHtcbiAgICAgICAgLy8gSWYgaHlkcmF0aW9uIC8gcmUtZGVoeWRyYXRpb24gZmFpbHMgZm9yIGFueSByZWFzb24sIGZhbGxcbiAgICAgICAgLy8gYmFjayB0byBwYXNzaW5nIHRocm91Z2ggdGhlIG9yaWdpbmFsIFZNIGJ5dGVzIChqdXN0IGFwcGx5XG4gICAgICAgIC8vIGVuY3J5cHRpb24gaWYgY29uZmlndXJlZCkuIEJldHRlciB0byBsb3NlIHNvdXJjZS1tYXBwZWRcbiAgICAgICAgLy8gZnJhbWVzIHRoYW4gdG8gbG9zZSB0aGUgZXJyb3IgZW50aXJlbHkuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gcmVtYXAgd29ya2Zsb3cgZXJyb3Igc3RhY2ssIHBhc3NpbmcgVk0gYnl0ZXMgdGhyb3VnaCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiAocmVoeWRyYXRlRXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGRlaHlkcmF0ZWRFcnJvciA9IChhd2FpdCBtYXliZUVuY3J5cHQoXG4gICAgICAgICAgcmVzdWx0LmZhaWxlZC52YWx1ZUJ5dGVzLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKSkgYXMgVWludDhBcnJheTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgcmVjb25zdHJ1Y3RlZC5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICByZWNvbnN0cnVjdGVkLFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKHNlckVycikge1xuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBtaW5pbWFsIHBheWxvYWQgc28gdGhlIHJ1biBzdGlsbCB0ZXJtaW5hdGVzXG4gICAgICAgIC8vIGV2ZW4gd2hlbiB0aGUgZXJyb3IgaXRzZWxmIGNvbnRhaW5zIHVuc2VyaWFsaXphYmxlIHZhbHVlcy5cbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGZhaWxlZCB0byBkZWh5ZHJhdGUgcnVuIGVycm9yLCBmYWxsaW5nIGJhY2sgdG8gYmFyZSBFcnJvcicsXG4gICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogKHNlckVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfVxuICAgICAgICApO1xuICAgICAgICBkZWh5ZHJhdGVkRXJyb3IgPSBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihyZXN1bHQuZmFpbGVkLm1lc3NhZ2UpLCB7XG4gICAgICAgICAgICBuYW1lOiByZXN1bHQuZmFpbGVkLm5hbWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogZGVoeWRyYXRlZEVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dvcmtmbG93IGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIHJ1bl9mYWlsZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIH0pO1xuICAgICAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkJywgeyByZXN1bHQ6ICdhbHJlYWR5X2ZpbmlzaGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2ZkaWFnKCdleGl0X2ZhaWxlZF9lcnJvcicsIHtcbiAgICAgICAgZXJyb3JOYW1lOiAoZXJyIGFzIEVycm9yKT8ubmFtZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiAoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICB3ZmRpYWcoJ2V4aXRfZmFpbGVkJywgeyByZXN1bHQ6ICdydW5fZmFpbGVkX3dyaXR0ZW4nIH0pO1xuICB9XG59XG4iXX0=
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==