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

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.
package/dist/runtime.js CHANGED
@@ -6,7 +6,7 @@ import { classifyRunError, isWorldContractError } from './classify-error.js';
6
6
  import { describeError } from './describe-error.js';
7
7
  import { WorkflowSuspension } from './global.js';
8
8
  import { runtimeLogger } from './logger.js';
9
- import { MAX_QUEUE_DELIVERIES, REPLAY_DIVERGENCE_MAX_RETRIES, } from './runtime/constants.js';
9
+ import { isTurboEnabled, MAX_QUEUE_DELIVERIES, REPLAY_DIVERGENCE_MAX_RETRIES, } from './runtime/constants.js';
10
10
  import { getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, loadWorkflowRunEvents, memoizeEncryptionKey, parseHealthCheckPayload, queueMessage, withHealthCheck, } from './runtime/helpers.js';
11
11
  import { handleReplayBudgetExhausted, ReplayBudget, } from './runtime/replay-budget.js';
12
12
  import { executeStep } from './runtime/step-executor.js';
@@ -15,6 +15,7 @@ import { getWaitContinuationDispatch } from './runtime/wait-continuation.js';
15
15
  import { getWorld, getWorldHandlers, } from './runtime/world.js';
16
16
  import { dehydrateRunError } from './serialization.js';
17
17
  import { remapErrorStack } from './source-map.js';
18
+ import { createStepHydrationCache, } from './step-hydration-cache.js';
18
19
  import * as Attribute from './telemetry/semantic-conventions.js';
19
20
  import { buildInvocationSpanLinks, getNextTraceCarrier, getSpanKind, getWorkflowTraceMode, isUsableTraceCarrier, trace, withTraceContext, withWorkflowBaggage, } from './telemetry.js';
20
21
  import { getErrorName, getErrorStack, normalizeUnknownError } from './types.js';
@@ -292,6 +293,14 @@ export function workflowEntrypoint(workflowCode, options) {
292
293
  // we fetch only events created after the last known cursor.
293
294
  let cachedEvents = null;
294
295
  let eventsCursor = null;
296
+ // Per-run cache of hydrated step return values, shared across
297
+ // every replay iteration of THIS invocation. Each iteration
298
+ // builds a fresh workflow context, so the cache is owned here
299
+ // (outside that context) and threaded into runWorkflow. It
300
+ // turns the otherwise O(N²) re-decrypt + re-parse of completed
301
+ // step results across N replays into O(N). Scoped to this run
302
+ // only — never reused across runs. See step-hydration-cache.ts.
303
+ const stepHydrationCache = createStepHydrationCache();
295
304
  // Inline-delta optimization: when an inline step's terminal
296
305
  // write returns the event-log delta since the pre-write
297
306
  // cursor (a supporting World only), we stash it here so the
@@ -307,6 +316,70 @@ export function workflowEntrypoint(workflowCode, options) {
307
316
  let workflowStartedAt = -1;
308
317
  let preloadedEvents;
309
318
  let preloadedEventsCursor;
319
+ // Turbo mode fast-paths the very first delivery of the very
320
+ // first invocation, where it is provably safe to: background
321
+ // `run_started`, skip the initial event-log load (nothing has
322
+ // been written yet), and force optimistic inline start (no
323
+ // concurrent peer handler exists to race the create-claim).
324
+ // `runInput` is only present on the start()-enqueued message,
325
+ // and `attempt === 1` (1-based) means this is the first
326
+ // delivery; `incomingStepId` would mark a background-step
327
+ // invocation and `replayDivergence` a recovery replay — both
328
+ // ineligible. The single-handler guarantee that makes forced
329
+ // optimistic start safe ends once a hook/wait/attr is created,
330
+ // so turbo exits at that point (see `forceOptimisticStart`).
331
+ const turbo = isTurboEnabled() &&
332
+ runInput !== undefined &&
333
+ metadata.attempt === 1 &&
334
+ incomingStepId === undefined &&
335
+ !replayDivergence;
336
+ // Turbo mode only: resolves once the backgrounded
337
+ // `run_started` has landed (or rejects if it failed). Threaded
338
+ // into handleSuspension and executeStep so no step/hook/wait
339
+ // write races ahead of the run's creation. Undefined outside
340
+ // turbo, where `run_started` is awaited up front.
341
+ let runReadyBarrier;
342
+ // Order a terminal run write (run_completed / run_failed) after
343
+ // the backgrounded run_started in turbo mode — a no-step
344
+ // workflow can otherwise reach run_completed before the run
345
+ // exists. Best-effort: a barrier rejection is swallowed for
346
+ // ordering only; if run_started truly failed the terminal write
347
+ // surfaces the real error (run not found / gone) and the message
348
+ // redelivers. No-op outside turbo.
349
+ const awaitRunReady = async () => {
350
+ if (runReadyBarrier) {
351
+ try {
352
+ await runReadyBarrier;
353
+ }
354
+ catch {
355
+ // intentional: ordering barrier only — see above.
356
+ }
357
+ }
358
+ };
359
+ // Re-invoke the orchestrator. Outside turbo this returns
360
+ // `{ timeoutSeconds }`, which makes the queue reschedule the
361
+ // CURRENT delivery's message. In turbo that is a trap: the
362
+ // current message carries `runInput`, and on async queues
363
+ // (e.g. graphile-worker) a reschedule comes back as delivery
364
+ // attempt 1 — so turbo re-engages, skips the event-log load
365
+ // again, replays against an empty log, never observes the
366
+ // hook/attr event this invocation just wrote, and re-suspends
367
+ // forever (the run wedges). Under turbo we instead enqueue an
368
+ // explicit continuation that carries NO `runInput`, so the
369
+ // next delivery is a normal (non-turbo) load-and-replay that
370
+ // observes the committed events and makes progress; we then
371
+ // return `undefined` so the queue treats this delivery as done
372
+ // rather than also rescheduling it.
373
+ const reinvoke = async (delaySeconds) => {
374
+ if (!turbo)
375
+ return { timeoutSeconds: delaySeconds };
376
+ await queueMessage(world, getWorkflowQueueName(workflowName, namespace), {
377
+ runId,
378
+ traceCarrier: await nextTraceCarrier(),
379
+ requestedAt: new Date(),
380
+ }, delaySeconds > 0 ? { delaySeconds } : undefined);
381
+ return undefined;
382
+ };
310
383
  // If incoming message has a stepId, this is a background step
311
384
  // execution. Execute the step, then check if all parallel steps
312
385
  // from the batch are done. If so, replay inline (saving a queue
@@ -434,92 +507,159 @@ export function workflowEntrypoint(workflowCode, options) {
434
507
  // Contract: events.create('run_started') must be idempotent
435
508
  // for runs already in 'running' status (return the run
436
509
  // without error), not just for pending → running transitions.
437
- try {
438
- const result = await world.events.create(runId, {
439
- eventType: 'run_started',
440
- // Use the spec version from the original start() call
441
- // when available, so the resilient start path creates
442
- // the run with the correct version (not always current).
443
- specVersion: runInput?.specVersion ?? SPEC_VERSION_CURRENT,
444
- // Pass run input from queue so the server can
445
- // create the run if run_created was missed.
446
- // Uint8Array values survive the queue natively
447
- // (CBOR on world-vercel, JSON reviver on world-local).
448
- ...(runInput
449
- ? {
450
- eventData: {
451
- input: runInput.input,
452
- deploymentId: runInput.deploymentId,
453
- workflowName: runInput.workflowName,
454
- executionContext: runInput.executionContext,
455
- attributes: runInput.attributes,
456
- allowReservedAttributes: runInput.allowReservedAttributes,
457
- },
458
- }
459
- : {}),
460
- }, { requestId });
461
- if (!result.run) {
462
- throw new WorkflowRuntimeError(`Event creation for 'run_started' did not return the run entity for run "${runId}"`);
463
- }
464
- workflowRun = result.run;
465
- // If the response includes events, use them to skip
466
- // the initial events.list call and reduce TTFB.
467
- if (result.events &&
468
- result.events.length > 0 &&
469
- result.hasMore !== true) {
470
- preloadedEvents = result.events;
471
- preloadedEventsCursor = result.cursor;
472
- }
473
- if (!workflowRun.startedAt) {
474
- throw new WorkflowRuntimeError(`Workflow run "${runId}" has no "startedAt" timestamp`);
475
- }
510
+ const runStartedEvent = {
511
+ eventType: 'run_started',
512
+ // Use the spec version from the original start() call
513
+ // when available, so the resilient start path creates
514
+ // the run with the correct version (not always current).
515
+ specVersion: runInput?.specVersion ?? SPEC_VERSION_CURRENT,
516
+ // Pass run input from queue so the server can
517
+ // create the run if run_created was missed.
518
+ // Uint8Array values survive the queue natively
519
+ // (CBOR on world-vercel, JSON reviver on world-local).
520
+ ...(runInput
521
+ ? {
522
+ eventData: {
523
+ input: runInput.input,
524
+ deploymentId: runInput.deploymentId,
525
+ workflowName: runInput.workflowName,
526
+ executionContext: runInput.executionContext,
527
+ attributes: runInput.attributes,
528
+ allowReservedAttributes: runInput.allowReservedAttributes,
529
+ },
530
+ }
531
+ : {}),
532
+ };
533
+ if (turbo && runInput) {
534
+ // Turbo: background `run_started` and synthesize the run
535
+ // entity locally so replay can begin without waiting for
536
+ // the round-trip. Safe here because this is the first
537
+ // delivery of the first invocation — start() created the
538
+ // run moments ago and no events have been written yet. The
539
+ // barrier is consumed by every downstream write (suspension
540
+ // handler, optimistic step_started, terminal run writes) so
541
+ // nothing is written before the run exists.
542
+ const startedPromise = world.events.create(runId, runStartedEvent,
543
+ // We background this purely as a write barrier and
544
+ // never read its preloaded events (preloadedEvents is
545
+ // forced to [] below), so tell the World to skip the
546
+ // run_started event-log preload. That trims the
547
+ // run_started request the chained first step_started
548
+ // waits on — shortening time-to-second-step — and the
549
+ // wasted list+resolve it would otherwise compute.
550
+ { requestId, skipPreload: true });
551
+ runReadyBarrier = startedPromise;
552
+ // Attach a no-op rejection handler so an early failure
553
+ // never surfaces as an unhandledRejection before a consumer
554
+ // (await/then) is attached; consumers still observe it.
555
+ startedPromise.catch(() => { });
556
+ // Skip the initial events.list: nothing has been written to
557
+ // the log yet on a first delivery (run_started is still in
558
+ // flight). An empty preloaded set routes iteration 1 through
559
+ // the no-load preloaded branch; iteration 2 then takes the
560
+ // existing post-preloaded full reload to pick up a cursor
561
+ // (no spurious "cursor missing" warning). `[]` is
562
+ // intentionally truthy here — do not change the load
563
+ // branches' `if (preloadedEvents)` checks to test length.
564
+ preloadedEvents = [];
565
+ const now = new Date();
566
+ workflowRun = {
567
+ runId,
568
+ status: 'running',
569
+ deploymentId: runInput.deploymentId,
570
+ workflowName: runInput.workflowName,
571
+ specVersion: runInput.specVersion,
572
+ executionContext: runInput.executionContext,
573
+ input: runInput.input,
574
+ // Seed attributes from start() ride along in `runInput`
575
+ // (they live in `run_created`'s eventData, not separate
576
+ // `attr_set` events), so the synthesized snapshot carries
577
+ // them even though we skip the initial events.list. This
578
+ // is correct ONLY while attributes are write-only:
579
+ // there is no in-workflow read API today (see workflow.ts
580
+ // "structural until a read API is introduced"), so the
581
+ // empty preloaded log can't diverge on a read. If a read
582
+ // API is ever added it MUST read from this snapshot, not
583
+ // by replaying run_created/attr_set events — otherwise
584
+ // turbo's empty initial log would surface seed attributes
585
+ // as `{}` on the first delivery only.
586
+ attributes: runInput.attributes ?? {},
587
+ startedAt: now,
588
+ createdAt: now,
589
+ updatedAt: now,
590
+ };
591
+ workflowStartedAt = +now;
592
+ span?.setAttributes({
593
+ ...Attribute.WorkflowRunStatus('running'),
594
+ ...Attribute.WorkflowStartedAt(workflowStartedAt),
595
+ });
476
596
  }
477
- catch (err) {
478
- // Run was concurrently completed/failed/cancelled
479
- if (EntityConflictError.is(err) ||
480
- RunExpiredError.is(err)) {
481
- // EntityConflictError: run was concurrently
482
- // completed/failed/cancelled during setup.
483
- // RunExpiredError: run already in terminal state.
484
- // In both cases, skip processing this message.
485
- runtimeLogger.info('Run already finished during setup, skipping', { workflowRunId: runId, message: err.message });
486
- return;
597
+ else {
598
+ try {
599
+ const result = await world.events.create(runId, runStartedEvent, { requestId });
600
+ if (!result.run) {
601
+ throw new WorkflowRuntimeError(`Event creation for 'run_started' did not return the run entity for run "${runId}"`);
602
+ }
603
+ workflowRun = result.run;
604
+ // If the response includes events, use them to skip
605
+ // the initial events.list call and reduce TTFB.
606
+ if (result.events &&
607
+ result.events.length > 0 &&
608
+ result.hasMore !== true) {
609
+ preloadedEvents = result.events;
610
+ preloadedEventsCursor = result.cursor;
611
+ }
612
+ if (!workflowRun.startedAt) {
613
+ throw new WorkflowRuntimeError(`Workflow run "${runId}" has no "startedAt" timestamp`);
614
+ }
487
615
  }
488
- else {
489
- const errorCode = getWorkflowSetupErrorCode(err);
490
- if (!errorCode) {
491
- throw err;
616
+ catch (err) {
617
+ // Run was concurrently completed/failed/cancelled
618
+ if (EntityConflictError.is(err) ||
619
+ RunExpiredError.is(err)) {
620
+ // EntityConflictError: run was concurrently
621
+ // completed/failed/cancelled during setup.
622
+ // RunExpiredError: run already in terminal state.
623
+ // In both cases, skip processing this message.
624
+ runtimeLogger.info('Run already finished during setup, skipping', { workflowRunId: runId, message: err.message });
625
+ return;
492
626
  }
493
- await recordFatalRunError({
494
- world,
495
- workflowRun,
496
- runId,
497
- requestId,
498
- err,
499
- errorCode,
500
- logMessage: 'Fatal runtime error during workflow setup',
627
+ else {
628
+ const errorCode = getWorkflowSetupErrorCode(err);
629
+ if (!errorCode) {
630
+ throw err;
631
+ }
632
+ await recordFatalRunError({
633
+ world,
634
+ workflowRun,
635
+ runId,
636
+ requestId,
637
+ err,
638
+ errorCode,
639
+ logMessage: 'Fatal runtime error during workflow setup',
640
+ });
641
+ return;
642
+ }
643
+ }
644
+ workflowStartedAt = +workflowRun.startedAt;
645
+ span?.setAttributes({
646
+ ...Attribute.WorkflowRunStatus(workflowRun.status),
647
+ ...Attribute.WorkflowStartedAt(workflowStartedAt),
648
+ });
649
+ if (workflowRun.status !== 'running') {
650
+ // Workflow has already completed or failed, so we can skip it
651
+ runtimeLogger.info('Workflow already completed or failed, skipping', {
652
+ workflowRunId: runId,
653
+ status: workflowRun.status,
501
654
  });
655
+ // TODO: for `cancel`, we actually want to propagate a WorkflowCancelled event
656
+ // inside the workflow context so the user can gracefully exit. this is SIGTERM
657
+ // TODO: furthermore, there should be a timeout or a way to force cancel SIGKILL
658
+ // so that we actually exit here without replaying the workflow at all, in the case
659
+ // the replaying the workflow is itself failing.
502
660
  return;
503
661
  }
504
- }
505
- workflowStartedAt = +workflowRun.startedAt;
506
- span?.setAttributes({
507
- ...Attribute.WorkflowRunStatus(workflowRun.status),
508
- ...Attribute.WorkflowStartedAt(workflowStartedAt),
509
- });
510
- if (workflowRun.status !== 'running') {
511
- // Workflow has already completed or failed, so we can skip it
512
- runtimeLogger.info('Workflow already completed or failed, skipping', {
513
- workflowRunId: runId,
514
- status: workflowRun.status,
515
- });
516
- // TODO: for `cancel`, we actually want to propagate a WorkflowCancelled event
517
- // inside the workflow context so the user can gracefully exit. this is SIGTERM
518
- // TODO: furthermore, there should be a timeout or a way to force cancel SIGKILL
519
- // so that we actually exit here without replaying the workflow at all, in the case
520
- // the replaying the workflow is itself failing.
521
- return;
522
- }
662
+ } // end else (non-turbo run_started)
523
663
  } // end if (!workflowRun)
524
664
  // Resolve the encryption key for this run's deployment.
525
665
  // Used eagerly here since both runWorkflow (input
@@ -771,7 +911,7 @@ export function workflowEntrypoint(workflowCode, options) {
771
911
  eventCount: events.length,
772
912
  });
773
913
  replayStart = Date.now();
774
- const result = await runWorkflow(workflowCode, workflowRun, events, encryptionKey);
914
+ const result = await runWorkflow(workflowCode, workflowRun, events, encryptionKey, stepHydrationCache);
775
915
  runtimeLogger.debug('Workflow replay completed', {
776
916
  workflowRunId: runId,
777
917
  loopIteration,
@@ -779,6 +919,10 @@ export function workflowEntrypoint(workflowCode, options) {
779
919
  });
780
920
  // Workflow completed
781
921
  try {
922
+ // Turbo: a workflow that finishes with no steps reaches
923
+ // here before the backgrounded run_started; order the
924
+ // terminal write after it so the run exists.
925
+ await awaitRunReady();
782
926
  await world.events.create(runId, {
783
927
  eventType: 'run_completed',
784
928
  specVersion: SPEC_VERSION_CURRENT,
@@ -822,6 +966,7 @@ export function workflowEntrypoint(workflowCode, options) {
822
966
  run: workflowRun,
823
967
  span,
824
968
  requestId,
969
+ runReadyBarrier,
825
970
  });
826
971
  }
827
972
  catch (suspensionError) {
@@ -846,6 +991,9 @@ export function workflowEntrypoint(workflowCode, options) {
846
991
  errorMessage: suspensionError.message,
847
992
  });
848
993
  try {
994
+ // Turbo: order the terminal write after the
995
+ // backgrounded run_started so the run exists.
996
+ await awaitRunReady();
849
997
  await world.events.create(runId, {
850
998
  eventType: 'run_failed',
851
999
  specVersion: SPEC_VERSION_CURRENT,
@@ -887,7 +1035,7 @@ export function workflowEntrypoint(workflowCode, options) {
887
1035
  });
888
1036
  // Hook conflict: break loop, re-invoke via queue
889
1037
  if (suspensionResult.hasHookConflict) {
890
- return { timeoutSeconds: 0 };
1038
+ return await reinvoke(0);
891
1039
  }
892
1040
  // Native workflow attribute events are resolved through
893
1041
  // replay. Re-invoke before processing pending steps:
@@ -895,7 +1043,7 @@ export function workflowEntrypoint(workflowCode, options) {
895
1043
  // durable attribute event can win without executing
896
1044
  // the losing step.
897
1045
  if (suspensionResult.hasAttributeEvents) {
898
- return { timeoutSeconds: 0 };
1046
+ return await reinvoke(0);
899
1047
  }
900
1048
  const pendingSteps = suspensionResult.pendingSteps;
901
1049
  // Inline execution is gated on ownership. The
@@ -994,7 +1142,7 @@ export function workflowEntrypoint(workflowCode, options) {
994
1142
  // queued or none pending) the run would sit idle
995
1143
  // until some unrelated message woke it.
996
1144
  if (suspensionResult.hasAwaitedHookCreation) {
997
- return { timeoutSeconds: 0 };
1145
+ return await reinvoke(0);
998
1146
  }
999
1147
  return;
1000
1148
  }
@@ -1046,6 +1194,33 @@ export function workflowEntrypoint(workflowCode, options) {
1046
1194
  lazyInlineSteps.length === 1 &&
1047
1195
  !suspensionResult.waitTimeout &&
1048
1196
  !hasOpenHookOrWait(cachedEvents ?? []);
1197
+ // Turbo mode forces optimistic inline start for this
1198
+ // batch — but only while the run is still "clean" (a pure
1199
+ // step suspension). The moment a hook or wait (or attr) is
1200
+ // created, later resume/parallel invocations become
1201
+ // possible, so the single-handler guarantee that makes
1202
+ // forced optimistic start safe no longer holds — turbo
1203
+ // exits and the steps take the normal (env-gated)
1204
+ // await-then-run path. The hook-conflict / attr cases
1205
+ // already returned early above and the awaited-hook case
1206
+ // emptied lazyInlineSteps; the checks below are defensive.
1207
+ //
1208
+ // The `suspensionResult.*` flags only reflect what THIS
1209
+ // batch created, so they do not catch a hook/wait opened
1210
+ // in an earlier iteration of the same delivery (e.g. a
1211
+ // fire-and-forget `createHook(...)` that doesn't block the
1212
+ // workflow, letting the replay loop continue to later pure
1213
+ // step suspensions). Once any hook or wait is open in the
1214
+ // cumulative log, resume/parallel invocations are possible
1215
+ // for the rest of the run, so turbo must latch off
1216
+ // permanently — checked here via `hasOpenHookOrWait` over
1217
+ // the cumulative `cachedEvents`.
1218
+ const forceOptimisticStart = turbo &&
1219
+ !suspensionResult.waitTimeout &&
1220
+ !suspensionResult.hasHookEvents &&
1221
+ !suspensionResult.hasAttributeEvents &&
1222
+ !suspensionResult.hasAwaitedHookCreation &&
1223
+ !hasOpenHookOrWait(cachedEvents ?? []);
1049
1224
  // Execute the inline steps in parallel. The replay
1050
1225
  // budget is paused for the whole batch — step duration is
1051
1226
  // bounded by the platform's function maxDuration, not the
@@ -1067,6 +1242,12 @@ export function workflowEntrypoint(workflowCode, options) {
1067
1242
  // input on step_started so the world creates the
1068
1243
  // step on the fly.
1069
1244
  lazyStepInput: s.dehydratedInput,
1245
+ // Turbo: force optimistic start and hold the lazy
1246
+ // step_started until the backgrounded run_started
1247
+ // lands (the body still runs immediately). Both
1248
+ // are undefined/false outside turbo.
1249
+ forceOptimisticStart,
1250
+ runReadyBarrier,
1070
1251
  ...(requestInlineDelta && preInlineWriteCursor
1071
1252
  ? {
1072
1253
  inlineDeltaSinceCursor: preInlineWriteCursor,
@@ -1149,7 +1330,7 @@ export function workflowEntrypoint(workflowCode, options) {
1149
1330
  // the in-invocation flush window (<= 500ms + waitUntil),
1150
1331
  // so ops settle before the post-backoff redelivery
1151
1332
  // replays and reads them.
1152
- return { timeoutSeconds: throttleTimeout };
1333
+ return await reinvoke(throttleTimeout);
1153
1334
  }
1154
1335
  if (toRetry.length > 0) {
1155
1336
  const retryTraceCarrier = await nextTraceCarrier();
@@ -1296,6 +1477,9 @@ export function workflowEntrypoint(workflowCode, options) {
1296
1477
  // type identity and custom properties round-trip
1297
1478
  // through the event log.
1298
1479
  try {
1480
+ // Turbo: order the terminal write after the
1481
+ // backgrounded run_started so the run exists.
1482
+ await awaitRunReady();
1299
1483
  await world.events.create(runId, {
1300
1484
  eventType: 'run_failed',
1301
1485
  specVersion: SPEC_VERSION_CURRENT,
@@ -1350,4 +1534,4 @@ export function workflowEntrypoint(workflowCode, options) {
1350
1534
  return cachedHandler(req);
1351
1535
  });
1352
1536
  }
1353
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUNqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw2QkFBNkIsR0FDOUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLGVBQWUsR0FDaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLFlBQVksR0FDYixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFP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QUNyRSxPQUFPLGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJlcGxheURpdmVyZ2VuY2VFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBwYXJzZVdvcmtmbG93TmFtZSxcbiAgd29ya2Zsb3dEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjbGFzc2lmeVJ1bkVycm9yLCBpc1dvcmxkQ29udHJhY3RFcnJvciB9IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIE1BWF9RVUVVRV9ERUxJVkVSSUVTLFxuICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbn0gZnJvbSAnLi9ydW50aW1lL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBsb2FkV29ya2Zsb3dSdW5FdmVudHMsXG4gIG1lbW9pemVFbmNyeXB0aW9uS2V5LFxuICBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZCxcbiAgcXVldWVNZXNzYWdlLFxuICB3aXRoSGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCxcbiAgUmVwbGF5QnVkZ2V0LFxufSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBleGVjdXRlU3RlcCB9IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGhhbmRsZVN1c3BlbnNpb24gfSBmcm9tICcuL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLmpzJztcbmltcG9ydCB7IGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB9IGZyb20gJy4vcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgdHlwZSBXb3JsZEhhbmRsZXJzLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlUnVuRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrIH0gZnJvbSAnLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBidWlsZEludm9jYXRpb25TcGFuTGlua3MsXG4gIGdldE5leHRUcmFjZUNhcnJpZXIsXG4gIGdldFNwYW5LaW5kLFxuICBnZXRXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaXNVc2FibGVUcmFjZUNhcnJpZXIsXG4gIHRyYWNlLFxuICB3aXRoVHJhY2VDb250ZXh0LFxuICB3aXRoV29ya2Zsb3dCYWdnYWdlLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRFcnJvck5hbWUsIGdldEVycm9yU3RhY2ssIG5vcm1hbGl6ZVVua25vd25FcnJvciB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRXb3JrZmxvd1N1c3BlbnNpb25NZXNzYWdlIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IHJ1bldvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH07XG5leHBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5leHBvcnQge1xuICB0eXBlIEhlYWx0aENoZWNrRW5kcG9pbnQsXG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIGNhbmNlbFJ1bixcbiAgbGlzdFN0cmVhbXMsXG4gIHR5cGUgUmVhZFN0cmVhbU9wdGlvbnMsXG4gIHR5cGUgUmVjcmVhdGVSdW5PcHRpb25zLFxuICByZWFkU3RyZWFtLFxuICByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyxcbiAgcmVlbnF1ZXVlUnVuLFxuICB0eXBlIFN0b3BTbGVlcE9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwUmVzdWx0LFxuICB3YWtlVXBSdW4sXG59IGZyb20gJy4vcnVudGltZS9ydW5zLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgU3RhcnRPcHRpb25zLFxuICB0eXBlIFN0YXJ0T3B0aW9uc0Jhc2UsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkLFxuICBzdGFydCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0YXJ0LmpzJztcbi8vIFYyOiBzdGVwRW50cnlwb2ludCBpcyBubyBsb25nZXIgcmUtZXhwb3J0ZWQg4oCUIHRoZSBjb21iaW5lZCBoYW5kbGVyXG4vLyAod29ya2Zsb3dFbnRyeXBvaW50KSBleGVjdXRlcyBzdGVwcyBpbmxpbmUuIFJlbW92aW5nIHRoZSByZS1leHBvcnRcbi8vIHByZXZlbnRzIFR1cmJvcGFjayBmcm9tIHRyYWNpbmcgc3RlcC1oYW5kbGVyLmpzIOKGkiBnZXQtcG9ydC5qc1xuLy8gZmlsZXN5c3RlbSBvcGVyYXRpb25zIGludG8gdGhlIGZsb3cgcm91dGUgYnVuZGxlLlxuZXhwb3J0IHtcbiAgY3JlYXRlV29ybGQsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBzZXRXb3JsZCxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnI6IHVua25vd24pOiBSdW5FcnJvckNvZGUgfCBudWxsIHtcbiAgaWYgKFdvcmtmbG93UnVudGltZUVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1I7XG4gIH1cblxuICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gIHdvcmxkLFxuICB3b3JrZmxvd1J1bixcbiAgcnVuSWQsXG4gIHJlcXVlc3RJZCxcbiAgZXJyLFxuICBlcnJvckNvZGUsXG4gIGxvZ01lc3NhZ2UsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICByZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZXJyOiB1bmtub3duO1xuICBlcnJvckNvZGU6IFJ1bkVycm9yQ29kZTtcbiAgbG9nTWVzc2FnZTogc3RyaW5nO1xufSkge1xuICBydW50aW1lTG9nZ2VyLmVycm9yKGxvZ01lc3NhZ2UsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBlcnJvckNvZGUsXG4gICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuID8/IHJ1bklkKTtcbiAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgcnVuSWQsXG4gICAgICB7XG4gICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgKSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAnRmF0YWwgd29ybGQgY29udHJhY3QgZXJyb3Igd2hpbGUgcmVjb3JkaW5nIHdvcmtmbG93IGZhaWx1cmUnLFxuICAgICAgICB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1IsXG4gICAgICAgICAgZXJyb3I6IGZhaWxFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGZhaWxFcnIubWVzc2FnZSA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZmFpbEVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzOiBFdmVudFtdLCBydW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRlcm1pbmFsIHJ1biBldmVudHMgYXJlIGFsd2F5cyBsYXN0IGJ5IGNvbnN0cnVjdGlvbiAobm8gZXZlbnQgY3JlYXRpb25cbiAgLy8gc3VjY2VlZHMgYWdhaW5zdCBhIHRlcm1pbmFsIHJ1biksIGJ1dCBzY2FuIHRoZSBmdWxsIGFycmF5IGZvclxuICAvLyBkZWZlbnNlLWluLWRlcHRoOiBhIFdvcmxkL2JhY2tlbmQgb3JkZXJpbmcgYnVnIHNob3VsZG4ndCBtYWtlIHVzIG1pc3MgYW5cbiAgLy8gYWN0dWFsIHRlcm1pbmF0aW9uIHNpZ25hbC5cbiAgY29uc3QgdGVybWluYWxSdW5FdmVudCA9IGV2ZW50cy5maW5kKFxuICAgIChlKSA9PlxuICAgICAgZS5ydW5JZCA9PT0gcnVuSWQgJiZcbiAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJylcbiAgKTtcblxuICBpZiAoIXRlcm1pbmFsUnVuRXZlbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBydW50aW1lTG9nZ2VyLmRlYnVnKCdSdW4gcmVhY2hlZCB0ZXJtaW5hbCBldmVudCwgZXhpdGluZycsIHtcbiAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICBldmVudFR5cGU6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ6IHRlcm1pbmFsUnVuRXZlbnQuZXZlbnRJZCxcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYW55IGhvb2sgb3Igd2FpdCB0aGF0IGFuIG91dC1vZi1iYW5kIHdyaXRlciBjb3VsZFxuICogYXBwZW5kIGFuIGV2ZW50IGZvciBiZXR3ZWVuIGFuIGlubGluZSBzdGVwJ3MgYHN0ZXBfY29tcGxldGVkYCB3cml0ZSBhbmRcbiAqIHRoZSBuZXh0IHJlcGxheSDigJQgbmFtZWx5IGFuIG9wZW4gaG9vayAoYSBgaG9va19jcmVhdGVkYCBub3QgeWV0XG4gKiBgaG9va19kaXNwb3NlZGAsIHdoaWNoIGEgd2ViaG9vayByZWNlaXZlciBjYW4gcmVzb2x2ZSB3aXRoXG4gKiBgaG9va19yZWNlaXZlZGApIG9yIGFuIG9wZW4gd2FpdCAoYSBgd2FpdF9jcmVhdGVkYCBub3QgeWV0XG4gKiBgd2FpdF9jb21wbGV0ZWRgLCB3aGljaCB0aGUgd2FpdCB0aW1lciBjYW4gcmVzb2x2ZSB3aXRoXG4gKiBgd2FpdF9jb21wbGV0ZWRgKS5cbiAqXG4gKiBUaGlzIGdhdGVzIHRoZSBpbmxpbmUtZGVsdGEgZmFzdCBwYXRoLiBUaGUgZGVsdGEgcmV0dXJuZWQgYnkgdGhlXG4gKiBzdGVwLXRlcm1pbmFsIHdyaXRlIGlzIHRoZSBldmVudCBsb2cgYXMgb2YgdGhhdCB3cml0ZTsgaXQgaXMgY29uc3VtZWRcbiAqIG9uIHRoZSBORVhUIGxvb3AgaXRlcmF0aW9uLCBzbyBhbnkgZXZlbnQgYSBjb25jdXJyZW50IHdyaXRlciBhcHBlbmRzIGluXG4gKiB0aGF0IHdpbmRvdyB3b3VsZCBiZSBwcmVzZW50IGluIGEgcmVhbCBgZXZlbnRzLmxpc3RgIGZldGNoIGJ1dCBhYnNlbnRcbiAqIGZyb20gdGhlIHN0YWxlIGRlbHRhLiBNaXNzaW5nIHN1Y2ggYW4gZXZlbnQgZm9yIG9uZSByZXBsYXkgY2FuIGR1cmFibHlcbiAqIGNvbW1pdCBhIHNjaGVkdWxpbmcgZGVjaXNpb24gKGUuZy4gaW5saW5lLWV4ZWN1dGluZyB0aGUgbG9zZXIgb2YgYVxuICogYFByb21pc2UucmFjZShbaG9vaywgc3RlcF0pYCkgdGhhdCB0aGUgZXZlbnR1YWwgZnVsbCByZXBsYXkgY2Fubm90XG4gKiBjb25zdW1lIOKAlCBhIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLiBXaGVuIG5vIGhvb2sgb3Igd2FpdCBpcyBvcGVuLCB0aGVcbiAqIG9ubHkgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2ggaXMgYmVuaWduIHRvIG9ic2VydmUgb25lXG4gKiBpdGVyYXRpb24gbGF0ZSAodGhlIG5leHQgZW50aXR5IHdyaXRlIGlzIHJlamVjdGVkIGFnYWluc3QgdGhlIHRlcm1pbmFsXG4gKiBydW4gYW5kIHRoZSBydW4gaXMgYWxyZWFkeSB0ZXJtaW5hbCksIHNvIHRoZSBmYXN0IHBhdGggaXMgc2FmZS5cbiAqXG4gKiBTdGVwLWJvZHkgYGF0dHJfc2V0YCB3cml0ZXMgYXJlIE5PVCBhIGNvbmNlcm46IHRoZXkgbGFuZCBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYW5kIGFyZSB0aGVyZWZvcmUgYWxyZWFkeSBpbnNpZGUgdGhlIHJldHVybmVkXG4gKiBkZWx0YS5cbiAqL1xuZnVuY3Rpb24gaGFzT3Blbkhvb2tPcldhaXQoZXZlbnRzOiBFdmVudFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpc3Bvc2VkSG9va0lkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykgZGlzcG9zZWRIb29rSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIGVsc2UgaWYgKGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICBjb21wbGV0ZWRXYWl0SWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmXG4gICAgICAhZGlzcG9zZWRIb29rSWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHJvdXRlIHdoaWNoIGhhbmRsZXMgd29ya2Zsb3cgZXhlY3V0aW9uIHJlcXVlc3RzLFxuICogZXhlY3V0aW5nIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBmdW5jdGlvbiBpbnZvY2F0aW9uc1xuICogYW5kIHF1ZXVlIG92ZXJoZWFkLlxuICpcbiAqIFRoZSBoYW5kbGVyIGxvb3BzOiByZXBsYXkgd29ya2Zsb3cg4oaSIGV4ZWN1dGUgc3RlcCBpbmxpbmUg4oaSIHJlcGxheSDihpIgLi4uXG4gKiB1bnRpbCB0aGUgd29ya2Zsb3cgY29tcGxldGVzLCB0aW1lcyBvdXQsIG9yIGVuY291bnRlcnMgbm9uLXN0ZXAgc3VzcGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGFsbCB3b3JrZmxvdyBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhIFZlcmNlbCBBUEkgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93RW50cnlwb2ludChcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IG5hbWVzcGFjZT86IHN0cmluZyB9XG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgPVxuICAgIE51bWJlcihwcm9jZXNzLmVudi5XT1JLRkxPV19WMl9USU1FT1VUX01TKSB8fCAxMjBfMDAwO1xuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpO1xuICBjb25zdCB3b3JrZmxvd1ByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgbmFtZXNwYWNlKTtcblxuICBjb25zdCBoYW5kbGVyID0gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgICB3b3JrZmxvd1ByZWZpeCxcbiAgICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgICBjb25zdCBoZWFsdGhDaGVjayA9IHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKG1lc3NhZ2VfKTtcbiAgICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICAgICAgICAnd29ya2Zsb3cnLFxuICAgICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogaW5jb21pbmdUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcmVxdWVzdGVkQXQsXG4gICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlLFxuICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICB9ID0gV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgICAgLy8gYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyBhIHRyYWNlIGNhcnJpZXIsIGJ1dFxuICAgICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuXG4gICAgICAgIC8vIGFic2VudCBvbmUgc28gbGlua2VkIG1vZGUgZmFsbHMgYmFjayB0byBhIGZyZXNoIG9yaWdpbiBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgICAgPyBpbmNvbWluZ1RyYWNlQ2FycmllclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSh3b3JrZmxvd1ByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgIC8vIC0tLSBNYXggZGVsaXZlcnkgY2hlY2sgLS0tXG4gICAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSB3b3JrZmxvd3MgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBydW4g4oCUIGF0dGFjaGVzIHJ1bklkL3dvcmtmbG93TmFtZSB0byBldmVyeVxuICAgICAgICAvLyBsb2cgbGluZSBhbmQgY2hpbGQgbG9nZ2VycyBiZWxvdywgc28gY2FsbGVycyBkb24ndCByZXBlYXQgaXQuXG4gICAgICAgIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gTUFYX1FVRVVFX0RFTElWRVJJRVMpIHtcbiAgICAgICAgICBjb25zdCBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24gPSBkZXNjcmliZUVycm9yKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgV29ya2Zsb3cgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5lcnJvckNvZGUsXG4gICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7TUFYX1FVRVVFX0RFTElWRVJJRVN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb24g4oCUXG4gICAgICAgIC8vIHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMg4oCUIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzIOKAlFxuICAgICAgICAvLyBzZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gLS0tIFJlcGxheSBidWRnZXQgYm9va2tlZXBpbmcgLS0tXG4gICAgICAgIC8vIFRoZSByZXBsYXkgYnVkZ2V0IGJvdW5kcyB0aGUgKm5vbi1zdGVwKiBwb3J0aW9uIG9mIGEgc2luZ2xlXG4gICAgICAgIC8vIGhhbmRsZXIgaW52b2NhdGlvbjogZGV0ZXJtaW5pc3RpYyBldmVudC1sb2cgcmVwbGF5LCB3b3JrZmxvdy1WTVxuICAgICAgICAvLyBleGVjdXRpb24gYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMsIHN1c3BlbnNpb24gaGFuZGxpbmcsIHF1ZXVlXG4gICAgICAgIC8vIHJvdW5kLXRyaXBzLCBldGMuIElubGluZSBzdGVwIGJvZGllcyAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zXG4gICAgICAgIC8vIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkIOKAlCB0aGV5IGFyZVxuICAgICAgICAvLyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uIGBtYXhEdXJhdGlvbmAgYW5kIHRoZVxuICAgICAgICAvLyBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AgZWFybHktcmV0dXJuIGd1YXJkIGJlbG93LlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgYnVkZ2V0IGlzIGNoZWNrZWQgYXQgbG9vcCBib3VuZGFyaWVzICh0b3Agb2YgZWFjaCBgd2hpbGVgXG4gICAgICAgIC8vIGl0ZXJhdGlvbikuIE5vdGUgdGhpcyBpcyAqbGVzcyByZXNwb25zaXZlKiB0aGFuIHRoZSBvbGRcbiAgICAgICAgLy8gYHNldFRpbWVvdXRgLWJhc2VkIGFwcHJvYWNoOiBhIHNpbmdsZSBwYXRob2xvZ2ljYWwgYHJ1bldvcmtmbG93YFxuICAgICAgICAvLyBjYWxsIHByb2Nlc3NpbmcgYSBodWdlIGV2ZW50IGxvZyBjYW4gb3ZlcnNob290IHRoZSBidWRnZXQgYnkgdXBcbiAgICAgICAgLy8gdG8gb25lIGl0ZXJhdGlvbiBiZWZvcmUgYmFpbGluZy4gSW4gcHJhY3RpY2UgdGhlIGhlYWRyb29tIGJ1aWx0XG4gICAgICAgIC8vIGludG8gYE1BWF9SRVBMQVlfVElNRU9VVF9NU2AgKGFuZCB0aGUgcGxhdGZvcm0gYG1heER1cmF0aW9uYFxuICAgICAgICAvLyBTSUdURVJNIGFzIHVsdGltYXRlIGJhY2tzdG9wKSBnaXZlcyB1cyBzbGFjayDigJQgdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIGBzZXRUaW1lb3V0YCBhcHByb2FjaCBhbHNvIHJlbGllZCBvbiB0aGUgcGxhdGZvcm0ga2lsbCBhcyB0aGVcbiAgICAgICAgLy8gaGFyZCBiYWNrc3RvcC4gRG8gKm5vdCogXCJmaXhcIiB0aGlzIGJ5IGFkZGluZyBhIGBzZXRJbnRlcnZhbGA7XG4gICAgICAgIC8vIGl0IHdvdWxkIHJpc2sgdGhlIHNhbWUgYnVnIHdlIGp1c3QgcmVtb3ZlZCAoYm91bmRpbmcgc3RlcFxuICAgICAgICAvLyBib2RpZXMpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFYXJsaWVyIHZlcnNpb25zIChwcmUtIzIwMDkgZml4KSB1c2VkIGEgc2luZ2xlIGBzZXRUaW1lb3V0YFxuICAgICAgICAvLyB0aGF0IGFsc28gYm91bmRlZCBzdGVwIGJvZGllcywgd2hpY2ggYnJva2UgYW55IHdvcmtmbG93IHdpdGggYVxuICAgICAgICAvLyBzaW5nbGUgc3RlcCBsb25nZXIgdGhhbiB0aGUgYnVkZ2V0LlxuICAgICAgICBjb25zdCByZXBsYXlCdWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG5cbiAgICAgICAgLy8gSW4gbGlua2VkIG1vZGUgdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBpcyBOT1QgcmVzdG9yZWQgYXMgdGhlXG4gICAgICAgIC8vIGFjdGl2ZSAocGFyZW50KSBjb250ZXh0IOKAlCBwYXNzaW5nIGB1bmRlZmluZWRgIG1ha2VzXG4gICAgICAgIC8vIHdpdGhUcmFjZUNvbnRleHQgYSBwYXNzdGhyb3VnaCwgc28gdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvd1xuICAgICAgICAvLyBzdGF5cyBhIGNoaWxkIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCBhbmQgdGhlXG4gICAgICAgIC8vIHJ1bi1vcmlnaW4gdHJhdmVscyBhcyBhIHNwYW4gbGluayBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBwYXJlbnRUcmFjZUNhcnJpZXIgPVxuICAgICAgICAgIHRyYWNlTW9kZSA9PT0gJ2NvbnRpbnVvdXMnID8gdHJhY2VDb250ZXh0IDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBRdWV1ZS1kZWxpdmVyZWQgaW52b2NhdGlvbjogQ09OU1VNRVIga2luZCwgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIHF1ZXVlLWRlbGl2ZXJlZCBzdGVwLmV4ZWN1dGUgc3Bhbi5cbiAgICAgICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnQ09OU1VNRVInKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUcmFjZUNvbnRleHQocGFyZW50VHJhY2VDYXJyaWVyLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhXb3JrZmxvd0JhZ2dhZ2UoXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCB3b3JrZmxvd05hbWUgfSxcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGxldCBsb29wSXRlcmF0aW9uID0gMDtcblxuICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgY2FjaGU6IGtlZXAgbG9hZGVkIGV2ZW50cyBpbiBtZW1vcnkgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24gd2UgZG8gYSBmdWxsIGxvYWQ7IG9uIHN1YnNlcXVlbnQgaXRlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gd2UgZmV0Y2ggb25seSBldmVudHMgY3JlYXRlZCBhZnRlciB0aGUgbGFzdCBrbm93biBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICBsZXQgY2FjaGVkRXZlbnRzOiBFdmVudFtdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogd2hlbiBhbiBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByZXR1cm5zIHRoZSBldmVudC1sb2cgZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIChhIHN1cHBvcnRpbmcgV29ybGQgb25seSksIHdlIHN0YXNoIGl0IGhlcmUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGNvbnN1bWVzIGl0IGluIHBsYWNlIG9mIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQtdHJpcC4gRWFjaCB2YWx1ZSBpcyBjb25zdW1lZCBleGFjdGx5IG9uY2VcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNsZWFyZWQuIE51bGwgbWVhbnMgXCJubyBkZWx0YSBwZW5kaW5nIOKAlCBmZXRjaFxuICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHlcIi4gU2VlIHRoZSBjb25zdW1lIHNpdGUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9kdWNlIHNpdGUgYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLlxuICAgICAgICAgICAgICAgICAgbGV0IHBlbmRpbmdJbmxpbmVEZWx0YToge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHNDdXJzb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIGluY29taW5nIG1lc3NhZ2UgaGFzIGEgc3RlcElkLCB0aGlzIGlzIGEgYmFja2dyb3VuZCBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24uIEV4ZWN1dGUgdGhlIHN0ZXAsIHRoZW4gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBiYXRjaCBhcmUgZG9uZS4gSWYgc28sIHJlcGxheSBpbmxpbmUgKHNhdmluZyBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyByb3VuZHRyaXApLiBJZiBub3QsIHJldHVybiDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwaWNrIHVwIHRoZSByZXBsYXkuXG4gICAgICAgICAgICAgICAgICBpZiAoaW5jb21pbmdTdGVwSWQgJiYgaW5jb21pbmdTdGVwTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnUnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkLCBza2lwcGluZyBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGF0dXM6IGJnUnVuLnN0YXR1cyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1N0YXJ0ZWRBdCA9IGJnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyArYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgdGhlIHJlcGxheSBidWRnZXQgd2hpbGUgdGhlIHN0ZXAgYm9keSBydW5zIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBTZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5QnVkZ2V0IGRvY3MgZm9yIHRoZSBjb250cmFjdC5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD4+O1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBiZ1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IGJnUnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3RlcCBoYWQgcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMpLCBicmVhayBhbmQgbGV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdFVudGlsIGZsdXNoIHRoZW0g4oCUIGNhbid0IGNvbnRpbnVlIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0Lmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2ZhaWxlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ3NraXBwZWQnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyB0byBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3Vyc29yLWJhc2VkIGxvYWRpbmcgc28gdGhlIG1haW4gbG9vcCBjYW4gY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsbHkgZnJvbSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcGVuZGluZyBzdGVwczogYW55IHN0ZXBfY3JlYXRlZCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1hdGNoaW5nIHN0ZXBfY29tcGxldGVkIG9yIHN0ZXBfZmFpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBUZXJtaW5hbElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNQZW5kaW5nU3RlcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc3RlcENyZWF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGVwVGVybWluYWxJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1BlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBzdGVwcyBzdGlsbCBpbiBwcm9ncmVzcy4gUmV0dXJuIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWluZyDigJQgdGhlIGxhc3QgaGFuZGxlciB0byBjb21wbGV0ZSB3aWxsIHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgZG9uZSBhbmQgcmVwbGF5IGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmUgYnV0IG90aGVyIHN0ZXBzIHBlbmRpbmcsIHJldHVybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIGRvbmUg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiByZXBsYXkgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBzaGFyZWQgc3RhdGUgc28gdGhlIGxvb3AgY2FuIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lIGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gYmdSdW47XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9IGJnU3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkRXZlbnRzIGFuZCBldmVudHNDdXJzb3IgYWxyZWFkeSBzZXQgZnJvbSBsb2FkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBlcnJvciB3aGlsZSBwcmVwYXJpbmcgYmFja2dyb3VuZCB3b3JrZmxvdyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHRoZSBydW4gc3RhdGUgLS0tXG4gICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHdvcmtmbG93UnVuIHdhcyBhbHJlYWR5IHNldCBieSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCBwYXRoIChpbmxpbmUgcmVwbGF5IGFmdGVyIGFsbCBwYXJhbGxlbCBzdGVwcyBkb25lKS5cbiAgICAgICAgICAgICAgICAgIGlmICghd29ya2Zsb3dSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgcnVuX3N0YXJ0ZWQgZGlyZWN0bHkg4oCUIHRoaXMgYm90aCB0cmFuc2l0aW9uc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHRvICdydW5uaW5nJyBBTkQgcmV0dXJucyB0aGUgcnVuIGVudGl0eSwgc2F2aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgc2VwYXJhdGUgcnVucy5nZXQgcm91bmQtdHJpcC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJhY3Q6IGV2ZW50cy5jcmVhdGUoJ3J1bl9zdGFydGVkJykgbXVzdCBiZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBydW5zIGFscmVhZHkgaW4gJ3J1bm5pbmcnIHN0YXR1cyAocmV0dXJuIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBlcnJvciksIG5vdCBqdXN0IGZvciBwZW5kaW5nIOKGkiBydW5uaW5nIHRyYW5zaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdmFpbGFibGUsIHNvIHRoZSByZXNpbGllbnQgc3RhcnQgcGF0aCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gd2l0aCB0aGUgY29ycmVjdCB2ZXJzaW9uIChub3QgYWx3YXlzIGN1cnJlbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dD8uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgcnVuIGlucHV0IGZyb20gcXVldWUgc28gdGhlIHNlcnZlciBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVWludDhBcnJheSB2YWx1ZXMgc3Vydml2ZSB0aGUgcXVldWUgbmF0aXZlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKENCT1Igb24gd29ybGQtdmVyY2VsLCBKU09OIHJldml2ZXIgb24gd29ybGQtbG9jYWwpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXQud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgRXZlbnQgY3JlYXRpb24gZm9yICdydW5fc3RhcnRlZCcgZGlkIG5vdCByZXR1cm4gdGhlIHJ1biBlbnRpdHkgZm9yIHJ1biBcIiR7cnVuSWR9XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgZXZlbnRzLCB1c2UgdGhlbSB0byBza2lwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QgY2FsbCBhbmQgcmVkdWNlIFRURkIuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSAhPT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gcmVzdWx0LmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50c0N1cnNvciA9IHJlc3VsdC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bi5zdGFydGVkQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvcjogcnVuIHdhcyBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1bkV4cGlyZWRFcnJvcjogcnVuIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQgZHVyaW5nIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyB3b3JrZmxvdyBzZXR1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICt3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHdvcmtmbG93UnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgYWxyZWFkeSBjb21wbGV0ZWQgb3IgZmFpbGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHdvcmtmbG93UnVuLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZm9yIGBjYW5jZWxgLCB3ZSBhY3R1YWxseSB3YW50IHRvIHByb3BhZ2F0ZSBhIFdvcmtmbG93Q2FuY2VsbGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSB3b3JrZmxvdyBjb250ZXh0IHNvIHRoZSB1c2VyIGNhbiBncmFjZWZ1bGx5IGV4aXQuIHRoaXMgaXMgU0lHVEVSTVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBhY3R1YWxseSBleGl0IGhlcmUgd2l0aG91dCByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGF0IGFsbCwgaW4gdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBpcyBpdHNlbGYgZmFpbGluZy5cblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgKCF3b3JrZmxvd1J1bilcblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggcnVuV29ya2Zsb3cgKGlucHV0XG4gICAgICAgICAgICAgICAgICAvLyBoeWRyYXRpb24gLyBob29rIHBheWxvYWQgZGVjcnlwdGlvbikgYW5kIHRoZSBydW5fZmFpbGVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWh5ZHJhdGUgcGF0aCBiZWxvdyBuZWVkIGl0LiBNZW1vaXplZCBhY2Nlc3NvcjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy9ub0NvbnN0YW50Q29uZGl0aW9uOiBpbnRlbnRpb25hbCBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBWZXJjZWwsIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCBhbHdheXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyB0aGUgcHJvY2Vzcy4gT24gbG9jYWwgZGV2IGl0IHJldHVybnM7IHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFuZCB0aGUgcmVxdWVzdCBlbmRzIG5vcm1hbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHJ1bl9mYWlsZWQgaGFzIGJlZW4gd3JpdHRlbiBiZXN0LWVmZm9ydCkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3Igb2YgdGhpcyBpdGVyYXRpb24ncyBldmVudCBsb2cgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGFkdmFuY2UgaXQg4oCUIGRlY2xhcmVkIGF0IHRyeSBzY29wZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBjYXRjaCAod2hpY2ggcnVucyB0aGUgaW5saW5lIHN0ZXApIGNhbiByZWFkIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBgc2luY2VDdXJzb3JgIGZvciB0aGUgaW5saW5lLWRlbHRhIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZUlubGluZVdyaXRlQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyDigJQgdXNlIGNhY2hlZCBldmVudHMgd2l0aCBpbmNyZW1lbnRhbCBmZXRjaCBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBhIGN1cnNvciB3aGVuIHRoZXJlIGFyZSBldmVudHMgKGV2ZW4gb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwgcGFnZSksIHNvIHdlIGNhbiByZWxpYWJseSB1c2UgaXQgZm9yIGluY3JlbWVudGFsIGxvYWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ0lubGluZURlbHRhICYmIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uJ3MgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIHRoZSBhdXRob3JpdGF0aXZlIGV2ZW50LWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZSBjdXJzb3IsIHNvIHdlIGNvbnN1bWUgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlbHRhIGlzIGJ5dGUtZm9yLWJ5dGUgd2hhdCBldmVudHMubGlzdChjdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBoYXZlIHJldHVybmVkIGF0IHdyaXRlIHRpbWUg4oCUIGl0IGluY2x1ZGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIncyBvd24gc3RlcCBldmVudHMsIGFueSBhdHRyX3NldCB0aGUgc3RlcCBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIOKAlCBzbyBza2lwcGluZyB0aGUgZmV0Y2ggY2Fubm90IGRyb3AgZXZlbnRzIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2V3IHRoZSBwcmVmaXggZnJvbSB0aGUgc2VydmVyJ3MgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwZW5kaW5nSW5saW5lRGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhLmV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMubWFwKChlKSA9PiBlLmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkZWx0YS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gZGVsdGEuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZEV2ZW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgaXRlcmF0aW9uOiB1c2UgcHJlbG9hZGVkIGV2ZW50cyBpZiBhdmFpbGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZG8gYSBmdWxsIGxvYWQgd2l0aCBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IHByZWxvYWRlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzZXF1ZW50IGl0ZXJhdGlvbjogZmV0Y2ggb25seSBuZXcgZXZlbnRzIHNpbmNlIGxhc3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWR1cGUgYnkgZXZlbnRJZDogYSBwcmV2aW91cyBpdGVyYXRpb24gbWF5IGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZGVkIGEgcmVmcmVzaGVkIHdhaXQtY29tcGxldGlvbiBkZWx0YSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxvb3Agb2JzZXJ2ZXMgdGhlIGFkdmFuY2VkIGN1cnNvciwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsIGZldGNoIGNhbiByZXR1cm4gZXZlbnRzIHdlIGFscmVhZHkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbiAyIGFmdGVyIGl0ZXJhdGlvbiAxIHVzZWQgcHJlbG9hZGVkIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoaWNoIGRvbid0IGNhcnJ5IGEgY3Vyc29yKS4gRG8gYSBmdWxsIGxvYWQgbm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIHVwIGFueSBldmVudHMgd3JpdHRlbiBzaW5jZSB0aGUgcHJlbG9hZGVkIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9idGFpbiBhIGN1cnNvciBmb3Igc3Vic2VxdWVudCBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZHMuIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHBhdGgsIG5vdCBhIGJ1Zy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdObyBjdXJzb3IgYWZ0ZXIgcHJlbG9hZGVkLWV2ZW50cyBmaXJzdCBpdGVyYXRpb247IGRvaW5nIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgY3Vyc29yLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY3Vyc29yIGF2YWlsYWJsZSBkZXNwaXRlIGhhdmluZyBjYWNoZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gcHJlbG9hZGVkLWV2ZW50cyBleHBsYW5hdGlvbi4gQWxsIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHJldHVybiBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgZXZlbnRzLCBzbyB0aGlzIHNpZ25hbHMgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXb3JsZC4gRmFsbCBiYWNrIHRvIGEgZnVsbCByZWxvYWQgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjdXJzb3IgbWlzc2luZyBhZnRlciBpbml0aWFsIGxvYWQg4oCUIGZhbGxpbmcgYmFjayB0byBmdWxsIHJlbG9hZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvbi4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbmN1cnJlbnQgY29tcGxldGlvbiB2aWEgdGhlIGV2ZW50IGxvZzogaWZcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgaGFuZGxlciB3cm90ZSBhIHRlcm1pbmFsIHJ1biBldmVudCwgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyByZXBsYXkgd29yay4gVGhlIHJ1biBlbnRpdHkncyBzdGF0dXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gdGhlc2UgZXZlbnRzLCBzbyBjaGVja2luZyB0aGUgbG9nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlcyB1cyB0aGUgc2FtZSBzaWduYWwgYXMgYSBydW5zLmdldCgpIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBleHRyYSByZXF1ZXN0IHBlciBsb29wIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRzVG9Db21wbGV0ZSA9IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTogZSBpcyBFeHRyYWN0PFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID4gJiB7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+PSAoZS5ldmVudERhdGEucmVzdW1lQXQgYXMgRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdDogZS5ldmVudERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiB3YWl0c1RvQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0IGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdHNUb0NvbXBsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IGlzIGNvbW1pdHRlZC4gTG9hZCBvbmx5IGV2ZW50cyBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHNuYXBzaG90IGN1cnNvciBzbyBjb25jdXJyZW50IGR1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cywgc3VjaCBhcyBob29rX3JlY2VpdmVkLCBrZWVwIHRoZWlyIG9yZGVyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byB3YWl0X2NvbXBsZXRlZC4gRmFsbCBiYWNrIHRvIGEgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIGZvciBvbGRlciB3b3JsZHMgdGhhdCBjYW5ub3QgZ2l2ZSB1cyBhIHN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBvciBpZiB0aGUgY3Vyc29yIGRlbHRhIGRvZXMgbm90IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGNvbXBsZXRpb24gdGhpcyBoYW5kbGVyIGp1c3QgYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50c0N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhd0FsbFdhaXRDb21wbGV0aW9ucyA9IHdhaXRzVG9Db21wbGV0ZS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FpdEV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QWxsV2FpdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhldmVudC5ldmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZXZlbnQuZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY2FjaGUgcmVmZXJlbmNlIChtYXkgaGF2ZSBiZWVuIHNldCBmb3IgZmlyc3QgdGltZSlcbiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBldmVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCB0aGUgY3Vyc29yIGFzIGl0IHN0YW5kcyBmb3IgdGhpcyBpdGVyYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZywgYmVmb3JlIGFueSBpbmxpbmUgd3JpdGVzIChzdGVwX2NyZWF0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlU3VzcGVuc2lvbiwgc3RlcF9zdGFydGVkL3N0ZXBfY29tcGxldGVkIHZpYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwKSBhZHZhbmNlIGl0LiBUaGlzIGlzIHRoZSBgc2luY2VDdXJzb3JgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIGEgc3VwcG9ydGluZyBXb3JsZCBvbiB0aGUgaW5saW5lIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHNvIGl0IGNhbiByZXR1cm4gdGhlIGV2ZW50LWxvZyBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsZXR0aW5nIHRoZSBuZXh0IGl0ZXJhdGlvbiBza2lwIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0LiBDYXB0dXJlZCBoZXJlIGJlY2F1c2Ugbm90aGluZyBiZXR3ZWVuIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCBhbmQgdGhlIGlubGluZSBleGVjdXRlU3RlcCBtdXRhdGVzIGV2ZW50c0N1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVJbmxpbmVXcml0ZUN1cnNvciA9IGV2ZW50c0N1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHdvcmtmbG93IHJlcGxheScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bldvcmtmbG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyByZXBsYXkgY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdXNwZW5zaW9uIGhhbmRsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uTXM6IERhdGUubm93KCkgLSBzdXNwZW5zaW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwczogc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kczogc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dD8uc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F0dHJpYnV0ZUV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIGNvbmZsaWN0OiBicmVhayBsb29wLCByZS1pbnZva2UgdmlhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gUmUtaW52b2tlIGJlZm9yZSBwcm9jZXNzaW5nIHBlbmRpbmcgc3RlcHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBQcm9taXNlLnJhY2UoW3NldEF0dHJpYnV0ZXMoKSwgc3RlcCgpXSksIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBhdHRyaWJ1dGUgZXZlbnQgY2FuIHdpbiB3aXRob3V0IGV4ZWN1dGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvc2luZyBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwcyA9IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgZXhlY3V0aW9uIGlzIGdhdGVkIG9uIG93bmVyc2hpcC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIHRvIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyAoYGxhenlJbmxpbmVTdGVwc2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcnVuIHRoZW0gaW5saW5lIOKAlCBpbiBwYXJhbGxlbCDigJQgdmlhIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyB0aGF0IGNyZWF0ZSBlYWNoIHN0ZXAgb24gdGhlIGZseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmluZyBvbmUgd29ybGQgcm91bmQtdHJpcCBwZXIgaW5saW5lIHN0ZXAuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgYXRvbWljIGFuZCBleGFjdGx5LW9uZSBwZXIgc3RlcDogdGhlIHdvcmxkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBzdGVwX3N0YXJ0ZWQgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgICjihpIgZXhlY3V0ZVN0ZXAgYHNraXBwZWRgKSB0byBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgbG9zZXIsIHNvIG9ubHkgb25lIGhhbmRsZXIgZXZlciBydW5zIGEgZ2l2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkuIEV2ZXJ5IG90aGVyIHBlbmRpbmcgc3RlcCBrZWVwcyBpdHMgZWFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCAoaW4gYGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHNgKSBhbmQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIG9ubHkgZGVzaWduYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhenlJbmxpbmVTdGVwc2Agd2hlbiBubyBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwcmVzZW50LiBUaGF0IGF3YWl0ZXIgY2FzZSBtdXN0IGV4ZWN1dGUgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lOiBhbiBpbmxpbmUgYGF3YWl0IGV4ZWN1dGVTdGVwKC4uLilgIGJsb2NrcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLCBzbyB0aGUgYXdhaXRlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gKHdoaWNoIG9ubHkgYWR2YW5jZXMgb24gdGhlIG5leHQgcmVwbGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgc2VyaWFsaXplZCBiZWhpbmQgdGhlIHN0ZXAg4oCUIGRlZmVhdGluZyB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ya2Zsb3cgZXhwcmVzc2VkIGFzIHBhcmFsbGVsIChlLmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgaG9vay5nZXRDb25mbGljdCgpLnRoZW4oKCkgPT4gc3RlcEIoKSlgIHJhY2luZyBgYXdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBBKClgKS4gSW4gdGhhdCBjYXNlIGBsYXp5SW5saW5lU3RlcHNgIGlzIGVtcHR5IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgc3RlcCBpcyBxdWV1ZWQgZm9yIHJlLWludm9jYXRpb24sIHdoaWNoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyIHdoaWxlIHF1ZXVlZCBzdGVwcyBydW4gaW4gcGFyYWxsZWwgaW52b2NhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5SW5saW5lU3RlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmxhenlJbmxpbmVTdGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNvcnJlbGF0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4gcy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZmllZCBxdWV1ZSBkaXNwYXRjaCBmb3IgZXZlcnl0aGluZyB3ZSBhcmUgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUtZXhlY3V0aW5nLiBTdGVwcyBhcmUgcXVldWVkIHdpdGggc3RlcElkIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIgcnVucyB0aGVtOyB0aGUgd2FpdCB0aW1lciBpcyBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZ2VuZXJpYyBjb250aW51YXRpb24gdGhhdCBmaXJlcyBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZWxhcHNlcyBhbmQgbGV0cyB0aGUgbmV4dCByZXBsYXkgb2JzZXJ2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCB2aWEgdGhlIFwiY29tcGxldGUgZWxhcHNlZCB3YWl0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgcXVldWVpbmcgaXMgdW5jb25kaXRpb25hbCAoY292ZXJzIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWYgYSBwcmlvciBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGNyYXNoZWQgYmVmb3JlIHF1ZXVlaW5nLCBhIGxhdGVyIGhhbmRsZXIgd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlbTsgaWRlbXBvdGVuY3lLZXkgb24gY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVkdXBlcyByZWR1bmRhbnQgcXVldWVzIGFjcm9zcyBjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVycykuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3NlcyDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBwZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChkaXNwYXRjaGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZSDigJQgZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgYW4gaW1tZWRpYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHRoZSByZXBsYXkgY29uc3VtZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIuIFdpdGhvdXQgaXQgKG5vIGlubGluZSBzdGVwLCBhbGwgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgb3Igbm9uZSBwZW5kaW5nKSB0aGUgcnVuIHdvdWxkIHNpdCBpZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudGlsIHNvbWUgdW5yZWxhdGVkIG1lc3NhZ2Ugd29rZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIGlubGluZSBzdGVwLiBQYXVzZSB0aGUgcmVwbGF5IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RlcCBib2R5IOKAlCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gV2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0aGUgcmVwbGF5LWJ1ZGdldCBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiB3b3VsZCAoaW5jb3JyZWN0bHkpIGNoYXJnZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgYm9keSBhZ2FpbnN0IHRoZSBidWRnZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgZmFzdCBwYXRoIGdhdGUuIFdlIHJlcXVlc3QgdGhlIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBjb25zdW1lIGl0IGluIHBsYWNlIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qg4oCUIG9ubHkgd2hlbiBBTEwgaG9sZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXZSBoYXZlIGEgcmVhbCBwcmlvciBjdXJzb3IgdG8gZGlmZiBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHByZUlubGluZVdyaXRlQ3Vyc29yYDsgYSBXb3JsZCBtYXkgcmV0dXJuIG5vbmUgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBpbml0aWFsIGxvYWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhpcyBpcyB0aGUgY2xlYW4gc2luZ2xlLXN0ZXAgc2VxdWVudGlhbCBjYXNlOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBzdXNwZW5zaW9uIHByb2R1Y2VkIGV4YWN0bHkgb25lIHN0ZXAgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBob29rcyBvciB3YWl0cyAoYGVyci57c3RlcCxob29rLHdhaXR9Q291bnRgKSwgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb25lIHN0ZXAgaXMgdGhlIGxvbmUgcGVuZGluZyBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDFgKSBhbmQgdGhlIGxvbmUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGVwIChgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMWAg4oCUIG5vIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzaWJsaW5ncyBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycywgYW5kIG5vIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpbmxpbmUgc3RlcCB3cml0aW5nIGl0cyBvd24gZXZlbnRzIG91dCBvZiBiYW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIHBlbmRpbmcgd2FpdCB0aW1lciBmcm9tIFRISVMgc3VzcGVuc2lvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoZSBydW4gaGFzIE5PIHByZS1leGlzdGluZyBvcGVuIGhvb2sgb3Igd2FpdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcGx1cyB0aGUgcGVyLXN1c3BlbnNpb24gY291bnRzIGFib3ZlIGlzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgbG9hZC1iZWFyaW5nIHNhZmV0eSBjaGVjazogdGhlIGRlbHRhIHNuYXBzaG90cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGxvZyBhdCB0aGUgc3RlcF9jb21wbGV0ZWQgd3JpdGUgYnV0IGlzIGNvbnN1bWVkIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbmV4dCByZXBsYXksIHNvIGFuIG91dC1vZi1iYW5kIGhvb2tfcmVjZWl2ZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdF9jb21wbGV0ZWQgbGFuZGluZyBpbiB0aGF0IHdpbmRvdyB3b3VsZCBiZSBpbiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZWFsIGZldGNoIHlldCBhYnNlbnQgZnJvbSB0aGUgc3RhbGUgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByaXNraW5nIGEgZGl2ZXJnZW50IHJlcGxheS4gV2l0aCBubyBob29rL3dhaXQgb3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKG5laXRoZXIgY2FycmllZCBvdmVyIG5vciBjcmVhdGVkIHRoaXMgc3VzcGVuc2lvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgb25seSBvdXQtb2YtYmFuZCB3cml0ZXIgaXMgY2FuY2VsbGF0aW9uLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgc2FmZSB0byBvYnNlcnZlIG9uZSBpdGVyYXRpb24gbGF0ZS4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBoYXNPcGVuSG9va09yV2FpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vcmUgdGhhbiBvbmUgc3RlcCBydW5zIGlubGluZSwgZWFjaCB3cml0ZXMgaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvd24gZXZlbnRzIGFuZCB0aGUgcGVyLXdyaXRlIGRlbHRhIHdvdWxkIGJlIHBhcnRpYWwsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsdGEgaXMgbm90IHJlcXVlc3RlZCAodGhlIGdhdGUgYmVsb3cgaXMgZmFsc2UgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aS1zdGVwKSBhbmQgdGhlIG5leHQgaXRlcmF0aW9uIGRvZXMgYSBub3JtYWwgZmV0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0SW5saW5lRGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJlSW5saW5lV3JpdGVDdXJzb3IgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5zdGVwQ291bnQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzT3Blbkhvb2tPcldhaXQoY2FjaGVkRXZlbnRzID8/IFtdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2gg4oCUIHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0IOKAlCBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IHNlbmQgdGhlIGRlZmVycmVkIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBvbiBzdGVwX3N0YXJ0ZWQgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgb24gdGhlIGZseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5kZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXF1ZXN0SW5saW5lRGVsdGEgJiYgcHJlSW5saW5lV3JpdGVDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVJbmxpbmVXcml0ZUN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIGJhdGNoIHJlc3VsdHMuIGByZXRyeWAgc3RlcHMgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGV4aXN0IOKAlCB0aGVpciBgc3RlcF9zdGFydGVkYCBzdWNjZWVkZWQpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcXVldWVkIHBlci1zdGVwIGFzIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5OyBgdGhyb3R0bGVkYCBzdGVwcyAocmVqZWN0ZWQgb24gdGhlIGNyZWF0ZS1jbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG5ldmVyIGNyZWF0ZWQpIGluc3RlYWQgZGVmZXIgcmVkZWxpdmVyeSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSBzbyB0aGV5IHJlLXJ1biBpbmxpbmUgd2l0aCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVwbGF5OyBjb21wbGV0ZWQvZmFpbGVkIHN0ZXBzIGFscmVhZHkgd3JvdGUgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50cy4gV2Ugb25seSBsb29wIGJhY2sgdG8gcmVwbGF5IHdoZW4gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSDigJQgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtcGVuZGluZyBzdGVwcyB3aWxsIGJlIHJlLXJ1biBieSB0aGVpciBxdWV1ZWQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFuZCB0aGUgYmFja2dyb3VuZC1zdGVwIGhhbmRsZXIgcmVwbGF5cyBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXp5SW5saW5lU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbGF6eUlubGluZVN0ZXBzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IHIudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRpbWVvdXRTZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVBlbmRpbmdPcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZlciByZWRlbGl2ZXJ5IG9mIHRoZSBvcmNoZXN0cmF0b3IgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm90dGxlIGJhY2tvZmYuIE9uIHJlcGxheSBldmVyeSBub24tdGVybWluYWwgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZS1kaXNwYXRjaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXI6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC10aHJvdHRsZWQgc3RlcHMgcnVuIGlubGluZSBhZ2FpbiBXSVRIIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0ICh0aGVpciBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCBhbmV3KSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBgcmV0cnlgIHN0ZXBzIGluIHRoaXMgYmF0Y2ggYXJlIHF1ZXVlZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duIHJldHJ5QWZ0ZXIgaG9ub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RlcHMgKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZWQgZnJvbSB0aGVpciBldmVudHMgYW5kIG5vdCByZS1ydW4uIEJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBkcml2ZXMgYWxsIHJlbWFpbmluZyB3b3JrLCB3ZSBtdXN0IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJlLXF1ZXVlIGB0b1JldHJ5YCBoZXJlIOKAlCB0aGF0IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1kaXNwYXRjaCB0aG9zZSBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEJFRk9SRSB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgc28gYSBiYXRjaCB0aGF0IG1peGVzIGEgdGhyb3R0bGUgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdGVwIHRoYXQgbGVmdCB1bmZsdXNoZWQgb3BzIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBleHBsaWNpdCBmbHVzaCBjb250aW51YXRpb24uIFRoYXQgaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0aHJvdHRsZSBiYWNrb2ZmICg+PSAxcykgYWx3YXlzIGV4Y2VlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLWludm9jYXRpb24gZmx1c2ggd2luZG93ICg8PSA1MDBtcyArIHdhaXRVbnRpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9wcyBzZXR0bGUgYmVmb3JlIHRoZSBwb3N0LWJhY2tvZmYgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzIGFuZCByZWFkcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogdGhyb3R0bGVUaW1lb3V0IH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUcmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkubWFwKCh7IHN0ZXAsIGRlbGF5U2Vjb25kcyB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXRyeVRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgdGhlIGRlbGF5ZWQgcmV0cnkgb24gdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlbGF0aW9uSWQgc28gaXQgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWVkIHJlLWRpc3BhdGNoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJmb3JtcyBvbiByZXBsYXkgKGl0IGFsc28gdXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkYCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGEgbWl4ZWQgYmF0Y2ggd2hlcmUgb25lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY29tcGxldGVkYCB3aXRoIHVuZmx1c2hlZCBiYWNrZ3JvdW5kIG9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgYW55UGVuZGluZ09wc2ApIGFuZCBhbm90aGVyIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyB3b3VsZCBkb3VibGUtZGlzcGF0Y2ggdGhlIHJldHJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoIGJlbG93IHF1ZXVlcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSBwbGFpbiBjb250aW51YXRpb24sIHdob3NlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIHN0aWxsLWByZXRyeWluZ2Agc3RlcCBhcyBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJlLWRpc3BhdGNoZXMgaXQgKmltbWVkaWF0ZWx5KiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqd2l0aCogYSBrZXkuIFNpbmNlIHRoaXMgZGVsYXllZCByZXRyeSBoYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBrZXksIHRoZSB0d28gbWVzc2FnZXMgd291bGRuJ3QgZGVkdXBlIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIHdvdWxkIHJ1biB0d2ljZSwgdGhlIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBiYWNrb2ZmIHdvdWxkIGJlIGlnbm9yZWQgKHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVycm9yYCByZXRyaWVzIHBlcnNpc3Qgbm8gYHJldHJ5QWZ0ZXJgLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBoYXMgbm8gYFRvb0Vhcmx5YCBndWFyZCksIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBib2R5IGNvdWxkIHJ1biBlYXJseS9jb25jdXJyZW50bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhcmluZyB0aGUga2V5IGxldHMgdGhlIGVhcmxpZXIgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2Ugd2luLCBob25vcmluZyB0aGUgYmFja29mZi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbnkgaW5saW5lIHN0ZXAgaGFkIHBlbmRpbmcgYmFja2dyb3VuZCBvcHMgKGUuZy4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gd3JpdGVzIHRvIFMzKSwgYnJlYWsgdGhlIGxvb3AgYW5kIHF1ZXVlIGEgcGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBzbyB3YWl0VW50aWwgY2FuIGZsdXNoIHRoZW0gYmVmb3JlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCByZXBsYXkgcmVhZHMgdGhlbS4gVGhpcyBtYXRjaGVzIFYxIGJlaGF2aW9yIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHN0ZXAgcmFuIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbnlQZW5kaW5nT3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JyZWFraW5nIGxvb3A6IGlubGluZSBzdGVwIGhhcyBwZW5kaW5nIG9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgaW5saW5lIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIHZpYSB0aGVpciBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgbWVzc2FnZXM7IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgaGFuZGxlciByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYWxsIHN0ZXBzIGFyZSB0ZXJtaW5hbC4gRG9uJ3QgbG9vcCBoZXJlIOKAlCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgc3RlcHMgaGF2ZSBubyB0ZXJtaW5hbCBldmVudCB0byBvYnNlcnZlIHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgaW5saW5lIHN0ZXBzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSDigJQgbG9vcCBiYWNrIHRvIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSB3b3JrZmxvdyBvYnNlcnZlcyB0aGUgdGVybWluYWwgZXZlbnRzIG9uIHJlcGxheSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZSBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgZGVsdGEgKHN1cHBvcnRpbmcgV29ybGQgKyB0aGUgc2luZ2xlLXN0ZXAgZ2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdmUpLCBzdGFzaCBpdCBzbyB0aGUgbmV4dCBpdGVyYXRpb24ncyBsb2FkIGNvbnN1bWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnN0ZWFkIG9mIGlzc3VpbmcgYW4gaW5jcmVtZW50YWwgZXZlbnRzLmxpc3QuIE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wbGV0ZWQgcGF0aCBjYXJyaWVzIGEgZGVsdGE7IG11bHRpLXN0ZXAgYmF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVxdWVzdCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmx5ID0gc3RlcFJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS5pbmxpbmVEZWx0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvbmx5LmlubGluZURlbHRhLmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBvbmx5LmlubGluZURlbHRhLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogb25seS5pbmxpbmVEZWx0YS5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWxFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXBsYXlEaXZlcmdlbmNlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZlcmdlbmNlQ291bnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlEaXZlcmdlbmNlPy5jb3VudCA/PyAwKSArIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VDb3VudCA8PSBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFU1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQ7IHF1ZXVlaW5nIGEgcmVjb3ZlcnkgcmVwbGF5IGJlZm9yZSBkZWNsYXJpbmcgdGhlIGV2ZW50IGxvZyBjb3JydXB0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfRElWRVJHRU5DRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvckRpdmVyZ2VuY2VFdmVudElkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U/LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWNvdmVyeVJlcGxheXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yID0gbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJlcGxheSBkaXZlcmdlZCAke2RpdmVyZ2VuY2VDb3VudH0gdGltZXMgYWZ0ZXIgJHtSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFU30gcmVjb3ZlcnkgcmVwbGF5czsgbGF0ZXN0IGRpdmVyZ2VudCBldmVudCB3YXMgJHtlcnIuZXZlbnRJZH0uIExhc3QgZGl2ZXJnZW5jZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY29kZSBlcnJvcnMgYW5kIHRlcm1pbmFsIHJ1bnRpbWUgZXJyb3JzIGZhaWwgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4odGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5uYW1lIHx8IGdldEVycm9yTmFtZSh0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayh0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvcjogV29ya2Zsb3dSdW50aW1lRXJyb3IgaW5kaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBTREsvcnVudGltZSBpc3N1ZSwgYW5kIHNlbGVjdGVkIHN1YmNsYXNzZXMgdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIGNvZGVzIGZvciBiYWNrZW5kIHRyYWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcih0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgcnVubmluZyB3b3JrZmxvdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBzb3VyY2UtbWFwLXJlbWFwcGVkIHN0YWNrIHRvIHRoZSB0aHJvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZXJyb3IgcHJlc2VydmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGBlcnIgaW5zdGFuY2VvZiBFcnJvcmAgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IHJ1bnMgaW4gYSBzZXBhcmF0ZSBWTSByZWFsbSDigJQgaXRzIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBob3N0J3MsIHNvIGBpbnN0YW5jZW9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcmAgaXMgYGZhbHNlYCBmb3IgVk0tdGhyb3duIGVycm9ycy4gVGhlIFY4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIHRhZyB3b3JrcyBhY3Jvc3MgcmVhbG1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IodGVybWluYWxFcnJvcikgJiYgZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGVybWluYWxFcnJvciBhcyBFcnJvcikuc3RhY2sgPSBlcnJvclN0YWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdyBydW4gdmlhIGV2ZW50IChldmVudC1zb3VyY2VkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlkZW50aXR5IGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSAvLyBFbmQgd2hpbGUgbG9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTsgLy8gRW5kIHRyYWNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTsgLy8gRW5kIHdpdGhXb3JrZmxvd0JhZ2dhZ2VcbiAgICAgICAgfSk7IC8vIEVuZCB3aXRoVHJhY2VDb250ZXh0XG4gICAgICB9XG4gICAgKTtcblxuICBsZXQgY2FjaGVkSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICBjYWNoZWRIYW5kbGVyID0gaGFuZGxlcihhd2FpdCBnZXRXb3JsZEhhbmRsZXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkSGFuZGxlcihyZXEpO1xuICB9KTtcbn1cbiJdfQ==
1537
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUNqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsNkJBQTZCLEdBQzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEdBQ2IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7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N0IsQ0FBQyxDQUNGLENBQUM7SUFFSixJQUFJLGFBQWdFLENBQUM7SUFDckUsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgcGFyc2VXb3JrZmxvd05hbWUsXG4gIHdvcmtmbG93RGlzcGxheU5hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciwgaXNXb3JsZENvbnRyYWN0RXJyb3IgfSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBpc1R1cmJvRW5hYmxlZCxcbiAgTUFYX1FVRVVFX0RFTElWRVJJRVMsXG4gIFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IGV4ZWN1dGVTdGVwIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICB0eXBlIFdvcmxkSGFuZGxlcnMsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyByZW1hcEVycm9yU3RhY2sgfSBmcm9tICcuL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlU3RlcEh5ZHJhdGlvbkNhY2hlLFxuICB0eXBlIFN0ZXBIeWRyYXRpb25DYWNoZSxcbn0gZnJvbSAnLi9zdGVwLWh5ZHJhdGlvbi1jYWNoZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBydW5Xb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja0VuZHBvaW50LFxuICB0eXBlIEhlYWx0aENoZWNrT3B0aW9ucyxcbiAgdHlwZSBIZWFsdGhDaGVja1Jlc3VsdCxcbiAgaGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIGdldEhvb2tCeVRva2VuLFxuICByZXN1bWVIb29rLFxuICByZXN1bWVXZWJob29rLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnO1xuZXhwb3J0IHtcbiAgZ2V0UnVuLFxuICBSdW4sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbSxcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyxcbn0gZnJvbSAnLi9ydW50aW1lL3J1bi5qcyc7XG5leHBvcnQge1xuICBjYW5jZWxSdW4sXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG4vLyBWMjogc3RlcEVudHJ5cG9pbnQgaXMgbm8gbG9uZ2VyIHJlLWV4cG9ydGVkIOKAlCB0aGUgY29tYmluZWQgaGFuZGxlclxuLy8gKHdvcmtmbG93RW50cnlwb2ludCkgZXhlY3V0ZXMgc3RlcHMgaW5saW5lLiBSZW1vdmluZyB0aGUgcmUtZXhwb3J0XG4vLyBwcmV2ZW50cyBUdXJib3BhY2sgZnJvbSB0cmFjaW5nIHN0ZXAtaGFuZGxlci5qcyDihpIgZ2V0LXBvcnQuanNcbi8vIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS5cbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICB3b3JsZCxcbiAgd29ya2Zsb3dSdW4sXG4gIHJ1bklkLFxuICByZXF1ZXN0SWQsXG4gIGVycixcbiAgZXJyb3JDb2RlLFxuICBsb2dNZXNzYWdlLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGVycjogdW5rbm93bjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIGxvZ01lc3NhZ2U6IHN0cmluZztcbn0pIHtcbiAgcnVudGltZUxvZ2dlci5lcnJvcihsb2dNZXNzYWdlLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1biA/PyBydW5JZCk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICksXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgIGVycm9yOiBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsRXJyLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGZhaWxFcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50czogRXZlbnRbXSwgcnVuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUZXJtaW5hbCBydW4gZXZlbnRzIGFyZSBhbHdheXMgbGFzdCBieSBjb25zdHJ1Y3Rpb24gKG5vIGV2ZW50IGNyZWF0aW9uXG4gIC8vIHN1Y2NlZWRzIGFnYWluc3QgYSB0ZXJtaW5hbCBydW4pLCBidXQgc2NhbiB0aGUgZnVsbCBhcnJheSBmb3JcbiAgLy8gZGVmZW5zZS1pbi1kZXB0aDogYSBXb3JsZC9iYWNrZW5kIG9yZGVyaW5nIGJ1ZyBzaG91bGRuJ3QgbWFrZSB1cyBtaXNzIGFuXG4gIC8vIGFjdHVhbCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gIGNvbnN0IHRlcm1pbmFsUnVuRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZSkgPT5cbiAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICk7XG5cbiAgaWYgKCF0ZXJtaW5hbFJ1bkV2ZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUnVuIHJlYWNoZWQgdGVybWluYWwgZXZlbnQsIGV4aXRpbmcnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXZlbnRUeXBlOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50VHlwZSxcbiAgICBldmVudElkOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBydW4gaGFzIGFueSBob29rIG9yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXkg4oCUIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogVGhpcyBnYXRlcyB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aC4gVGhlIGRlbHRhIHJldHVybmVkIGJ5IHRoZVxuICogc3RlcC10ZXJtaW5hbCB3cml0ZSBpcyB0aGUgZXZlbnQgbG9nIGFzIG9mIHRoYXQgd3JpdGU7IGl0IGlzIGNvbnN1bWVkXG4gKiBvbiB0aGUgTkVYVCBsb29wIGl0ZXJhdGlvbiwgc28gYW55IGV2ZW50IGEgY29uY3VycmVudCB3cml0ZXIgYXBwZW5kcyBpblxuICogdGhhdCB3aW5kb3cgd291bGQgYmUgcHJlc2VudCBpbiBhIHJlYWwgYGV2ZW50cy5saXN0YCBmZXRjaCBidXQgYWJzZW50XG4gKiBmcm9tIHRoZSBzdGFsZSBkZWx0YS4gTWlzc2luZyBzdWNoIGFuIGV2ZW50IGZvciBvbmUgcmVwbGF5IGNhbiBkdXJhYmx5XG4gKiBjb21taXQgYSBzY2hlZHVsaW5nIGRlY2lzaW9uIChlLmcuIGlubGluZS1leGVjdXRpbmcgdGhlIGxvc2VyIG9mIGFcbiAqIGBQcm9taXNlLnJhY2UoW2hvb2ssIHN0ZXBdKWApIHRoYXQgdGhlIGV2ZW50dWFsIGZ1bGwgcmVwbGF5IGNhbm5vdFxuICogY29uc3VtZSDigJQgYSBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC4gV2hlbiBubyBob29rIG9yIHdhaXQgaXMgb3BlbiwgdGhlXG4gKiBvbmx5IG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIGJlbmlnbiB0byBvYnNlcnZlIG9uZVxuICogaXRlcmF0aW9uIGxhdGUgKHRoZSBuZXh0IGVudGl0eSB3cml0ZSBpcyByZWplY3RlZCBhZ2FpbnN0IHRoZSB0ZXJtaW5hbFxuICogcnVuIGFuZCB0aGUgcnVuIGlzIGFscmVhZHkgdGVybWluYWwpLCBzbyB0aGUgZmFzdCBwYXRoIGlzIHNhZmUuXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIGhhc09wZW5Ib29rT3JXYWl0KGV2ZW50czogRXZlbnRbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBkaXNwb3NlZEhvb2tJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIGRpc3Bvc2VkSG9va0lkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgY29tcGxldGVkV2FpdElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgIWRpc3Bvc2VkSG9va0lkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSByb3V0ZSB3aGljaCBoYW5kbGVzIHdvcmtmbG93IGV4ZWN1dGlvbiByZXF1ZXN0cyxcbiAqIGV4ZWN1dGluZyBzdGVwcyBpbmxpbmUgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2UgZnVuY3Rpb24gaW52b2NhdGlvbnNcbiAqIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAqXG4gKiBUaGUgaGFuZGxlciBsb29wczogcmVwbGF5IHdvcmtmbG93IOKGkiBleGVjdXRlIHN0ZXAgaW5saW5lIOKGkiByZXBsYXkg4oaSIC4uLlxuICogdW50aWwgdGhlIHdvcmtmbG93IGNvbXBsZXRlcywgdGltZXMgb3V0LCBvciBlbmNvdW50ZXJzIG5vbi1zdGVwIHN1c3BlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvd0NvZGUgLSBUaGUgd29ya2Zsb3cgYnVuZGxlIGNvZGUgY29udGFpbmluZyBhbGwgd29ya2Zsb3cgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBWZXJjZWwgQVBJIHJvdXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0VudHJ5cG9pbnQoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICBvcHRpb25zPzogeyBuYW1lc3BhY2U/OiBzdHJpbmcgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TID1cbiAgICBOdW1iZXIocHJvY2Vzcy5lbnYuV09SS0ZMT1dfVjJfVElNRU9VVF9NUykgfHwgMTIwXzAwMDtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgICAvLyBOT1RFOiBIZWFsdGggY2hlY2sgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgdW5hdXRoZW50aWNhdGVkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLlxuICAgICAgICAvLyBUaGV5IG9ubHkgd3JpdGUgYSBzaW1wbGUgc3RhdHVzIHJlc3BvbnNlIHRvIGEgc3RyZWFtIGFuZCBkbyBub3QgZXhwb3NlIHNlbnNpdGl2ZSBkYXRhLlxuICAgICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChtZXNzYWdlXyk7XG4gICAgICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICAgIGhlYWx0aENoZWNrLFxuICAgICAgICAgICAgJ3dvcmtmbG93JyxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgfSA9IFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYS5wYXJzZShtZXNzYWdlXyk7XG4gICAgICAgIC8vIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgYSB0cmFjZSBjYXJyaWVyLCBidXRcbiAgICAgICAgLy8gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkgcmV0dXJucyBge31gIHdoZW4gbm8gT1RFTCBTREsgaXMgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBvciBubyBzcGFuIGlzIGFjdGl2ZSDigJQgdHJlYXQgYW4gZW1wdHkgY2FycmllciB0aGUgc2FtZSBhcyBhblxuICAgICAgICAvLyBhYnNlbnQgb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgICAvLyBmb3J3YXJkaW5nIGEgdXNlbGVzcyBge31gIGZvcmV2ZXIuXG4gICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nVHJhY2VDYXJyaWVyKVxuICAgICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uod29ya2Zsb3dQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgICAvLyBFbmZvcmNlIG1heCBkZWxpdmVyeSBsaW1pdCBiZWZvcmUgYW55IGluZnJhc3RydWN0dXJlIGNhbGxzLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgd29ya2Zsb3dzIGZyb20gY29uc3VtaW5nIGluZmluaXRlIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgcnVuIOKAlCBhdHRhY2hlcyBydW5JZC93b3JrZmxvd05hbWUgdG8gZXZlcnlcbiAgICAgICAgLy8gbG9nIGxpbmUgYW5kIGNoaWxkIGxvZ2dlcnMgYmVsb3csIHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgICBjb25zdCBydW5Mb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihydW5JZCwgd29ya2Zsb3dOYW1lKTtcblxuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IE1BWF9RVUVVRV9ERUxJVkVSSUVTKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHtNQVhfUVVFVUVfREVMSVZFUklFU30pYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JDb2RlOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5JZCk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IGV4Y2VlZGVkIG1heGltdW0gcXVldWUgZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC0tLSBSZXBsYXkgYnVkZ2V0IGJvb2trZWVwaW5nIC0tLVxuICAgICAgICAvLyBUaGUgcmVwbGF5IGJ1ZGdldCBib3VuZHMgdGhlICpub24tc3RlcCogcG9ydGlvbiBvZiBhIHNpbmdsZVxuICAgICAgICAvLyBoYW5kbGVyIGludm9jYXRpb246IGRldGVybWluaXN0aWMgZXZlbnQtbG9nIHJlcGxheSwgd29ya2Zsb3ctVk1cbiAgICAgICAgLy8gZXhlY3V0aW9uIGJldHdlZW4gc3RlcCBib3VuZGFyaWVzLCBzdXNwZW5zaW9uIGhhbmRsaW5nLCBxdWV1ZVxuICAgICAgICAvLyByb3VuZC10cmlwcywgZXRjLiBJbmxpbmUgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uc1xuICAgICAgICAvLyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKSBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZCDigJQgdGhleSBhcmVcbiAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBgbWF4RHVyYXRpb25gIGFuZCB0aGVcbiAgICAgICAgLy8gYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgIGVhcmx5LXJldHVybiBndWFyZCBiZWxvdy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGJ1ZGdldCBpcyBjaGVja2VkIGF0IGxvb3AgYm91bmRhcmllcyAodG9wIG9mIGVhY2ggYHdoaWxlYFxuICAgICAgICAvLyBpdGVyYXRpb24pLiBOb3RlIHRoaXMgaXMgKmxlc3MgcmVzcG9uc2l2ZSogdGhhbiB0aGUgb2xkXG4gICAgICAgIC8vIGBzZXRUaW1lb3V0YC1iYXNlZCBhcHByb2FjaDogYSBzaW5nbGUgcGF0aG9sb2dpY2FsIGBydW5Xb3JrZmxvd2BcbiAgICAgICAgLy8gY2FsbCBwcm9jZXNzaW5nIGEgaHVnZSBldmVudCBsb2cgY2FuIG92ZXJzaG9vdCB0aGUgYnVkZ2V0IGJ5IHVwXG4gICAgICAgIC8vIHRvIG9uZSBpdGVyYXRpb24gYmVmb3JlIGJhaWxpbmcuIEluIHByYWN0aWNlIHRoZSBoZWFkcm9vbSBidWlsdFxuICAgICAgICAvLyBpbnRvIGBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgIChhbmQgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAgICAgICAgLy8gU0lHVEVSTSBhcyB1bHRpbWF0ZSBiYWNrc3RvcCkgZ2l2ZXMgdXMgc2xhY2sg4oCUIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyBgc2V0VGltZW91dGAgYXBwcm9hY2ggYWxzbyByZWxpZWQgb24gdGhlIHBsYXRmb3JtIGtpbGwgYXMgdGhlXG4gICAgICAgIC8vIGhhcmQgYmFja3N0b3AuIERvICpub3QqIFwiZml4XCIgdGhpcyBieSBhZGRpbmcgYSBgc2V0SW50ZXJ2YWxgO1xuICAgICAgICAvLyBpdCB3b3VsZCByaXNrIHRoZSBzYW1lIGJ1ZyB3ZSBqdXN0IHJlbW92ZWQgKGJvdW5kaW5nIHN0ZXBcbiAgICAgICAgLy8gYm9kaWVzKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRWFybGllciB2ZXJzaW9ucyAocHJlLSMyMDA5IGZpeCkgdXNlZCBhIHNpbmdsZSBgc2V0VGltZW91dGBcbiAgICAgICAgLy8gdGhhdCBhbHNvIGJvdW5kZWQgc3RlcCBib2RpZXMsIHdoaWNoIGJyb2tlIGFueSB3b3JrZmxvdyB3aXRoIGFcbiAgICAgICAgLy8gc2luZ2xlIHN0ZXAgbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlKFxuICAgICAgICAgICAgICAgIGB3b3JrZmxvdy5leGVjdXRlICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWAsXG4gICAgICAgICAgICAgICAgeyBraW5kOiBzcGFuS2luZCwgbGlua3M6IHNwYW5MaW5rcyB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ2V4ZWN1dGVfdjInKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VQcm9wYWdhdGVkKCEhdHJhY2VDb250ZXh0KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VNb2RlKHRyYWNlTW9kZSksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgaW52b2NhdGlvblN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICBsZXQgbG9vcEl0ZXJhdGlvbiA9IDA7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IGNhY2hlOiBrZWVwIGxvYWRlZCBldmVudHMgaW4gbWVtb3J5IGFjcm9zcyBsb29wIGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAvLyBPbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHdlIGRvIGEgZnVsbCBsb2FkOyBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGZldGNoIG9ubHkgZXZlbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGxhc3Qga25vd24gY3Vyc29yLlxuICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZEV2ZW50czogRXZlbnRbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gY2FjaGUgb2YgaHlkcmF0ZWQgc3RlcCByZXR1cm4gdmFsdWVzLCBzaGFyZWQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAvLyBldmVyeSByZXBsYXkgaXRlcmF0aW9uIG9mIFRISVMgaW52b2NhdGlvbi4gRWFjaCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkcyBhIGZyZXNoIHdvcmtmbG93IGNvbnRleHQsIHNvIHRoZSBjYWNoZSBpcyBvd25lZCBoZXJlXG4gICAgICAgICAgICAgICAgICAvLyAob3V0c2lkZSB0aGF0IGNvbnRleHQpIGFuZCB0aHJlYWRlZCBpbnRvIHJ1bldvcmtmbG93LiBJdFxuICAgICAgICAgICAgICAgICAgLy8gdHVybnMgdGhlIG90aGVyd2lzZSBPKE7CsikgcmUtZGVjcnlwdCArIHJlLXBhcnNlIG9mIGNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgLy8gc3RlcCByZXN1bHRzIGFjcm9zcyBOIHJlcGxheXMgaW50byBPKE4pLiBTY29wZWQgdG8gdGhpcyBydW5cbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkg4oCUIG5ldmVyIHJldXNlZCBhY3Jvc3MgcnVucy4gU2VlIHN0ZXAtaHlkcmF0aW9uLWNhY2hlLnRzLlxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEh5ZHJhdGlvbkNhY2hlOiBTdGVwSHlkcmF0aW9uQ2FjaGUgPVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdGVwSHlkcmF0aW9uQ2FjaGUoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogd2hlbiBhbiBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByZXR1cm5zIHRoZSBldmVudC1sb2cgZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIChhIHN1cHBvcnRpbmcgV29ybGQgb25seSksIHdlIHN0YXNoIGl0IGhlcmUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGNvbnN1bWVzIGl0IGluIHBsYWNlIG9mIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQtdHJpcC4gRWFjaCB2YWx1ZSBpcyBjb25zdW1lZCBleGFjdGx5IG9uY2VcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNsZWFyZWQuIE51bGwgbWVhbnMgXCJubyBkZWx0YSBwZW5kaW5nIOKAlCBmZXRjaFxuICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsbHlcIi4gU2VlIHRoZSBjb25zdW1lIHNpdGUgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9kdWNlIHNpdGUgYWZ0ZXIgaW5saW5lIGV4ZWN1dGVTdGVwLlxuICAgICAgICAgICAgICAgICAgbGV0IHBlbmRpbmdJbmxpbmVEZWx0YToge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgIH0gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHNDdXJzb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgZmFzdC1wYXRocyB0aGUgdmVyeSBmaXJzdCBkZWxpdmVyeSBvZiB0aGUgdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgaXQgaXMgcHJvdmFibHkgc2FmZSB0bzogYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCwgc2tpcCB0aGUgaW5pdGlhbCBldmVudC1sb2cgbG9hZCAobm90aGluZyBoYXNcbiAgICAgICAgICAgICAgICAgIC8vIGJlZW4gd3JpdHRlbiB5ZXQpLCBhbmQgZm9yY2Ugb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgKG5vXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHBlZXIgaGFuZGxlciBleGlzdHMgdG8gcmFjZSB0aGUgY3JlYXRlLWNsYWltKS5cbiAgICAgICAgICAgICAgICAgIC8vIGBydW5JbnB1dGAgaXMgb25seSBwcmVzZW50IG9uIHRoZSBzdGFydCgpLWVucXVldWVkIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgYGF0dGVtcHQgPT09IDFgICgxLWJhc2VkKSBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnk7IGBpbmNvbWluZ1N0ZXBJZGAgd291bGQgbWFyayBhIGJhY2tncm91bmQtc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBhbmQgYHJlcGxheURpdmVyZ2VuY2VgIGEgcmVjb3ZlcnkgcmVwbGF5IOKAlCBib3RoXG4gICAgICAgICAgICAgICAgICAvLyBpbmVsaWdpYmxlLiBUaGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXMgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAvLyBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgZW5kcyBvbmNlIGEgaG9vay93YWl0L2F0dHIgaXMgY3JlYXRlZCxcbiAgICAgICAgICAgICAgICAgIC8vIHNvIHR1cmJvIGV4aXRzIGF0IHRoYXQgcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cmJvID1cbiAgICAgICAgICAgICAgICAgICAgaXNUdXJib0VuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmF0dGVtcHQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVwbGF5RGl2ZXJnZW5jZTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAob3IgcmVqZWN0cyBpZiBpdCBmYWlsZWQpLiBUaHJlYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW50byBoYW5kbGVTdXNwZW5zaW9uIGFuZCBleGVjdXRlU3RlcCBzbyBubyBzdGVwL2hvb2svd2FpdFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmFjZXMgYWhlYWQgb2YgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWQgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gdHVyYm8sIHdoZXJlIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZCB1cCBmcm9udC5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5SZWFkeUJhcnJpZXI6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE9yZGVyIGEgdGVybWluYWwgcnVuIHdyaXRlIChydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCkgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgaW4gdHVyYm8gbW9kZSDigJQgYSBuby1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gb3RoZXJ3aXNlIHJlYWNoIHJ1bl9jb21wbGV0ZWQgYmVmb3JlIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cy4gQmVzdC1lZmZvcnQ6IGEgYmFycmllciByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvclxuICAgICAgICAgICAgICAgICAgLy8gb3JkZXJpbmcgb25seTsgaWYgcnVuX3N0YXJ0ZWQgdHJ1bHkgZmFpbGVkIHRoZSB0ZXJtaW5hbCB3cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IgKHJ1biBub3QgZm91bmQgLyBnb25lKSBhbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMuIE5vLW9wIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICBjb25zdCBhd2FpdFJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHkg4oCUIHNlZSBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgb3JjaGVzdHJhdG9yLiBPdXRzaWRlIHR1cmJvIHRoaXMgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAsIHdoaWNoIG1ha2VzIHRoZSBxdWV1ZSByZXNjaGVkdWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBkZWxpdmVyeSdzIG1lc3NhZ2UuIEluIHR1cmJvIHRoYXQgaXMgYSB0cmFwOiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAsIGFuZCBvbiBhc3luYyBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGdyYXBoaWxlLXdvcmtlcikgYSByZXNjaGVkdWxlIGNvbWVzIGJhY2sgYXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgMSDigJQgc28gdHVyYm8gcmUtZW5nYWdlcywgc2tpcHMgdGhlIGV2ZW50LWxvZyBsb2FkXG4gICAgICAgICAgICAgICAgICAvLyBhZ2FpbiwgcmVwbGF5cyBhZ2FpbnN0IGFuIGVtcHR5IGxvZywgbmV2ZXIgb2JzZXJ2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rL2F0dHIgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm4g4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1J1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgc3RhdHVzOiBiZ1J1bi5zdGF0dXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdTdGFydGVkQXQgPSBiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gK2JnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVucyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBiZ1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBiZ1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHN0ZXAgaGFkIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzKSwgYnJlYWsgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRVbnRpbCBmbHVzaCB0aGVtIOKAlCBjYW4ndCBjb250aW51ZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdza2lwcGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMgdG8gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnNvci1iYXNlZCBsb2FkaW5nIHNvIHRoZSBtYWluIGxvb3AgY2FuIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IGZyb20gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgc3RlcHM6IGFueSBzdGVwX2NyZWF0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtYXRjaGluZyBzdGVwX2NvbXBsZXRlZCBvciBzdGVwX2ZhaWxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwVGVybWluYWxJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFRlcm1pbmFsSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUGVuZGluZ1N0ZXBzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZW5kaW5nU3RlcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmcg4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGRvbmUgYW5kIHJlcGxheSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGVwcyBkb25lIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gcmVwbGF5IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgc2hhcmVkIHN0YXRlIHNvIHRoZSBsb29wIGNhbiBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSwgcmVwbGF5aW5nIGlubGluZSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IGJnUnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBiZ1N0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyBhbmQgZXZlbnRzQ3Vyc29yIGFscmVhZHkgc2V0IGZyb20gbG9hZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogcHJlcGFyZSB0aGUgcnVuIHN0YXRlIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiB3b3JrZmxvd1J1biB3YXMgYWxyZWFkeSBzZXQgYnkgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCAoaW5saW5lIHJlcGxheSBhZnRlciBhbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSkuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0dXJibyAmJiBydW5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBiYWNrZ3JvdW5kIGBydW5fc3RhcnRlZGAgYW5kIHN5bnRoZXNpemUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGl0eSBsb2NhbGx5IHNvIHJlcGxheSBjYW4gYmVnaW4gd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZC10cmlwLiBTYWZlIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uIOKAlCBzdGFydCgpIGNyZWF0ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIG1vbWVudHMgYWdvIGFuZCBubyBldmVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiYXJyaWVyIGlzIGNvbnN1bWVkIGJ5IGV2ZXJ5IGRvd25zdHJlYW0gd3JpdGUgKHN1c3BlbnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyLCBvcHRpbWlzdGljIHN0ZXBfc3RhcnRlZCwgdGVybWluYWwgcnVuIHdyaXRlcykgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRQcm9taXNlID0gd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYmFja2dyb3VuZCB0aGlzIHB1cmVseSBhcyBhIHdyaXRlIGJhcnJpZXIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFkIGl0cyBwcmVsb2FkZWQgZXZlbnRzIChwcmVsb2FkZWRFdmVudHMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCB0byBbXSBiZWxvdyksIHNvIHRlbGwgdGhlIFdvcmxkIHRvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBldmVudC1sb2cgcHJlbG9hZC4gVGhhdCB0cmltcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIHJlcXVlc3QgdGhlIGNoYWluZWQgZmlyc3Qgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBvbiDigJQgc2hvcnRlbmluZyB0aW1lLXRvLXNlY29uZC1zdGVwIOKAlCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXN0ZWQgbGlzdCtyZXNvbHZlIGl0IHdvdWxkIG90aGVyd2lzZSBjb21wdXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQsIHNraXBQcmVsb2FkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllciA9IHN0YXJ0ZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhIG5vLW9wIHJlamVjdGlvbiBoYW5kbGVyIHNvIGFuIGVhcmx5IGZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gYmVmb3JlIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYXdhaXQvdGhlbikgaXMgYXR0YWNoZWQ7IGNvbnN1bWVycyBzdGlsbCBvYnNlcnZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWRlZCBzZXQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyAobm8gc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcpLiBgW11gIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSB0cnV0aHkgaGVyZSDigJQgZG8gbm90IGNoYW5nZSB0aGUgbG9hZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJyYW5jaGVzJyBgaWYgKHByZWxvYWRlZEV2ZW50cylgIGNoZWNrcyB0byB0ZXN0IGxlbmd0aC5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cyDigJQgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIGZvciAncnVuX3N0YXJ0ZWQnIGRpZCBub3QgcmV0dXJuIHRoZSBydW4gZW50aXR5IGZvciBydW4gXCIke3J1bklkfVwiYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgZXZlbnRzLCB1c2UgdGhlbSB0byBza2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbCBldmVudHMubGlzdCBjYWxsIGFuZCByZWR1Y2UgVFRGQi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc01vcmUgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSByZXN1bHQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPSByZXN1bHQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHdhcyBjb25jdXJyZW50bHkgY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvcjogcnVuIHdhcyBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWQgZHVyaW5nIHNldHVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3I6IHJ1biBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICt3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB3b3JrZmxvd1J1bi5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZvciBgY2FuY2VsYCwgd2UgYWN0dWFsbHkgd2FudCB0byBwcm9wYWdhdGUgYSBXb3JrZmxvd0NhbmNlbGxlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSB3b3JrZmxvdyBjb250ZXh0IHNvIHRoZSB1c2VyIGNhbiBncmFjZWZ1bGx5IGV4aXQuIHRoaXMgaXMgU0lHVEVSTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlcm1vcmUsIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgb3IgYSB3YXkgdG8gZm9yY2UgY2FuY2VsIFNJR0tJTExcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgYWN0dWFsbHkgZXhpdCBoZXJlIHdpdGhvdXQgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBhdCBhbGwsIGluIHRoZSBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBpcyBpdHNlbGYgZmFpbGluZy5cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAobm9uLXR1cmJvIHJ1bl9zdGFydGVkKVxuICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgKCF3b3JrZmxvd1J1bilcblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggcnVuV29ya2Zsb3cgKGlucHV0XG4gICAgICAgICAgICAgICAgICAvLyBoeWRyYXRpb24gLyBob29rIHBheWxvYWQgZGVjcnlwdGlvbikgYW5kIHRoZSBydW5fZmFpbGVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWh5ZHJhdGUgcGF0aCBiZWxvdyBuZWVkIGl0LiBNZW1vaXplZCBhY2Nlc3NvcjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy9ub0NvbnN0YW50Q29uZGl0aW9uOiBpbnRlbnRpb25hbCBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBWZXJjZWwsIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCBhbHdheXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyB0aGUgcHJvY2Vzcy4gT24gbG9jYWwgZGV2IGl0IHJldHVybnM7IHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFuZCB0aGUgcmVxdWVzdCBlbmRzIG5vcm1hbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHJ1bl9mYWlsZWQgaGFzIGJlZW4gd3JpdHRlbiBiZXN0LWVmZm9ydCkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3Igb2YgdGhpcyBpdGVyYXRpb24ncyBldmVudCBsb2cgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGFkdmFuY2UgaXQg4oCUIGRlY2xhcmVkIGF0IHRyeSBzY29wZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBjYXRjaCAod2hpY2ggcnVucyB0aGUgaW5saW5lIHN0ZXApIGNhbiByZWFkIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBgc2luY2VDdXJzb3JgIGZvciB0aGUgaW5saW5lLWRlbHRhIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZUlubGluZVdyaXRlQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyDigJQgdXNlIGNhY2hlZCBldmVudHMgd2l0aCBpbmNyZW1lbnRhbCBmZXRjaCBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBhIGN1cnNvciB3aGVuIHRoZXJlIGFyZSBldmVudHMgKGV2ZW4gb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwgcGFnZSksIHNvIHdlIGNhbiByZWxpYWJseSB1c2UgaXQgZm9yIGluY3JlbWVudGFsIGxvYWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ0lubGluZURlbHRhICYmIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uJ3MgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIHRoZSBhdXRob3JpdGF0aXZlIGV2ZW50LWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZSBjdXJzb3IsIHNvIHdlIGNvbnN1bWUgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlbHRhIGlzIGJ5dGUtZm9yLWJ5dGUgd2hhdCBldmVudHMubGlzdChjdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBoYXZlIHJldHVybmVkIGF0IHdyaXRlIHRpbWUg4oCUIGl0IGluY2x1ZGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIncyBvd24gc3RlcCBldmVudHMsIGFueSBhdHRyX3NldCB0aGUgc3RlcCBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIOKAlCBzbyBza2lwcGluZyB0aGUgZmV0Y2ggY2Fubm90IGRyb3AgZXZlbnRzIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2V3IHRoZSBwcmVmaXggZnJvbSB0aGUgc2VydmVyJ3MgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwZW5kaW5nSW5saW5lRGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhLmV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMubWFwKChlKSA9PiBlLmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkZWx0YS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gZGVsdGEuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZEV2ZW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgaXRlcmF0aW9uOiB1c2UgcHJlbG9hZGVkIGV2ZW50cyBpZiBhdmFpbGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZG8gYSBmdWxsIGxvYWQgd2l0aCBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IHByZWxvYWRlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzZXF1ZW50IGl0ZXJhdGlvbjogZmV0Y2ggb25seSBuZXcgZXZlbnRzIHNpbmNlIGxhc3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWR1cGUgYnkgZXZlbnRJZDogYSBwcmV2aW91cyBpdGVyYXRpb24gbWF5IGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZGVkIGEgcmVmcmVzaGVkIHdhaXQtY29tcGxldGlvbiBkZWx0YSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxvb3Agb2JzZXJ2ZXMgdGhlIGFkdmFuY2VkIGN1cnNvciwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsIGZldGNoIGNhbiByZXR1cm4gZXZlbnRzIHdlIGFscmVhZHkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbiAyIGFmdGVyIGl0ZXJhdGlvbiAxIHVzZWQgcHJlbG9hZGVkIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoaWNoIGRvbid0IGNhcnJ5IGEgY3Vyc29yKS4gRG8gYSBmdWxsIGxvYWQgbm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIHVwIGFueSBldmVudHMgd3JpdHRlbiBzaW5jZSB0aGUgcHJlbG9hZGVkIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9idGFpbiBhIGN1cnNvciBmb3Igc3Vic2VxdWVudCBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZHMuIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHBhdGgsIG5vdCBhIGJ1Zy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdObyBjdXJzb3IgYWZ0ZXIgcHJlbG9hZGVkLWV2ZW50cyBmaXJzdCBpdGVyYXRpb247IGRvaW5nIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgY3Vyc29yLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY3Vyc29yIGF2YWlsYWJsZSBkZXNwaXRlIGhhdmluZyBjYWNoZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gcHJlbG9hZGVkLWV2ZW50cyBleHBsYW5hdGlvbi4gQWxsIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHJldHVybiBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgZXZlbnRzLCBzbyB0aGlzIHNpZ25hbHMgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXb3JsZC4gRmFsbCBiYWNrIHRvIGEgZnVsbCByZWxvYWQgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjdXJzb3IgbWlzc2luZyBhZnRlciBpbml0aWFsIGxvYWQg4oCUIGZhbGxpbmcgYmFjayB0byBmdWxsIHJlbG9hZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvbi4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbmN1cnJlbnQgY29tcGxldGlvbiB2aWEgdGhlIGV2ZW50IGxvZzogaWZcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgaGFuZGxlciB3cm90ZSBhIHRlcm1pbmFsIHJ1biBldmVudCwgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyByZXBsYXkgd29yay4gVGhlIHJ1biBlbnRpdHkncyBzdGF0dXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gdGhlc2UgZXZlbnRzLCBzbyBjaGVja2luZyB0aGUgbG9nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlcyB1cyB0aGUgc2FtZSBzaWduYWwgYXMgYSBydW5zLmdldCgpIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBleHRyYSByZXF1ZXN0IHBlciBsb29wIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRzVG9Db21wbGV0ZSA9IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTogZSBpcyBFeHRyYWN0PFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID4gJiB7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+PSAoZS5ldmVudERhdGEucmVzdW1lQXQgYXMgRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdDogZS5ldmVudERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiB3YWl0c1RvQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0IGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdHNUb0NvbXBsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IGlzIGNvbW1pdHRlZC4gTG9hZCBvbmx5IGV2ZW50cyBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHNuYXBzaG90IGN1cnNvciBzbyBjb25jdXJyZW50IGR1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cywgc3VjaCBhcyBob29rX3JlY2VpdmVkLCBrZWVwIHRoZWlyIG9yZGVyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byB3YWl0X2NvbXBsZXRlZC4gRmFsbCBiYWNrIHRvIGEgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIGZvciBvbGRlciB3b3JsZHMgdGhhdCBjYW5ub3QgZ2l2ZSB1cyBhIHN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBvciBpZiB0aGUgY3Vyc29yIGRlbHRhIGRvZXMgbm90IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGNvbXBsZXRpb24gdGhpcyBoYW5kbGVyIGp1c3QgYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50c0N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhd0FsbFdhaXRDb21wbGV0aW9ucyA9IHdhaXRzVG9Db21wbGV0ZS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FpdEV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QWxsV2FpdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhldmVudC5ldmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZXZlbnQuZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY2FjaGUgcmVmZXJlbmNlIChtYXkgaGF2ZSBiZWVuIHNldCBmb3IgZmlyc3QgdGltZSlcbiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBldmVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCB0aGUgY3Vyc29yIGFzIGl0IHN0YW5kcyBmb3IgdGhpcyBpdGVyYXRpb24nc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZywgYmVmb3JlIGFueSBpbmxpbmUgd3JpdGVzIChzdGVwX2NyZWF0ZWQgdmlhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlU3VzcGVuc2lvbiwgc3RlcF9zdGFydGVkL3N0ZXBfY29tcGxldGVkIHZpYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwKSBhZHZhbmNlIGl0LiBUaGlzIGlzIHRoZSBgc2luY2VDdXJzb3JgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIGEgc3VwcG9ydGluZyBXb3JsZCBvbiB0aGUgaW5saW5lIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHNvIGl0IGNhbiByZXR1cm4gdGhlIGV2ZW50LWxvZyBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsZXR0aW5nIHRoZSBuZXh0IGl0ZXJhdGlvbiBza2lwIHRoZSBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0LiBDYXB0dXJlZCBoZXJlIGJlY2F1c2Ugbm90aGluZyBiZXR3ZWVuIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCBhbmQgdGhlIGlubGluZSBleGVjdXRlU3RlcCBtdXRhdGVzIGV2ZW50c0N1cnNvci5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVJbmxpbmVXcml0ZUN1cnNvciA9IGV2ZW50c0N1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHdvcmtmbG93IHJlcGxheScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bldvcmtmbG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEh5ZHJhdGlvbkNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyByZXBsYXkgY29tcGxldGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYSB3b3JrZmxvdyB0aGF0IGZpbmlzaGVzIHdpdGggbm8gc3RlcHMgcmVhY2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBiZWZvcmUgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZDsgb3JkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBhZnRlciBpdCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBvdXRwdXQ6IHJlc3VsdCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3M6IGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzOiBlcnIud2FpdENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoc3VzcGVuc2lvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWMjogaGFuZGxlIHN1c3BlbnNpb24gd2l0aG91dCBxdWV1aW5nIHN0ZXBzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1c3BlbnNpb25SZXN1bHQ6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGhhbmRsZVN1c3BlbnNpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdCA9IGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb246IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvckNvZGUoZXJyb3JDb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoc3VzcGVuc2lvbkVycm9yLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9vayBjb25mbGljdDogYnJlYWsgbG9vcCwgcmUtaW52b2tlIHZpYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gUmUtaW52b2tlIGJlZm9yZSBwcm9jZXNzaW5nIHBlbmRpbmcgc3RlcHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBQcm9taXNlLnJhY2UoW3NldEF0dHJpYnV0ZXMoKSwgc3RlcCgpXSksIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBhdHRyaWJ1dGUgZXZlbnQgY2FuIHdpbiB3aXRob3V0IGV4ZWN1dGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvc2luZyBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ1N0ZXBzID0gc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBleGVjdXRpb24gaXMgZ2F0ZWQgb24gb3duZXJzaGlwLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZCB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgdG8gYGdldE1heElubGluZVN0ZXBzKClgIHN0ZXBzIChgbGF6eUlubGluZVN0ZXBzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBydW4gdGhlbSBpbmxpbmUg4oCUIGluIHBhcmFsbGVsIOKAlCB2aWEgbGF6eVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfc3RhcnRlZGAgZXZlbnRzIHRoYXQgY3JlYXRlIGVhY2ggc3RlcCBvbiB0aGUgZmx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2aW5nIG9uZSB3b3JsZCByb3VuZC10cmlwIHBlciBpbmxpbmUgc3RlcC4gT3duZXJzaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhdG9taWMgYW5kIGV4YWN0bHktb25lIHBlciBzdGVwOiB0aGUgd29ybGQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIGluc2lkZSBlYWNoIHN0ZXBfc3RhcnRlZCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKOKGkiBleGVjdXRlU3RlcCBgc2tpcHBlZGApIHRvIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBsb3Nlciwgc28gb25seSBvbmUgaGFuZGxlciBldmVyIHJ1bnMgYSBnaXZlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9keS4gRXZlcnkgb3RoZXIgcGVuZGluZyBzdGVwIGtlZXBzIGl0cyBlYWdlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIChpbiBgY3JlYXRlZFN0ZXBDb3JyZWxhdGlvbklkc2ApIGFuZCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgb25seSBkZXNpZ25hdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF6eUlubGluZVN0ZXBzYCB3aGVuIG5vIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnQuIFRoYXQgYXdhaXRlciBjYXNlIG11c3QgZXhlY3V0ZSBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmU6IGFuIGlubGluZSBgYXdhaXQgZXhlY3V0ZVN0ZXAoLi4uKWAgYmxvY2tzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sIHNvIHRoZSBhd2FpdGVyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiAod2hpY2ggb25seSBhZHZhbmNlcyBvbiB0aGUgbmV4dCByZXBsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBzZXJpYWxpemVkIGJlaGluZCB0aGUgc3RlcCDigJQgZGVmZWF0aW5nIHdvcmtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JrZmxvdyBleHByZXNzZWQgYXMgcGFyYWxsZWwgKGUuZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBob29rLmdldENvbmZsaWN0KCkudGhlbigoKSA9PiBzdGVwQigpKWAgcmFjaW5nIGBhd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcEEoKWApLiBJbiB0aGF0IGNhc2UgYGxhenlJbmxpbmVTdGVwc2AgaXMgZW1wdHkgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBzdGVwIGlzIHF1ZXVlZCBmb3IgcmUtaW52b2NhdGlvbiwgd2hpY2ggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIgd2hpbGUgcXVldWVkIHN0ZXBzIHJ1biBpbiBwYXJhbGxlbCBpbnZvY2F0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhenlJbmxpbmVTdGVwcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQubGF6eUlubGluZVN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lQ29ycmVsYXRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubWFwKChzKSA9PiBzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmlmaWVkIHF1ZXVlIGRpc3BhdGNoIGZvciBldmVyeXRoaW5nIHdlIGFyZSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZS1leGVjdXRpbmcuIFN0ZXBzIGFyZSBxdWV1ZWQgd2l0aCBzdGVwSWQgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlciBydW5zIHRoZW07IHRoZSB3YWl0IHRpbWVyIGlzIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBnZW5lcmljIGNvbnRpbnVhdGlvbiB0aGF0IGZpcmVzIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBlbGFwc2VzIGFuZCBsZXRzIHRoZSBuZXh0IHJlcGxheSBvYnNlcnZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IHZpYSB0aGUgXCJjb21wbGV0ZSBlbGFwc2VkIHdhaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBxdWV1ZWluZyBpcyB1bmNvbmRpdGlvbmFsIChjb3ZlcnMgY3Jhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZiBhIHByaW9yIGhhbmRsZXIgd3JvdGUgc3RlcF9jcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgY3Jhc2hlZCBiZWZvcmUgcXVldWVpbmcsIGEgbGF0ZXIgaGFuZGxlciB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGVtOyBpZGVtcG90ZW5jeUtleSBvbiBjb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWR1cGVzIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd2FpdCBjb250aW51YXRpb24gaXMgd2hhdCBtYWtlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFByb21pc2UucmFjZShzdGVwLCBzbGVlcClgIGJlaGF2ZSBjb3JyZWN0bHkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgZXhlY3V0aW9uOiBldmVuIGlmIHRoZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tzIHRoaXMgaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IHRpbWVyIGZpcmVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24uIElmIHRoZSBzbGVlcCB3aW5zLCB0aGF0IHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGNvbXBsZXRlcyB0aGUgcnVuOyBpZiB0aGUgc3RlcCB3aW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdhaXQgY29udGludWF0aW9uIGZpcmVzIGxhdGVyIGFuZCBuby1vcHMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRpbnVhdGlvbidzIGRlbGF5IGlzIGNsYW1wZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIHF1ZXVlIGRlbGF5IChsb25nIHdhaXRzIGNoYWluIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgaG9wcykgYW5kIGl0cyBpZGVtcG90ZW5jeSBrZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtb2JzZXJ2YXRpb25zIG9mIHRoZSBzYW1lIHBlbmRpbmcgd2FpdCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gcGFzc2VzIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUvd2FpdC1jb250aW51YXRpb24udHMgZm9yIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheS9rZXkgc2VsZWN0aW9uIHJhdGlvbmFsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHBlbmRpbmdTdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lQ29ycmVsYXRpb25JZHMuaGFzKHN0ZXAuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGRpc3BhdGNoZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGV4ZWN1dGUgaW5saW5lIOKAlCBldmVyeXRoaW5nIGhhcyBiZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgKG9yIG5vIHdvcmsgbmVlZHMgc2NoZWR1bGluZykuIEV4aXQgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGRyaXZlIHN1YnNlcXVlbnQgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlciBuZWVkcyBhbiBpbW1lZGlhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdGhlIHJlcGxheSBjb25zdW1lcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlci4gV2l0aG91dCBpdCAobm8gaW5saW5lIHN0ZXAsIGFsbCB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBvciBub25lIHBlbmRpbmcpIHRoZSBydW4gd291bGQgc2l0IGlkbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW50aWwgc29tZSB1bnJlbGF0ZWQgbWVzc2FnZSB3b2tlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSBpbmxpbmUgc3RlcC4gUGF1c2UgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHN0ZXAgYm9keSDigJQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGhlIHJlcGxheS1idWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gd291bGQgKGluY29ycmVjdGx5KSBjaGFyZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIGJvZHkgYWdhaW5zdCB0aGUgYnVkZ2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLWRlbHRhIGZhc3QgcGF0aCBnYXRlLiBXZSByZXF1ZXN0IHRoZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gY29uc3VtZSBpdCBpbiBwbGFjZSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IOKAlCBvbmx5IHdoZW4gQUxMIGhvbGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gV2UgaGF2ZSBhIHJlYWwgcHJpb3IgY3Vyc29yIHRvIGRpZmYgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwcmVJbmxpbmVXcml0ZUN1cnNvcmA7IGEgV29ybGQgbWF5IHJldHVybiBub25lIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaG9va3Mgb3Igd2FpdHMgKGBlcnIue3N0ZXAsaG9vayx3YWl0fUNvdW50YCksIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9uZSBzdGVwIGlzIHRoZSBsb25lIHBlbmRpbmcgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYCkgYW5kIHRoZSBsb25lIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RlcCAoYGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDFgIOKAlCBubyBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2libGluZ3MgcXVldWVkIHRvIGJhY2tncm91bmQgaGFuZGxlcnMsIGFuZCBubyBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW5saW5lIHN0ZXAgd3JpdGluZyBpdHMgb3duIGV2ZW50cyBvdXQgb2YgYmFuZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBObyBwZW5kaW5nIHdhaXQgdGltZXIgZnJvbSBUSElTIHN1c3BlbnNpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBUaGUgcnVuIGhhcyBOTyBwcmUtZXhpc3Rpbmcgb3BlbiBob29rIG9yIHdhaXQuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHBsdXMgdGhlIHBlci1zdXNwZW5zaW9uIGNvdW50cyBhYm92ZSBpcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGxvYWQtYmVhcmluZyBzYWZldHkgY2hlY2s6IHRoZSBkZWx0YSBzbmFwc2hvdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBsb2cgYXQgdGhlIHN0ZXBfY29tcGxldGVkIHdyaXRlIGJ1dCBpcyBjb25zdW1lZCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIG5leHQgcmVwbGF5LCBzbyBhbiBvdXQtb2YtYmFuZCBob29rX3JlY2VpdmVkIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdhaXRfY29tcGxldGVkIGxhbmRpbmcgaW4gdGhhdCB3aW5kb3cgd291bGQgYmUgaW4gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVhbCBmZXRjaCB5ZXQgYWJzZW50IGZyb20gdGhlIHN0YWxlIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmlza2luZyBhIGRpdmVyZ2VudCByZXBsYXkuIFdpdGggbm8gaG9vay93YWl0IG9wZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChuZWl0aGVyIGNhcnJpZWQgb3ZlciBub3IgY3JlYXRlZCB0aGlzIHN1c3BlbnNpb24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIG9ubHkgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIHNhZmUgdG8gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaGFzT3Blbkhvb2tPcldhaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHN0ZXAgcnVucyBpbmxpbmUsIGVhY2ggd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGV2ZW50cyBhbmQgdGhlIHBlci13cml0ZSBkZWx0YSB3b3VsZCBiZSBwYXJ0aWFsLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGlzIG5vdCByZXF1ZXN0ZWQgKHRoZSBnYXRlIGJlbG93IGlzIGZhbHNlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktc3RlcCkgYW5kIHRoZSBuZXh0IGl0ZXJhdGlvbiBkb2VzIGEgbm9ybWFsIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdElubGluZURlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHByZUlubGluZVdyaXRlQ3Vyc29yID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc09wZW5Ib29rT3JXYWl0KGNhY2hlZEV2ZW50cyA/PyBbXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgZm9yY2VzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCDigJQgYnV0IG9ubHkgd2hpbGUgdGhlIHJ1biBpcyBzdGlsbCBcImNsZWFuXCIgKGEgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9uKS4gVGhlIG1vbWVudCBhIGhvb2sgb3Igd2FpdCAob3IgYXR0cikgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGxhdGVyIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBiZWNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgbm8gbG9uZ2VyIGhvbGRzIOKAlCB0dXJib1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgYW5kIHRoZSBzdGVwcyB0YWtlIHRoZSBub3JtYWwgKGVudi1nYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0LXRoZW4tcnVuIHBhdGguIFRoZSBob29rLWNvbmZsaWN0IC8gYXR0ciBjYXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSByZXR1cm5lZCBlYXJseSBhYm92ZSBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmUgZGVmZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgc3VzcGVuc2lvblJlc3VsdC4qYCBmbGFncyBvbmx5IHJlZmxlY3Qgd2hhdCBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBjcmVhdGVkLCBzbyB0aGV5IGRvIG5vdCBjYXRjaCBhIGhvb2svd2FpdCBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFuIGVhcmxpZXIgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIGRlbGl2ZXJ5IChlLmcuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vayguLi4pYCB0aGF0IGRvZXNuJ3QgYmxvY2sgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdywgbGV0dGluZyB0aGUgcmVwbGF5IGxvb3AgY29udGludWUgdG8gbGF0ZXIgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9ucykuIE9uY2UgYW55IGhvb2sgb3Igd2FpdCBpcyBvcGVuIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBsb2csIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBhcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLCBzbyB0dXJibyBtdXN0IGxhdGNoIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWFuZW50bHkg4oCUIGNoZWNrZWQgaGVyZSB2aWEgYGhhc09wZW5Ib29rT3JXYWl0YCBvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VtdWxhdGl2ZSBgY2FjaGVkRXZlbnRzYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzT3Blbkhvb2tPcldhaXQoY2FjaGVkRXZlbnRzID8/IFtdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2gg4oCUIHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0IOKAlCBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiB3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBpbmxpbmUgc3RhcnQ6IHNlbmQgdGhlIGRlZmVycmVkIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBvbiBzdGVwX3N0YXJ0ZWQgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgb24gdGhlIGZseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eVN0ZXBJbnB1dDogcy5kZWh5ZHJhdGVkSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBmb3JjZSBvcHRpbWlzdGljIHN0YXJ0IGFuZCBob2xkIHRoZSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCB1bnRpbCB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmRzICh0aGUgYm9keSBzdGlsbCBydW5zIGltbWVkaWF0ZWx5KS4gQm90aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdW5kZWZpbmVkL2ZhbHNlIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlT3B0aW1pc3RpY1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXF1ZXN0SW5saW5lRGVsdGEgJiYgcHJlSW5saW5lV3JpdGVDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVJbmxpbmVXcml0ZUN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgdGhlIGJhdGNoIHJlc3VsdHMuIGByZXRyeWAgc3RlcHMgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGV4aXN0IOKAlCB0aGVpciBgc3RlcF9zdGFydGVkYCBzdWNjZWVkZWQpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtcXVldWVkIHBlci1zdGVwIGFzIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5OyBgdGhyb3R0bGVkYCBzdGVwcyAocmVqZWN0ZWQgb24gdGhlIGNyZWF0ZS1jbGFpbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG5ldmVyIGNyZWF0ZWQpIGluc3RlYWQgZGVmZXIgcmVkZWxpdmVyeSBvZiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSBzbyB0aGV5IHJlLXJ1biBpbmxpbmUgd2l0aCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcmVwbGF5OyBjb21wbGV0ZWQvZmFpbGVkIHN0ZXBzIGFscmVhZHkgd3JvdGUgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIGV2ZW50cy4gV2Ugb25seSBsb29wIGJhY2sgdG8gcmVwbGF5IHdoZW4gZXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSDigJQgb3RoZXJ3aXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtcGVuZGluZyBzdGVwcyB3aWxsIGJlIHJlLXJ1biBieSB0aGVpciBxdWV1ZWQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGFuZCB0aGUgYmFja2dyb3VuZC1zdGVwIGhhbmRsZXIgcmVwbGF5cyBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgYXJlIGRvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6ICh0eXBlb2YgbGF6eUlubGluZVN0ZXBzKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXp5SW5saW5lU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbGF6eUlubGluZVN0ZXBzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IHIudGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRpbWVvdXRTZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVBlbmRpbmdPcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZlciByZWRlbGl2ZXJ5IG9mIHRoZSBvcmNoZXN0cmF0b3IgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm90dGxlIGJhY2tvZmYuIE9uIHJlcGxheSBldmVyeSBub24tdGVybWluYWwgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZS1kaXNwYXRjaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXI6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC10aHJvdHRsZWQgc3RlcHMgcnVuIGlubGluZSBhZ2FpbiBXSVRIIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0ICh0aGVpciBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCBhbmV3KSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueSBgcmV0cnlgIHN0ZXBzIGluIHRoaXMgYmF0Y2ggYXJlIHF1ZXVlZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duIHJldHJ5QWZ0ZXIgaG9ub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYWwgc3RlcHMgKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZWQgZnJvbSB0aGVpciBldmVudHMgYW5kIG5vdCByZS1ydW4uIEJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheSBkcml2ZXMgYWxsIHJlbWFpbmluZyB3b3JrLCB3ZSBtdXN0IE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHJlLXF1ZXVlIGB0b1JldHJ5YCBoZXJlIOKAlCB0aGF0IHdvdWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1kaXNwYXRjaCB0aG9zZSBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEJFRk9SRSB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdywgc28gYSBiYXRjaCB0aGF0IG1peGVzIGEgdGhyb3R0bGUgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdGVwIHRoYXQgbGVmdCB1bmZsdXNoZWQgb3BzIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBleHBsaWNpdCBmbHVzaCBjb250aW51YXRpb24uIFRoYXQgaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0aHJvdHRsZSBiYWNrb2ZmICg+PSAxcykgYWx3YXlzIGV4Y2VlZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLWludm9jYXRpb24gZmx1c2ggd2luZG93ICg8PSA1MDBtcyArIHdhaXRVbnRpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIG9wcyBzZXR0bGUgYmVmb3JlIHRoZSBwb3N0LWJhY2tvZmYgcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXlzIGFuZCByZWFkcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UodGhyb3R0bGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVRyYWNlQ2FycmllciA9IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRyeS5tYXAoKHsgc3RlcCwgZGVsYXlTZWNvbmRzIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IHJldHJ5VHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSB0aGUgZGVsYXllZCByZXRyeSBvbiB0aGUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVsYXRpb25JZCBzbyBpdCBkZWR1cGVzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgcmUtZGlzcGF0Y2ggdGhlIHN1c3BlbnNpb24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1zIG9uIHJlcGxheSAoaXQgYWxzbyB1c2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWRgKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYSBtaXhlZCBiYXRjaCB3aGVyZSBvbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb21wbGV0ZWRgIHdpdGggdW5mbHVzaGVkIGJhY2tncm91bmQgb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBhbnlQZW5kaW5nT3BzYCkgYW5kIGFub3RoZXIgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHdvdWxkIGRvdWJsZS1kaXNwYXRjaCB0aGUgcmV0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2ggYmVsb3cgcXVldWVzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHBsYWluIGNvbnRpbnVhdGlvbiwgd2hvc2UgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlcyB0aGUgc3RpbGwtYHJldHJ5aW5nYCBzdGVwIGFzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcyBpdCAqaW1tZWRpYXRlbHkqIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICp3aXRoKiBhIGtleS4gU2luY2UgdGhpcyBkZWxheWVkIHJldHJ5IGhhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGtleSwgdGhlIHR3byBtZXNzYWdlcyB3b3VsZG4ndCBkZWR1cGUg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgd291bGQgcnVuIHR3aWNlLCB0aGUgY29uZmlndXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJhY2tvZmYgd291bGQgYmUgaWdub3JlZCAocGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgRXJyb3JgIHJldHJpZXMgcGVyc2lzdCBubyBgcmV0cnlBZnRlcmAsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGhhcyBubyBgVG9vRWFybHlgIGd1YXJkKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJvZHkgY291bGQgcnVuIGVhcmx5L2NvbmN1cnJlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFyaW5nIHRoZSBrZXkgbGV0cyB0aGUgZWFybGllciBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB3aW4sIGhvbm9yaW5nIHRoZSBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFueSBpbmxpbmUgc3RlcCBoYWQgcGVuZGluZyBiYWNrZ3JvdW5kIG9wcyAoZS5nLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB3cml0ZXMgdG8gUzMpLCBicmVhayB0aGUgbG9vcCBhbmQgcXVldWUgYSBwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIHNvIHdhaXRVbnRpbCBjYW4gZmx1c2ggdGhlbSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHJlcGxheSByZWFkcyB0aGVtLiBUaGlzIG1hdGNoZXMgVjEgYmVoYXZpb3Igd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggc3RlcCByYW4gaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFueVBlbmRpbmdPcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnJlYWtpbmcgbG9vcDogaW5saW5lIHN0ZXAgaGFzIHBlbmRpbmcgb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBsb29wSXRlcmF0aW9uIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBpbmxpbmUgc3RlcHMgd2lsbCBiZSByZS1ydW4gdmlhIHRoZWlyIHF1ZXVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBtZXNzYWdlczsgdGhlIGJhY2tncm91bmQtc3RlcCBoYW5kbGVyIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbGwgc3RlcHMgYXJlIHRlcm1pbmFsLiBEb24ndCBsb29wIGhlcmUg4oCUIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyBzdGVwcyBoYXZlIG5vIHRlcm1pbmFsIGV2ZW50IHRvIG9ic2VydmUgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBpbmxpbmUgc3RlcHMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIOKAlCBsb29wIGJhY2sgdG8gcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHdvcmtmbG93IG9ic2VydmVzIHRoZSB0ZXJtaW5hbCBldmVudHMgb24gcmVwbGF5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlIGlubGluZSBzdGVwJ3MgdGVybWluYWwgd3JpdGUgcmV0dXJuZWQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBkZWx0YSAoc3VwcG9ydGluZyBXb3JsZCArIHRoZSBzaW5nbGUtc3RlcCBnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSksIHN0YXNoIGl0IHNvIHRoZSBuZXh0IGl0ZXJhdGlvbidzIGxvYWQgY29uc3VtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC4gT25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBsZXRlZCBwYXRoIGNhcnJpZXMgYSBkZWx0YTsgbXVsdGktc3RlcCBiYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZXF1ZXN0IG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LmlubGluZURlbHRhICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IG9ubHkuaW5saW5lRGVsdGEuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBvbmx5LmlubGluZURlbHRhLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50IDw9IFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZT8uZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkICR7ZGl2ZXJnZW5jZUNvdW50fSB0aW1lcyBhZnRlciAke1JFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtIOKAlCBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSAvLyBFbmQgd2hpbGUgbG9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTsgLy8gRW5kIHRyYWNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTsgLy8gRW5kIHdpdGhXb3JrZmxvd0JhZ2dhZ2VcbiAgICAgICAgfSk7IC8vIEVuZCB3aXRoVHJhY2VDb250ZXh0XG4gICAgICB9XG4gICAgKTtcblxuICBsZXQgY2FjaGVkSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICBjYWNoZWRIYW5kbGVyID0gaGFuZGxlcihhd2FpdCBnZXRXb3JsZEhhbmRsZXJzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkSGFuZGxlcihyZXEpO1xuICB9KTtcbn1cbiJdfQ==