footprintjs 9.26.0 → 9.28.0
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/AGENTS.md +3 -0
- package/CLAUDE.md +5 -4
- package/README.md +4 -0
- package/dist/advanced.js +3 -2
- package/dist/esm/advanced.d.ts +2 -2
- package/dist/esm/advanced.js +2 -2
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +10 -0
- package/dist/esm/lib/builder/FlowChartBuilder.js +27 -13
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +45 -12
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +195 -0
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +471 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +6 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +43 -10
- package/dist/esm/lib/engine/handlers/index.d.ts +2 -0
- package/dist/esm/lib/engine/handlers/index.js +2 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +49 -4
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +64 -13
- package/dist/esm/lib/engine/types.d.ts +30 -11
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/pause/index.d.ts +1 -1
- package/dist/esm/lib/pause/index.js +1 -1
- package/dist/esm/lib/pause/types.d.ts +93 -5
- package/dist/esm/lib/pause/types.js +57 -3
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +8 -10
- package/dist/esm/lib/runner/FlowChartExecutor.js +153 -181
- package/dist/esm/lib/time-travel/bundles.js +11 -1
- package/dist/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +27 -13
- package/dist/lib/engine/handlers/ChildrenExecutor.js +45 -12
- package/dist/lib/engine/handlers/ResumeEntry.js +478 -0
- package/dist/lib/engine/handlers/SubflowExecutor.js +43 -10
- package/dist/lib/engine/handlers/index.js +4 -2
- package/dist/lib/engine/traversal/FlowchartTraverser.js +64 -13
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/pause/index.js +1 -1
- package/dist/lib/pause/types.js +57 -3
- package/dist/lib/runner/FlowChartExecutor.js +153 -181
- package/dist/lib/time-travel/bundles.js +11 -1
- package/dist/types/advanced.d.ts +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +10 -0
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +195 -0
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +6 -0
- package/dist/types/lib/engine/handlers/index.d.ts +2 -0
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +49 -4
- package/dist/types/lib/engine/types.d.ts +30 -11
- package/dist/types/lib/pause/index.d.ts +1 -1
- package/dist/types/lib/pause/types.d.ts +93 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +8 -10
- package/package.json +1 -1
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* const result = await executor.run({ input: data, env: { traceId: 'req-123' } });
|
|
18
18
|
*/
|
|
19
19
|
import { detachAndForget as _detachAndForget, detachAndJoinLater as _detachAndJoinLater } from '../detach/spawn.js';
|
|
20
|
+
import { ResumeEntry } from '../engine/handlers/ResumeEntry.js';
|
|
20
21
|
import { servedSubflowResults } from '../engine/handlers/servedSubflowResults.js';
|
|
21
22
|
import { CombinedNarrativeRecorder } from '../engine/narrative/CombinedNarrativeRecorder.js';
|
|
22
23
|
import { ManifestFlowRecorder } from '../engine/narrative/recorders/ManifestFlowRecorder.js';
|
|
@@ -37,6 +38,35 @@ import { generateRunId } from './runId.js';
|
|
|
37
38
|
import { validateInput } from './validateInput.js';
|
|
38
39
|
/** Default scope factory — creates a plain ScopeFacade for each stage. */
|
|
39
40
|
const defaultScopeFactory = (ctx, stageName, readOnly, env) => new ScopeFacade(ctx, stageName, readOnly, env);
|
|
41
|
+
/**
|
|
42
|
+
* The paused stage's stand-in for a resume: the stage's OWN node — so it keeps
|
|
43
|
+
* its shape (a decider's or selector's branches, a fork parent's children,
|
|
44
|
+
* its `next`) and its name, description and declared tags — with `fn` swapped
|
|
45
|
+
* for the resume half.
|
|
46
|
+
*
|
|
47
|
+
* Dropped: `resumeFn` and `isPausable` (the resume half must not pause
|
|
48
|
+
* because it returned a value — the original pausable contract); and, on the
|
|
49
|
+
* `addPausableFunction` re-entry, the policies declared for the stage's OWN
|
|
50
|
+
* function (`retry`, streaming) — that re-entry runs a different function
|
|
51
|
+
* (`resumeFn`) under a different contract. The `interrupt()` re-entry re-runs
|
|
52
|
+
* the stage's own function, so it keeps them.
|
|
53
|
+
*
|
|
54
|
+
* Tags follow the stage on BOTH re-entries (9.21.0): a tag is the stage's
|
|
55
|
+
* NAME, not a policy over its function, and the resumed execution is that
|
|
56
|
+
* stage running again — its bundle must carry it, or a chained axis would
|
|
57
|
+
* show the paused leg tagged and the resumed leg silently not.
|
|
58
|
+
*/
|
|
59
|
+
function standInFor(pausedNode, fn, isInterruptResume) {
|
|
60
|
+
const standIn = { ...pausedNode, fn };
|
|
61
|
+
delete standIn.resumeFn;
|
|
62
|
+
delete standIn.isPausable;
|
|
63
|
+
if (!isInterruptResume) {
|
|
64
|
+
delete standIn.retry;
|
|
65
|
+
delete standIn.isStreaming;
|
|
66
|
+
delete standIn.streamId;
|
|
67
|
+
}
|
|
68
|
+
return standIn;
|
|
69
|
+
}
|
|
40
70
|
export class FlowChartExecutor {
|
|
41
71
|
traverser;
|
|
42
72
|
/** Shared execution counter — survives pause/resume. Reset on fresh run(). */
|
|
@@ -242,7 +272,8 @@ export class FlowChartExecutor {
|
|
|
242
272
|
mod(scope);
|
|
243
273
|
return scope;
|
|
244
274
|
});
|
|
245
|
-
|
|
275
|
+
// The first stage this traversal runs: the resume's entry, else the chart root.
|
|
276
|
+
const effectiveRoot = overrides?.resume?.start ?? fc.root;
|
|
246
277
|
const effectiveInitialContext = overrides?.initialContext ?? args.initialContext;
|
|
247
278
|
let runtime;
|
|
248
279
|
if (overrides?.existingRuntime) {
|
|
@@ -308,7 +339,13 @@ export class FlowChartExecutor {
|
|
|
308
339
|
runtime.useWriteProvenance(writeProvenance);
|
|
309
340
|
}
|
|
310
341
|
return new FlowchartTraverser({
|
|
311
|
-
|
|
342
|
+
// Always the REAL chart — every id (loop targets, a re-visit of the
|
|
343
|
+
// paused stage) resolves against it. A resume only moves where the
|
|
344
|
+
// traversal STARTS (`entry`), once.
|
|
345
|
+
root: fc.root,
|
|
346
|
+
...(overrides?.resume?.start && { entry: overrides.resume.start }),
|
|
347
|
+
...(overrides?.resume?.startPendingPauses && { pendingPauses: overrides.resume.startPendingPauses }),
|
|
348
|
+
...(overrides?.resume && { resume: overrides.resume }),
|
|
312
349
|
stageMap: fc.stageMap,
|
|
313
350
|
scopeFactory,
|
|
314
351
|
executionRuntime: runtime,
|
|
@@ -326,10 +363,6 @@ export class FlowChartExecutor {
|
|
|
326
363
|
executionCounter: this._executionCounter,
|
|
327
364
|
visitCounts: this._visitCounts,
|
|
328
365
|
runId: this._currentRunId,
|
|
329
|
-
...(overrides?.subflowsOverride && { subflows: overrides.subflowsOverride }),
|
|
330
|
-
...(overrides?.subflowStatesForResume && {
|
|
331
|
-
subflowStatesForResume: overrides.subflowStatesForResume,
|
|
332
|
-
}),
|
|
333
366
|
...(maxDepth !== undefined && { maxDepth }),
|
|
334
367
|
...(maxIterations !== undefined && { maxIterations }),
|
|
335
368
|
});
|
|
@@ -437,7 +470,14 @@ export class FlowChartExecutor {
|
|
|
437
470
|
* Resume a paused flowchart from a checkpoint.
|
|
438
471
|
*
|
|
439
472
|
* Restores the scope state, calls the paused stage's `resumeFn` with the
|
|
440
|
-
* provided input,
|
|
473
|
+
* provided input (or, for an `interrupt()` pause, re-runs the stage with the
|
|
474
|
+
* answer), then continues with whatever ran after that stage on the run —
|
|
475
|
+
* its own `next`, or the continuation of the decider, selector or fork that
|
|
476
|
+
* dispatched it, at every level of the pause path — and from there walks the
|
|
477
|
+
* chart as built. When parallel siblings paused in the same fan-out
|
|
478
|
+
* (`checkpoint.pendingPauses`), the run pauses again with the next sibling's
|
|
479
|
+
* question once this one's branch is done; the fan-out's join runs after the
|
|
480
|
+
* last answer. See `ResumeEntry` (`footprintjs/advanced`).
|
|
441
481
|
*
|
|
442
482
|
* The checkpoint can come from `getCheckpoint()` on a previous run, or from
|
|
443
483
|
* a serialized checkpoint stored in Redis/Postgres/localStorage.
|
|
@@ -487,31 +527,6 @@ export class FlowChartExecutor {
|
|
|
487
527
|
!checkpoint.subflowPath.every((s) => typeof s === 'string')) {
|
|
488
528
|
throw new Error('Invalid checkpoint: subflowPath must be an array of strings.');
|
|
489
529
|
}
|
|
490
|
-
// ── Seed the shared execution counter + per-stage visit counts ──
|
|
491
|
-
//
|
|
492
|
-
// MUST run before the counter is READ below (the resume-node runtimeStageId
|
|
493
|
-
// reconstruction) AND before createTraverser() hands the traverser these
|
|
494
|
-
// objects BY REFERENCE. Seeding keeps runtimeStageIds unique and
|
|
495
|
-
// loopIteration monotonic across a CROSS-executor resume (a fresh executor
|
|
496
|
-
// starts both at 0/empty; the checkpoint carries the pause-time values).
|
|
497
|
-
//
|
|
498
|
-
// MUTATE, never REPLACE: `_executionCounter` and `_visitCounts` are shared
|
|
499
|
-
// by reference into the traverser (and, transitively, every subflow
|
|
500
|
-
// traverser — see FlowchartTraverser's sub-traverser factory). Assigning a
|
|
501
|
-
// fresh object here would sever that shared reference. Both fields are
|
|
502
|
-
// optional on the checkpoint (older persisted checkpoints omit them) — skip
|
|
503
|
-
// seeding when absent, preserving the previous behavior. Same-executor
|
|
504
|
-
// resume is idempotent: at pause the instance values already equal the
|
|
505
|
-
// checkpoint's, so re-seeding them changes nothing.
|
|
506
|
-
if (typeof checkpoint.executionCount === 'number') {
|
|
507
|
-
this._executionCounter.value = checkpoint.executionCount;
|
|
508
|
-
}
|
|
509
|
-
if (checkpoint.visitCounts) {
|
|
510
|
-
this._visitCounts.clear();
|
|
511
|
-
for (const [stageId, count] of Object.entries(checkpoint.visitCounts)) {
|
|
512
|
-
this._visitCounts.set(stageId, count);
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
530
|
// Find the paused node in the graph
|
|
516
531
|
const pausedNode = this.findNodeInGraph(checkpoint.pausedStageId, checkpoint.subflowPath);
|
|
517
532
|
if (!pausedNode) {
|
|
@@ -535,8 +550,7 @@ export class FlowChartExecutor {
|
|
|
535
550
|
throw new Error(`Cannot resume: stage '${pausedNode.name}' (${pausedNode.id}) has no resumeFn. ` +
|
|
536
551
|
'Only stages created with addPausableFunction(), or stages that paused via interrupt(), can be resumed.');
|
|
537
552
|
}
|
|
538
|
-
|
|
539
|
-
// Build a synthetic resume node: runs the resume half, then continues.
|
|
553
|
+
// The resume half — what the paused stage's stand-in runs.
|
|
540
554
|
// resumeFn signature is (scope, input) per PausableHandler — wrap to match StageFunction(scope, breakFn).
|
|
541
555
|
let resumeStageFn;
|
|
542
556
|
if (isInterruptResume) {
|
|
@@ -562,75 +576,90 @@ export class FlowChartExecutor {
|
|
|
562
576
|
return resumeFn(scope, resumeInput);
|
|
563
577
|
};
|
|
564
578
|
}
|
|
565
|
-
//
|
|
566
|
-
//
|
|
567
|
-
//
|
|
568
|
-
//
|
|
579
|
+
// The paused stage's STAND-IN: the stage's OWN node — id, name,
|
|
580
|
+
// description, tags, and its shape (a decider's branches, a selector's, a
|
|
581
|
+
// fork parent's children, its `next`) — with its function swapped for the
|
|
582
|
+
// resume half. Built from the whole node so an `interrupt()` raised inside
|
|
583
|
+
// a decider, selector or fork-parent function DISPATCHES on resume, as the
|
|
584
|
+
// stage did on the run (before 9.28.0 only fn/next/tags/retry were copied
|
|
585
|
+
// and the dispatch was silently skipped). It is where the resumed
|
|
586
|
+
// traversal starts — and nothing else: it is never in a node map or the
|
|
587
|
+
// subflow dictionary, so a loop back to the paused id finds the REAL
|
|
588
|
+
// stage, which pauses again (see ResumeEntry). What runs after it — its
|
|
589
|
+
// own `next`, else its dispatcher's continuation — is attached by
|
|
590
|
+
// `ResumeEntry.plan`, from the chart.
|
|
591
|
+
const standIn = standInFor(pausedNode, resumeStageFn, isInterruptResume);
|
|
592
|
+
// Where the resume re-enters, planned against the chart as built:
|
|
593
|
+
//
|
|
594
|
+
// • TOP-LEVEL PAUSE (subflowPath empty): the resumed traversal starts
|
|
595
|
+
// at the stand-in.
|
|
596
|
+
// • PAUSE INSIDE SUBFLOWS: it starts at the mount of the first subflow
|
|
597
|
+
// on the path, so the outputMappers and the parent's continuation
|
|
598
|
+
// run. Each subflow on the path is entered ONCE through its hop: its
|
|
599
|
+
// nested runtime is seeded from its capture (in place of the
|
|
600
|
+
// inputMapper's values) and its traversal starts at the mount of the
|
|
601
|
+
// next subflow — or, at the leaf, at the stand-in. An outer subflow's
|
|
602
|
+
// stages before that mount do not run again.
|
|
603
|
+
// • AT EVERY LEVEL the entry carries what its dispatcher would have run
|
|
604
|
+
// after it — a decider's `next`, a selector's, a fork's join — so a
|
|
605
|
+
// subflow mounted as a branch or a fork child hands control back to
|
|
606
|
+
// its parent's continuation at the parent's level.
|
|
607
|
+
// • Parallel siblings that paused in the same fan-out wait in
|
|
608
|
+
// `checkpoint.pendingPauses`: each is raised again in turn, and the
|
|
609
|
+
// join runs only once the last one is resumed.
|
|
610
|
+
//
|
|
611
|
+
// Everything else walks the REAL chart: `fc.root` and `fc.subflows` are
|
|
612
|
+
// untouched, so every later loop target and every later subflow entry
|
|
613
|
+
// (real root, inputMapper) resolves as it would on a run. Refused HERE —
|
|
614
|
+
// before any state is touched — when the checkpoint's path does not fit
|
|
615
|
+
// this chart.
|
|
569
616
|
//
|
|
570
|
-
//
|
|
571
|
-
//
|
|
572
|
-
//
|
|
573
|
-
//
|
|
574
|
-
//
|
|
575
|
-
//
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
//
|
|
586
|
-
//
|
|
587
|
-
//
|
|
588
|
-
//
|
|
589
|
-
//
|
|
590
|
-
//
|
|
591
|
-
//
|
|
592
|
-
//
|
|
593
|
-
//
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
617
|
+
// Clone-in: the captures seed nested runtimes (shallow-merged into each
|
|
618
|
+
// nested SharedMemory), so without a copy the engine would hold live
|
|
619
|
+
// references into the caller's checkpoint object — caller mutations would
|
|
620
|
+
// bleed into the resumed run and engine writes would reach a checkpoint
|
|
621
|
+
// the caller may have already persisted. The same for the waiting
|
|
622
|
+
// siblings' captures.
|
|
623
|
+
const fc = this.flowChartArgs.flowChart;
|
|
624
|
+
const resumeEntry = ResumeEntry.plan({
|
|
625
|
+
root: fc.root,
|
|
626
|
+
subflows: fc.subflows,
|
|
627
|
+
path: checkpoint.subflowPath,
|
|
628
|
+
captures: structuredClone(checkpoint.subflowStates),
|
|
629
|
+
standIn,
|
|
630
|
+
...(checkpoint.pendingPauses !== undefined && { pendingPauses: structuredClone(checkpoint.pendingPauses) }),
|
|
631
|
+
});
|
|
632
|
+
// ── Seed the shared execution counter + per-stage visit counts ──
|
|
633
|
+
//
|
|
634
|
+
// Only now — every refusal above (the checkpoint's shape, the paused
|
|
635
|
+
// stage, the plan) leaves the executor exactly as it was. MUST run before
|
|
636
|
+
// the counter is READ below (the stand-in's runtimeStageId for
|
|
637
|
+
// `onResume`) AND before createTraverser() hands the traverser these
|
|
638
|
+
// objects BY REFERENCE. Seeding keeps runtimeStageIds unique and
|
|
639
|
+
// loopIteration monotonic across a CROSS-executor resume (a fresh
|
|
640
|
+
// executor starts both at 0/empty; the checkpoint carries the pause-time
|
|
641
|
+
// values).
|
|
642
|
+
//
|
|
643
|
+
// MUTATE, never REPLACE: `_executionCounter` and `_visitCounts` are shared
|
|
644
|
+
// by reference into the traverser (and, transitively, every subflow
|
|
645
|
+
// traverser — see FlowchartTraverser's sub-traverser factory). Assigning a
|
|
646
|
+
// fresh object here would sever that shared reference. Both fields are
|
|
647
|
+
// optional on the checkpoint (older persisted checkpoints omit them) — skip
|
|
648
|
+
// seeding when absent, preserving the previous behavior. Same-executor
|
|
649
|
+
// resume is idempotent: at pause the instance values already equal the
|
|
650
|
+
// checkpoint's, so re-seeding them changes nothing.
|
|
651
|
+
if (typeof checkpoint.executionCount === 'number') {
|
|
652
|
+
this._executionCounter.value = checkpoint.executionCount;
|
|
600
653
|
}
|
|
601
|
-
if (
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
? this.findNodeInGraph(checkpoint.continuationStageId, checkpoint.subflowPath)
|
|
606
|
-
: undefined;
|
|
607
|
-
if (!continuationNext) {
|
|
608
|
-
continuationNext = this.findNodeInGraph(checkpoint.continuationStageId, []);
|
|
654
|
+
if (checkpoint.visitCounts) {
|
|
655
|
+
this._visitCounts.clear();
|
|
656
|
+
for (const [stageId, count] of Object.entries(checkpoint.visitCounts)) {
|
|
657
|
+
this._visitCounts.set(stageId, count);
|
|
609
658
|
}
|
|
610
659
|
}
|
|
611
|
-
//
|
|
612
|
-
//
|
|
613
|
-
|
|
614
|
-
const innerResumeChain = {
|
|
615
|
-
name: pausedNode.name,
|
|
616
|
-
id: pausedNode.id,
|
|
617
|
-
description: pausedNode.description,
|
|
618
|
-
fn: resumeStageFn,
|
|
619
|
-
next: continuationNext,
|
|
620
|
-
// A declared `retry` policy follows the stage only on the INTERRUPT
|
|
621
|
-
// re-entry, because that path re-runs the stage's OWN function — the
|
|
622
|
-
// exact function the policy was declared for. The `addPausableFunction`
|
|
623
|
-
// re-entry runs a different function (`resumeFn`) under a different
|
|
624
|
-
// contract, so it deliberately runs without the policy.
|
|
625
|
-
...(isInterruptResume && pausedNode.retry && { retry: pausedNode.retry }),
|
|
626
|
-
// Declared tags (9.21.0) follow the stage on BOTH re-entries: a tag is
|
|
627
|
-
// the stage's NAME, not a policy over its function, and the resumed
|
|
628
|
-
// execution is that stage running again — its bundle must carry it,
|
|
629
|
-
// or a chained axis would show the paused leg tagged and the resumed
|
|
630
|
-
// leg silently not. The chart's node has the tags; this synthetic
|
|
631
|
-
// root is the one place they would otherwise be lost.
|
|
632
|
-
...(pausedNode.tags && { tags: pausedNode.tags }),
|
|
633
|
-
};
|
|
660
|
+
// (Wiped only now: every refusal above leaves the executor's existing
|
|
661
|
+
// checkpoint untouched.)
|
|
662
|
+
this.lastCheckpoint = undefined;
|
|
634
663
|
// Don't clear recorders — resume continues from previous state.
|
|
635
664
|
// Narrative, metrics, debug entries accumulate across pause/resume.
|
|
636
665
|
//
|
|
@@ -641,7 +670,7 @@ export class FlowChartExecutor {
|
|
|
641
670
|
// • Cross-executor (fresh executor reconstructed from a stored
|
|
642
671
|
// checkpoint): seed a NEW runtime from `checkpoint.sharedState`
|
|
643
672
|
// so resume handlers can read pre-pause scope. The execution
|
|
644
|
-
// tree starts at the resume
|
|
673
|
+
// tree starts at the resume entry — we don't have the previous
|
|
645
674
|
// traversal's tree on a fresh process anyway.
|
|
646
675
|
const sameExecutor = this._hasRunBefore;
|
|
647
676
|
const existingRuntime = sameExecutor
|
|
@@ -653,69 +682,35 @@ export class FlowChartExecutor {
|
|
|
653
682
|
// needs cross-run audit (we don't store it on the checkpoint today;
|
|
654
683
|
// future enhancement). See `runId.ts`.
|
|
655
684
|
this._currentRunId = generateRunId();
|
|
656
|
-
//
|
|
657
|
-
//
|
|
658
|
-
//
|
|
659
|
-
//
|
|
660
|
-
//
|
|
661
|
-
//
|
|
662
|
-
// SUBFLOW-NESTED PAUSE (subflowPath non-empty):
|
|
663
|
-
// The pause was INSIDE a subflow's body. To run the subflow's
|
|
664
|
-
// outputMapper and the parent's continuation, we have to enter
|
|
665
|
-
// through the OUTER MOUNT (the parent's node that mounts the
|
|
666
|
-
// leaf subflow). We swap the leaf subflow's root with
|
|
667
|
-
// innerResumeChain so SubflowExecutor:
|
|
668
|
-
// 1. enters the subflow boundary,
|
|
669
|
-
// 2. seeds the nested runtime from subflowStates[leaf]
|
|
670
|
-
// (skipping the inputMapper — see SubflowExecutor.ts),
|
|
671
|
-
// 3. runs the resumeFn → continuation chain,
|
|
672
|
-
// 4. runs the outputMapper at exit,
|
|
673
|
-
// 5. parent traversal continues normally.
|
|
674
|
-
//
|
|
675
|
-
// Cross-executor: initialContext = checkpoint.sharedState (the
|
|
676
|
-
// parent's view at pause time — outputMapper writes back into it).
|
|
677
|
-
// Same-executor: existingRuntime is reused; initialContext is moot
|
|
678
|
-
// for the subflow frame (already in the runtime stack), but we
|
|
679
|
-
// still pass sharedState for consistency.
|
|
680
|
-
const fc = this.flowChartArgs.flowChart;
|
|
681
|
-
let resumeRoot = innerResumeChain;
|
|
682
|
-
let subflowsOverride;
|
|
683
|
-
if (leafSubflowId !== undefined) {
|
|
684
|
-
// Find the OUTER mount node for the FIRST entry on the path.
|
|
685
|
-
// For single-level pauses, this is the only mount we need to
|
|
686
|
-
// enter through. For nested mounts the pattern would extend, but
|
|
687
|
-
// single-level covers all current use cases (Sequence(Agent),
|
|
688
|
-
// Conditional(Agent), Parallel branches with paused agents).
|
|
689
|
-
const outerSubflowId = checkpoint.subflowPath[0];
|
|
690
|
-
const outerMount = this.findMountInGraph(fc.root, outerSubflowId);
|
|
691
|
-
if (outerMount) {
|
|
692
|
-
resumeRoot = outerMount;
|
|
693
|
-
}
|
|
694
|
-
// Replace the leaf subflow's root with the resume chain so the
|
|
695
|
-
// body runs from the pause point forward.
|
|
696
|
-
subflowsOverride = { ...(fc.subflows ?? {}) };
|
|
697
|
-
subflowsOverride[leafSubflowId] = { root: innerResumeChain };
|
|
698
|
-
}
|
|
699
|
-
// Clone-in for the same reason as `sfStates` above: `initialContext`
|
|
700
|
-
// seeds the fresh SharedMemory via `mergeContextWins`, which copies only
|
|
701
|
-
// the TOP level — nested objects would alias the caller's checkpoint.
|
|
685
|
+
// Initial context: `checkpoint.sharedState` — the top level's view at the
|
|
686
|
+
// pause (a subflow's outputMapper writes back into it). Same-executor, the
|
|
687
|
+
// existing runtime is reused and this is moot, but passed for consistency.
|
|
688
|
+
// Clone-in for the same reason as the captures: `initialContext` seeds
|
|
689
|
+
// the fresh SharedMemory via `mergeContextWins`, which copies only the TOP
|
|
690
|
+
// level — nested objects would alias the caller's checkpoint.
|
|
702
691
|
const resumeInitialContext = structuredClone(checkpoint.sharedState);
|
|
703
692
|
this.traverser = this.createTraverser(options?.signal, undefined, options?.env, options?.maxDepth, options?.maxIterations, {
|
|
704
|
-
root: resumeRoot,
|
|
705
693
|
initialContext: resumeInitialContext,
|
|
706
694
|
preserveRecorders: true,
|
|
707
695
|
...(existingRuntime ? { existingRuntime } : {}),
|
|
708
|
-
|
|
709
|
-
// Always present on a checkpoint — empty `{}` for root pauses.
|
|
710
|
-
subflowStatesForResume: sfStates,
|
|
711
|
-
...(subflowsOverride && { subflowsOverride }),
|
|
696
|
+
resume: resumeEntry,
|
|
712
697
|
});
|
|
713
698
|
// Fire onResume event on all recorders (flow + scope). Stamp the
|
|
714
699
|
// synthetic TraversalContext for the resumed stage with the NEW
|
|
715
700
|
// runId so consumers detect "this is a fresh logical run" via
|
|
716
701
|
// the same runId-change pattern they use for `onRunStart`.
|
|
702
|
+
//
|
|
703
|
+
// The runtimeStageId is the STAND-IN's own: it runs after one mount per
|
|
704
|
+
// subflow on the path (each entered at its mount), so its execution index
|
|
705
|
+
// is the counter plus the path's length — the event and the stand-in's
|
|
706
|
+
// commit name the same execution. (Fired before the traversal on purpose:
|
|
707
|
+
// `onResume` precedes `onRunStart`, which recorders rely on to adopt the
|
|
708
|
+
// new runId without resetting.) The one shape where the index cannot be
|
|
709
|
+
// known up front — a degraded checkpoint missing an OUTER subflow's
|
|
710
|
+
// capture, whose opening stages then re-run — names the planned position.
|
|
717
711
|
const hasInput = resumeInput !== undefined;
|
|
718
|
-
const
|
|
712
|
+
const stepsBeforeStandIn = resumeEntry.stepsBeforeStandIn ?? checkpoint.subflowPath.length;
|
|
713
|
+
const resumeRuntimeStageId = buildRuntimeStageId(pausedNode.id, this._executionCounter.value + stepsBeforeStandIn);
|
|
719
714
|
const flowResumeEvent = {
|
|
720
715
|
stageName: pausedNode.name,
|
|
721
716
|
stageId: pausedNode.id,
|
|
@@ -736,7 +731,7 @@ export class FlowChartExecutor {
|
|
|
736
731
|
const scopeResumeEvent = {
|
|
737
732
|
stageName: pausedNode.name,
|
|
738
733
|
stageId: pausedNode.id,
|
|
739
|
-
runtimeStageId:
|
|
734
|
+
runtimeStageId: resumeRuntimeStageId,
|
|
740
735
|
hasInput,
|
|
741
736
|
pipelineId: '',
|
|
742
737
|
timestamp: Date.now(),
|
|
@@ -855,6 +850,10 @@ export class FlowChartExecutor {
|
|
|
855
850
|
// Invoker context — collected during traversal bubble-up (not tree-walked)
|
|
856
851
|
...(signal.invokerStageId && { invokerStageId: signal.invokerStageId }),
|
|
857
852
|
...(signal.continuationStageId && { continuationStageId: signal.continuationStageId }),
|
|
853
|
+
// Parallel siblings' pauses from the same fan-out, waiting their turn
|
|
854
|
+
// (9.28.0). Absent when only one child paused — the shape every
|
|
855
|
+
// earlier checkpoint has.
|
|
856
|
+
...(signal.pendingPauses.length > 0 && { pendingPauses: signal.pendingPauses }),
|
|
858
857
|
// HOW the pause was raised. One checkpoint shape, one extra optional
|
|
859
858
|
// field — an interrupt() pause is not a second kind of checkpoint, it is
|
|
860
859
|
// the same checkpoint that resume() re-enters differently (stage top vs
|
|
@@ -900,33 +899,6 @@ export class FlowChartExecutor {
|
|
|
900
899
|
return undefined;
|
|
901
900
|
return this.dfsFind(subflowRoot, stageId);
|
|
902
901
|
}
|
|
903
|
-
/**
|
|
904
|
-
* Find the mount node (the node that mounts a subflow boundary)
|
|
905
|
-
* for a given subflowId, by DFS from `start`. Used by `resume()` to
|
|
906
|
-
* locate the OUTER node we have to enter through so the subflow's
|
|
907
|
-
* outputMapper and parent continuation execute.
|
|
908
|
-
*
|
|
909
|
-
* Cycle-safe via visited set. Returns the first match (DFS order).
|
|
910
|
-
*/
|
|
911
|
-
findMountInGraph(start, subflowId, visited = new Set()) {
|
|
912
|
-
if (start.isLoopRef)
|
|
913
|
-
return undefined;
|
|
914
|
-
if (visited.has(start.id))
|
|
915
|
-
return undefined;
|
|
916
|
-
visited.add(start.id);
|
|
917
|
-
if (start.subflowId === subflowId)
|
|
918
|
-
return start;
|
|
919
|
-
if (start.children) {
|
|
920
|
-
for (const child of start.children) {
|
|
921
|
-
const found = this.findMountInGraph(child, subflowId, visited);
|
|
922
|
-
if (found)
|
|
923
|
-
return found;
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
if (start.next)
|
|
927
|
-
return this.findMountInGraph(start.next, subflowId, visited);
|
|
928
|
-
return undefined;
|
|
929
|
-
}
|
|
930
902
|
/** DFS search for a node by ID in the StageNode graph. Cycle-safe via visited set. */
|
|
931
903
|
dfsFind(node, targetId, visited = new Set()) {
|
|
932
904
|
// Skip loop back-edge references (they share the target's ID but have no fn/resumeFn)
|
|
@@ -1501,4 +1473,4 @@ export class FlowChartExecutor {
|
|
|
1501
1473
|
return recorder?.getSpec(subflowId);
|
|
1502
1474
|
}
|
|
1503
1475
|
}
|
|
1504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUsZUFBZSxJQUFJLGdCQUFnQixFQUFFLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFbEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFN0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQVdMLGFBQWEsR0FDZCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVF2RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFckgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENB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U0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLG9CQUFvQixDQUVwRSxDQUFDO1FBQ2QsT0FBTyxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsU0FBaUI7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxvQkFBb0IsQ0FFcEUsQ0FBQztRQUNkLE9BQU8sUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEV4ZWN1dG9yIOKAlCBQdWJsaWMgQVBJIGZvciBleGVjdXRpbmcgYSBjb21waWxlZCBGbG93Q2hhcnQuXG4gKlxuICogV3JhcHMgRmxvd2NoYXJ0VHJhdmVyc2VyLiBCdWlsZCBhIGNoYXJ0IHdpdGggZmxvd0NoYXJ0KCkgYW5kIHBhc3MgdGhlIHJlc3VsdCBoZXJlOlxuICpcbiAqICAgY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQoJ2VudHJ5JywgZW50cnlGbikuYWRkRnVuY3Rpb24oJ3Byb2Nlc3MnLCBwcm9jZXNzRm4pLmJ1aWxkKCk7XG4gKlxuICogICAvLyBOby1vcHRpb25zIGZvcm0gKHVzZXMgYXV0by1kZXRlY3RlZCBUeXBlZFNjb3BlIGZhY3RvcnkgZnJvbSB0aGUgY2hhcnQpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gKlxuICogICAvLyBPcHRpb25zLW9iamVjdCBmb3JtIChwcmVmZXJyZWQgd2hlbiB5b3UgbmVlZCB0byBjdXN0b21pemUgYmVoYXZpb3IpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSB9KTtcbiAqXG4gKiAgIC8vIDItcGFyYW0gZm9ybSAoYWNjZXB0cyBhIFNjb3BlRmFjdG9yeSBkaXJlY3RseSwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgbXlGYWN0b3J5KTtcbiAqXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0OiBkYXRhLCBlbnY6IHsgdHJhY2VJZDogJ3JlcS0xMjMnIH0gfSk7XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGRldGFjaEFuZEZvcmdldCBhcyBfZGV0YWNoQW5kRm9yZ2V0LCBkZXRhY2hBbmRKb2luTGF0ZXIgYXMgX2RldGFjaEFuZEpvaW5MYXRlciB9IGZyb20gJy4uL2RldGFjaC9zcGF3bi5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRTdWJmbG93UmVzdWx0cyB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3JSZXN1bHQsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZUZ1bmN0aW9uLFxuICB0eXBlIFN0YWdlTm9kZSxcbiAgdHlwZSBTdHJlYW1IYW5kbGVycyxcbiAgdHlwZSBTdWJmbG93UmVzdWx0LFxuICB0eXBlIFRyYXZlcnNhbFJlc3VsdCxcbiAgZGVmYXVsdExvZ2dlcixcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWl0VmFsdWVzTW9kZSxcbiAgUmVhZFRyYWNraW5nTW9kZSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgV3JpdGVQcm92ZW5hbmNlTW9kZSxcbiAgV3JpdGVUcmFja2luZ01vZGUsXG59IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm92aWRlSW50ZXJydXB0QW5zd2VyIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCwgUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLCBoYXNGbG93UmVjb3JkZXJNZXRob2RzLCBoYXNSZWNvcmRlck1ldGhvZHMgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTY29wZUZhY2FkZSB9IGZyb20gJy4uL3Njb3BlL1Njb3BlRmFjYWRlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZUNoZWNrcG9pbnRDbG9uZUZhaWx1cmUsIHNhbml0aXplRGlhZ25vc3RpY0JhZ3MgfSBmcm9tICcuL2NoZWNrcG9pbnRTYW5pdGl6ZS5qcyc7XG5pbXBvcnQgeyB0eXBlIEF0dGFjaFJlY29yZGVyT3B0aW9ucywgdHlwZSBPYnNlcnZlckRyYWluUmVzdWx0LCBEZWZlcnJlZE9ic2VydmVyVGllciB9IGZyb20gJy4vRGVmZXJyZWRPYnNlcnZlclRpZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRlclNuYXBzaG90LCB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUlucHV0IH0gZnJvbSAnLi92YWxpZGF0ZUlucHV0LmpzJztcblxuLyoqIERlZmF1bHQgc2NvcGUgZmFjdG9yeSDigJQgY3JlYXRlcyBhIHBsYWluIFNjb3BlRmFjYWRlIGZvciBlYWNoIHN0YWdlLiAqL1xuY29uc3QgZGVmYXVsdFNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5ID0gKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KSA9PlxuICBuZXcgU2NvcGVGYWNhZGUoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpO1xuXG4vKipcbiAqIE9wdGlvbnMgb2JqZWN0IGZvciBgRmxvd0NoYXJ0RXhlY3V0b3JgIOKAlCBwcmVmZXJyZWQgb3ZlciBwb3NpdGlvbmFsIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleCA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwge1xuICogICBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSxcbiAqICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHsgLi4uIH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gIC8vIOKUgOKUgCBDb250ZXh0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIHByZS1wb3B1bGF0ZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgYmVmb3JlICoqZWFjaCoqIHN0YWdlXG4gICAqIChyZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLCBhY3RpbmcgYXMgYmFzZWxpbmUgZGVmYXVsdHMpLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAvKipcbiAgICogSW5pdGlhbCBjb250ZXh0IHZhbHVlcyBtZXJnZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgKipvbmNlKiogYXQgc3RhcnR1cFxuICAgKiAoYXBwbGllZCBiZWZvcmUgdGhlIGZpcnN0IHN0YWdlLCBub3QgcmVwZWF0ZWQgb24gc3Vic2VxdWVudCBzdGFnZXMpLlxuICAgKiBEaXN0aW5jdCBmcm9tIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UuXG4gICAqL1xuICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gIC8qKiBSZWFkLW9ubHkgaW5wdXQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAg4oCUIG5ldmVyIHRyYWNrZWQgb3Igd3JpdHRlbi4gKi9cbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcblxuICAvLyDilIDilIAgT2JzZXJ2YWJpbGl0eSBjb3N0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCkuIERlZmF1bHQgYCdmdWxsJ2Ag4oCUIGV2ZXJ5XG4gICAqIHRyYWNrZWQgcmVhZCBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG8gdGhlIHN0YWdlJ3MgcmVhZCB2aWV3XG4gICAqICh0aGUgaGlzdG9yaWNhbCBiZWhhdmlvcjsgd2hhdCBsZW5zL2FnZW50Zm9vdHByaW50IHNuYXBzaG90cyBzaG93KS5cbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIHR5cGUvc2l6ZS9wcmV2aWV3IG1hcmtlciBwZXIgcmVhZDsgYCdvZmYnYFxuICAgKiByZWNvcmRzIG5vdGhpbmcg4oCUIHplcm8gcGVyLXJlYWQgY2xvbmUgY29zdCAocmVhZHMgb2YgbGFyZ2UgdmFsdWVzIGJlY29tZVxuICAgKiB+ZnJlZSkuIE5hcnJhdGl2ZSBhbmQgYFNjb3BlUmVjb3JkZXIub25SZWFkYCBhcmUgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIENhdmVhdDogdW5kZXIgYCdvZmYnYCBhIHN0YWdlJ3Mgc25hcHNob3QgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAgICogdGhhdCByZWFkIG5vdGhpbmcg4oCUIGF1ZGl0aW5nIGNvbnN1bWVycyB0aGF0IG5lZWQgXCJkaWQgaXQgcmVhZD9cIiB3aXRob3V0XG4gICAqIHRoZSB2YWx1ZSBjb3N0IHNob3VsZCBwcmVmZXIgYCdzdW1tYXJ5J2AuXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHJlYWRUcmFja2luZz86IFJlYWRUcmFja2luZ01vZGU7XG5cbiAgLyoqXG4gICAqIFBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGUgc2libGluZyBvZlxuICAgKiB7QGxpbmsgcmVhZFRyYWNraW5nfTsgdGhlIHR3byBkaWFscyBhcmUgaW5kZXBlbmRlbnQuIERlZmF1bHQgYCdmdWxsJ2Ag4oCUXG4gICAqIGV2ZXJ5IHRyYWNrZWQgd3JpdGUgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvIHRoZSBzdGFnZSdzIHdyaXRlXG4gICAqIHZpZXcgKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yKS4gYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwXG4gICAqIGBXcml0ZVN1bW1hcnlNYXJrZXJgICh0eXBlL3NpemUvcHJldmlldykgcGVyIHdyaXRlOyBgJ29mZidgIHJlY29yZHNcbiAgICogbm90aGluZyDigJQgYHN0YWdlV3JpdGVzYCBpcyBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqXG4gICAqIE9ic2VydmFibGUgY29uc2VxdWVuY2VzIOKAlCB3aGF0IHRoZSBwb2xpY3kgRE9FUyBnb3Zlcm46XG4gICAqIC0gYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgIChtYXJrZXJzIHVuZGVyIGAnc3VtbWFyeSdgLCBhYnNlbnQgdW5kZXJcbiAgICogICBgJ29mZidgKS5cbiAgICogLSBUaGUgY29tbWl0IG9ic2VydmVyIHBheWxvYWQ6IGBTY29wZVJlY29yZGVyLm9uQ29tbWl0KG11dGF0aW9ucylgXG4gICAqICAgcmVjZWl2ZXMgdGhlIHJldGFpbmVkIGBfc3RhZ2VXcml0ZXNgIGVudHJpZXMsIHNvIGl0IGNhcnJpZXMgdGhlIHNhbWVcbiAgICogICBtYXJrZXJzIHVuZGVyIGAnc3VtbWFyeSdgIGFuZCBhbiBlbXB0eSBtdXRhdGlvbnMgYmFnIHVuZGVyIGAnb2ZmJ2Ag4oCUXG4gICAqICAgZGVmZXJyZWQvb2JzZXJ2ZXIgY29uc3VtZXJzIHNlZSBleGFjdGx5IHdoYXQgcmV0ZW50aW9uIHN0b3JlZC5cbiAgICpcbiAgICogV2hhdCBpdCBkb2VzIE5PVCBnb3Zlcm46XG4gICAqIC0gVGhlIHdyaXRlcyB0aGVtc2VsdmVzOiBzaGFyZWQgc3RhdGUsIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIsIGFuZCB0aGVcbiAgICogICBDT01NSVQgTE9HIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZSAoY29tbWl0TG9nIHZhbHVlcyBrZWVwIHRoZWlyXG4gICAqICAgZnVsbCBwYXlsb2FkcyDigJQgdGhlIGxvc3NsZXNzIGxpbmVhci1jb3N0IGZpeCBmb3IgdGhvc2UgaXMgdGhlXG4gICAqICAge0BsaW5rIGNvbW1pdFZhbHVlc30gZGlhbCwgIzEzYy1CKS5cbiAgICogLSBQZXItb3AgYFNjb3BlUmVjb3JkZXIub25Xcml0ZWAgZXZlbnRzIOKAlCB0aGV5IGZpcmUgd2l0aCBsaXZlIHZhbHVlc1xuICAgKiAgIHJlZ2FyZGxlc3MgKGRlbGl2ZXJ5IHRpZXIsIFJGQy0wMDEncyBjb25jZXJuKSwgc28gbmFycmF0aXZlIG91dHB1dCBpc1xuICAgKiAgIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLlxuICAgKiAtIFJlZGFjdGlvbjogYSBwb2xpY3kvcGVyLWNhbGwtcmVkYWN0ZWQgd3JpdGUgc3RvcmVzIGAnW1JFREFDVEVEXSdgXG4gICAqICAgdW5kZXIgYCdmdWxsJ2AgQU5EIGAnc3VtbWFyeSdgIChyZWRhY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZVxuICAgKiAgIGRpYWw7IGEgbWFya2VyIHdvdWxkIGxlYWsgc2l6ZS9wcmV2aWV3KSwgYW5kIG5vdGhpbmcgdW5kZXIgYCdvZmYnYC5cbiAgICpcbiAgICogQ2F2ZWF0OiB1bmRlciBgJ29mZidgIGEgc3RhZ2UncyBTTkFQU0hPVCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZVxuICAgKiB0aGF0IHdyb3RlIG5vdGhpbmcg4oCUIGJ1dCB1bmxpa2UgYHJlYWRUcmFja2luZzogJ29mZidgLCB0aGUgY29tbWl0IGxvZ1xuICAgKiBzdGlsbCByZWNvcmRzIGV2ZXJ5IG5ldCBjaGFuZ2UsIHNvIFwiZGlkIGl0IHdyaXRlP1wiIHN0YXlzIGFuc3dlcmFibGUuXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0V3JpdGVUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gICAqL1xuICB3cml0ZVRyYWNraW5nPzogV3JpdGVUcmFja2luZ01vZGU7XG5cbiAgLyoqXG4gICAqIEVuY29kaW5nIHBvbGljeSBmb3IgQ09NTUlUIExPRyB2YWx1ZXMgKCMxM2MtQikg4oCUIHRoZSB0aGlyZCBkaWFsIG9mIHRoZVxuICAgKiBmYW1pbHksIGFuZCB1bmxpa2UgaXRzIHNpYmxpbmdzIGl0IGlzICoqbG9zc2xlc3MgaW4gYm90aCBtb2RlcyoqIChpdFxuICAgKiBjaGFuZ2VzIHRoZSBsb2cncyBlbmNvZGluZywgbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS5cbiAgICpcbiAgICogLSBgJ2Z1bGwnYCAoZGVmYXVsdCkg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBwYXRoIHN0b3JlcyB0aGUgZnVsbCBmaW5hbFxuICAgKiAgIHZhbHVlOyBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBiZWhhdmlvci5cbiAgICogLSBgJ2RlbHRhJ2Ag4oCUIGFycmF5IG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhblxuICAgKiAgIGBhcHBlbmRgIHRyYWNlIHZlcmIgc3RvcmluZyBPTkxZIHRoZSB0YWlsICh0aGUgZ3Jvd2luZy1oaXN0b3J5IGNvbW1pdFxuICAgKiAgIGxvZyBiZWNvbWVzIGxpbmVhciBpbnN0ZWFkIG9mIE8oTsKyKSByZXRhaW5lZCk7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzXG4gICAqICAgYXMgYSByZWFsIGBkZWxldGVgIHZlcmIgKHJlcGxheSByZW1vdmVzIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nXG4gICAqICAgYGtleTogdW5kZWZpbmVkYCk7IGJ1bmRsZXMgY2FycnkgZXhhY3RseSBPTkUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZ1xuICAgKiAgIHBhdGguIFJlcGxheSAoYGFwcGx5U21hcnRNZXJnZWAg4oCUIGxpdmUgc3RhdGUsIGBtYXRlcmlhbGlzZSgpYCwgdGhlXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yKSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzIGZ1bGwgc3RhdGUgZXhhY3RseS5cbiAgICpcbiAgICogQ29uc3VtZXJzIHRoYXQgcmVhZCBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyBcInRoZSBmdWxsIHZhbHVlIHdyaXR0ZW5cIlxuICAgKiBtdXN0IHN3aXRjaCB0byBgY29tbWl0VmFsdWVBdChjb21taXRMb2csIGlkeCwga2V5KWAgZnJvbVxuICAgKiBgZm9vdHByaW50anMvdHJhY2VgIOKAlCB1bmRlciBgJ2RlbHRhJ2AgdGhhdCB2YWx1ZSBpcyB2ZXJiLXF1YWxpZmllZCAoYW5cbiAgICogYGFwcGVuZGAgYnVuZGxlIGhvbGRzIG9ubHkgdGhlIHRhaWwpLiBQYXRoLXRpZXIgY29uc3VtZXJzXG4gICAqIChgZmluZExhc3RXcml0ZXJgLCBgY2F1c2FsQ2hhaW5gLCBuYXJyYXRpdmUsIGxlbnMgaGlnaGxpZ2h0cykgYXJlXG4gICAqIHVuYWZmZWN0ZWQuIFRoZSBhY3RpdmUgbW9kZSBpcyBzdXJmYWNlZCBhc1xuICAgKiBgZ2V0U25hcHNob3QoKS5jb21taXRWYWx1ZXNgLlxuICAgKlxuICAgKiBIb25lc3QgY29zdCBub3RlOiBhcHBlbmQgZGV0ZWN0aW9uIGlzIG5ldyB3YWxsIHdvcmsg4oCUIGFuIE8ofGJhc2UgYXJyYXl8KVxuICAgKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0LiBPbiBhIGhpdCB0aGVcbiAgICogY29tbWl0IGdldHMgY2hlYXBlciBpbiBib3RoIHdhbGwgYW5kIGhlYXA7IG9uIGEgbWlzcyAocHJlZml4IGRpdmVyZ2VzKVxuICAgKiBpdCBwYXlzIGNvbXBhcmUgKyBmdWxsIGNsb25lLiBgJ2Z1bGwnYCBwYXlzIHplcm8uXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIGNvbW1pdFZhbHVlcz86IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkIHByb3ZlbmFuY2UgKCNQMSkg4oCUIHRoZSBmb3VydGggZGlhbCBvZiB0aGUgZmFtaWx5LiBEZWZhdWx0XG4gICAqIGAnb2ZmJ2A6IHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuIGAncmVhZHMtcHJlZml4J2A6IGV2ZXJ5XG4gICAqIGNvbW1pdHRlZCBgVHJhY2VFbnRyeWAgY2FycmllcyBgcmVhZEtleXNgIOKAlCB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFXG4gICAqIHRoYXQgd3JpdGUg4oCUIGVuYWJsaW5nIHBlci13cml0ZSBjYXVzYWwgYXR0cmlidXRpb24gKGBjYXVzYWxDaGFpbmAnc1xuICAgKiBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHZhcmlhYmxlIHNsaWNlcykuIENvc3Q6IG9uZSBzbWFsbFxuICAgKiBhcnJheSBjb3B5IHBlciB3cml0ZS4gU25hcHNob3QgZGlzY3JpbWluYW50OlxuICAgKiBgZ2V0U25hcHNob3QoKS53cml0ZVByb3ZlbmFuY2VgLlxuICAgKi9cbiAgd3JpdGVQcm92ZW5hbmNlPzogV3JpdGVQcm92ZW5hbmNlTW9kZTtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAvKiogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIChieSBzdGFnZUlkKSBkcml2aW5nIFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbi5cbiAgICogIFR3aW4gb2YgX2V4ZWN1dGlvbkNvdW50ZXI6IHN1cnZpdmVzIHBhdXNlL3Jlc3VtZSwgcmVzZXQgb24gZnJlc2ggcnVuKCkuICovXG4gIHByaXZhdGUgX3Zpc2l0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgLyoqIFBlci1gcnVuKClgIGlkZW50aWZpZXIg4oCUIGdlbmVyYXRlZCBmcmVzaCBwZXIgcnVuICsgcGVyIHJlc3VtZS4gVGhyZWFkZWRcbiAgICogIHRocm91Z2ggZXZlcnkgVHJhdmVyc2FsQ29udGV4dCBzbyByZWNvcmRlcnMgY2FuIHNjb3BlIHN0YXRlIHRvIGEgc2luZ2xlXG4gICAqICBydW4uIFNlZSBgcnVuSWQudHNgLiAqL1xuICBwcml2YXRlIF9jdXJyZW50UnVuSWQgPSAnJztcbiAgcHJpdmF0ZSBuYXJyYXRpdmVFbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbmFycmF0aXZlT3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zO1xuICBwcml2YXRlIGNvbWJpbmVkUmVjb3JkZXI6IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmxvd1JlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzY29wZVJlY29yZGVyczogU2NvcGVSZWNvcmRlcltdID0gW107XG4gIC8qKlxuICAgKiBSRkMtMDAxIGRlZmVycmVkLW9ic2VydmVyIHdpcmluZyDigJQgY3JlYXRlZCBMQVpJTFkgb24gdGhlIGZpcnN0XG4gICAqIGBkZWxpdmVyeTogJ2RlZmVycmVkJ2AgYXR0YWNoLiBgdW5kZWZpbmVkYCBmb3IgZXZlcnkgZXhlY3V0b3IgdGhhdCBuZXZlclxuICAgKiBvcHRzIGluOiB6ZXJvIGFsbG9jYXRpb24sIHplcm8gcGVyLWV2ZW50IGNvc3QsIGJ5dGUtaWRlbnRpY2FsIGJlaGF2aW9yXG4gICAqICh0aGUgZW1pdCBmYXN0LXBhdGggcHJlY2VkZW50KS5cbiAgICovXG4gIHByaXZhdGUgZGVmZXJyZWRUaWVyPzogRGVmZXJyZWRPYnNlcnZlclRpZXI7XG4gIHByaXZhdGUgcmVkYWN0aW9uUG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgT05FIHJlZGFjdGlvbiBydWxlIChgbWVtb3J5L3JlZGFjdGlvbi50c2ApOiBidWlsdCBmcmVzaCBwZXJcbiAgICogYGNyZWF0ZVRyYXZlcnNlcmAgKHBlci1jYWxsIG1hcmtzIHJlc2V0IHBlciBydW4gYW5kIHBlciByZXN1bWUsIGFzIHRoZVxuICAgKiBzaGFyZWQgc2V0IGFsd2F5cyBkaWQpLCBpbnN0YWxsZWQgb24gdGhlIHJ1bnRpbWUgcm9vdCBzbyBldmVyeSBjb250ZXh0XG4gICAqIHJldGFpbnMgdW5kZXIgaXQsIGFuZCByZWFkIGJ5IGV2ZXJ5IGBTY29wZUZhY2FkZWAgdGhyb3VnaCBpdHMgY29udGV4dC5cbiAgICovXG4gIHByaXZhdGUgcmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gIHByaXZhdGUgbGFzdENoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBgdHJ1ZWAgb25jZSBgcnVuKClgIChvciBhIHByZXZpb3VzIGByZXN1bWUoKWApIGhhcyBleGVjdXRlZCBvblxuICAgKiB0aGlzIGluc3RhbmNlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKlxuICAgKiAgIOKAoiB0cnVlICDihpIgcmV1c2UgdGhlIGNvbnN0cnVjdG9yLXRpbWUgcnVudGltZSAoc2FtZS1leGVjdXRvclxuICAgKiAgICAgICAgICAgICBjb250aW51aXR5OiBleGVjdXRpb24gdHJlZSwgcmVjb3JkZXJzLCBuYXJyYXRpdmVcbiAgICogICAgICAgICAgICAgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcylcbiAgICogICDigKIgZmFsc2Ug4oaSIHNlZWQgYSBmcmVzaCBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAqICAgICAgICAgICAgIChjcm9zcy1leGVjdXRvciAvIGNyb3NzLXByb2Nlc3MgcmVzdW1lOiBuZXcgaW5zdGFuY2VcbiAgICogICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc2VyaWFsaXplZCBjaGVja3BvaW50KVxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgZmxhZywgZnJlc2ggZXhlY3V0b3JzIHNpbGVudGx5IGRpc2NhcmRlZCB0aGVcbiAgICogY2hlY2twb2ludCdzIHNoYXJlZFN0YXRlIGFuZCByZXN1bWUgaGFuZGxlcnMgY291bGRuJ3QgcmVhZCBwcmUtcGF1c2VcbiAgICogc2NvcGUuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZS1lbnRyYW5jeSBndWFyZC4gYHJ1bigpYCBhbmQgYHJlc3VtZSgpYCBtdXRhdGUgcGVyLXJ1biBpbnN0YW5jZSBzdGF0ZVxuICAgKiAodHJhdmVyc2VyLCBydW5JZCwgZXhlY3V0aW9uIGNvdW50ZXIsIGNoZWNrcG9pbnQpIGFuZCBjbGVhciBhdHRhY2hlZFxuICAgKiByZWNvcmRlcnMg4oCUIGEgc2Vjb25kIGNvbmN1cnJlbnQgZW50cnkgb24gdGhlIFNBTUUgZXhlY3V0b3Igd291bGRcbiAgICogaW50ZXJsZWF2ZSBydW5JZHMgYW5kIGNyb3NzLWNvbnRhbWluYXRlIHJlY29yZGVyL25hcnJhdGl2ZSBzdGF0ZSwgYW5kXG4gICAqIGBnZXRDaGVja3BvaW50KClgIHdvdWxkIHJldHVybiB3aGljaGV2ZXIgcnVuIHBhdXNlZCBsYXN0LiBPbmUgZXhlY3V0b3IgPVxuICAgKiBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbjsgY3JlYXRlIGFuIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi5cbiAgICogU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC5cbiAgICovXG4gIHByaXZhdGUgX2lzRXhlY3V0aW5nID0gZmFsc2U7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIHJlYWRUcmFja2luZz86IFJlYWRUcmFja2luZ01vZGU7XG4gICAgd3JpdGVUcmFja2luZz86IFdyaXRlVHJhY2tpbmdNb2RlO1xuICAgIGNvbW1pdFZhbHVlcz86IENvbW1pdFZhbHVlc01vZGU7XG4gICAgd3JpdGVQcm92ZW5hbmNlPzogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0IH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKjItcGFyYW0gZm9ybSoqIChhbHNvIHN1cHBvcnRlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZmxvd0NoYXJ0IC0gVGhlIGNvbXBpbGVkIEZsb3dDaGFydCByZXR1cm5lZCBieSBgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKWBcbiAgICogQHBhcmFtIGZhY3RvcnlPck9wdGlvbnMgLSBBIGBTY29wZUZhY3Rvcnk8VFNjb3BlPmAgT1IgYSBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT5gIG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBmYWN0b3J5T3JPcHRpb25zPzogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPixcbiAgKSB7XG4gICAgLy8gRGV0ZWN0IG9wdGlvbnMtb2JqZWN0IGZvcm0gdnMgZmFjdG9yeSBmb3JtXG4gICAgbGV0IHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCBpbml0aWFsQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgcmVhZE9ubHlDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiAoKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzY29wZVByb3RlY3Rpb25Nb2RlOiBTY29wZVByb3RlY3Rpb25Nb2RlIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWFkVHJhY2tpbmc6IFJlYWRUcmFja2luZ01vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHdyaXRlVHJhY2tpbmc6IFdyaXRlVHJhY2tpbmdNb2RlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeU9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gMi1wYXJhbSBmb3JtOiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICAgIHNjb3BlRmFjdG9yeSA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmYWN0b3J5T3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wdGlvbnMgb2JqZWN0IGZvcm1cbiAgICAgIGNvbnN0IG9wdHMgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgICAgc2NvcGVGYWN0b3J5ID0gb3B0cy5zY29wZUZhY3Rvcnk7XG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCA9IG9wdHMuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ7XG4gICAgICBpbml0aWFsQ29udGV4dCA9IG9wdHMuaW5pdGlhbENvbnRleHQ7XG4gICAgICByZWFkT25seUNvbnRleHQgPSBvcHRzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIgPSBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXI7XG4gICAgICBzdHJlYW1IYW5kbGVycyA9IG9wdHMuc3RyZWFtSGFuZGxlcnM7XG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlID0gb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgICAgcmVhZFRyYWNraW5nID0gb3B0cy5yZWFkVHJhY2tpbmc7XG4gICAgICB3cml0ZVRyYWNraW5nID0gb3B0cy53cml0ZVRyYWNraW5nO1xuICAgICAgY29tbWl0VmFsdWVzID0gb3B0cy5jb21taXRWYWx1ZXM7XG4gICAgICB3cml0ZVByb3ZlbmFuY2UgPSBvcHRzLndyaXRlUHJvdmVuYW5jZTtcbiAgICB9XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzID0ge1xuICAgICAgZmxvd0NoYXJ0LFxuICAgICAgc2NvcGVGYWN0b3J5OiBzY29wZUZhY3RvcnkgPz8gZmxvd0NoYXJ0LnNjb3BlRmFjdG9yeSA/PyAoZGVmYXVsdFNjb3BlRmFjdG9yeSBhcyBTY29wZUZhY3Rvcnk8VFNjb3BlPiksXG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgIGluaXRpYWxDb250ZXh0LFxuICAgICAgcmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHJlYWRUcmFja2luZyxcbiAgICAgIHdyaXRlVHJhY2tpbmcsXG4gICAgICBjb21taXRWYWx1ZXMsXG4gICAgICB3cml0ZVByb3ZlbmFuY2UsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMuanMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICByb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGZyb20gYSBjaGVja3BvaW50IOKAlCBwYXNzZWQgdGhyb3VnaFxuICAgICAgICogIHRvIEhhbmRsZXJEZXBzIHNvIFN1YmZsb3dFeGVjdXRvciBjYW4gcmUtc2VlZCBuZXN0ZWQgcnVudGltZXNcbiAgICAgICAqICBvbiB0aGUgcmVzdW1lIHBhdGguIFVuZGVmaW5lZCBvbiBub3JtYWwgcnVuKCkgcGF0aHMuICovXG4gICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgLyoqIFJlc3VtZS1vbmx5IG92ZXJyaWRlIG9mIHRoZSBzdWJmbG93cyBkaWN0IOKAlCBzdWJzdGl0dXRlcyB0aGVcbiAgICAgICAqICBsZWFmIHN1YmZsb3cncyByb290IHdpdGggYSByZXN1bWUgY2hhaW4gc28gdGhlIHN1YmZsb3cgYm9keVxuICAgICAgICogIHBpY2tzIHVwIGF0IHRoZSBwYXVzZSBwb2ludC4gT3RoZXIgZW50cmllcyBwYXNzIHRocm91Z2hcbiAgICAgICAqICB1bmNoYW5nZWQuICovXG4gICAgICBzdWJmbG93c092ZXJyaWRlPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiBrZWVwIGV4aXN0aW5nIGNvbWJpbmVkUmVjb3JkZXIgc28gbmFycmF0aXZlIGFjY3VtdWxhdGVzXG4gICAgfSBlbHNlIGlmIChuYXJyYXRpdmVGbGFnKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSBuZXcgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcih0aGlzLm5hcnJhdGl2ZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUodGhpcy5yZWRhY3Rpb25Qb2xpY3kpO1xuXG4gICAgLy8gQnVpbGQgbW9kaWZpZXIgbGlzdCDigJQgZWFjaCBtb2RpZmllciByZWNlaXZlcyB0aGUgc2NvcGUgYWZ0ZXIgY3JlYXRpb25cbiAgICB0eXBlIFNjb3BlTW9kaWZpZXIgPSAoc2NvcGU6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdCBtb2RpZmllcnM6IFNjb3BlTW9kaWZpZXJbXSA9IFtdO1xuXG4gICAgLy8gMS4gTmFycmF0aXZlIHJlY29yZGVyIChpZiBlbmFibGVkKVxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5jb21iaW5lZFJlY29yZGVyO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZGVycykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMmIuIERlZmVycmVkLW9ic2VydmVyIHNjb3BlIHRhcCAoUkZDLTAwMSBCbG9jayA3KSDigJQgYSBzeW50aGV0aWNcbiAgICAvLyByZWNvcmRlciB3aG9zZSBob29rcyBDQVBUVVJFIGludG8gdGhlIGJvdW5kZWQgcXVldWUgaW5zdGVhZCBvZiBkb2luZ1xuICAgIC8vIG9ic2VydmVyIHdvcmsuIEl0IHJpZGVzIHRoZSBzYW1lIHBlci1zdGFnZSByZWNvcmRlciBsaXN0IGFzIGlubGluZVxuICAgIC8vIHJlY29yZGVycywgc28gaXQgcmVjZWl2ZXMgZXhhY3RseSB0aGUgcG9zdC1yZWRhY3Rpb24gZXZlbnRzIHRoZXkgZG8uXG4gICAgLy8gQWJzZW50ICh6ZXJvIHdvcmssIGlkZW50aWNhbCBsaXN0KSB3aGVuIG5vYm9keSBvcHRlZCBpbnRvIGRlZmVycmFsLlxuICAgIGNvbnN0IHNjb3BlVGFwID0gdGhpcy5kZWZlcnJlZFRpZXI/LmJ1aWxkU2NvcGVUYXAoKTtcbiAgICBpZiAoc2NvcGVUYXApIHtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIoc2NvcGVUYXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVkYWN0aW9uIHBvbGljeSAoY29uZGl0aW9uYWwg4oCUIG9ubHkgd2hlbiBwb2xpY3kgaXMgc2V0KS4gQVxuICAgIC8vIGBTY29wZUZhY2FkZWAgYWxyZWFkeSByZWFkcyB0aGUgcnVuJ3MgcnVsZSB0aHJvdWdoIGl0cyBjb250ZXh0ICh0aGVcbiAgICAvLyBydWxlIGlzIGluc3RhbGxlZCBvbiB0aGUgcnVudGltZSByb290IGJlbG93KTsgdGhpcyBjYWxsIGlzIHRoZSBsZWdhY3lcbiAgICAvLyBwcm90b2NvbCBmb3IgY3VzdG9tIHNjb3BlcyB0aGF0IGFyZSBub3QgZmFjYWRlcywgYW5kIG9uIGEgZmFjYWRlIGl0XG4gICAgLy8gcmUtc3RhdGVzIHRoZSBleGVjdXRvcidzIHBvbGljeSBvbiB0aGUgc2hhcmVkIHJ1bGUgKGEgbm8tb3ApLlxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5yZWRhY3Rpb25Qb2xpY3k7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZTogYmFzZSBmYWN0b3J5ICsgbW9kaWZpZXJzIGluIGEgc2luZ2xlIHBhc3MuXG4gICAgLy8gVGhlIG1hcmtlZC1rZXlzIHNldCBpcyBBTFdBWVMgd2lyZWQgdXAgKHVuY29uZGl0aW9uYWwg4oCUIGVuc3VyZXMgY3Jvc3Mtc3RhZ2VcbiAgICAvLyBwcm9wYWdhdGlvbiBldmVuIHdpdGhvdXQgYSBwb2xpY3ksIGJlY2F1c2Ugc3RhZ2VzIGNhbiBjYWxsIHNldFZhbHVlKGtleSwgdmFsLCB0cnVlKVxuICAgIC8vIGZvciBwZXItY2FsbCByZWRhY3Rpb24pLiBPcHRpb25hbCBtb2RpZmllcnMgKHJlY29yZGVycywgcG9saWN5KSBhcmUgaW4gdGhlIGxpc3QuXG4gICAgY29uc3QgYmFzZUZhY3RvcnkgPSBhcmdzLnNjb3BlRmFjdG9yeTtcbiAgICBjb25zdCBzaGFyZWRSZWRhY3RlZEtleXMgPSB0aGlzLnJlZGFjdGlvblJ1bGUubWFya2VkS2V5cygpO1xuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9ICgoY3R4OiBhbnksIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seT86IHVua25vd24sIGVudkFyZz86IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBiYXNlRmFjdG9yeShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudkFyZyk7XG4gICAgICAvLyBBbHdheXMgd2lyZSBzaGFyZWQgcmVkYWN0aW9uIHN0YXRlXG4gICAgICBpZiAodHlwZW9mIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkUmVkYWN0ZWRLZXlzKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIG1vZGlmaWVyc1xuICAgICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kaWZpZXJzKSBtb2Qoc2NvcGUpO1xuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH0pIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gICAgY29uc3QgZWZmZWN0aXZlUm9vdCA9IG92ZXJyaWRlcz8ucm9vdCA/PyBmYy5yb290O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0ID0gb3ZlcnJpZGVzPy5pbml0aWFsQ29udGV4dCA/PyBhcmdzLmluaXRpYWxDb250ZXh0O1xuXG4gICAgbGV0IHJ1bnRpbWU6IEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgaWYgKG92ZXJyaWRlcz8uZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZTogcmV1c2UgZXhpc3RpbmcgcnVudGltZSBzbyBleGVjdXRpb24gdHJlZSBjb250aW51ZXMgZnJvbSBwYXVzZSBwb2ludC5cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIChmdWxsIHRyZWUpLCB0aGVuIGFkdmFuY2VcbiAgICAgIC8vIHJvb3RTdGFnZUNvbnRleHQgdG8gYSBjb250aW51YXRpb24gZnJvbSB0aGUgbGVhZiAoZm9yIHRyYXZlcnNhbCkuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKFxuICAgICAgICBlZmZlY3RpdmVSb290Lm5hbWUsXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QuaWQsXG4gICAgICAgIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICAgIGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVkYWN0aW9uIHJ1bGUgKDkuMTkuMCk6IE9ORSBvd25lciBvZiB0aGUgdmVyZGljdCBmb3IgdGhlIHdob2xlXG4gICAgLy8gcnVuLCBpbnN0YWxsZWQgb24gdGhlIHJ1bnRpbWUncyByb290IGNvbnRleHQgc28gZXZlcnkgZGVzY2VuZGFudCBhbmRcbiAgICAvLyBldmVyeSBzdWJmbG93IHJvb3QgcmV0YWlucyB1bmRlciBpdCDigJQgdGhlIHNhbWUgYW5jaG9yIGFuZCB0aGUgc2FtZVxuICAgIC8vIHJlc3VtZS1wYXRoIG9yZGVyaW5nIGFzIHRoZSBtaXJyb3IgYW5kIHRoZSBmb3VyIGRpYWxzLiBJbnN0YWxsZWQgZXZlblxuICAgIC8vIHdpdGhvdXQgYSBwb2xpY3k6IGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCBtYXJrcyB0aGUga2V5XG4gICAgLy8gb24gdGhpcyBydWxlLCBhbmQgdGhlIHBhdGhzIHRoYXQgYnlwYXNzIHRoZSBmYWNhZGUgKHN1YmZsb3cgc2VlZCxcbiAgICAvLyBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjaywgcmVzdW1lIHJlLXNlZWQpIGhvbm91ciB0aGF0IG1hcmsgdGhyb3VnaCBpdC5cbiAgICAvLyBPUkRFUiBNQVRURVJTOiBiZWZvcmUgdGhlIG1pcnJvciBiZWxvdyDigJQgdGhlIG1pcnJvcidzIFNFRUQgaXMgc2NydWJiZWRcbiAgICAvLyB3aXRoIHRoaXMgcnVsZSAoYSBzZWVkZWQsIG5ldmVyIHJlLXdyaXR0ZW4gcG9saWN5IGtleSBpcyBzZXJ2ZWQpLlxuICAgIHJ1bnRpbWUudXNlUmVkYWN0aW9uKHRoaXMucmVkYWN0aW9uUnVsZSk7XG5cbiAgICAvLyBXaGVuIGEgcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkLCBtYWludGFpbiBhIHBhcmFsbGVsIHJlZGFjdGVkXG4gICAgLy8gbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAgZHVyaW5nIHRyYXZlcnNhbC4gRWFjaCBjb21taXQgYXBwbGllcyB0aGVcbiAgICAvLyBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHNhbWUgb25lcyBmZWQgdG8gdGhlIGV2ZW50IGxvZyDigJRcbiAgICAvLyBzbyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHJldHVybnMgYSBzY3J1YmJlZCBzaGFyZWRTdGF0ZSBhdFxuICAgIC8vIHplcm8gcG9zdC1wYXNzIGNvc3QuIFNraXBwZWQgd2hlbiBubyBwb2xpY3kgZXhpc3RzICh6ZXJvIGFsbG9jYXRpb24pLlxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgcnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpO1xuICAgIH1cblxuICAgIC8vIFJlYWQtdHJhY2tpbmcgcG9saWN5ICgjMTQpOiBzZXQgb24gdGhlIHJ1bnRpbWUncyByb290IGNvbnRleHQgc28gZXZlcnlcbiAgICAvLyBkZXNjZW5kYW50IGNvbnRleHQgKGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQpIGFuZCBzdWJmbG93IHJvb3QgaW5oZXJpdHMuXG4gICAgLy8gQXBwbGllZCBBRlRFUiB0aGUgcmVzdW1lLXBhdGggcm9vdCBzd2FwIGFib3ZlIHNvIHRoZSBjb250aW51YXRpb24gcm9vdFxuICAgIC8vIGNhcnJpZXMgdGhlIHBvbGljeSB0b28uIFNraXBwZWQgZm9yIHRoZSBkZWZhdWx0ICdmdWxsJyDigJQgemVybyB3b3JrLlxuICAgIGNvbnN0IHJlYWRUcmFja2luZyA9IGFyZ3MucmVhZFRyYWNraW5nO1xuICAgIGlmIChyZWFkVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiByZWFkVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgcnVudGltZS51c2VSZWFkVHJhY2tpbmcocmVhZFRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBXcml0ZS10cmFja2luZyBwb2xpY3kgKCMxM2MtQSk6IGlkZW50aWNhbCBwbHVtYmluZyB0byByZWFkVHJhY2tpbmcg4oCUXG4gICAgLy8gc2FtZSByb290LWNvbnRleHQgYW5jaG9yLCBzYW1lIGluaGVyaXRhbmNlLCBzYW1lIHJlc3VtZS1wYXRoIG9yZGVyaW5nLlxuICAgIGNvbnN0IHdyaXRlVHJhY2tpbmcgPSBhcmdzLndyaXRlVHJhY2tpbmc7XG4gICAgaWYgKHdyaXRlVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiB3cml0ZVRyYWNraW5nICE9PSAnZnVsbCcpIHtcbiAgICAgIHJ1bnRpbWUudXNlV3JpdGVUcmFja2luZyh3cml0ZVRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXQtdmFsdWVzIGVuY29kaW5nICgjMTNjLUIpOiBpZGVudGljYWwgcGx1bWJpbmcgdG8gdGhlIHR3byBkaWFsc1xuICAgIC8vIGFib3ZlIOKAlCByb290LWNvbnRleHQgYW5jaG9yLCBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkIGluaGVyaXRhbmNlLFxuICAgIC8vIFN1YmZsb3dFeGVjdXRvciBkdWNrLXB1c2gsIHJlc3VtZS1wYXRoIHJlLWFwcGxpY2F0aW9uLiBTa2lwcGVkIGZvciB0aGVcbiAgICAvLyBkZWZhdWx0ICdmdWxsJyDigJQgemVybyB3b3JrLCBieXRlLWlkZW50aWNhbCBjb21taXQgbG9nLlxuICAgIGNvbnN0IGNvbW1pdFZhbHVlcyA9IGFyZ3MuY29tbWl0VmFsdWVzO1xuICAgIGlmIChjb21taXRWYWx1ZXMgIT09IHVuZGVmaW5lZCAmJiBjb21taXRWYWx1ZXMgIT09ICdmdWxsJykge1xuICAgICAgcnVudGltZS51c2VDb21taXRWYWx1ZXMoY29tbWl0VmFsdWVzKTtcbiAgICB9XG5cbiAgICAvLyBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpOiBpZGVudGljYWwgcGx1bWJpbmcgdG8gdGhlIHRocmVlIGRpYWxzXG4gICAgLy8gYWJvdmUg4oCUIHJvb3QtY29udGV4dCBhbmNob3IsIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQgaW5oZXJpdGFuY2UsXG4gICAgLy8gU3ViZmxvd0V4ZWN1dG9yIGR1Y2stcHVzaCwgcmVzdW1lLXBhdGggcmUtYXBwbGljYXRpb24uIFNraXBwZWQgZm9yIHRoZVxuICAgIC8vIGRlZmF1bHQgJ29mZicg4oCUIHplcm8gd29yaywgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZy5cbiAgICBjb25zdCB3cml0ZVByb3ZlbmFuY2UgPSBhcmdzLndyaXRlUHJvdmVuYW5jZTtcbiAgICBpZiAod3JpdGVQcm92ZW5hbmNlICE9PSB1bmRlZmluZWQgJiYgd3JpdGVQcm92ZW5hbmNlICE9PSAnb2ZmJykge1xuICAgICAgcnVudGltZS51c2VXcml0ZVByb3ZlbmFuY2Uod3JpdGVQcm92ZW5hbmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgIHJvb3Q6IGVmZmVjdGl2ZVJvb3QsXG4gICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICBzY29wZUZhY3RvcnksXG4gICAgICBleGVjdXRpb25SdW50aW1lOiBydW50aW1lLFxuICAgICAgcmVhZE9ubHlDb250ZXh0OiByZWFkT25seUNvbnRleHRPdmVycmlkZSA/PyBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IGFyZ3MudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBhcmdzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgICAgbmFycmF0aXZlRW5hYmxlZDogbmFycmF0aXZlRmxhZyxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgbG9nZ2VyOiBmYy5sb2dnZXIgPz8gZGVmYXVsdExvZ2dlcixcbiAgICAgIHNpZ25hbCxcbiAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgZmxvd1JlY29yZGVyczogdGhpcy5idWlsZEZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLFxuICAgICAgdmlzaXRDb3VudHM6IHRoaXMuX3Zpc2l0Q291bnRzLFxuICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dzT3ZlcnJpZGUgJiYgeyBzdWJmbG93czogb3ZlcnJpZGVzLnN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lICYmIHtcbiAgICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogb3ZlcnJpZGVzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUsXG4gICAgICB9KSxcbiAgICAgIC4uLihtYXhEZXB0aCAhPT0gdW5kZWZpbmVkICYmIHsgbWF4RGVwdGggfSksXG4gICAgICAuLi4obWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9ucyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zKSB0aGlzLm5hcnJhdGl2ZU9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCkuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gRXF1aXZhbGVudCB0byB0aGUgYHJlYWRUcmFja2luZ2BcbiAgICogY29uc3RydWN0b3Igb3B0aW9uIOKAlCBzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5yZWFkVHJhY2tpbmd9XG4gICAqIGZvciB0aGUgbW9kZSBzZW1hbnRpY3MgKCdmdWxsJyBkZWZhdWx0IC8gJ3N1bW1hcnknIC8gJ29mZicpLlxuICAgKi9cbiAgc2V0UmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MucmVhZFRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuIEVxdWl2YWxlbnQgdG8gdGhlIGB3cml0ZVRyYWNraW5nYFxuICAgKiBjb25zdHJ1Y3RvciBvcHRpb24g4oCUIHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLndyaXRlVHJhY2tpbmd9XG4gICAqIGZvciB0aGUgbW9kZSBzZW1hbnRpY3MgKCdmdWxsJyBkZWZhdWx0IC8gJ3N1bW1hcnknIC8gJ29mZicpLCB0aGVcbiAgICogb25Db21taXQtcGF5bG9hZCBjb25zZXF1ZW5jZSwgYW5kIHRoZSByZWRhY3Rpb24tcHJlY2VkZW5jZSBydWxlLlxuICAgKi9cbiAgc2V0V3JpdGVUcmFja2luZyhtb2RlOiBXcml0ZVRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy53cml0ZVRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbW1pdC12YWx1ZXMgZW5jb2RpbmcgcG9saWN5IGZvciB0aGUgY29tbWl0IGxvZyAoIzEzYy1CKS5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLiBFcXVpdmFsZW50IHRvIHRoZSBgY29tbWl0VmFsdWVzYFxuICAgKiBjb25zdHJ1Y3RvciBvcHRpb24g4oCUIHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLmNvbW1pdFZhbHVlc31cbiAgICogZm9yIHRoZSBtb2RlIHNlbWFudGljcyAoJ2Z1bGwnIGRlZmF1bHQgLyAnZGVsdGEnKSwgdGhlIHZlcmItcXVhbGlmaWVkXG4gICAqIGBvdmVyd3JpdGVgIGNvbnNlcXVlbmNlLCBhbmQgdGhlIGBjb21taXRWYWx1ZUF0YCBtaWdyYXRpb24gaGVscGVyLlxuICAgKi9cbiAgc2V0Q29tbWl0VmFsdWVzKG1vZGU6IENvbW1pdFZhbHVlc01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuY29tbWl0VmFsdWVzID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3Rpb25SdWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgaXMgSlNPTi1zZXJpYWxpemFibGUg4oCUIHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBldGMuXG4gICAqXG4gICAqIEl0IGlzIGZ1bGx5IERFVEFDSEVEIGZyb20gZW5naW5lIHN0YXRlOiBldmVyeSBmaWVsZCB3YXMgZGVlcC1jb3BpZWQgYXRcbiAgICogcGF1c2UgdGltZSAoc2VlIGBidWlsZFBhdXNlQ2hlY2twb2ludGApLiBIb2xkaW5nLCBtdXRhdGluZywgb3IgcGVyc2lzdGluZ1xuICAgKiBpdCBjYW5ub3QgYWZmZWN0IHRoZSBleGVjdXRvciwgYW5kIGEgbGF0ZXIgc2FtZS1leGVjdXRvciByZXN1bWUgY2Fubm90XG4gICAqIG11dGF0ZSBhIGNoZWNrcG9pbnQgeW91IGFscmVhZHkgc3RvcmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICAgKiBpZiAoZXhlY3V0b3IuaXNQYXVzZWQoKSkge1xuICAgKiAgIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiAgIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldENoZWNrcG9pbnQoKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vc3QgcmVjZW50IHJ1bigpIHdhcyBwYXVzZWQgKGNoZWNrcG9pbnQgYXZhaWxhYmxlKS4gKi9cbiAgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcnVuJ3MgY29tbWl0IGxvZy4gTygxKSDigJQgZGlyZWN0IGxlbmd0aFxuICAgKiByZWFkLCBubyBzbmFwc2hvdCBtYXRlcmlhbGl6YXRpb24uIFVzZSB0aGlzIHRvIHN0YW1wIGNvbW1pdFxuICAgKiBpbmRpY2VzIG9uIG9ic2VydmVyIGV2ZW50cyAoZS5nLiwgYEJvdW5kYXJ5UmVjb3JkZXJgIHN0b3JpbmdcbiAgICogYGNvbW1pdElkeEJlZm9yZWAgLyBgY29tbWl0SWR4QWZ0ZXJgIHBlciBkb21haW4gZXZlbnQgZm9yXG4gICAqIGBDb21taXRSYW5nZUluZGV4YCBxdWVyaWVzIOKAlCBzZWUgYGZvb3RwcmludGpzL3RyYWNlYCkuXG4gICAqXG4gICAqIFJldHVybnMgMCBiZWZvcmUgYW55IHJ1bjsgYWZ0ZXIsIHJldHVybnMgdGhlIGN1bXVsYXRpdmUgY29tbWl0XG4gICAqIGNvdW50IGFjcm9zcyB0aGUgZXhlY3V0b3IncyBsaWZldGltZSAoaW5jbHVkaW5nIHJlc3VtZXMpLlxuICAgKlxuICAgKiBJTVBMRU1FTlRBVElPTiBOT1RFOiB0aGlzIHJldHVybnMgYHJ1bnRpbWUuZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGhgLFxuICAgKiB3aGljaCBpcyB0aGUgc2FtZSB2YWx1ZSBhcyBgZ2V0U25hcHNob3QoKS5jb21taXRMb2cubGVuZ3RoYC4gVGhlXG4gICAqIG5hbWluZyBhc3ltbWV0cnkgaXMgaGlzdG9yaWNhbCDigJQgdGhlIHVuZGVybHlpbmcgYEV2ZW50TG9nYCBmaWVsZFxuICAgKiBpcyBuYW1lZCBgZXhlY3V0aW9uSGlzdG9yeWAgYnV0IHN0b3JlcyB0aGUgYENvbW1pdEJ1bmRsZVtdYCB0aGF0XG4gICAqIGBjb21taXRMb2dgIGV4cG9zZXMuIFRoZXkgYWx3YXlzIHJlcG9ydCB0aGUgc2FtZSBMRU5HVEggKHZlcmlmaWVkIGJ5IHRoZVxuICAgKiBcIm1hdGNoZXMgY29tbWl0TG9nLmxlbmd0aFwiIGludGVncmF0aW9uIHRlc3QpOyBzaW5jZSA5LjE3LjAgdGhlIHNuYXBzaG90XG4gICAqIHNlcnZlcyBhIGRldGFjaGVkIGZyb3plbiBDT1BZIG9mIHRoZSBhcnJheSwgbm90IHRoZSBsaXZlIG9uZS5cbiAgICovXG4gIGdldENvbW1pdENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBydW50aW1lPy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhdXNlZCBmbG93Y2hhcnQgZnJvbSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIFJlc3RvcmVzIHRoZSBzY29wZSBzdGF0ZSwgY2FsbHMgdGhlIHBhdXNlZCBzdGFnZSdzIGByZXN1bWVGbmAgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgaW5wdXQsIHRoZW4gY29udGludWVzIHRyYXZlcnNhbCBmcm9tIHRoZSBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBjYW4gY29tZSBmcm9tIGBnZXRDaGVja3BvaW50KClgIG9uIGEgcHJldmlvdXMgcnVuLCBvciBmcm9tXG4gICAqIGEgc2VyaWFsaXplZCBjaGVja3BvaW50IHN0b3JlZCBpbiBSZWRpcy9Qb3N0Z3Jlcy9sb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqICoqUmVjb3JkZXIvbmFycmF0aXZlIHN0YXRlIGRlcGVuZHMgb24gdGhlIHJlc3VtZSBtb2RlLioqIFJlc3VtaW5nIG9uIHRoZSBTQU1FXG4gICAqIGV4ZWN1dG9yIHRoYXQgcmFuIHByZXNlcnZlcyBhbmQgYWNjdW11bGF0ZXMgbmFycmF0aXZlL21ldHJpY3MvZGVidWcgYWNyb3NzIHRoZVxuICAgKiBwYXVzZS9yZXN1bWUgY3ljbGUgKHByZXNlcnZlUmVjb3JkZXJzKS4gUmVzdW1pbmcgb24gYSBGUkVTSCBleGVjdXRvclxuICAgKiAocmVjb25zdHJ1Y3RlZCBmcm9tIGEgc3RvcmVkIGNoZWNrcG9pbnQpIHN0YXJ0cyB3aXRoIGVtcHR5IHJlY29yZGVyIHN0YXRlIOKAlFxuICAgKiBjb2xsZWN0IHdoYXQgeW91IG5lZWQgYmVmb3JlIGRpc2NhcmRpbmcgdGhlIHBhdXNlZCBleGVjdXRvci4gQSBmcmVzaCBgcnVuSWRgXG4gICAqIGlzIGdlbmVyYXRlZCBlaXRoZXIgd2F5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFByb2Nlc3MgQSDigJQgYWZ0ZXIgYSBwYXVzZSwgcGVyc2lzdCB0aGUgY2hlY2twb2ludDpcbiAgICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICpcbiAgICogLy8gUHJvY2VzcyBCIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KSDigJQgcmVzdG9yZSBhbmQgcmVzdW1lOlxuICAgKiBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShyZXN0b3JlZCwgeyBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXN1bWUoXG4gICAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgICByZXN1bWVJbnB1dD86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFBpY2s8UnVuT3B0aW9ucywgJ3NpZ25hbCcgfCAnZW52JyB8ICdtYXhEZXB0aCcgfCAnbWF4SXRlcmF0aW9ucyc+LFxuICApOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgLy8gUmUtZW50cmFuY3kgZ3VhcmQgRklSU1Qg4oCUIHJlc3VtZSgpIG11dGF0ZXMgdGhlIHNhbWUgcGVyLXJ1biBzdGF0ZSBydW4oKVxuICAgIC8vIGRvZXMgKHRyYXZlcnNlciwgcnVuSWQsIGNoZWNrcG9pbnQpLCBzbyByZXN1bWUtZHVyaW5nLXJ1biBhbmRcbiAgICAvLyBkb3VibGUtcmVzdW1lIGFyZSB0aGUgc2FtZSBjb3JydXB0aW9uIGNsYXNzIGFzIGNvbmN1cnJlbnQgcnVuKCkuXG4gICAgaWYgKHRoaXMuX2lzRXhlY3V0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdGbG93Q2hhcnRFeGVjdXRvcjogcmVzdW1lKCkgY2FsbGVkIHdoaWxlIGFub3RoZXIgcnVuKCkvcmVzdW1lKCkgaXMgaW4gZmxpZ2h0IG9uIHRoaXMgJyArXG4gICAgICAgICAgJ2V4ZWN1dG9yLiBBbiBleGVjdXRvciBob2xkcyBwZXItcnVuIHN0YXRlIChydW5JZCwgcmVjb3JkZXJzLCBjaGVja3BvaW50KSDigJQgY3JlYXRlICcgK1xuICAgICAgICAgICdvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLiBTZWUgZG9jcy9ndWlkZXMvZXhlY3V0aW9uLW1vZGVsLm1kLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgVmFsaWRhdGUgY2hlY2twb2ludCBzdHJ1Y3R1cmUgKG1heSBjb21lIGZyb20gdW50cnVzdGVkIGV4dGVybmFsIHN0b3JhZ2UpIOKUgOKUgFxuICAgIC8vIChsYXN0Q2hlY2twb2ludCBpcyB3aXBlZCBBRlRFUiB2YWxpZGF0aW9uIOKAlCBhIHJlamVjdGVkIGNoZWNrcG9pbnQgbXVzdFxuICAgIC8vIG5vdCBkZXN0cm95IHRoZSBleGVjdXRvcidzIGV4aXN0aW5nIGNoZWNrcG9pbnQgc3RhdGUuKVxuICAgIGlmIChcbiAgICAgICFjaGVja3BvaW50IHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50LnNoYXJlZFN0YXRlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnNoYXJlZFN0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHNoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkICE9PSAnc3RyaW5nJyB8fCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogcGF1c2VkU3RhZ2VJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zdWJmbG93UGF0aCkgfHxcbiAgICAgICFjaGVja3BvaW50LnN1YmZsb3dQYXRoLmV2ZXJ5KChzOiB1bmtub3duKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc3ViZmxvd1BhdGggbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBTZWVkIHRoZSBzaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgKyBwZXItc3RhZ2UgdmlzaXQgY291bnRzIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gTVVTVCBydW4gYmVmb3JlIHRoZSBjb3VudGVyIGlzIFJFQUQgYmVsb3cgKHRoZSByZXN1bWUtbm9kZSBydW50aW1lU3RhZ2VJZFxuICAgIC8vIHJlY29uc3RydWN0aW9uKSBBTkQgYmVmb3JlIGNyZWF0ZVRyYXZlcnNlcigpIGhhbmRzIHRoZSB0cmF2ZXJzZXIgdGhlc2VcbiAgICAvLyBvYmplY3RzIEJZIFJFRkVSRU5DRS4gU2VlZGluZyBrZWVwcyBydW50aW1lU3RhZ2VJZHMgdW5pcXVlIGFuZFxuICAgIC8vIGxvb3BJdGVyYXRpb24gbW9ub3RvbmljIGFjcm9zcyBhIENST1NTLWV4ZWN1dG9yIHJlc3VtZSAoYSBmcmVzaCBleGVjdXRvclxuICAgIC8vIHN0YXJ0cyBib3RoIGF0IDAvZW1wdHk7IHRoZSBjaGVja3BvaW50IGNhcnJpZXMgdGhlIHBhdXNlLXRpbWUgdmFsdWVzKS5cbiAgICAvL1xuICAgIC8vIE1VVEFURSwgbmV2ZXIgUkVQTEFDRTogYF9leGVjdXRpb25Db3VudGVyYCBhbmQgYF92aXNpdENvdW50c2AgYXJlIHNoYXJlZFxuICAgIC8vIGJ5IHJlZmVyZW5jZSBpbnRvIHRoZSB0cmF2ZXJzZXIgKGFuZCwgdHJhbnNpdGl2ZWx5LCBldmVyeSBzdWJmbG93XG4gICAgLy8gdHJhdmVyc2VyIOKAlCBzZWUgRmxvd2NoYXJ0VHJhdmVyc2VyJ3Mgc3ViLXRyYXZlcnNlciBmYWN0b3J5KS4gQXNzaWduaW5nIGFcbiAgICAvLyBmcmVzaCBvYmplY3QgaGVyZSB3b3VsZCBzZXZlciB0aGF0IHNoYXJlZCByZWZlcmVuY2UuIEJvdGggZmllbGRzIGFyZVxuICAgIC8vIG9wdGlvbmFsIG9uIHRoZSBjaGVja3BvaW50IChvbGRlciBwZXJzaXN0ZWQgY2hlY2twb2ludHMgb21pdCB0aGVtKSDigJQgc2tpcFxuICAgIC8vIHNlZWRpbmcgd2hlbiBhYnNlbnQsIHByZXNlcnZpbmcgdGhlIHByZXZpb3VzIGJlaGF2aW9yLiBTYW1lLWV4ZWN1dG9yXG4gICAgLy8gcmVzdW1lIGlzIGlkZW1wb3RlbnQ6IGF0IHBhdXNlIHRoZSBpbnN0YW5jZSB2YWx1ZXMgYWxyZWFkeSBlcXVhbCB0aGVcbiAgICAvLyBjaGVja3BvaW50J3MsIHNvIHJlLXNlZWRpbmcgdGhlbSBjaGFuZ2VzIG5vdGhpbmcuXG4gICAgaWYgKHR5cGVvZiBjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSA9IGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQ7XG4gICAgfVxuICAgIGlmIChjaGVja3BvaW50LnZpc2l0Q291bnRzKSB7XG4gICAgICB0aGlzLl92aXNpdENvdW50cy5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCBbc3RhZ2VJZCwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKGNoZWNrcG9pbnQudmlzaXRDb3VudHMpKSB7XG4gICAgICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChzdGFnZUlkLCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGF1c2VkIG5vZGUgaW4gdGhlIGdyYXBoXG4gICAgY29uc3QgcGF1c2VkTm9kZSA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aCk7XG4gICAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtjaGVja3BvaW50LnBhdXNlZFN0YWdlSWR9JyBub3QgZm91bmQgaW4gZmxvd2NoYXJ0LiBgICtcbiAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFR3byByZS1lbnRyeSBzaGFwZXMsIGNob3NlbiBieSBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQ6XG4gICAgLy9cbiAgICAvLyAgIOKAoiBpbnRlcnJ1cHQoKSAgICAgIOKGkiBSRS1SVU4gVEhFIFNUQUdFJ1MgT1dOIEZVTkNUSU9OIEZST00gSVRTIFRPUC5cbiAgICAvLyAgICAgU3RhZ2VzIGFyZSBhdG9taWMgKHRoZSBzYW1lIGxhdyBgcmVzdW1lT25FcnJvcmAgc3RhdGVzKTogYSBzdGFnZSB0aGF0XG4gICAgLy8gICAgIHN0b3BwZWQgbWlkLWJvZHkgaGFzIG5vIGhhbGYgdG8gcmVzdW1lIGludG8sIHNvIHRoZSB3aG9sZSBib2R5IHJ1bnNcbiAgICAvLyAgICAgYWdhaW4gYW5kIHRoZSBhbnN3ZXIgY29tZXMgYmFjayBvdXQgb2YgdGhlIGBpbnRlcnJ1cHQoKWAgY2FsbCBpdHNlbGYuXG4gICAgLy8gICAgIEV2ZXJ5dGhpbmcgdGhlIGJvZHkgZGlkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIHJlLWRvbmUg4oCUIHdoaWNoIGlzXG4gICAgLy8gICAgIHdoeSB0aGUgZG9jcyB0ZWxsIHlvdSB0byBrZWVwIHRoYXQgaGFsZiBpZGVtcG90ZW50LlxuICAgIC8vICAg4oCiIGFkZFBhdXNhYmxlRnVuY3Rpb24g4oaSIHJ1biB0aGUgZGVjbGFyZWQgYHJlc3VtZUZuYC5cbiAgICAvL1xuICAgIC8vIFRoZSBkaXNjcmltaW5hbnQgaXMgb24gdGhlIGNoZWNrcG9pbnQsIHNvIHRoaXMgd29ya3MgY3Jvc3MtZXhlY3V0b3JcbiAgICAvLyAoYSBjaGVja3BvaW50IHJlc3RvcmVkIGZyb20gUmVkaXMgb24gYSBmcmVzaCBwcm9jZXNzIHJlc3VtZXMgdGhlIHNhbWUgd2F5KS5cbiAgICBjb25zdCBpc0ludGVycnVwdFJlc3VtZSA9IGNoZWNrcG9pbnQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnO1xuICAgIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbiAmJiAhaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpLCBvciBzdGFnZXMgdGhhdCBwYXVzZWQgdmlhIGludGVycnVwdCgpLCBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIGEgc3ludGhldGljIHJlc3VtZSBub2RlOiBydW5zIHRoZSByZXN1bWUgaGFsZiwgdGhlbiBjb250aW51ZXMuXG4gICAgLy8gcmVzdW1lRm4gc2lnbmF0dXJlIGlzIChzY29wZSwgaW5wdXQpIHBlciBQYXVzYWJsZUhhbmRsZXIg4oCUIHdyYXAgdG8gbWF0Y2ggU3RhZ2VGdW5jdGlvbihzY29wZSwgYnJlYWtGbikuXG4gICAgbGV0IHJlc3VtZVN0YWdlRm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICBpZiAoaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRm4gPVxuICAgICAgICBwYXVzZWROb2RlLmZuID8/XG4gICAgICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuc3RhZ2VNYXAuZ2V0KHBhdXNlZE5vZGUuaWQpID8/XG4gICAgICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuc3RhZ2VNYXAuZ2V0KHBhdXNlZE5vZGUubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbmFsRm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgcGF1c2VkIHZpYSBpbnRlcnJ1cHQoKSBidXQgaXRzIGAgK1xuICAgICAgICAgICAgJ3N0YWdlIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBpbiB0aGUgY2hhcnQuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50ICcgK1xuICAgICAgICAgICAgJ3dhcyBjcmVhdGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXN1bWVTdGFnZUZuID0gKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBEZXBvc2l0IHRoZSBhbnN3ZXIgZm9yIFRISVMgc2NvcGUgaW5zdGFuY2UgYmVmb3JlIHRoZSBib2R5IHJ1bnMsIHNvXG4gICAgICAgIC8vIHRoZSBgaW50ZXJydXB0KClgIGNhbGwgdGhhdCB0aHJldyBsYXN0IHRpbWUgcmV0dXJucyBpdCB0aGlzIHRpbWUuXG4gICAgICAgIC8vIEtleWVkIGJ5IHNjb3BlIGlkZW50aXR5IOKAlCBzYWZlIHdoZW4gc2V2ZXJhbCBicmFuY2hlcyByZXN1bWUgYXQgb25jZS5cbiAgICAgICAgcHJvdmlkZUludGVycnVwdEFuc3dlcihzY29wZSwgcmVzdW1lSW5wdXQpO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxGbihzY29wZSwgYnJlYWtGbiwgc3RyZWFtQ2FsbGJhY2spO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdW1lRm4gPSBwYXVzZWROb2RlLnJlc3VtZUZuITtcbiAgICAgIHJlc3VtZVN0YWdlRm4gPSAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KSBhcyBUT3V0IHwgUHJvbWlzZTxUT3V0PjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbnRpbnVhdGlvbjogZm9yIGJyYW5jaCBjaGlsZHJlbiAoZGVjaWRlci9zZWxlY3RvciksXG4gICAgLy8gcGF1c2VkTm9kZS5uZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGNoZWNrcG9pbnQnc1xuICAgIC8vIGNvbnRpbnVhdGlvblN0YWdlSWQgKGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cClcbiAgICAvLyBwb2ludHMgdG8gdGhlIGludm9rZXIncyBuZXh0IG5vZGUuXG4gICAgLy9cbiAgICAvLyBGb3IgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBjb250aW51YXRpb24gbGl2ZXMgSU5TSURFIHRoZVxuICAgIC8vIGxlYWYgc3ViZmxvdyAoZS5nLiwgdGhlIGxvb3AgdGFyZ2V0IGJhY2sgdG8gYG1lc3NhZ2VzYCkuIFNlYXJjaFxuICAgIC8vIHRoZSBsZWFmIHN1YmZsb3cgZmlyc3Q7IGZhbGwgYmFjayB0byB0b3AtbGV2ZWwgZm9yIHJvb3QtbGV2ZWxcbiAgICAvLyBwYXVzZXMuXG4gICAgLy8gQ2xvbmUtaW46IGBzdWJmbG93U3RhdGVzYCBzZWVkcyBuZXN0ZWQgcnVudGltZXMgaW4gU3ViZmxvd0V4ZWN1dG9yXG4gICAgLy8gKHNoYWxsb3ctbWVyZ2VkIGludG8gZWFjaCBuZXN0ZWQgU2hhcmVkTWVtb3J5KSwgc28gd2l0aG91dCBhIGNvcHkgdGhlXG4gICAgLy8gZW5naW5lIHdvdWxkIGhvbGQgbGl2ZSByZWZlcmVuY2VzIGludG8gdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQgb2JqZWN0IOKAlFxuICAgIC8vIGNhbGxlciBtdXRhdGlvbnMgd291bGQgYmxlZWQgaW50byB0aGUgcmVzdW1lZCBydW4gYW5kIGVuZ2luZSB3cml0ZXNcbiAgICAvLyB3b3VsZCByZWFjaCBhIGNoZWNrcG9pbnQgdGhlIGNhbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICBjb25zdCBzZlN0YXRlcyA9IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXMpO1xuICAgIGNvbnN0IGxlYWZTdWJmbG93SWQgPVxuICAgICAgY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggPiAwID8gY2hlY2twb2ludC5zdWJmbG93UGF0aFtjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIGxldCBjb250aW51YXRpb25OZXh0ID0gcGF1c2VkTm9kZS5uZXh0O1xuICAgIC8vIEEgYnJhbmNoLXNvdXJjZWQgbG9vcCAoYHsgbG9vcFRvIH1gIC8gYERlY2lkZXJMaXN0Lmxvb3BUb2ApIHNldHMgdGhlXG4gICAgLy8gbG9vcGluZyBicmFuY2gncyBgbmV4dGAgdG8gYSBsb29wLXJlZiBTVFVCIOKAlCBgeyBpZCwgaXNMb29wUmVmOnRydWUgfWBcbiAgICAvLyB3aXRoIG5vIGZuL2NoaWxkcmVuL3N1YmZsb3dJZC4gT24gYSBOT1JNQUwgcnVuIHRoYXQgc3R1YiByZXNvbHZlcyBmaW5lOlxuICAgIC8vIHRoZSByZWFsIHRhcmdldCBub2RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBjaGFydCByb290LCBzbyB0aGUgdHJhdmVyc2VyJ3NcbiAgICAvLyBub2RlIG1hcCBhbHJlYWR5IGhvbGRzIGl0ICh0aGUgc3R1YiBpcyBza2lwcGVkIOKAlCBmaXJzdC13cml0ZS13aW5zKS4gT25cbiAgICAvLyBSRVNVTUUgdGhlIG5vZGUgbWFwIGlzIGJ1aWx0IGZyb20gdGhlIHRydW5jYXRlZCByZXN1bWUgcm9vdCwgd2hlcmUgdGhlXG4gICAgLy8gcmVhbCB0YXJnZXQgaXMgdW5yZWFjaGFibGUsIHNvIHRoZSBzdHViIHdvdWxkIHdpbiB0aGUgaWQgc2xvdCBhbmRcbiAgICAvLyBgZXhlY3V0ZU5vZGVgIHRocm93cyBcIk5vZGUgJzx0YXJnZXQ+JyBtdXN0IGRlZmluZSAuLi5cIi4gUmVzb2x2ZSB0aGUgc3R1YlxuICAgIC8vIHRvIHRoZSBSRUFMIHRhcmdldCBub2RlIGhlcmUgKGRmc0ZpbmQgc2tpcHMgbG9vcC1yZWZzIGFuZCByZXR1cm5zIHRoZVxuICAgIC8vIHJlYWwgbm9kZSBXSVRIIGl0cyBmdWxsIGRvd25zdHJlYW0gY2hhaW4g4oCUIGUuZy4gYSBzdWJmbG93IE1PVU5UIG5vZGUsXG4gICAgLy8gd2hvc2UgYC5uZXh0YCBjYXJyaWVzIHRoZSBkZWNpZGVyL3Rlcm1pbmFsIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBtdXN0XG4gICAgLy8gcmUtZW50ZXIpLiBTZWUgdGVzdC9saWIvcGF1c2UvcmVzdW1lLWJyYW5jaC1sb29wLXN1YmZsb3cudGVzdC50cy5cbiAgICBpZiAoY29udGludWF0aW9uTmV4dD8uaXNMb29wUmVmKSB7XG4gICAgICBjb25zdCBsb29wVGFyZ2V0SWQgPSBjb250aW51YXRpb25OZXh0LmlkO1xuICAgICAgY29uc3QgcmVhbFRhcmdldCA9XG4gICAgICAgIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIFtdKTtcbiAgICAgIGlmIChyZWFsVGFyZ2V0KSBjb250aW51YXRpb25OZXh0ID0gcmVhbFRhcmdldDtcbiAgICB9XG4gICAgaWYgKCFjb250aW51YXRpb25OZXh0ICYmIGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCkge1xuICAgICAgLy8gU2VhcmNoIGxlYWYgc3ViZmxvdyBmaXJzdCAobG9vcCB0YXJnZXRzIC8gYnJhbmNoIGpvaW5zIGxpdmUgdGhlcmUpLFxuICAgICAgLy8gdGhlbiBmYWxsIGJhY2sgdG8gdG9wIGxldmVsLlxuICAgICAgY29udGludWF0aW9uTmV4dCA9IGxlYWZTdWJmbG93SWRcbiAgICAgICAgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb250aW51YXRpb25OZXh0KSB7XG4gICAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgXCJpbm5lclwiIHJlc3VtZSBjaGFpbjogcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbi4gVGhpcyBpcyB3aGF0XG4gICAgLy8gcnVucyBJTlNJREUgdGhlIGxlYWYgc3ViZmxvdydzIGJvZHkuIEZvciBhIHJvb3QtbGV2ZWwgcGF1c2VcbiAgICAvLyAoc3ViZmxvd1BhdGggZW1wdHkpLCB0aGlzIGlzIGFsc28gdGhlIHRvcC1sZXZlbCByZXN1bWUgcm9vdC5cbiAgICBjb25zdCBpbm5lclJlc3VtZUNoYWluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIGlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IHBhdXNlZE5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBmbjogcmVzdW1lU3RhZ2VGbixcbiAgICAgIG5leHQ6IGNvbnRpbnVhdGlvbk5leHQsXG4gICAgICAvLyBBIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5IGZvbGxvd3MgdGhlIHN0YWdlIG9ubHkgb24gdGhlIElOVEVSUlVQVFxuICAgICAgLy8gcmUtZW50cnksIGJlY2F1c2UgdGhhdCBwYXRoIHJlLXJ1bnMgdGhlIHN0YWdlJ3MgT1dOIGZ1bmN0aW9uIOKAlCB0aGVcbiAgICAgIC8vIGV4YWN0IGZ1bmN0aW9uIHRoZSBwb2xpY3kgd2FzIGRlY2xhcmVkIGZvci4gVGhlIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYFxuICAgICAgLy8gcmUtZW50cnkgcnVucyBhIGRpZmZlcmVudCBmdW5jdGlvbiAoYHJlc3VtZUZuYCkgdW5kZXIgYSBkaWZmZXJlbnRcbiAgICAgIC8vIGNvbnRyYWN0LCBzbyBpdCBkZWxpYmVyYXRlbHkgcnVucyB3aXRob3V0IHRoZSBwb2xpY3kuXG4gICAgICAuLi4oaXNJbnRlcnJ1cHRSZXN1bWUgJiYgcGF1c2VkTm9kZS5yZXRyeSAmJiB7IHJldHJ5OiBwYXVzZWROb2RlLnJldHJ5IH0pLFxuICAgICAgLy8gRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb2xsb3cgdGhlIHN0YWdlIG9uIEJPVEggcmUtZW50cmllczogYSB0YWcgaXNcbiAgICAgIC8vIHRoZSBzdGFnZSdzIE5BTUUsIG5vdCBhIHBvbGljeSBvdmVyIGl0cyBmdW5jdGlvbiwgYW5kIHRoZSByZXN1bWVkXG4gICAgICAvLyBleGVjdXRpb24gaXMgdGhhdCBzdGFnZSBydW5uaW5nIGFnYWluIOKAlCBpdHMgYnVuZGxlIG11c3QgY2FycnkgaXQsXG4gICAgICAvLyBvciBhIGNoYWluZWQgYXhpcyB3b3VsZCBzaG93IHRoZSBwYXVzZWQgbGVnIHRhZ2dlZCBhbmQgdGhlIHJlc3VtZWRcbiAgICAgIC8vIGxlZyBzaWxlbnRseSBub3QuIFRoZSBjaGFydCdzIG5vZGUgaGFzIHRoZSB0YWdzOyB0aGlzIHN5bnRoZXRpY1xuICAgICAgLy8gcm9vdCBpcyB0aGUgb25lIHBsYWNlIHRoZXkgd291bGQgb3RoZXJ3aXNlIGJlIGxvc3QuXG4gICAgICAuLi4ocGF1c2VkTm9kZS50YWdzICYmIHsgdGFnczogcGF1c2VkTm9kZS50YWdzIH0pLFxuICAgIH07XG5cbiAgICAvLyBEb24ndCBjbGVhciByZWNvcmRlcnMg4oCUIHJlc3VtZSBjb250aW51ZXMgZnJvbSBwcmV2aW91cyBzdGF0ZS5cbiAgICAvLyBOYXJyYXRpdmUsIG1ldHJpY3MsIGRlYnVnIGVudHJpZXMgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lLlxuICAgIC8vXG4gICAgLy8gVHdvLW1vZGUgcmVzdW1lOlxuICAgIC8vICAg4oCiIFNhbWUtZXhlY3V0b3IgKHJ1bigpIHByZXZpb3VzbHkgY2FsbGVkIG9uIFRISVMgaW5zdGFuY2UpOlxuICAgIC8vICAgICByZXVzZSB0aGUgZXhpc3RpbmcgcnVudGltZSBzbyB0aGUgZXhlY3V0aW9uIHRyZWUgY29udGludWVzXG4gICAgLy8gICAgIGZyb20gdGhlIHBhdXNlIHBvaW50IGFuZCByZWNvcmRlcnMvbmFycmF0aXZlIGFjY3VtdWxhdGUuXG4gICAgLy8gICDigKIgQ3Jvc3MtZXhlY3V0b3IgKGZyZXNoIGV4ZWN1dG9yIHJlY29uc3RydWN0ZWQgZnJvbSBhIHN0b3JlZFxuICAgIC8vICAgICBjaGVja3BvaW50KTogc2VlZCBhIE5FVyBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAgLy8gICAgIHNvIHJlc3VtZSBoYW5kbGVycyBjYW4gcmVhZCBwcmUtcGF1c2Ugc2NvcGUuIFRoZSBleGVjdXRpb25cbiAgICAvLyAgICAgdHJlZSBzdGFydHMgYXQgdGhlIHJlc3VtZSBub2RlIOKAlCB3ZSBkb24ndCBoYXZlIHRoZSBwcmV2aW91c1xuICAgIC8vICAgICB0cmF2ZXJzYWwncyB0cmVlIG9uIGEgZnJlc2ggcHJvY2VzcyBhbnl3YXkuXG4gICAgY29uc3Qgc2FtZUV4ZWN1dG9yID0gdGhpcy5faGFzUnVuQmVmb3JlO1xuICAgIGNvbnN0IGV4aXN0aW5nUnVudGltZSA9IHNhbWVFeGVjdXRvclxuICAgICAgPyAodGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhbnkgcGF0aCB0aGF0IHJlc3VtZXMgY291bnRzIGFzIGEgcnVuXG4gICAgLy8gUmVzdW1lIGdldHMgYSBORVcgcnVuSWQg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4uXG4gICAgLy8gT3JpZ2luYWwgcnVuSWQgaXMgcmVjb3ZlcmFibGUgZnJvbSBjaGVja3BvaW50IG1ldGFkYXRhIGlmIGEgY29uc3VtZXJcbiAgICAvLyBuZWVkcyBjcm9zcy1ydW4gYXVkaXQgKHdlIGRvbid0IHN0b3JlIGl0IG9uIHRoZSBjaGVja3BvaW50IHRvZGF5O1xuICAgIC8vIGZ1dHVyZSBlbmhhbmNlbWVudCkuIFNlZSBgcnVuSWQudHNgLlxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTtcblxuICAgIC8vIFBpY2sgdGhlIHJlc3VtZSByb290ICsgaW5pdGlhbCBjb250ZXh0LlxuICAgIC8vXG4gICAgLy8gICBST09ULUxFVkVMIFBBVVNFIChzdWJmbG93UGF0aCBlbXB0eSk6XG4gICAgLy8gICAgIHJlc3VtZSByb290ID0gaW5uZXJSZXN1bWVDaGFpbiAocnVuIHJlc3VtZUZuIGF0IHRvcCBsZXZlbCkuXG4gICAgLy8gICAgIGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZS5cbiAgICAvL1xuICAgIC8vICAgU1VCRkxPVy1ORVNURUQgUEFVU0UgKHN1YmZsb3dQYXRoIG5vbi1lbXB0eSk6XG4gICAgLy8gICAgIFRoZSBwYXVzZSB3YXMgSU5TSURFIGEgc3ViZmxvdydzIGJvZHkuIFRvIHJ1biB0aGUgc3ViZmxvdydzXG4gICAgLy8gICAgIG91dHB1dE1hcHBlciBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvbiwgd2UgaGF2ZSB0byBlbnRlclxuICAgIC8vICAgICB0aHJvdWdoIHRoZSBPVVRFUiBNT1VOVCAodGhlIHBhcmVudCdzIG5vZGUgdGhhdCBtb3VudHMgdGhlXG4gICAgLy8gICAgIGxlYWYgc3ViZmxvdykuIFdlIHN3YXAgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aFxuICAgIC8vICAgICBpbm5lclJlc3VtZUNoYWluIHNvIFN1YmZsb3dFeGVjdXRvcjpcbiAgICAvLyAgICAgICAxLiBlbnRlcnMgdGhlIHN1YmZsb3cgYm91bmRhcnksXG4gICAgLy8gICAgICAgMi4gc2VlZHMgdGhlIG5lc3RlZCBydW50aW1lIGZyb20gc3ViZmxvd1N0YXRlc1tsZWFmXVxuICAgIC8vICAgICAgICAgIChza2lwcGluZyB0aGUgaW5wdXRNYXBwZXIg4oCUIHNlZSBTdWJmbG93RXhlY3V0b3IudHMpLFxuICAgIC8vICAgICAgIDMuIHJ1bnMgdGhlIHJlc3VtZUZuIOKGkiBjb250aW51YXRpb24gY2hhaW4sXG4gICAgLy8gICAgICAgNC4gcnVucyB0aGUgb3V0cHV0TWFwcGVyIGF0IGV4aXQsXG4gICAgLy8gICAgICAgNS4gcGFyZW50IHRyYXZlcnNhbCBjb250aW51ZXMgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyAgICAgQ3Jvc3MtZXhlY3V0b3I6IGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAodGhlXG4gICAgLy8gICAgICAgcGFyZW50J3MgdmlldyBhdCBwYXVzZSB0aW1lIOKAlCBvdXRwdXRNYXBwZXIgd3JpdGVzIGJhY2sgaW50byBpdCkuXG4gICAgLy8gICAgIFNhbWUtZXhlY3V0b3I6IGV4aXN0aW5nUnVudGltZSBpcyByZXVzZWQ7IGluaXRpYWxDb250ZXh0IGlzIG1vb3RcbiAgICAvLyAgICAgICBmb3IgdGhlIHN1YmZsb3cgZnJhbWUgKGFscmVhZHkgaW4gdGhlIHJ1bnRpbWUgc3RhY2spLCBidXQgd2VcbiAgICAvLyAgICAgICBzdGlsbCBwYXNzIHNoYXJlZFN0YXRlIGZvciBjb25zaXN0ZW5jeS5cbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG4gICAgbGV0IHJlc3VtZVJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0gaW5uZXJSZXN1bWVDaGFpbjtcbiAgICBsZXQgc3ViZmxvd3NPdmVycmlkZTogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobGVhZlN1YmZsb3dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBGaW5kIHRoZSBPVVRFUiBtb3VudCBub2RlIGZvciB0aGUgRklSU1QgZW50cnkgb24gdGhlIHBhdGguXG4gICAgICAvLyBGb3Igc2luZ2xlLWxldmVsIHBhdXNlcywgdGhpcyBpcyB0aGUgb25seSBtb3VudCB3ZSBuZWVkIHRvXG4gICAgICAvLyBlbnRlciB0aHJvdWdoLiBGb3IgbmVzdGVkIG1vdW50cyB0aGUgcGF0dGVybiB3b3VsZCBleHRlbmQsIGJ1dFxuICAgICAgLy8gc2luZ2xlLWxldmVsIGNvdmVycyBhbGwgY3VycmVudCB1c2UgY2FzZXMgKFNlcXVlbmNlKEFnZW50KSxcbiAgICAgIC8vIENvbmRpdGlvbmFsKEFnZW50KSwgUGFyYWxsZWwgYnJhbmNoZXMgd2l0aCBwYXVzZWQgYWdlbnRzKS5cbiAgICAgIGNvbnN0IG91dGVyU3ViZmxvd0lkID0gY2hlY2twb2ludC5zdWJmbG93UGF0aFswXTtcbiAgICAgIGNvbnN0IG91dGVyTW91bnQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoZmMucm9vdCwgb3V0ZXJTdWJmbG93SWQpO1xuICAgICAgaWYgKG91dGVyTW91bnQpIHtcbiAgICAgICAgcmVzdW1lUm9vdCA9IG91dGVyTW91bnQ7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNlIHRoZSBsZWFmIHN1YmZsb3cncyByb290IHdpdGggdGhlIHJlc3VtZSBjaGFpbiBzbyB0aGVcbiAgICAgIC8vIGJvZHkgcnVucyBmcm9tIHRoZSBwYXVzZSBwb2ludCBmb3J3YXJkLlxuICAgICAgc3ViZmxvd3NPdmVycmlkZSA9IHsgLi4uKGZjLnN1YmZsb3dzID8/IHt9KSB9O1xuICAgICAgc3ViZmxvd3NPdmVycmlkZVtsZWFmU3ViZmxvd0lkXSA9IHsgcm9vdDogaW5uZXJSZXN1bWVDaGFpbiB9O1xuICAgIH1cbiAgICAvLyBDbG9uZS1pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGBzZlN0YXRlc2AgYWJvdmU6IGBpbml0aWFsQ29udGV4dGBcbiAgICAvLyBzZWVkcyB0aGUgZnJlc2ggU2hhcmVkTWVtb3J5IHZpYSBgbWVyZ2VDb250ZXh0V2luc2AsIHdoaWNoIGNvcGllcyBvbmx5XG4gICAgLy8gdGhlIFRPUCBsZXZlbCDigJQgbmVzdGVkIG9iamVjdHMgd291bGQgYWxpYXMgdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQuXG4gICAgY29uc3QgcmVzdW1lSW5pdGlhbENvbnRleHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSk7XG5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKFxuICAgICAgb3B0aW9ucz8uc2lnbmFsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgb3B0aW9ucz8uZW52LFxuICAgICAgb3B0aW9ucz8ubWF4RGVwdGgsXG4gICAgICBvcHRpb25zPy5tYXhJdGVyYXRpb25zLFxuICAgICAge1xuICAgICAgICByb290OiByZXN1bWVSb290LFxuICAgICAgICBpbml0aWFsQ29udGV4dDogcmVzdW1lSW5pdGlhbENvbnRleHQsXG4gICAgICAgIHByZXNlcnZlUmVjb3JkZXJzOiB0cnVlLFxuICAgICAgICAuLi4oZXhpc3RpbmdSdW50aW1lID8geyBleGlzdGluZ1J1bnRpbWUgfSA6IHt9KSxcbiAgICAgICAgLy8gSGFuZCB0aGUgcGVyLXN1YmZsb3cgc2NvcGUgY2FwdHVyZXMgZG93biB0byBTdWJmbG93RXhlY3V0b3IuXG4gICAgICAgIC8vIEFsd2F5cyBwcmVzZW50IG9uIGEgY2hlY2twb2ludCDigJQgZW1wdHkgYHt9YCBmb3Igcm9vdCBwYXVzZXMuXG4gICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHNmU3RhdGVzLFxuICAgICAgICAuLi4oc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBGaXJlIG9uUmVzdW1lIGV2ZW50IG9uIGFsbCByZWNvcmRlcnMgKGZsb3cgKyBzY29wZSkuIFN0YW1wIHRoZVxuICAgIC8vIHN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciB0aGUgcmVzdW1lZCBzdGFnZSB3aXRoIHRoZSBORVdcbiAgICAvLyBydW5JZCBzbyBjb25zdW1lcnMgZGV0ZWN0IFwidGhpcyBpcyBhIGZyZXNoIGxvZ2ljYWwgcnVuXCIgdmlhXG4gICAgLy8gdGhlIHNhbWUgcnVuSWQtY2hhbmdlIHBhdHRlcm4gdGhleSB1c2UgZm9yIGBvblJ1blN0YXJ0YC5cbiAgICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdW1lUnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpO1xuICAgIGNvbnN0IGZsb3dSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgdHJhdmVyc2FsQ29udGV4dDoge1xuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogcmVzdW1lUnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgICBkZXB0aDogMCxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsOiAnZmxvdycgYXMgY29uc3QsXG4gICAgfTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB0aGlzLmNvbWJpbmVkUmVjb3JkZXIub25SZXN1bWUoZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oZmxvd1Jlc3VtZUV2ZW50KTtcblxuICAgIGNvbnN0IHNjb3BlUmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgcGlwZWxpbmVJZDogJycsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHIub25SZXN1bWU/LihzY29wZVJlc3VtZUV2ZW50KTtcblxuICAgIC8vIERlZmVycmVkIHRpZXIgKFJGQy0wMDEpOiB0aGVzZSBleGVjdXRvci1zeW50aGVzaXplZCBvblJlc3VtZSBldmVudHNcbiAgICAvLyBieXBhc3MgdGhlIHBlci1zdGFnZSBkaXNwYXRjaCBzaXRlcywgc28gY2FwdHVyZSB0aGVtIGRpcmVjdGx5LlxuICAgIGlmICh0aGlzLmRlZmVycmVkVGllcikge1xuICAgICAgdGhpcy5kZWZlcnJlZFRpZXIuY2FwdHVyZSgnZmxvdycsICdvblJlc3VtZScsIHJlc3VtZVJ1bnRpbWVTdGFnZUlkLCB0aGlzLl9jdXJyZW50UnVuSWQsIGZsb3dSZXN1bWVFdmVudCk7XG4gICAgICB0aGlzLmRlZmVycmVkVGllci5jYXB0dXJlKFxuICAgICAgICAnc2NvcGUnLFxuICAgICAgICAnb25SZXN1bWUnLFxuICAgICAgICBzY29wZVJlc3VtZUV2ZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzY29wZVJlc3VtZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICAgIHNjb3BlUmVzdW1lRXZlbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uL2xvb2t1cCB0aHJvd3MgYWJvdmUgKG5vdGhpbmcgY2FuIGxlYWsgdGhlXG4gICAgLy8gZmxhZyk7IG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHJhY2UtZnJlZS5cbiAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgdGhpcy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHRoaXMuYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZnVsbHkgREVUQUNIRUQgY2hlY2twb2ludCBmcm9tIGEgY2F1Z2h0IFBhdXNlU2lnbmFsLlxuICAgKlxuICAgKiBFdmVyeSBmaWVsZCBpcyBkZWVwLWNvcGllZCB2aWEgb25lIGBzdHJ1Y3R1cmVkQ2xvbmVgIG9mIHRoZSBhc3NlbWJsZWRcbiAgICogY2hlY2twb2ludCwgYmVjYXVzZSB0aGUgcmF3IHBpZWNlcyBhbGlhcyBsaXZlIGVuZ2luZSBzdGF0ZTpcbiAgICpcbiAgICogICAtIGBzaGFyZWRTdGF0ZWAgSVMgYFNoYXJlZE1lbW9yeWAncyBpbnRlcm5hbCBjb250ZXh0IG9iamVjdCDigJQgdGhlIGFsaWFzXG4gICAqICAgICBvbmx5IGRldGFjaGVzIGF0IHRoZSBuZXh0IGNvbW1pdCAoYGFwcGx5U21hcnRNZXJnZWAgcmVidWlsZHMgaXQpLCBhbmRcbiAgICogICAgIGFmdGVyIGEgcGF1c2UgdGhlcmUgaXMgbm8gbmV4dCBjb21taXQgdW50aWwgcmVzdW1lLlxuICAgKiAgIC0gYGV4ZWN1dGlvblRyZWVgIG5vZGVzIGFyZSBmcmVzaCwgYnV0IHRoZWlyIGBsb2dzYC9gZXJyb3JzYC9gbWV0cmljc2AvXG4gICAqICAgICBgZXZhbHNgL2BzdGFnZVJlYWRzYC9gZmxvd01lc3NhZ2VzYCBmaWVsZHMgcmVmZXJlbmNlIGxpdmVcbiAgICogICAgIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBiYWdzIHRoYXQga2VlcCBhY2N1bXVsYXRpbmcgb24gc2FtZS1leGVjdXRvclxuICAgKiAgICAgcmVzdW1lLlxuICAgKiAgIC0gYHN1YmZsb3dTdGF0ZXNgIHZhbHVlcyBhcmUgc2hhbGxvdyBjb3BpZXMgd2hvc2UgTkVTVEVEIG9iamVjdHMgYWxpYXNcbiAgICogICAgIHN1YmZsb3cgbWVtb3J5LCBhbmQgdGhleSBnZXQgc2VlZGVkIGJhY2sgaW50byBsaXZlIHJ1bnRpbWVzIG9uIHJlc3VtZS5cbiAgICogICAtIGBzdWJmbG93UmVzdWx0c2AgdmFsdWVzIHN0YXkgcmVmZXJlbmNlZCBieSB0aGUgdHJhdmVyc2VyJ3MgcmVzdWx0cyBtYXAuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIHBlcnNpc3RlZCBieSBjb250cmFjdCAoXCJzdG9yZSBpbiBSZWRpcy9Qb3N0Z3Jlc1wiKSDigJQgaXRcbiAgICogbXVzdCBuZXZlciBzaGFyZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW5naW5lLiBQYXVzZSBpcyBub3QgYSBob3QgcGF0aDsgdGhlXG4gICAqIGNsb25lIGNvc3QgaXMgaXJyZWxldmFudC5cbiAgICpcbiAgICogVGhlIEpTT04tc2FmZSBjaGVja3BvaW50IGNvbnRyYWN0IChubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcylcbiAgICogZ292ZXJucyBDT05TVU1FUi1vd25lZCBkYXRhIOKAlCBidXQgdGhlIGV4ZWN1dGlvblRyZWUncyBkaWFnbm9zdGljIGJhZ3NcbiAgICogYWNjZXB0IEFOWSB2YWx1ZSBhdCB3cml0ZSB0aW1lIHdpdGhvdXQgY2xvbmluZyAoJGRlYnVnLyRlcnJvci8kbWV0cmljL1xuICAgKiAkZXZhbCBzdG9yZSByYXcgcmVmZXJlbmNlcyksIHNvIGEgY29udHJhY3QtY29tcGxpYW50IHJ1biBjYW4gc3RpbGwgY2FycnlcbiAgICogYSBub24tY2xvbmVhYmxlIGRpYWdub3N0aWMuIE9ic2VydmFiaWxpdHkgc2lkZS1iYWdzIG5ldmVyIGFib3J0IHRyYXZlcnNhbFxuICAgKiBhbnl3aGVyZSBlbHNlIGluIHRoZSBsaWJyYXJ5LCBzbyB0aGV5IG11c3Qgbm90IGFib3J0IHRoZSBwYXVzZSBlaXRoZXI6XG4gICAqIG9uIGNsb25lIGZhaWx1cmUgd2Ugc2FuaXRpemUgdGhlIGRpYWdub3N0aWMgYmFncyAobm9uLWNsb25lYWJsZSB2YWx1ZXNcbiAgICogYmVjb21lICdbbm9uLXNlcmlhbGl6YWJsZTog4oCmXScgbWFya2VycyDigJQgdGhlIGxpdmUgZW5naW5lIGJhZ3MgYXJlIG5ldmVyXG4gICAqIHRvdWNoZWQpIGFuZCByZXRyeS4gSWYgdGhlIHJldHJ5IFNUSUxMIGZhaWxzLCB0aGUgdmlvbGF0aW9uIGlzIGluXG4gICAqIGNvbnN1bWVyLW93bmVkIGRhdGEgKHJlYWxpc3RpY2FsbHkgYHBhdXNlRGF0YWAg4oCUIGEgZnVuY3Rpb24gY2FuIG5ldmVyXG4gICAqIHJlYWNoIHNoYXJlZCBzdGF0ZSBpbiB0aGUgZmlyc3QgcGxhY2U6IFRyYW5zYWN0aW9uQnVmZmVyIGNsb25lcyBldmVyeVxuICAgKiB3cml0dGVuIHZhbHVlIGF0IHdyaXRlIHRpbWUsIHNvIHRoZSBvZmZlbmRpbmcgd3JpdGUgYWxyZWFkeSByZWplY3RlZClcbiAgICogYW5kIHdlIHRocm93IGEgREVTQ1JJUFRJVkUgY29udHJhY3QgZXJyb3IgbmFtaW5nIHRoZSBvZmZlbmRpbmdcbiAgICogY2hlY2twb2ludCBmaWVsZChzKS4gQSBuYWtlZCBEYXRhQ2xvbmVFcnJvciBuZXZlciBlc2NhcGVzLlxuICAgKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUgKGBzdWJmbG93U3RhdGVzYCkgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RpbmcgaXQgb250byB0aGVcbiAgICogY2hlY2twb2ludCBoZXJlIGxldHMgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIHJlc3RvcmUgcHJlLXBhdXNlIHN1YmZsb3dcbiAgICogc2NvcGUgKGUuZy4gYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWApLiBFbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQYXVzZUNoZWNrcG9pbnQoc2lnbmFsOiBQYXVzZVNpZ25hbCk6IEZsb3djaGFydENoZWNrcG9pbnQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIC8vIExlYW4gc3ViZmxvd1Jlc3VsdHMgZm9yIHRoZSBjaGVja3BvaW50IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpOlxuICAgIC8vICAg4oCiIERST1AgdGhlIHBlci1pdGVyYXRpb24gbW91bnQtcnVudGltZVN0YWdlSWQga2V5cyAoJyMnKSB0aGF0IHRoZSBzbmFwc2hvdCBkdWFsLWtleXMg4oCUXG4gICAgLy8gICAgIHRoZXkgd291bGQgRE9VQkxFIHRoZSBjaGVja3BvaW50LCBhbmQgcmVzdW1lIHJlc3RvcmVzIHNjb3BlIGZyb20gYHN1YmZsb3dTdGF0ZXNgLCBub3QgdGhlc2UuXG4gICAgLy8gICDigKIgU1RSSVAgZWFjaCBzdWJmbG93J3MgYHRyZWVDb250ZXh0Lmhpc3RvcnlgIOKAlCByZXN1bWUgTkVWRVIgcmVhZHMgYHN1YmZsb3dSZXN1bHRzYCAoaXRcbiAgICAvLyAgICAgcmVzdG9yZXMgZnJvbSBgc3ViZmxvd1N0YXRlc2AgKyBgc2hhcmVkU3RhdGVgKSwgc28gdGhlIHBlci1zdWJmbG93IGNvbW1pdCBsb2cgaXMgcHVyZVxuICAgIC8vICAgICBjaGVja3BvaW50IGJsb2F0LiBUaGUgZmxhdCBhZ2VudCdzIGNoZWNrcG9pbnQgY2FycmllcyBubyBjb21taXQgaGlzdG9yeSBlaXRoZXIg4oaSIHN5bW1ldHJpYy5cbiAgICBjb25zdCBsZWFuU3ViZmxvd1Jlc3VsdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc2ZSZXN1bHRzKSB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCcjJykpIGNvbnRpbnVlOyAvLyBwZXItaXRlcmF0aW9uIGtleXMgYXJlIHNuYXBzaG90LW9ubHlcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyB1bmtub3duIGFzIHsgdHJlZUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgaWYgKHY/LnRyZWVDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHRyZWVDdHhSZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNrIG9mIE9iamVjdC5rZXlzKHYudHJlZUNvbnRleHQpKSB7XG4gICAgICAgICAgaWYgKGNrICE9PSAnaGlzdG9yeScpIHRyZWVDdHhSZXN0W2NrXSA9IHYudHJlZUNvbnRleHRbY2tdOyAvLyBzdHJpcCB0aGUgcGVyLXN1YmZsb3cgY29tbWl0IGxvZ1xuICAgICAgICB9XG4gICAgICAgIGxlYW5TdWJmbG93UmVzdWx0c1trZXldID0geyAuLi4odmFsdWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIHRyZWVDb250ZXh0OiB0cmVlQ3R4UmVzdCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVhblN1YmZsb3dSZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHtcbiAgICAgIHNoYXJlZFN0YXRlOiBzbmFwc2hvdC5zaGFyZWRTdGF0ZSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICBwYXVzZWRTdGFnZUlkOiBzaWduYWwuc3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBzaWduYWwuc3ViZmxvd1BhdGgsXG4gICAgICBwYXVzZURhdGE6IHNpZ25hbC5wYXVzZURhdGEsXG4gICAgICBzdWJmbG93U3RhdGVzOiBzaWduYWwuc3ViZmxvd1N0YXRlcyxcbiAgICAgIC8vIENvdW50ZXIgY29udGludWl0eSDigJQgc2VlZGVkIGJhY2sgaW4gcmVzdW1lKCkgc28gcnVudGltZVN0YWdlSWRzIHN0YXlcbiAgICAgIC8vIHVuaXF1ZSBhbmQgbG9vcEl0ZXJhdGlvbiBzdGF5cyBtb25vdG9uaWMgYWNyb3NzIGEgQ1JPU1MtZXhlY3V0b3IgcmVzdW1lXG4gICAgICAvLyAoYm90aCBhcmUgcGxhaW4gbnVtYmVyL3JlY29yZCwgc28gdGhleSByaWRlIHRoZSBzaW5nbGUgc3RydWN0dXJlZENsb25lXG4gICAgICAvLyBiZWxvdyB1bnRvdWNoZWQpLiBTZWUgdGVzdC9saWIvcGF1c2UvcmVzdW1lLWV4ZWN1dGlvbi1jb3VudGVyLWNvbnRpbnVpdHkudGVzdC50cy5cbiAgICAgIGV4ZWN1dGlvbkNvdW50OiB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlLFxuICAgICAgdmlzaXRDb3VudHM6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLl92aXNpdENvdW50cyksXG4gICAgICAuLi4oT2JqZWN0LmtleXMobGVhblN1YmZsb3dSZXN1bHRzKS5sZW5ndGggPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IGxlYW5TdWJmbG93UmVzdWx0cyB9KSxcbiAgICAgIC8vIEludm9rZXIgY29udGV4dCDigJQgY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWwgYnViYmxlLXVwIChub3QgdHJlZS13YWxrZWQpXG4gICAgICAuLi4oc2lnbmFsLmludm9rZXJTdGFnZUlkICYmIHsgaW52b2tlclN0YWdlSWQ6IHNpZ25hbC5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgIC4uLihzaWduYWwuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IHNpZ25hbC5jb250aW51YXRpb25TdGFnZUlkIH0pLFxuICAgICAgLy8gSE9XIHRoZSBwYXVzZSB3YXMgcmFpc2VkLiBPbmUgY2hlY2twb2ludCBzaGFwZSwgb25lIGV4dHJhIG9wdGlvbmFsXG4gICAgICAvLyBmaWVsZCDigJQgYW4gaW50ZXJydXB0KCkgcGF1c2UgaXMgbm90IGEgc2Vjb25kIGtpbmQgb2YgY2hlY2twb2ludCwgaXQgaXNcbiAgICAgIC8vIHRoZSBzYW1lIGNoZWNrcG9pbnQgdGhhdCByZXN1bWUoKSByZS1lbnRlcnMgZGlmZmVyZW50bHkgKHN0YWdlIHRvcCB2c1xuICAgICAgLy8gcmVzdW1lRm4pLiBBYnNlbnQgZm9yIGV2ZXJ5IHByZS05LjE0LjAgY2hlY2twb2ludCwgd2hpY2ggaXMgY29ycmVjdC5cbiAgICAgIC4uLihzaWduYWwucGF1c2VkQnkgJiYgeyBwYXVzZWRCeTogc2lnbmFsLnBhdXNlZEJ5IH0pLFxuICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vbi1jbG9uZWFibGUgZGlhZ25vc3RpY3MgbXVzdCBub3Qgc3dhbGxvdyB0aGUgcGF1c2Ug4oCUIHNhbml0aXplIHRoZVxuICAgICAgLy8gZXhlY3V0aW9uVHJlZSdzIGJhZ3MgKG1hcmtlcnMgcmVwbGFjZSB0aGUgb2ZmZW5kZXJzKSBhbmQgcmV0cnkuXG4gICAgICB0cnkge1xuICAgICAgICBjaGVja3BvaW50LmV4ZWN1dGlvblRyZWUgPSBzYW5pdGl6ZURpYWdub3N0aWNCYWdzKGNoZWNrcG9pbnQuZXhlY3V0aW9uVHJlZSBhcyBTdGFnZVNuYXBzaG90KTtcbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50KTtcbiAgICAgIH0gY2F0Y2ggKHJldHJ5RXJyb3IpIHtcbiAgICAgICAgLy8gR2VudWluZSBKU09OLXNhZmUgY29udHJhY3QgdmlvbGF0aW9uIGluIGNvbnN1bWVyLW93bmVkIGRhdGEuXG4gICAgICAgIHRocm93IGRlc2NyaWJlQ2hlY2twb2ludENsb25lRmFpbHVyZShjaGVja3BvaW50LCByZXRyeUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQuXG4gICAqIEhhbmRsZXMgc3ViZmxvdyBwYXRocyBieSBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWQgc3ViZmxvd3MuXG4gICAqL1xuICBwcml2YXRlIGZpbmROb2RlSW5HcmFwaChzdGFnZUlkOiBzdHJpbmcsIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG5cbiAgICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUb3AtbGV2ZWw6IERGUyBmcm9tIHJvb3RcbiAgICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gICAgfVxuXG4gICAgLy8gU3ViZmxvdzogZHJpbGwgaW50byB0aGUgc3ViZmxvdyBjaGFpbiwgdGhlbiBzZWFyY2ggZnJvbSB0aGUgbGFzdCBzdWJmbG93J3Mgcm9vdFxuICAgIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgICBjb25zdCBzdWJmbG93ID0gZmMuc3ViZmxvd3M/LltzZklkXTtcbiAgICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICAgIH1cbiAgICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoc3ViZmxvd1Jvb3QsIHN0YWdlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG1vdW50IG5vZGUgKHRoZSBub2RlIHRoYXQgbW91bnRzIGEgc3ViZmxvdyBib3VuZGFyeSlcbiAgICogZm9yIGEgZ2l2ZW4gc3ViZmxvd0lkLCBieSBERlMgZnJvbSBgc3RhcnRgLiBVc2VkIGJ5IGByZXN1bWUoKWAgdG9cbiAgICogbG9jYXRlIHRoZSBPVVRFUiBub2RlIHdlIGhhdmUgdG8gZW50ZXIgdGhyb3VnaCBzbyB0aGUgc3ViZmxvdydzXG4gICAqIG91dHB1dE1hcHBlciBhbmQgcGFyZW50IGNvbnRpbnVhdGlvbiBleGVjdXRlLlxuICAgKlxuICAgKiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2ggKERGUyBvcmRlcikuXG4gICAqL1xuICBwcml2YXRlIGZpbmRNb3VudEluR3JhcGgoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChzdGFydC5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHN0YXJ0LmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChzdGFydC5pZCk7XG4gICAgaWYgKHN0YXJ0LnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTW91bnRJbkdyYXBoKGNoaWxkLCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0Lm5leHQpIHJldHVybiB0aGlzLmZpbmRNb3VudEluR3JhcGgoc3RhcnQubmV4dCwgc3ViZmxvd0lkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbiAgcHJpdmF0ZSBkZnNGaW5kKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICAgIGlmIChub2RlLmlkID09PSB0YXJnZXRJZCkgcmV0dXJuIG5vZGU7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIHRoaXMuZGZzRmluZChub2RlLm5leHQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgc2NvcGUgU2NvcGVSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cykuXG4gICAqIEF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgdG8gZXZlcnkgU2NvcGVGYWNhZGUgY3JlYXRlZCBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiBJZiBhIHJlY29yZGVyIHdpdGggdGhlIHNhbWUgYGlkYCBpcyBhbHJlYWR5IGF0dGFjaGVkLFxuICAgKiBpdCBpcyByZXBsYWNlZCAobm90IGR1cGxpY2F0ZWQpLiBUaGlzIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyB3aGVuIGJvdGhcbiAgICogYSBmcmFtZXdvcmsgYW5kIHRoZSB1c2VyIGF0dGFjaCB0aGUgc2FtZSByZWNvcmRlciB0eXBlLlxuICAgKlxuICAgKiBCdWlsdC1pbiByZWNvcmRlcnMgdXNlIGF1dG8taW5jcmVtZW50IElEcyAoYG1ldHJpY3MtMWAsIGBkZWJ1Zy0xYCwgLi4uKSBieVxuICAgKiBkZWZhdWx0LCBzbyBtdWx0aXBsZSBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBjb2V4aXN0LiBUbyBvdmVycmlkZVxuICAgKiBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciwgcGFzcyB0aGUgc2FtZSB3ZWxsLWtub3duIElELlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE11bHRpcGxlIHJlY29yZGVycyB3aXRoIGRpZmZlcmVudCBjb25maWdzIOKAlCBlYWNoIGdldHMgYSB1bmlxdWUgSURcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IERlYnVnUmVjb3JkZXIoeyB2ZXJib3NpdHk6ICdtaW5pbWFsJyB9KSk7XG4gICAqXG4gICAqIC8vIE92ZXJyaWRlIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyIGJ5IHBhc3NpbmcgaXRzIHdlbGwta25vd24gSURcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ21ldHJpY3MnKSk7XG4gICAqXG4gICAqIC8vIEF0dGFjaGluZyB0d2ljZSB3aXRoIHNhbWUgSUQgcmVwbGFjZXMgKG5vIGRvdWJsZS1jb3VudGluZylcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpOyAvLyByZXBsYWNlcyBwcmV2aW91c1xuICAgKiBgYGBcbiAgICpcbiAgICogKipEZWxpdmVyeSB0aWVyIChSRkMtMDAxKToqKiBwYXNzIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIHRvIHRha2UgdGhlXG4gICAqIHJlY29yZGVyIG91dCBvZiB0aGUgZW5naW5lJ3MgaG90IHBhdGgg4oCUIGV2ZW50cyBhcmUgY2FwdHVyZWQgaW50byBhXG4gICAqIGJvdW5kZWQgcXVldWUgYW5kIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludCAoXCJvbmUgYmVhdFxuICAgKiBiZWhpbmRcIikuIE9taXR0aW5nIGBkZWxpdmVyeWAga2VlcHMgdGhlIGhpc3RvcmljYWwgc3luY2hyb25vdXMgY2FsbCxcbiAgICogYnl0ZS1pZGVudGljYWwgdG8gcHJldmlvdXMgcmVsZWFzZXMuIFJlLWF0dGFjaGluZyB0aGUgc2FtZSBgaWRgIHdpdGggYVxuICAgKiBkaWZmZXJlbnQgdGllciBTV0FQUyB0aWVycyBjbGVhbmx5IOKAlCBuZXZlciBkb3VibGUgZGVsaXZlcnkuIFNlZVxuICAgKiBgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYC5cbiAgICovXG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICAvLyBUaWVyIHN3YXAsIGJvdGggZGlyZWN0aW9uczogYW4gaWQgbGl2ZXMgb24gZXhhY3RseSBPTkUgdGllciBwZXIgbGlzdC5cbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICBpZiAob3B0aW9ucz8uZGVsaXZlcnkgPT09ICdkZWZlcnJlZCcpIHtcbiAgICAgIHRoaXMuZW5zdXJlRGVmZXJyZWRUaWVyKG9wdGlvbnMpLnJlZ2lzdGVyKHJlY29yZGVyLCB7IHNjb3BlOiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlZmVycmVkVGllcj8ucmVtb3ZlRnJvbUxpc3RzKHJlY29yZGVyLmlkLCB7IHNjb3BlOiB0cnVlIH0pO1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IGNyZWF0ZSB0aGUgZXhlY3V0b3IncyBPTkUgZGVmZXJyZWQtb2JzZXJ2ZXIgdGllciAob25lIG1lcmdlZFxuICAgKiBxdWV1ZSwgdG90YWwgZXZlbnQgb3JkZXIgYWNyb3NzIGFsbCB0aHJlZSBjaGFubmVscykuIFRoZSBGSVJTVCBkZWZlcnJlZFxuICAgKiBhdHRhY2gncyBvcHRpb25zIGNvbmZpZ3VyZSB0aGUgZGlzcGF0Y2hlcjsgbGF0ZXIgZGlmZmVyaW5nIG9wdGlvbnMgYXJlXG4gICAqIGRldi13YXJuZWQgYW5kIGlnbm9yZWQgKHNlZSBgQXR0YWNoUmVjb3JkZXJPcHRpb25zYCkuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZURlZmVycmVkVGllcihvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogRGVmZXJyZWRPYnNlcnZlclRpZXIge1xuICAgIGlmICghdGhpcy5kZWZlcnJlZFRpZXIpIHRoaXMuZGVmZXJyZWRUaWVyID0gbmV3IERlZmVycmVkT2JzZXJ2ZXJUaWVyKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmRlZmVycmVkVGllcjtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBEZXRhY2ggKFQ0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gQmFyZS1leGVjdXRvciBlbnRyeSBwb2ludCBmb3IgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24uXG4gIC8vIFVzZSBmcm9tIG91dHNpZGUgYW55IGNoYXJ0IChjb25zdW1lciBjb2RlIHRoYXQgd2FudHMgdG8gZGV0YWNoIHdvcmtcbiAgLy8gd2l0aG91dCBmaXJzdCBydW5uaW5nIGEgcGFyZW50IGNoYXJ0KS4gRm9yIGRldGFjaCBGUk9NIElOU0lERSBhIHN0YWdlLFxuICAvLyB1c2UgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWAgLyBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYCDigJRcbiAgLy8gdGhvc2UgbWludCByZWZJZHMgZnJvbSB0aGUgY2FsbGluZyBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIGZvciB0cmFjZVxuICAvLyBjb3JyZWxhdGlvbjsgdGhlIGJhcmUtZXhlY3V0b3IgZW50cmllcyB1c2UgYSBzeW50aGV0aWMgcHJlZml4XG4gIC8vIChgX19leGVjdXRvcl9fYCkgaW5zdGVhZC5cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybiBhIGBEZXRhY2hIYW5kbGVgXG4gICAqIHRoZSBjYWxsZXIgY2FuIGB3YWl0KClgIG9uIChQcm9taXNlKSBvciByZWFkIGAuc3RhdHVzYCBmcm9tIChzeW5jKS5cbiAgICpcbiAgICogVGhlIGRyaXZlciBpcyBhIFJFUVVJUkVEIGZpcnN0IGFyZ3VtZW50IOKAlCB0aGVyZSBpcyBubyBsaWJyYXJ5LWRlZmF1bHQsXG4gICAqIHRvIGtlZXAgdGhlIGVuZ2luZSBmcmVlIG9mIGRyaXZlciBpbXBvcnRzIGFuZCB0byBtYWtlIHRoZSBjaG9pY2Ugb2ZcbiAgICogc2NoZWR1bGluZyBhbGdvcml0aG0gZXhwbGljaXQgYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGV4ZWMgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IocGFyZW50Q2hhcnQpO1xuICAgKiBjb25zdCBoYW5kbGUgPSBleGVjLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgdGVsZW1ldHJ5Q2hhcnQsIHsgZXZlbnQ6ICd4JyB9KTtcbiAgICogYXdhaXQgaGFuZGxlLndhaXQoKTsgLy8gb3B0aW9uYWxcbiAgICogYGBgXG4gICAqL1xuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUge1xuICAgIHJldHVybiBfZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIERJU0NBUkQgdGhlIGhhbmRsZS5cbiAgICogVXNlIGZvciB0ZWxlbWV0cnkgZXhwb3J0cyAvIGZpcmUtYW5kLWZvcmdldCBzaWRlIGVmZmVjdHMgd2hlcmUgdGhlXG4gICAqIGNhbGxlciBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogRXJyb3JzIHJhaXNlZCBieSB0aGUgY2hpbGQgc3RpbGwgbGFuZCBvbiB0aGUgKGRpc2NhcmRlZCkgaGFuZGxlIOKAlCB0aGV5XG4gICAqIGdvIHNpbGVudCB1bmxlc3Mgc3VyZmFjZWQgdGhyb3VnaCBhIHJlY29yZGVyLiBGb3Igb2JzZXJ2YWJsZSBkZXRhY2gsXG4gICAqIHByZWZlciBgZGV0YWNoQW5kSm9pbkxhdGVyYCBhbmQgc3VyZmFjZSBmYWlsdXJlcyB2aWEgYC53YWl0KCkuY2F0Y2goKWAuXG4gICAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgX2RldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hTY29wZVJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgICB0aGlzLmRlZmVycmVkVGllcj8ucmVtb3ZlRnJvbUxpc3RzKGlkLCB7IHNjb3BlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBzY29wZSBSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5zY29wZVJlY29yZGVycywgLi4uKHRoaXMuZGVmZXJyZWRUaWVyPy5zY29wZUxpc3RSZWNvcmRlcnMoKSA/PyBbXSldO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZsb3dSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLlxuICAgKiBBdXRvbWF0aWNhbGx5IGVuYWJsZXMgbmFycmF0aXZlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKSDigJQgcmVjb3JkZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHRyYXZlcnNlciBhdCBjcmVhdGlvbiB0aW1lLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqICoqRGVsaXZlcnkgdGllciAoUkZDLTAwMSk6KiogcGFzcyBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBmb3JcbiAgICogbmV4dC1jaGVja3BvaW50IGRlbGl2ZXJ5IG9mZiB0aGUgaG90IHBhdGgg4oCUIHNlZSBgYXR0YWNoU2NvcGVSZWNvcmRlcmAuXG4gICAqL1xuICBhdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXI6IEZsb3dSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIC8vIFRpZXIgc3dhcCwgYm90aCBkaXJlY3Rpb25zOiBhbiBpZCBsaXZlcyBvbiBleGFjdGx5IE9ORSB0aWVyIHBlciBsaXN0LlxuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zPy5kZWxpdmVyeSA9PT0gJ2RlZmVycmVkJykge1xuICAgICAgdGhpcy5lbnN1cmVEZWZlcnJlZFRpZXIob3B0aW9ucykucmVnaXN0ZXIocmVjb3JkZXIsIHsgZmxvdzogdHJ1ZSB9LCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZWZlcnJlZFRpZXI/LnJlbW92ZUZyb21MaXN0cyhyZWNvcmRlci5pZCwgeyBmbG93OiB0cnVlIH0pO1xuICAgIHRoaXMuZmxvd1JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQg4oCUIGJvdGggZGVsaXZlcnkgdGllcnMuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICAgIHRoaXMuZGVmZXJyZWRUaWVyPy5yZW1vdmVGcm9tTGlzdHMoaWQsIHsgZmxvdzogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgRmxvd1JlY29yZGVycyAoYm90aCB0aWVycykuICovXG4gIGdldEZsb3dSZWNvcmRlcnMoKTogRmxvd1JlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5mbG93UmVjb3JkZXJzLCAuLi4odGhpcy5kZWZlcnJlZFRpZXI/LmZsb3dMaXN0UmVjb3JkZXJzKCkgPz8gW10pXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDb21iaW5lZCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHJlY29yZGVyIHRoYXQgbWF5IG9ic2VydmUgbXVsdGlwbGUgZXZlbnQgc3RyZWFtcyAoc2NvcGVcbiAgICogZGF0YS1mbG93LCBjb250cm9sLWZsb3csIG9yIGJvdGgpLiBEZXRlY3RzIGF0IHJ1bnRpbWUgd2hpY2ggc3RyZWFtcyB0aGVcbiAgICogcmVjb3JkZXIgaGFzIG1ldGhvZHMgZm9yIGFuZCByb3V0ZXMgaXQgdG8gdGhlIGNvcnJlY3QgaW50ZXJuYWwgY2hhbm5lbHMuXG4gICAqXG4gICAqIFByZWZlcnJlZCBvdmVyIGNhbGxpbmcgYGF0dGFjaFNjb3BlUmVjb3JkZXJgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyYFxuICAgKiBzZXBhcmF0ZWx5LCBiZWNhdXNlIGZvcmdldHRpbmcgb25lIG9mIHRoZSB0d28gaXMgYSBzaWxlbnQgZm9vdC1ndW4g4oCUXG4gICAqIGhhbGYgeW91ciBldmVudHMgbmV2ZXIgZmlyZSBhbmQgdGhlcmUgaXMgbm8gcnVudGltZSB3YXJuaW5nLiBXaXRoXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0aGUgbGlicmFyeSBndWFyYW50ZWVzIHRoZSByZWNvcmRlcidzIGRlY2xhcmVkXG4gICAqIG1ldGhvZHMgYWxsIGZpcmUsIGFuZCBhZGRzIG5vIG92ZXJoZWFkIHZlcnN1cyB0d28gZXhwbGljaXQgY2FsbHMuXG4gICAqXG4gICAqICMjIElkZW1wb3RlbmN5XG4gICAqXG4gICAqIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgQUxMIGNoYW5uZWxzIOKAlCByZS1hdHRhY2hpbmcgd2l0aCB0aGUgc2FtZSBgaWRgXG4gICAqIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBldmVyeXdoZXJlIGl0IHdhcyByZWdpc3RlcmVkLiBNaXhpbmdcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIoeClgIHdpdGggYSBwcmlvciBgYXR0YWNoU2NvcGVSZWNvcmRlcih5KWAgb3JcbiAgICogYGF0dGFjaEZsb3dSZWNvcmRlcih5KWAgdGhhdCBzaGFyZSBgeC5pZCA9PT0geS5pZGAgaXMgYWxzbyBzYWZlOiB0aGVcbiAgICogY29tYmluZWQgYXR0YWNoIHJlcGxhY2VzIHRoZSBzaW5nbGUtY2hhbm5lbCByZWdpc3RyYXRpb24gb24gd2hpY2hldmVyXG4gICAqIGNoYW5uZWwocykgYHhgIGhhcyBtZXRob2RzIGZvci4gTm8gZHVwbGljYXRlIGZpcmluZ3Mgb2NjdXIuXG4gICAqXG4gICAqICMjIE5hcnJhdGl2ZSBhY3RpdmF0aW9uXG4gICAqXG4gICAqIElmIHRoZSByZWNvcmRlciBoYXMgYW55IGNvbnRyb2wtZmxvdyBtZXRob2RzLCBgZW5hYmxlTmFycmF0aXZlKClgIGlzXG4gICAqIGNhbGxlZCBhcyBhIHNpZGUgZWZmZWN0ICh0aGUgbmFycmF0aXZlIHN1YnN5c3RlbSBpcyByZXF1aXJlZCB0byBlbWl0XG4gICAqIGNvbnRyb2wtZmxvdyBldmVudHMpLiBEYXRhLWZsb3ctb25seSByZWNvcmRlcnMgZG8gTk9UIGFjdGl2YXRlIHRoZVxuICAgKiBuYXJyYXRpdmUuXG4gICAqXG4gICAqICMjIERldGVjdGlvbiBydWxlXG4gICAqXG4gICAqIE9ubHkgKipvd24qKiBldmVudCBtZXRob2RzIGNvdW50IChzZWUgYGhhc1JlY29yZGVyTWV0aG9kc2ApLiBNZXRob2RzXG4gICAqIGluaGVyaXRlZCB2aWEgdGhlIHByb3RvdHlwZSBjaGFpbiBhcmUgaWdub3JlZCDigJQgdGhpcyBwcm90ZWN0cyBhZ2FpbnN0XG4gICAqIGFjY2lkZW50YWwgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBhdHRhY2hpbmcgaGFuZGxlcnMgeW91IG5ldmVyXG4gICAqIGRlY2xhcmVkLiBBIHJlY29yZGVyIHRoYXQgcHJvdmlkZXMgb25seSBgY2xlYXJgL2B0b1NuYXBzaG90YCBpcyBhXG4gICAqIG5vLW9wIGFuZCBlbWl0cyBhIGRldi1tb2RlIHdhcm5pbmcgdG8gc3VyZmFjZSB0aGUgbGlrZWx5IG1pc3Rha2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAqICAgaWQ6ICdhdWRpdCcsXG4gICAqICAgb25Xcml0ZTogKGUpID0+IGxvZygnc2NvcGUgd3JpdGUnLCBlLmtleSksXG4gICAqICAgb25EZWNpc2lvbjogKGUpID0+IGxvZygncm91dGVkIHRvJywgZS5jaG9zZW4pLFxuICAgKiB9O1xuICAgKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyOiBDb21iaW5lZFJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRGF0YSA9IGhhc1JlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG4gICAgY29uc3QgaGFzRmxvdyA9IGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0VtaXQgPSBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcblxuICAgIC8vIERlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEpOiBvcHRpb25zIGJhZyBPUiB0aGUgcmVjb3JkZXIncyBvd25cbiAgICAvLyBgZGVsaXZlcnk6ICdkZWZlcnJlZCdgIGZpZWxkLiBUaGUgZmllbGQgaXMgYSBzdHJpbmcg4oCUIGNoYW5uZWwgcm91dGluZ1xuICAgIC8vIGFib3ZlIGNvdW50cyBldmVudC1NRVRIT0QgcHJvcGVydGllcyBvbmx5LCBzbyBkZWNsYXJpbmcgaXQgbmV2ZXJcbiAgICAvLyBjaGFuZ2VzIHdoaWNoIGNoYW5uZWxzIHRoZSByZWNvcmRlciBsYW5kcyBvbi5cbiAgICBjb25zdCBkZWxpdmVyeSA9IG9wdGlvbnM/LmRlbGl2ZXJ5ID8/IHJlY29yZGVyLmRlbGl2ZXJ5O1xuICAgIGNvbnN0IHRpZXJPcHRpb25zOiBBdHRhY2hSZWNvcmRlck9wdGlvbnMgfCB1bmRlZmluZWQgPSBkZWxpdmVyeSA9PT0gdW5kZWZpbmVkID8gb3B0aW9ucyA6IHsgLi4ub3B0aW9ucywgZGVsaXZlcnkgfTtcblxuICAgIC8vIEVtaXQgcmVjb3JkZXJzIGxpdmUgb24gdGhlIFNBTUUgY2hhbm5lbCBhcyBkYXRhLWZsb3cgcmVjb3JkZXJzXG4gICAgLy8gKFNjb3BlRmFjYWRlIGl0ZXJhdGVzIGBfcmVjb3JkZXJzYCBmb3Igb25FbWl0IGRpc3BhdGNoKS4gU29cbiAgICAvLyBhdHRhY2hFbWl0UmVjb3JkZXIgaW50ZXJuYWxseSBjYWxscyBhdHRhY2hTY29wZVJlY29yZGVyIOKAlCBidXQgd2Ugd2FudCB0b1xuICAgIC8vIGF2b2lkIGRvdWJsZS1hdHRhY2ggd2hlbiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBCT1RIIG9uRW1pdCBBTkRcbiAgICAvLyBvdGhlciBTY29wZVJlY29yZGVyIG1ldGhvZHMuIFNob3J0LWNpcmN1aXQ6IGlmIGhhc0RhdGEgT1IgaGFzRW1pdCwgdGhlXG4gICAgLy8gcmVjb3JkZXIgbGFuZHMgb24gdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgZXhhY3RseSBvbmNlLlxuICAgIGlmIChoYXNEYXRhIHx8IGhhc0VtaXQpIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyLCB0aWVyT3B0aW9ucyk7XG4gICAgaWYgKGhhc0Zsb3cpIHRoaXMuYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyIGFzIEZsb3dSZWNvcmRlciwgdGllck9wdGlvbnMpO1xuXG4gICAgaWYgKCFoYXNEYXRhICYmICFoYXNGbG93ICYmICFoYXNFbWl0ICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBvbmx5OiBzaWxlbnQgc2tpcHMgYXJlIGludmlzaWJsZSBhbmQgcHJvZHVjZSBoYXJkLXRvLWRlYnVnXG4gICAgICAvLyBcIndoeSBkaWRuJ3QgbXkgcmVjb3JkZXIgZmlyZVwiIHJlcG9ydHMuIFBlciBsaWJyYXJ5IGNvbnZlbnRpb24sIGdhdGVkXG4gICAgICAvLyBvbiB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIChub3QgcHJvY2Vzcy5lbnYpIHNvIGNvbnN1bWVycyBjYW5cbiAgICAgIC8vIGNvbnRyb2wgZGV2IHRvb2xpbmcgY2VudHJhbGx5IHZpYSBlbmFibGVEZXZNb2RlKCkvZGlzYWJsZURldk1vZGUoKS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGF0dGFjaENvbWJpbmVkUmVjb3JkZXI6IHJlY29yZGVyICcke3JlY29yZGVyLmlkfScgaGFzIGAgK1xuICAgICAgICAgICdubyBvYnNlcnZlciBldmVudCBtZXRob2RzIOKAlCBub3RoaW5nIHRvIGF0dGFjaC4gRGlkIHlvdSBmb3JnZXQgdG8gJyArXG4gICAgICAgICAgJ2FkZCBhbiBvbiogaGFuZGxlciAob25Xcml0ZSwgb25EZWNpc2lvbiwgb25TdWJmbG93RW50cnksIC4uLik/ICcgK1xuICAgICAgICAgICdOb3RlOiBvbmx5IE9XTiBwcm9wZXJ0aWVzIGNvdW50OyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gJyArXG4gICAgICAgICAgJ2FyZSBpZ25vcmVkIG9uIHB1cnBvc2UuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gYWxsIGNoYW5uZWxzIGl0IHdhcyBhdHRhY2hlZCB0by5cbiAgICogU2FmZSB0byBjYWxsIGlmIHRoZSByZWNvcmRlciB3YXMgb25seSBvbiBvbmUgY2hhbm5lbCBvciBuZXZlciBhdHRhY2hlZC5cbiAgICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gICAgdGhpcy5kZXRhY2hGbG93UmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEVtaXQgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IChQaGFzZSAzKSDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIOKAlCBhbiBvYnNlcnZlciBmb3IgY29uc3VtZXItZW1pdHRlZCBzdHJ1Y3R1cmVkXG4gICAqIGV2ZW50cyBmaXJlZCB2aWEgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAgICpcbiAgICogSW50ZXJuYWxseSwgZW1pdCByZWNvcmRlcnMgc2hhcmUgdGhlIHNjb3BlLXJlY29yZGVyIGNoYW5uZWwgYmVjYXVzZVxuICAgKiBlbWl0IGV2ZW50cyBmaXJlIGZyb20gaW5zaWRlIGBTY29wZUZhY2FkZWAgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbixcbiAgICogc2FtZSB0aW1pbmcgYXMgYG9uUmVhZGAvYG9uV3JpdGVgLiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIHRoYXRcbiAgICogZGVsZWdhdGVzIHRvIGBhdHRhY2hTY29wZVJlY29yZGVyYCDigJQgY29uc3VtZXJzIGNhbiBhbHNvIHVzZVxuICAgKiBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgZGlyZWN0bHkgZm9yIGEgcmVjb3JkZXIgdGhhdCBpbXBsZW1lbnRzIEJPVEhcbiAgICogYG9uV3JpdGVgIGFuZCBgb25FbWl0YC4gRWl0aGVyIGFwcHJvYWNoIHBsYWNlcyB0aGUgcmVjb3JkZXIgb24gdGhlXG4gICAqIHNhbWUgdW5kZXJseWluZyBsaXN0LCBzbyBgb25FbWl0YCBmaXJlcyBleGFjdGx5IG9uY2UgcGVyIGV2ZW50LlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgYGlkYDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIoe1xuICAgKiAgIGlkOiAndG9rZW4tbWV0ZXInLFxuICAgKiAgIG9uRW1pdDogKGUpID0+IHtcbiAgICogICAgIGlmIChlLm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykgdHJhY2tUb2tlbnMoZS5wYXlsb2FkKTtcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hFbWl0UmVjb3JkZXIocmVjb3JkZXI6IEVtaXRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCByZWNvcmRlcnMgKGJvdGggZGVsaXZlcnkgdGllcnMpXG4gICAqIGZpbHRlcmVkIHRvIHRob3NlIHRoYXQgaW1wbGVtZW50IGBvbkVtaXRgLiBVc2VmdWwgZm9yIGluc3BlY3Rpb24gZHVyaW5nXG4gICAqIHRlc3RpbmcuXG4gICAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTY29wZVJlY29yZGVycygpLmZpbHRlcihcbiAgICAgIChyKTogciBpcyBFbWl0UmVjb3JkZXIgPT4gdHlwZW9mIChyIGFzIHsgb25FbWl0PzogdW5rbm93biB9KS5vbkVtaXQgPT09ICdmdW5jdGlvbicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cnVjdHVyZWQgbmFycmF0aXZlIGVudHJpZXMg4oCUIHRoZSBzaW5nbGUgcHVibGljIG5hcnJhdGl2ZSBBUEkuXG4gICAqIEVhY2ggZW50cnkgaGFzIGEgdHlwZSAoc3RhZ2UsIHN0ZXAsIGNvbmRpdGlvbiwgZm9yaywgZXRjLiksIHRleHQsIGFuZFxuICAgKiBkZXB0aC4gQ29uc3VtZXJzIHJlbmRlciBob3dldmVyIHRoZXkgd2FudDsgY2FsbCBgLm1hcChlID0+IGUudGV4dClgXG4gICAqIGlmIGEgZmxhdCBgc3RyaW5nW11gIGlzIG5lZWRlZCBsb2NhbGx5LlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0RW50cmllcygpO1xuICAgIH1cbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXMubWFwKCh0ZXh0KSA9PiAoeyB0eXBlOiAnc3RhZ2UnIGFzIGNvbnN0LCB0ZXh0LCBkZXB0aDogMCB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tYmluZWQgRmxvd1JlY29yZGVycyBsaXN0LiBXaGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLFxuICAgKiBpbmNsdWRlcyB0aGUgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciAod2hpY2ggYnVpbGRzIG1lcmdlZCBmbG93K2RhdGFcbiAgICogZW50cmllcyBpbmxpbmUpLiBQbHVzIGFueSB1c2VyLWF0dGFjaGVkIHJlY29yZGVycy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpOiBGbG93UmVjb3JkZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJlY29yZGVycy5wdXNoKHRoaXMuY29tYmluZWRSZWNvcmRlcik7XG4gICAgfVxuICAgIHJlY29yZGVycy5wdXNoKC4uLnRoaXMuZmxvd1JlY29yZGVycyk7XG4gICAgLy8gRGVmZXJyZWQtb2JzZXJ2ZXIgZmxvdyB0YXAgKFJGQy0wMDEgQmxvY2sgNykg4oCUIGNhcHR1cmVzIGV2ZXJ5IGZsb3dcbiAgICAvLyBldmVudCBmb3IgZGVmZXJyZWQgbGlzdGVuZXJzLiBBcHBlbmRlZCBsaWtlIGFueSBvdGhlciBmbG93IHJlY29yZGVyLFxuICAgIC8vIHNvIHRoZSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHNpdGUgbmVlZHMgbm8gdGllciBsb2dpYyBvZiBpdHMgb3duLlxuICAgIGNvbnN0IGZsb3dUYXAgPSB0aGlzLmRlZmVycmVkVGllcj8uYnVpbGRGbG93VGFwKCk7XG4gICAgaWYgKGZsb3dUYXApIHJlY29yZGVycy5wdXNoKGZsb3dUYXApO1xuICAgIHJldHVybiByZWNvcmRlcnMubGVuZ3RoID4gMCA/IHJlY29yZGVycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBjaGFydC4gUmVzb2x2ZXMgd2hlbiB0aGUgcnVuIGZpbmlzaGVzIOKAlCBvciBwYXVzZXMsIGlmIGFcbiAgICogcGF1c2FibGUgc3RhZ2UgcmV0dXJuZWQgZGF0YSAoY2hlY2sgYGlzUGF1c2VkKClgIGFmdGVyd2FyZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIGB7IGlucHV0LCBlbnYgfWAg4oCUIGBpbnB1dGAgaXMgdGhlIGZyb3plbiBidXNpbmVzcyBpbnB1dFxuICAgKiAgIChyZWFkIGluIGEgc3RhZ2UgdmlhIGBzY29wZS4kZ2V0QXJncygpYCk7IGBlbnZgIGlzIGluZnJhc3RydWN0dXJlIGNvbnRleHRcbiAgICogICBsaWtlIGB7IHNpZ25hbCwgdGltZW91dE1zLCB0cmFjZUlkIH1gIChyZWFkIHZpYSBgc2NvcGUuJGdldEVudigpYCkuXG4gICAqXG4gICAqIEFmdGVyIGl0IHJlc29sdmVzLCByZWFkIHJlc3VsdHMgb2ZmIHRoZSBleGVjdXRvcjpcbiAgICogLSBgZ2V0U25hcHNob3QoKWAg4oCUIGZ1bGwgc3RhdGUsIGNvbW1pdCBsb2csIGV4ZWN1dGlvbiB0cmVlLlxuICAgKiAtIGBnZXROYXJyYXRpdmVFbnRyaWVzKClgIOKAlCB0aGUgcGxhaW4tRW5nbGlzaCB0cmFjZSAoY2FsbCBgZW5hYmxlTmFycmF0aXZlKClgXG4gICAqICAgb3IgYXR0YWNoIGEgYG5hcnJhdGl2ZSgpYCByZWNvcmRlciBmaXJzdCkuXG4gICAqIC0gYGlzUGF1c2VkKClgIOKAlCB0cnVlIGlmIGEgc3RhZ2UgcGF1c2VkOyB0aGVuIHVzZSBgZ2V0Q2hlY2twb2ludCgpYCAvIGByZXN1bWUoKWAuXG4gICAqXG4gICAqIE9uZSBydW4gYXQgYSB0aW1lIHBlciBleGVjdXRvciDigJQgaXQgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycyxcbiAgICogY2hlY2twb2ludCkuIENyZWF0ZSBvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLlxuICAgKi9cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIFJlLWVudHJhbmN5IGd1YXJkIEZJUlNUIOKAlCBiZWZvcmUgY2xlYXJpbmcgcmVjb3JkZXJzIG9yIHRvdWNoaW5nIGFueVxuICAgIC8vIHBlci1ydW4gZmllbGQsIHNvIGEgcmVqZWN0ZWQgY29uY3VycmVudCBjYWxsIGxlYXZlcyB0aGUgaW4tZmxpZ2h0IHJ1blxuICAgIC8vIGNvbXBsZXRlbHkgdW50b3VjaGVkLlxuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRmxvd0NoYXJ0RXhlY3V0b3I6IHJ1bigpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzICcgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50LiBWYWxpZGF0aW9uIHJ1bnNcbiAgICAvLyBCRUZPUkUgdGhlIHRpbWVvdXQgdGltZXIgaXMgY3JlYXRlZCBzbyBhIHJlamVjdGVkIGlucHV0IGNhbid0IGxlYWsgYVxuICAgIC8vIHBlbmRpbmcgdGltZXIgKHNhbWUgXCJmYWlsZWQgZW50cnkgbGVhdmVzIG5vIHNpZGUgZWZmZWN0c1wiIHJ1bGUgYXMgdGhlXG4gICAgLy8gcmUtZW50cmFuY3kgZ3VhcmQgYWJvdmUpLlxuICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgIH1cblxuICAgIGxldCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgbGV0IHRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW50ZXJuYWwgQWJvcnRDb250cm9sbGVyIGZvciB0aW1lb3V0TXNcbiAgICBpZiAob3B0aW9ucz8udGltZW91dE1zICYmICFzaWduYWwpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGNvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucy50aW1lb3V0TXN9bXNgKSksXG4gICAgICAgIG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVc2VyLWF0dGFjaGVkIHJlY29yZGVycyAoZmxvd1JlY29yZGVycyArIHNjb3BlUmVjb3JkZXJzKSBhcmUgY2xlYXJlZCB2aWEgY2xlYXIoKSB0byBwcmV2ZW50XG4gICAgLy8gY3Jvc3MtcnVuIGFjY3VtdWxhdGlvbi4gVGhlIGNvbWJpbmVkUmVjb3JkZXIgaXMgTk9UIGNsZWFyZWQgaGVyZSDigJQgY3JlYXRlVHJhdmVyc2VyKCkgYWx3YXlzXG4gICAgLy8gY3JlYXRlcyBhIGZyZXNoIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgaW5zdGFuY2Ugb24gZWFjaCBydW4sIHNvIHN0YWxlIHN0YXRlIGlzIG5ldmVyIGFuIGlzc3VlLlxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuICAgIHRoaXMuZGVmZXJyZWRUaWVyPy5jbGVhclJlY29yZGVycygpO1xuXG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9OyAvLyBSZXNldCBjb3VudGVyIG9uIGZyZXNoIHJ1blxuICAgIHRoaXMuX3Zpc2l0Q291bnRzID0gbmV3IE1hcCgpOyAvLyBSZXNldCBsb29wLWl0ZXJhdGlvbiBjb3VudHMgb24gZnJlc2ggcnVuICh0d2luIG9mIF9leGVjdXRpb25Db3VudGVyKVxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTsgLy8gRnJlc2ggcnVuSWQgcGVyIHJ1bigpIGNhbGxcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBtYXJrIHNvIGEgbGF0ZXIgcmVzdW1lKCkgdGFrZXMgdGhlXG4gICAgLy8gc2FtZS1leGVjdXRvciBicmFuY2ggKHJldXNlIHJ1bnRpbWUsIGFjY3VtdWxhdGUgZXhlY3V0aW9uIHRyZWUpLlxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoXG4gICAgICBzaWduYWwsXG4gICAgICB2YWxpZGF0ZWRJbnB1dCxcbiAgICAgIG9wdGlvbnM/LmVudixcbiAgICAgIG9wdGlvbnM/Lm1heERlcHRoLFxuICAgICAgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uIHRocm93cyAobm90aGluZyBhYm92ZSBjYW4gbGVhayB0aGUgZmxhZyk7XG4gICAgLy8gbm8gYXdhaXQgYmV0d2VlbiB0aGUgdG9wLW9mLW1ldGhvZCBjaGVjayBhbmQgaGVyZSwgc28gdGhpcyBpcyByYWNlLWZyZWUuXG4gICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAvLyBUZXJtaW5hbCBmbHVzaCAoUkZDLTAwMSBCbG9jayA4KSBhdCB0aGUgUkVTT0xWRSBib3VuZGFyeTogZXZlcnlcbiAgICAgIC8vIGNhcHR1cmVkLWJ1dC11bmRlbGl2ZXJlZCBvYnNlcnZlciBldmVudCBpcyBkZWxpdmVyZWQgc3luY2hyb25vdXNseVxuICAgICAgLy8gYmVmb3JlIHJ1bigpIHJldHVybnMg4oCUIFwib25lIGJlYXQgYmVoaW5kXCIgbmV2ZXIgYmVjb21lcyBcImxvc3QgYXQgZXhpdFwiLlxuICAgICAgdGhpcy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIGF0IHRoZSBQQVVTRSBhbmQgUkVKRUNUIGJvdW5kYXJpZXMg4oCUIHRoaXMgaXMgdGhlXG4gICAgICAvLyBPVVRFUk1PU1QgaGFuZGxlciAoYSBwYXVzZSByZS10aHJvd3MgdGhyb3VnaCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAgIC8vIHdpdGhvdXQgZXhpdCBldmVudHMsIHNvIHBlci10cmF2ZXJzZXIgaG9va3Mgd291bGQgbWlzcyBpdCkuIFJ1bnNcbiAgICAgIC8vIGJlZm9yZSB0aGUgY2hlY2twb2ludCBpcyBleHBvc2VkIGFuZCBiZWZvcmUgdGhlIGVycm9yIHJlYWNoZXMgdGhlXG4gICAgICAvLyBjYWxsZXIuXG4gICAgICB0aGlzLmRlZmVycmVkVGllcj8udGVybWluYWxGbHVzaCgpO1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIC8vIEJ1aWxkIGEgZGV0YWNoZWQgY2hlY2twb2ludCBmcm9tIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlIOKAlCBzZWVcbiAgICAgICAgLy8gYnVpbGRQYXVzZUNoZWNrcG9pbnQoKSBmb3IgdGhlIGRlZXAtY29weSByYXRpb25hbGUuXG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB0aGlzLmJ1aWxkUGF1c2VDaGVja3BvaW50KGVycm9yKTtcbiAgICAgICAgLy8gUmV0dXJuIGEgUGF1c2VSZXN1bHQtc2hhcGVkIHZhbHVlIHNvIGNhbGxlcnMgY2FuIGNoZWNrIHdpdGhvdXQgdHJ5L2NhdGNoXG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSBkZWZlcnJlZC1vYnNlcnZlciBiYWNrbG9nLCB0aGVuIGF3YWl0IGFzeW5jIGxpc3RlbmVyXG4gICAqIGNvbXBsZXRpb25zIHVuZGVyIGEgZGVhZGxpbmUgKFJGQy0wMDEgQmxvY2sgOCDigJQgdGhlIHNlcnZlcmxlc3MgL1xuICAgKiBncmFjZWZ1bC1zaHV0ZG93biBwYXR0ZXJuOiBjYWxsIGJlZm9yZSB0aGUgcHJvY2VzcyBmcmVlemVzIG9yIGV4aXRzIHNvXG4gICAqIFwib25lIGJlYXQgYmVoaW5kXCIgd29yayBpcyBub3QgbG9zdCkuIFJlc29sdmVzIGltbWVkaWF0ZWx5IHdpdGggemVyb3NcbiAgICogd2hlbiBubyBkZWZlcnJlZCBvYnNlcnZlciB3YXMgZXZlciBhdHRhY2hlZC4gYHBlbmRpbmcgPT09IDBgIG1lYW5zIGFcbiAgICogZnVsbCBkcmFpbjsgYSBub24temVybyBgcGVuZGluZ2AgcmVwb3J0cyBjb250aW51YXRpb25zIChwbHVzIGFueSBxdWV1ZWRcbiAgICogZXZlbnRzKSBzdGlsbCBvdXRzdGFuZGluZyBhdCB0aGUgZGVhZGxpbmUg4oCUIGhvbmVzdCwgbmV2ZXIgc2lsZW50LlxuICAgKi9cbiAgZHJhaW5PYnNlcnZlcnMob3B0cz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPE9ic2VydmVyRHJhaW5SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuZGVmZXJyZWRUaWVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogMCwgZmFpbGVkOiAwLCBwZW5kaW5nOiAwIH0pO1xuICAgIHJldHVybiB0aGlzLmRlZmVycmVkVGllci5kcmFpbihvcHRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCBgc2hhcmVkU3RhdGVgIGNvbWVzIGZyb20gdGhlIHBhcmFsbGVsXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIChpZiBtYWludGFpbmVkIOKAlCBzZWUgYHNldFJlZGFjdGlvblBvbGljeWApLiBUaGlzIGlzXG4gICAqICAgdGhlIHNhZmUgdmlldyBmb3IgZXhwb3J0aW5nIHRyYWNlcyBleHRlcm5hbGx5IChwYXN0ZSBpbnRvIGEgdmlld2VyLFxuICAgKiAgIHNoYXJlIHdpdGggc3VwcG9ydCkuIFdoZW4gbm8gcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciBpcyBub3QgbWFpbnRhaW5lZCwgc28gdGhpcyBmbGFnIGlzIGEgbm8tb3Ag4oCUXG4gICAqICAgYHNoYXJlZFN0YXRlYCBpcyB0aGUgcmF3IHdvcmtpbmcgbWVtb3J5IGVpdGhlciB3YXkuIERlZmF1bHQgYGZhbHNlYC5cbiAgICpcbiAgICogICBUaGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUgcmVnYXJkbGVzcyBvZiB0aGlzXG4gICAqICAgZmxhZywgYW5kIHRoZSBleGVjdXRpb24gdHJlZSBjYXJyaWVzIG9ubHkgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICogICBgc3ViZmxvd1Jlc3VsdHNbKl0udHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgZm9sbG93cyB0aGUgZmxhZyB0b29cbiAgICogICAoOS4yMC4wKTogdW5kZXIgYHJlZGFjdDogdHJ1ZWAgaXQgaXMgZWFjaCBzdWJmbG93J3Mgb3duIHJlZGFjdGVkXG4gICAqICAgbWlycm9yOyBwbGFpbiwgdGhlIHN1YmZsb3cncyBsaXZlIGhlYXAuXG4gICAqXG4gICAqICoqVHJlYXQgYHNoYXJlZFN0YXRlYCBhcyBSRUFELU9OTFkuKiogSW4gcHJvZHVjdGlvbiBpdCBpcyBhIGxpdmUgdmlldyBvZlxuICAgKiB0aGUgZW5naW5lJ3Mgd29ya2luZyBtZW1vcnkgKHplcm8gY29weSBjb3N0KSDigJQgbXV0YXRpbmcgaXQgY29ycnVwdHNcbiAgICogZW5naW5lIHN0YXRlLiBJbiBkZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIGl0IGlzIGEgZGVlcC1mcm96ZW4gQ0xPTkUsXG4gICAqIHNvIGFueSBjb25zdW1lciBtdXRhdGlvbiB0aHJvd3MgbG91ZGx5IGluc3RlYWQgb2YgY29ycnVwdGluZyBzaWxlbnRseS5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdChvcHRpb25zKSBhcyBSdW50aW1lU25hcHNob3Q7XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBtdXRhdGlvbiBndWFyZDogZnJlZXplIGEgQ0xPTkUsIG5ldmVyIHRoZSBsaXZlIGVuZ2luZVxuICAgICAgLy8gc3RhdGUg4oCUIGBzbmFwc2hvdC5zaGFyZWRTdGF0ZWAgYWxpYXNlcyBTaGFyZWRNZW1vcnkncyBpbnRlcm5hbFxuICAgICAgLy8gY29udGV4dCB1bnRpbCB0aGUgbmV4dCBjb21taXQgcmVidWlsZHMgaXQgKHBvc3QtcnVuOiBmb3JldmVyKS5cbiAgICAgIC8vIFByb2R1Y3Rpb24gc3RheXMgemVyby1jb3B5OyBjbG9uZS1hbHdheXMgaXMgYSBtZWFzdXJlZCBkZWNpc2lvblxuICAgICAgLy8gZGVmZXJyZWQgdW50aWwgdGhlIGJlbmNoIHNheXMgaXQncyBhZmZvcmRhYmxlIChCQUNLTE9HICM4KS5cbiAgICAgIC8vIE5PVEU6IGRlZXBGcmVlemUgKHJldXNlZCBmcm9tIHJlYWRvbmx5SW5wdXQpIGZyZWV6ZXMgcGxhaW4gb2JqZWN0cy9cbiAgICAgIC8vIGFycmF5cyBvbmx5IOKAlCBNYXAvU2V0IElOVEVSTkFMUyBzdGF5IG11dGFibGUgKGBtYXAuc2V0KClgIG9uIHRoZVxuICAgICAgLy8gZnJvemVuIGNsb25lIHdvbid0IHRocm93KS4gVGhlIENMT05FIHN0aWxsIGlzb2xhdGVzIHRoZSBlbmdpbmUuXG4gICAgICBzbmFwc2hvdC5zaGFyZWRTdGF0ZSA9IGRlZXBGcmVlemUoc3RydWN0dXJlZENsb25lKHNuYXBzaG90LnNoYXJlZFN0YXRlKSk7XG4gICAgfVxuICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgaWYgKHNmUmVzdWx0cy5zaXplID4gMCkge1xuICAgICAgLy8gVW5kZXIgYHJlZGFjdDogdHJ1ZWAgZWFjaCBzdWJmbG93J3MgYGdsb2JhbENvbnRleHRgIGlzIGl0cyBvd24gbWlycm9yXG4gICAgICAvLyAoOS4yMC4wKSDigJQgc2VydmVkLCBuZXZlciB3cml0dGVuIGludG8gdGhlIHJlY29yZCAoc2VlXG4gICAgICAvLyBlbmdpbmUvaGFuZGxlcnMvc2VydmVkU3ViZmxvd1Jlc3VsdHMudHMpLiBQbGFpbjogdGhlIHJlY29yZHMgYXMgdGhleSBhcmUuXG4gICAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IHNlcnZlZFN1YmZsb3dSZXN1bHRzKHNmUmVzdWx0cywgb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmRlclNuYXBzaG90cyA9IHRoaXMuY29sbGVjdFJlY29yZGVyU25hcHNob3RzKCk7XG4gICAgaWYgKHJlY29yZGVyU25hcHNob3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnJlY29yZGVycyA9IHJlY29yZGVyU25hcHNob3RzO1xuICAgIH1cblxuICAgIC8vIFJGQy0wMDEgQmxvY2sgOTogdGhlIGRlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgc3VyZmFjZS4gUHJlc2VudFxuICAgIC8vIE9OTFkgd2hlbiBhIGRlZmVycmVkIG9ic2VydmVyIHdhcyBhdHRhY2hlZCBvbiB0aGlzIGV4ZWN1dG9yIOKAlFxuICAgIC8vIHplcm8tY29zdCBkaXNjaXBsaW5lIGZvciBldmVyeW9uZSBlbHNlLlxuICAgIGlmICh0aGlzLmRlZmVycmVkVGllcikge1xuICAgICAgc25hcHNob3Qub2JzZXJ2ZXJTdGF0cyA9IHRoaXMuZGVmZXJyZWRUaWVyLmdldFN0YXRzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgYHRvU25hcHNob3QoKWAgYnVuZGxlcyBmcm9tIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIOKAlCBPTkUgZW50cnlcbiAgICogcGVyIHJlY29yZGVyIGlkLCBhY3Jvc3MgYWxsIGNoYW5uZWxzIGFuZCBib3RoIGRlbGl2ZXJ5IHRpZXJzLlxuICAgKlxuICAgKiBUaGUgZGVkdXBlIGlzIGxvYWQtYmVhcmluZywgbm90IHRpZGluZXNzLiBBIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBhXG4gICAqIHNoYXJlZC1uYW1lIGhvb2sgKGBvbkVycm9yYCAvIGBvblBhdXNlYCAvIGBvblJlc3VtZWAg4oCUIGRlY2xhcmVkIG9uIEJPVEhcbiAgICogdGhlIHNjb3BlIGFuZCBmbG93IGludGVyZmFjZXMpIGlzIGxlZ2l0aW1hdGVseSByZWdpc3RlcmVkIG9uIEJPVEggaW5saW5lXG4gICAqIGxpc3RzIGJ5IGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCwgYW5kIHRoYXQgaXMgYnkgZGVzaWduOiBlYWNoIGNoYW5uZWxcbiAgICogY2FsbHMgdGhlIGhvb2sgd2l0aCBpdHMgb3duIHBheWxvYWQgdmFyaWFudC4gYE1ldHJpY1JlY29yZGVyLm9uUGF1c2VgIGlzXG4gICAqIHRoZSBldmVyeWRheSBjYXNlLiBXYWxraW5nIHRoZSBsaXN0cyB3aXRob3V0IGEgc2hhcmVkIGBzZWVuYCBzZXQgdHVybmVkXG4gICAqIHRoYXQgaW50byBhIERVUExJQ0FURUQgc25hcHNob3QgZW50cnkgKHNhbWUgaWQgdHdpY2UpLCB3aGljaCBicmVha3MgZXZlcnlcbiAgICogY29uc3VtZXIgdGhhdCBpbmRleGVzIGBzbmFwc2hvdC5yZWNvcmRlcnNgIGJ5IGlkLlxuICAgKlxuICAgKiBPcmRlcmluZyBpcyBzY29wZSBsaXN0IOKGkiBmbG93IGxpc3Qg4oaSIGRlZmVycmVkIHRpZXIsIGFuZCB0aGUgRklSU1QgYnVuZGxlXG4gICAqIGZvciBhbiBpZCB3aW5zLiBBIHJlY29yZGVyIHdpdGggbm8gYHRvU25hcHNob3RgIG5ldmVyIGNsYWltcyBhbiBpZCwgc28gaXRcbiAgICogY2Fubm90IHNoYWRvdyBhIHNhbWUtaWQgcmVjb3JkZXIgdGhhdCBkb2VzIGhhdmUgb25lLlxuICAgKlxuICAgKiBUaGUgcm93IGlzIFJFQlVJTFQgZmllbGQgYnkgZmllbGQgcmF0aGVyIHRoYW4gc3ByZWFkLCBzbyB0aGF0IGEgcmVjb3JkZXJcbiAgICogY2Fubm90IHNtdWdnbGUgYW4gYGlkYCBvZiBpdHMgb3duIGNob29zaW5nIGludG8gdGhlIHNuYXBzaG90ICh0aGUgaWQgaXNcbiAgICogdGhlIGV4ZWN1dG9yJ3MsIGFuZCBjb25zdW1lcnMgaW5kZXggYnkgaXQpLiBUaGUgY29zdCBvZiB0aGF0IGlzIHJlYWw6XG4gICAqIGFueXRoaW5nIHRoZSByZWNvcmRlciByZXR1cm5zIGFuZCB0aGlzIGxpc3QgZm9yZ2V0cyBpcyBkcm9wcGVkIGluXG4gICAqIHNpbGVuY2UuIGBtZXRhYCBpcyBvbiB0aGUgbGlzdCBmb3IgZXhhY3RseSB0aGF0IHJlYXNvbiDigJQgYSByZWNvcmRlciB0aGF0XG4gICAqIHNoaXBzIG1vcmUgdGhhbiBvbmUgYnVuZGxlIHNoYXBlIG5lZWRzIG9uZSBmaWVsZCBhbiBvZmZsaW5lIHJlYWRlciBjYW5cbiAgICogYnJhbmNoIG9uLCBhbmQgdW50aWwgaXQgd2FzIGNvcGllZCBoZXJlIHRoZSBvbmx5IHBsYWNlIHRvIHNheSB3aGljaFxuICAgKiBzaGFwZSB5b3Ugd2VyZSBob2xkaW5nIHdhcyB0aGUgcHJvc2UgaW4gYGRlc2NyaXB0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdFJlY29yZGVyU25hcHNob3RzKCk6IFJlY29yZGVyU25hcHNob3RbXSB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgY29sbGVjdCA9IChyOiBTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXIudG9TbmFwc2hvdCB8fCBzZWVuLmhhcyhyLmlkKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQoci5pZCk7XG4gICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICBvdXQucHVzaCh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIG1ldGE6IHNuYXAubWV0YSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIGNvbGxlY3Qocik7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykgY29sbGVjdChyKTtcbiAgICBpZiAodGhpcy5kZWZlcnJlZFRpZXIpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmRlZmVycmVkVGllci5zY29wZUxpc3RSZWNvcmRlcnMoKSkgY29sbGVjdChyKTtcbiAgICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmRlZmVycmVkVGllci5mbG93TGlzdFJlY29yZGVycygpKSBjb2xsZWN0KHIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRNYW5pZmVzdCgpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGwgc3BlYyBmb3IgYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIHN1YmZsb3cuXG4gICAqIFJlcXVpcmVzIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyIHRoYXQgb2JzZXJ2ZWQgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGdldFN1YmZsb3dTcGVjKHN1YmZsb3dJZDogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cbiJdfQ==
|
|
1476
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUsZUFBZSxJQUFJLGdCQUFnQixFQUFFLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRWxGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRzdGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQy9FLE9BQU8sRUFXTCxhQUFhLEdBQ2QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFRdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXJILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXRELE9BQU8s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UyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHsgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHsgc2VydmVkU3ViZmxvd1Jlc3VsdHMgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvc2VydmVkU3ViZmxvd1Jlc3VsdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VGdW5jdGlvbixcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3RyZWFtSGFuZGxlcnMsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgdHlwZSBUcmF2ZXJzYWxSZXN1bHQsXG4gIGRlZmF1bHRMb2dnZXIsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1pdFZhbHVlc01vZGUsXG4gIFJlYWRUcmFja2luZ01vZGUsXG4gIFN0YWdlU25hcHNob3QsXG4gIFdyaXRlUHJvdmVuYW5jZU1vZGUsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvdmlkZUludGVycnVwdEFuc3dlciB9IGZyb20gJy4uL3BhdXNlL2ludGVycnVwdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgaGFzRW1pdFJlY29yZGVyTWV0aG9kcywgaGFzRmxvd1JlY29yZGVyTWV0aG9kcywgaGFzUmVjb3JkZXJNZXRob2RzIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlLCBzYW5pdGl6ZURpYWdub3N0aWNCYWdzIH0gZnJvbSAnLi9jaGVja3BvaW50U2FuaXRpemUuanMnO1xuaW1wb3J0IHsgdHlwZSBBdHRhY2hSZWNvcmRlck9wdGlvbnMsIHR5cGUgT2JzZXJ2ZXJEcmFpblJlc3VsdCwgRGVmZXJyZWRPYnNlcnZlclRpZXIgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcbmltcG9ydCB7IHR5cGUgUmVjb3JkZXJTbmFwc2hvdCwgdHlwZSBSdW50aW1lU25hcHNob3QsIEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSdW5JZCB9IGZyb20gJy4vcnVuSWQuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbi8qKiBEZWZhdWx0IHNjb3BlIGZhY3Rvcnkg4oCUIGNyZWF0ZXMgYSBwbGFpbiBTY29wZUZhY2FkZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmNvbnN0IGRlZmF1bHRTY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeSA9IChjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudikgPT5cbiAgbmV3IFNjb3BlRmFjYWRlKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KTtcblxuLyoqXG4gKiBUaGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4gZm9yIGEgcmVzdW1lOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgc28gaXQga2VlcHNcbiAqIGl0cyBzaGFwZSAoYSBkZWNpZGVyJ3Mgb3Igc2VsZWN0b3IncyBicmFuY2hlcywgYSBmb3JrIHBhcmVudCdzIGNoaWxkcmVuLFxuICogaXRzIGBuZXh0YCkgYW5kIGl0cyBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgZGVjbGFyZWQgdGFncyDigJQgd2l0aCBgZm5gIHN3YXBwZWRcbiAqIGZvciB0aGUgcmVzdW1lIGhhbGYuXG4gKlxuICogRHJvcHBlZDogYHJlc3VtZUZuYCBhbmQgYGlzUGF1c2FibGVgICh0aGUgcmVzdW1lIGhhbGYgbXVzdCBub3QgcGF1c2VcbiAqIGJlY2F1c2UgaXQgcmV0dXJuZWQgYSB2YWx1ZSDigJQgdGhlIG9yaWdpbmFsIHBhdXNhYmxlIGNvbnRyYWN0KTsgYW5kLCBvbiB0aGVcbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZS1lbnRyeSwgdGhlIHBvbGljaWVzIGRlY2xhcmVkIGZvciB0aGUgc3RhZ2UncyBPV05cbiAqIGZ1bmN0aW9uIChgcmV0cnlgLCBzdHJlYW1pbmcpIOKAlCB0aGF0IHJlLWVudHJ5IHJ1bnMgYSBkaWZmZXJlbnQgZnVuY3Rpb25cbiAqIChgcmVzdW1lRm5gKSB1bmRlciBhIGRpZmZlcmVudCBjb250cmFjdC4gVGhlIGBpbnRlcnJ1cHQoKWAgcmUtZW50cnkgcmUtcnVuc1xuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCBzbyBpdCBrZWVwcyB0aGVtLlxuICpcbiAqIFRhZ3MgZm9sbG93IHRoZSBzdGFnZSBvbiBCT1RIIHJlLWVudHJpZXMgKDkuMjEuMCk6IGEgdGFnIGlzIHRoZSBzdGFnZSdzXG4gKiBOQU1FLCBub3QgYSBwb2xpY3kgb3ZlciBpdHMgZnVuY3Rpb24sIGFuZCB0aGUgcmVzdW1lZCBleGVjdXRpb24gaXMgdGhhdFxuICogc3RhZ2UgcnVubmluZyBhZ2FpbiDigJQgaXRzIGJ1bmRsZSBtdXN0IGNhcnJ5IGl0LCBvciBhIGNoYWluZWQgYXhpcyB3b3VsZFxuICogc2hvdyB0aGUgcGF1c2VkIGxlZyB0YWdnZWQgYW5kIHRoZSByZXN1bWVkIGxlZyBzaWxlbnRseSBub3QuXG4gKi9cbmZ1bmN0aW9uIHN0YW5kSW5Gb3I8VE91dCwgVFNjb3BlPihcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBzdGFuZEluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ucGF1c2VkTm9kZSwgZm4gfTtcbiAgZGVsZXRlIHN0YW5kSW4ucmVzdW1lRm47XG4gIGRlbGV0ZSBzdGFuZEluLmlzUGF1c2FibGU7XG4gIGlmICghaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICBkZWxldGUgc3RhbmRJbi5yZXRyeTtcbiAgICBkZWxldGUgc3RhbmRJbi5pc1N0cmVhbWluZztcbiAgICBkZWxldGUgc3RhbmRJbi5zdHJlYW1JZDtcbiAgfVxuICByZXR1cm4gc3RhbmRJbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIG9iamVjdCBmb3IgYEZsb3dDaGFydEV4ZWN1dG9yYCDigJQgcHJlZmVycmVkIG92ZXIgcG9zaXRpb25hbCBwYXJhbXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZXggPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHtcbiAqICAgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnksXG4gKiAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0OiB7IC4uLiB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKlN5bmMgbm90ZSBmb3IgbWFpbnRhaW5lcnM6KiogRXZlcnkgZmllbGQgYWRkZWQgaGVyZSBtdXN0IGFsc28gYXBwZWFyIGluIHRoZVxuICogYGZsb3dDaGFydEFyZ3NgIHByaXZhdGUgZmllbGQgdHlwZSBhbmQgaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgb3B0aW9ucy1yZXNvbHV0aW9uXG4gKiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2ggdGhhdCByZWFkcyBmcm9tIGBvcHRzYCkuIE1pc3NpbmcgYW55IG9uZSBvZiB0aGVcbiAqIHRocmVlIGNhdXNlcyBzaWxlbnQgb21pc3Npb24g4oCUIHRoZSBvcHRpb24gaXMgYWNjZXB0ZWQgYnV0IG5ldmVyIGFwcGxpZWQuXG4gKlxuICogKipUU2NvcGUgaW5mZXJlbmNlIG5vdGU6KiogV2hlbiB1c2luZyB0aGUgb3B0aW9ucy1vYmplY3QgZm9ybSB3aXRoIGEgY3VzdG9tIHNjb3BlLFxuICogVHlwZVNjcmlwdCBjYW5ub3QgaW5mZXIgYFRTY29wZWAgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QuIFBhc3MgdGhlIHR5cGVcbiAqIGV4cGxpY2l0bHk6IGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCwgTXlTY29wZT4oY2hhcnQsIHsgc2NvcGVGYWN0b3J5IH0pYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlID0gYW55PiB7XG4gIC8vIOKUgOKUgCBDb21tb24gb3B0aW9ucyAobW9zdCBjYWxsZXJzIG5lZWQgb25seSB0aGVzZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1c3RvbSBzY29wZSBmYWN0b3J5LiBEZWZhdWx0cyB0byBUeXBlZFNjb3BlIG9yIFNjb3BlRmFjYWRlIGF1dG8tZGV0ZWN0aW9uLiAqL1xuICBzY29wZUZhY3Rvcnk/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcblxuICAvLyDilIDilIAgQ29udGV4dCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBwcmUtcG9wdWxhdGVkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0IGJlZm9yZSAqKmVhY2gqKiBzdGFnZVxuICAgKiAocmUtYXBwbGllZCBldmVyeSBzdGFnZSwgYWN0aW5nIGFzIGJhc2VsaW5lIGRlZmF1bHRzKS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEluaXRpYWwgY29udGV4dCB2YWx1ZXMgbWVyZ2VkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0ICoqb25jZSoqIGF0IHN0YXJ0dXBcbiAgICogKGFwcGxpZWQgYmVmb3JlIHRoZSBmaXJzdCBzdGFnZSwgbm90IHJlcGVhdGVkIG9uIHN1YnNlcXVlbnQgc3RhZ2VzKS5cbiAgICogRGlzdGluY3QgZnJvbSBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyByZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLlxuICAgKi9cbiAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAvKiogUmVhZC1vbmx5IGlucHV0IGFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRBcmdzKClgIOKAlCBuZXZlciB0cmFja2VkIG9yIHdyaXR0ZW4uICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG5cbiAgLy8g4pSA4pSAIE9ic2VydmFiaWxpdHkgY29zdCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBQb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpLiBEZWZhdWx0IGAnZnVsbCdgIOKAlCBldmVyeVxuICAgKiB0cmFja2VkIHJlYWQgYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSB2YWx1ZSBpbnRvIHRoZSBzdGFnZSdzIHJlYWQgdmlld1xuICAgKiAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3I7IHdoYXQgbGVucy9hZ2VudGZvb3RwcmludCBzbmFwc2hvdHMgc2hvdykuXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCB0eXBlL3NpemUvcHJldmlldyBtYXJrZXIgcGVyIHJlYWQ7IGAnb2ZmJ2BcbiAgICogcmVjb3JkcyBub3RoaW5nIOKAlCB6ZXJvIHBlci1yZWFkIGNsb25lIGNvc3QgKHJlYWRzIG9mIGxhcmdlIHZhbHVlcyBiZWNvbWVcbiAgICogfmZyZWUpLiBOYXJyYXRpdmUgYW5kIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgYXJlIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLlxuICAgKiBDYXZlYXQ6IHVuZGVyIGAnb2ZmJ2AgYSBzdGFnZSdzIHNuYXBzaG90IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lXG4gICAqIHRoYXQgcmVhZCBub3RoaW5nIOKAlCBhdWRpdGluZyBjb25zdW1lcnMgdGhhdCBuZWVkIFwiZGlkIGl0IHJlYWQ/XCIgd2l0aG91dFxuICAgKiB0aGUgdmFsdWUgY29zdCBzaG91bGQgcHJlZmVyIGAnc3VtbWFyeSdgLlxuICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYGV4ZWN1dG9yLnNldFJlYWRUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gICAqL1xuICByZWFkVHJhY2tpbmc/OiBSZWFkVHJhY2tpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBQb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlIHNpYmxpbmcgb2ZcbiAgICoge0BsaW5rIHJlYWRUcmFja2luZ307IHRoZSB0d28gZGlhbHMgYXJlIGluZGVwZW5kZW50LiBEZWZhdWx0IGAnZnVsbCdgIOKAlFxuICAgKiBldmVyeSB0cmFja2VkIHdyaXRlIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50byB0aGUgc3RhZ2UncyB3cml0ZVxuICAgKiB2aWV3ICh0aGUgaGlzdG9yaWNhbCBiZWhhdmlvcikuIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcFxuICAgKiBgV3JpdGVTdW1tYXJ5TWFya2VyYCAodHlwZS9zaXplL3ByZXZpZXcpIHBlciB3cml0ZTsgYCdvZmYnYCByZWNvcmRzXG4gICAqIG5vdGhpbmcg4oCUIGBzdGFnZVdyaXRlc2AgaXMgYWJzZW50IGZyb20gdGhlIHNuYXBzaG90LlxuICAgKlxuICAgKiBPYnNlcnZhYmxlIGNvbnNlcXVlbmNlcyDigJQgd2hhdCB0aGUgcG9saWN5IERPRVMgZ292ZXJuOlxuICAgKiAtIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAobWFya2VycyB1bmRlciBgJ3N1bW1hcnknYCwgYWJzZW50IHVuZGVyXG4gICAqICAgYCdvZmYnYCkuXG4gICAqIC0gVGhlIGNvbW1pdCBvYnNlcnZlciBwYXlsb2FkOiBgU2NvcGVSZWNvcmRlci5vbkNvbW1pdChtdXRhdGlvbnMpYFxuICAgKiAgIHJlY2VpdmVzIHRoZSByZXRhaW5lZCBgX3N0YWdlV3JpdGVzYCBlbnRyaWVzLCBzbyBpdCBjYXJyaWVzIHRoZSBzYW1lXG4gICAqICAgbWFya2VycyB1bmRlciBgJ3N1bW1hcnknYCBhbmQgYW4gZW1wdHkgbXV0YXRpb25zIGJhZyB1bmRlciBgJ29mZidgIOKAlFxuICAgKiAgIGRlZmVycmVkL29ic2VydmVyIGNvbnN1bWVycyBzZWUgZXhhY3RseSB3aGF0IHJldGVudGlvbiBzdG9yZWQuXG4gICAqXG4gICAqIFdoYXQgaXQgZG9lcyBOT1QgZ292ZXJuOlxuICAgKiAtIFRoZSB3cml0ZXMgdGhlbXNlbHZlczogc2hhcmVkIHN0YXRlLCB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyLCBhbmQgdGhlXG4gICAqICAgQ09NTUlUIExPRyBhcmUgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUgKGNvbW1pdExvZyB2YWx1ZXMga2VlcCB0aGVpclxuICAgKiAgIGZ1bGwgcGF5bG9hZHMg4oCUIHRoZSBsb3NzbGVzcyBsaW5lYXItY29zdCBmaXggZm9yIHRob3NlIGlzIHRoZVxuICAgKiAgIHtAbGluayBjb21taXRWYWx1ZXN9IGRpYWwsICMxM2MtQikuXG4gICAqIC0gUGVyLW9wIGBTY29wZVJlY29yZGVyLm9uV3JpdGVgIGV2ZW50cyDigJQgdGhleSBmaXJlIHdpdGggbGl2ZSB2YWx1ZXNcbiAgICogICByZWdhcmRsZXNzIChkZWxpdmVyeSB0aWVyLCBSRkMtMDAxJ3MgY29uY2VybiksIHNvIG5hcnJhdGl2ZSBvdXRwdXQgaXNcbiAgICogICBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS5cbiAgICogLSBSZWRhY3Rpb246IGEgcG9saWN5L3Blci1jYWxsLXJlZGFjdGVkIHdyaXRlIHN0b3JlcyBgJ1tSRURBQ1RFRF0nYFxuICAgKiAgIHVuZGVyIGAnZnVsbCdgIEFORCBgJ3N1bW1hcnknYCAocmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGVcbiAgICogICBkaWFsOyBhIG1hcmtlciB3b3VsZCBsZWFrIHNpemUvcHJldmlldyksIGFuZCBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AuXG4gICAqXG4gICAqIENhdmVhdDogdW5kZXIgYCdvZmYnYCBhIHN0YWdlJ3MgU05BUFNIT1QgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAgICogdGhhdCB3cm90ZSBub3RoaW5nIOKAlCBidXQgdW5saWtlIGByZWFkVHJhY2tpbmc6ICdvZmYnYCwgdGhlIGNvbW1pdCBsb2dcbiAgICogc3RpbGwgcmVjb3JkcyBldmVyeSBuZXQgY2hhbmdlLCBzbyBcImRpZCBpdCB3cml0ZT9cIiBzdGF5cyBhbnN3ZXJhYmxlLlxuICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgd3JpdGVUcmFja2luZz86IFdyaXRlVHJhY2tpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBFbmNvZGluZyBwb2xpY3kgZm9yIENPTU1JVCBMT0cgdmFsdWVzICgjMTNjLUIpIOKAlCB0aGUgdGhpcmQgZGlhbCBvZiB0aGVcbiAgICogZmFtaWx5LCBhbmQgdW5saWtlIGl0cyBzaWJsaW5ncyBpdCBpcyAqKmxvc3NsZXNzIGluIGJvdGggbW9kZXMqKiAoaXRcbiAgICogY2hhbmdlcyB0aGUgbG9nJ3MgZW5jb2RpbmcsIG5ldmVyIGl0cyBpbmZvcm1hdGlvbikuXG4gICAqXG4gICAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgcGF0aCBzdG9yZXMgdGhlIGZ1bGwgZmluYWxcbiAgICogICB2YWx1ZTsgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgYmVoYXZpb3IuXG4gICAqIC0gYCdkZWx0YSdgIOKAlCBhcnJheSBuZXQtY2hhbmdlcyB0aGF0IGFyZSBcImJhc2UgcGx1cyBhIHRhaWxcIiBjb21taXQgYXMgYW5cbiAgICogICBgYXBwZW5kYCB0cmFjZSB2ZXJiIHN0b3JpbmcgT05MWSB0aGUgdGFpbCAodGhlIGdyb3dpbmctaGlzdG9yeSBjb21taXRcbiAgICogICBsb2cgYmVjb21lcyBsaW5lYXIgaW5zdGVhZCBvZiBPKE7CsikgcmV0YWluZWQpOyBgZGVsZXRlVmFsdWUoKWAgY29tbWl0c1xuICAgKiAgIGFzIGEgcmVhbCBgZGVsZXRlYCB2ZXJiIChyZXBsYXkgcmVtb3ZlcyB0aGUga2V5IGluc3RlYWQgb2YgbGVhdmluZ1xuICAgKiAgIGBrZXk6IHVuZGVmaW5lZGApOyBidW5kbGVzIGNhcnJ5IGV4YWN0bHkgT05FIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmdcbiAgICogICBwYXRoLiBSZXBsYXkgKGBhcHBseVNtYXJ0TWVyZ2VgIOKAlCBsaXZlIHN0YXRlLCBgbWF0ZXJpYWxpc2UoKWAsIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvcikgcmVjb25zdHJ1Y3RzIGV2ZXJ5IHN0ZXAncyBmdWxsIHN0YXRlIGV4YWN0bHkuXG4gICAqXG4gICAqIENvbnN1bWVycyB0aGF0IHJlYWQgYGJ1bmRsZS5vdmVyd3JpdGVba2V5XWAgYXMgXCJ0aGUgZnVsbCB2YWx1ZSB3cml0dGVuXCJcbiAgICogbXVzdCBzd2l0Y2ggdG8gYGNvbW1pdFZhbHVlQXQoY29tbWl0TG9nLCBpZHgsIGtleSlgIGZyb21cbiAgICogYGZvb3RwcmludGpzL3RyYWNlYCDigJQgdW5kZXIgYCdkZWx0YSdgIHRoYXQgdmFsdWUgaXMgdmVyYi1xdWFsaWZpZWQgKGFuXG4gICAqIGBhcHBlbmRgIGJ1bmRsZSBob2xkcyBvbmx5IHRoZSB0YWlsKS4gUGF0aC10aWVyIGNvbnN1bWVyc1xuICAgKiAoYGZpbmRMYXN0V3JpdGVyYCwgYGNhdXNhbENoYWluYCwgbmFycmF0aXZlLCBsZW5zIGhpZ2hsaWdodHMpIGFyZVxuICAgKiB1bmFmZmVjdGVkLiBUaGUgYWN0aXZlIG1vZGUgaXMgc3VyZmFjZWQgYXNcbiAgICogYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAgICpcbiAgICogSG9uZXN0IGNvc3Qgbm90ZTogYXBwZW5kIGRldGVjdGlvbiBpcyBuZXcgd2FsbCB3b3JrIOKAlCBhbiBPKHxiYXNlIGFycmF5fClcbiAgICogc3RydWN0dXJhbCBwcmVmaXggY29tcGFyZSBwZXIgYXJyYXktc2V0IHBhdGggcGVyIGNvbW1pdC4gT24gYSBoaXQgdGhlXG4gICAqIGNvbW1pdCBnZXRzIGNoZWFwZXIgaW4gYm90aCB3YWxsIGFuZCBoZWFwOyBvbiBhIG1pc3MgKHByZWZpeCBkaXZlcmdlcylcbiAgICogaXQgcGF5cyBjb21wYXJlICsgZnVsbCBjbG9uZS4gYCdmdWxsJ2AgcGF5cyB6ZXJvLlxuICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYGV4ZWN1dG9yLnNldENvbW1pdFZhbHVlcyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gICAqL1xuICBjb21taXRWYWx1ZXM/OiBDb21taXRWYWx1ZXNNb2RlO1xuXG4gIC8qKlxuICAgKiBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpIOKAlCB0aGUgZm91cnRoIGRpYWwgb2YgdGhlIGZhbWlseS4gRGVmYXVsdFxuICAgKiBgJ29mZidgOiB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIGNvbW1pdCBsb2dzLiBgJ3JlYWRzLXByZWZpeCdgOiBldmVyeVxuICAgKiBjb21taXR0ZWQgYFRyYWNlRW50cnlgIGNhcnJpZXMgYHJlYWRLZXlzYCDigJQgdGhlIGtleXMgdHJhY2tlZC1yZWFkIEJFRk9SRVxuICAgKiB0aGF0IHdyaXRlIOKAlCBlbmFibGluZyBwZXItd3JpdGUgY2F1c2FsIGF0dHJpYnV0aW9uIChgY2F1c2FsQ2hhaW5gJ3NcbiAgICogYGVkZ2VBdHRyaWJ1dGlvbjogJ3Blci13cml0ZSdgIGFuZCB2YXJpYWJsZSBzbGljZXMpLiBDb3N0OiBvbmUgc21hbGxcbiAgICogYXJyYXkgY29weSBwZXIgd3JpdGUuIFNuYXBzaG90IGRpc2NyaW1pbmFudDpcbiAgICogYGdldFNuYXBzaG90KCkud3JpdGVQcm92ZW5hbmNlYC5cbiAgICovXG4gIHdyaXRlUHJvdmVuYW5jZT86IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG5cbiAgLy8g4pSA4pSAIEFkdmFuY2VkIC8gZXNjYXBlLWhhdGNoIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBkbyBub3QgbmVlZCB0aGVzZSkg4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBjbGFzc2lmaWVyIGZvciB0aHJvdHRsaW5nIGRldGVjdGlvbi4gUmV0dXJuIGB0cnVlYCBpZiB0aGVcbiAgICogZXJyb3IgcmVwcmVzZW50cyBhIHJhdGUtbGltaXQgb3IgYmFja3ByZXNzdXJlIGNvbmRpdGlvbiAodGhlIGV4ZWN1dG9yIHdpbGxcbiAgICogdHJlYXQgaXQgZGlmZmVyZW50bHkgZnJvbSBoYXJkIGZhaWx1cmVzKS4gRGVmYXVsdHMgdG8gbm8gdGhyb3R0bGluZyBjbGFzc2lmaWNhdGlvbi5cbiAgICovXG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKiBIYW5kbGVycyBmb3Igc3RyZWFtaW5nIHN0YWdlIGxpZmVjeWNsZSBldmVudHMgKHNlZSBgYWRkU3RyZWFtaW5nRnVuY3Rpb25gKS4gKi9cbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgLyoqIFNjb3BlIHByb3RlY3Rpb24gbW9kZSBmb3IgVHlwZWRTY29wZSBkaXJlY3QtYXNzaWdubWVudCBkZXRlY3Rpb24uICovXG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciDigJQgc3Vydml2ZXMgcGF1c2UvcmVzdW1lLiBSZXNldCBvbiBmcmVzaCBydW4oKS4gKi9cbiAgcHJpdmF0ZSBfZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTtcbiAgLyoqIFNoYXJlZCBwZXItcnVuIHZpc2l0IGNvdW50cyAoYnkgc3RhZ2VJZCkgZHJpdmluZyBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb24uXG4gICAqICBUd2luIG9mIF9leGVjdXRpb25Db3VudGVyOiBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUsIHJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF92aXNpdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBQZXItYHJ1bigpYCBpZGVudGlmaWVyIOKAlCBnZW5lcmF0ZWQgZnJlc2ggcGVyIHJ1biArIHBlciByZXN1bWUuIFRocmVhZGVkXG4gICAqICB0aHJvdWdoIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQgc28gcmVjb3JkZXJzIGNhbiBzY29wZSBzdGF0ZSB0byBhIHNpbmdsZVxuICAgKiAgcnVuLiBTZWUgYHJ1bklkLnRzYC4gKi9cbiAgcHJpdmF0ZSBfY3VycmVudFJ1bklkID0gJyc7XG4gIHByaXZhdGUgbmFycmF0aXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIG5hcnJhdGl2ZU9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSBjb21iaW5lZFJlY29yZGVyOiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZsb3dSZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgc2NvcGVSZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuICAvKipcbiAgICogUkZDLTAwMSBkZWZlcnJlZC1vYnNlcnZlciB3aXJpbmcg4oCUIGNyZWF0ZWQgTEFaSUxZIG9uIHRoZSBmaXJzdFxuICAgKiBgZGVsaXZlcnk6ICdkZWZlcnJlZCdgIGF0dGFjaC4gYHVuZGVmaW5lZGAgZm9yIGV2ZXJ5IGV4ZWN1dG9yIHRoYXQgbmV2ZXJcbiAgICogb3B0cyBpbjogemVybyBhbGxvY2F0aW9uLCB6ZXJvIHBlci1ldmVudCBjb3N0LCBieXRlLWlkZW50aWNhbCBiZWhhdmlvclxuICAgKiAodGhlIGVtaXQgZmFzdC1wYXRoIHByZWNlZGVudCkuXG4gICAqL1xuICBwcml2YXRlIGRlZmVycmVkVGllcj86IERlZmVycmVkT2JzZXJ2ZXJUaWVyO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIHJ1bidzIE9ORSByZWRhY3Rpb24gcnVsZSAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKTogYnVpbHQgZnJlc2ggcGVyXG4gICAqIGBjcmVhdGVUcmF2ZXJzZXJgIChwZXItY2FsbCBtYXJrcyByZXNldCBwZXIgcnVuIGFuZCBwZXIgcmVzdW1lLCBhcyB0aGVcbiAgICogc2hhcmVkIHNldCBhbHdheXMgZGlkKSwgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3Qgc28gZXZlcnkgY29udGV4dFxuICAgKiByZXRhaW5zIHVuZGVyIGl0LCBhbmQgcmVhZCBieSBldmVyeSBgU2NvcGVGYWNhZGVgIHRocm91Z2ggaXRzIGNvbnRleHQuXG4gICAqL1xuICBwcml2YXRlIHJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSgpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgYHJ1bigpYCAob3IgYSBwcmV2aW91cyBgcmVzdW1lKClgKSBoYXMgZXhlY3V0ZWQgb25cbiAgICogdGhpcyBpbnN0YW5jZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICpcbiAgICogICDigKIgdHJ1ZSAg4oaSIHJldXNlIHRoZSBjb25zdHJ1Y3Rvci10aW1lIHJ1bnRpbWUgKHNhbWUtZXhlY3V0b3JcbiAgICogICAgICAgICAgICAgY29udGludWl0eTogZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlXG4gICAqICAgICAgICAgICAgIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMpXG4gICAqICAg4oCiIGZhbHNlIOKGkiBzZWVkIGEgZnJlc2ggcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgKiAgICAgICAgICAgICAoY3Jvc3MtZXhlY3V0b3IgLyBjcm9zcy1wcm9jZXNzIHJlc3VtZTogbmV3IGluc3RhbmNlXG4gICAqICAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludClcbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGZsYWcsIGZyZXNoIGV4ZWN1dG9ycyBzaWxlbnRseSBkaXNjYXJkZWQgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzaGFyZWRTdGF0ZSBhbmQgcmVzdW1lIGhhbmRsZXJzIGNvdWxkbid0IHJlYWQgcHJlLXBhdXNlXG4gICAqIHNjb3BlLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuICAvKipcbiAgICogUmUtZW50cmFuY3kgZ3VhcmQuIGBydW4oKWAgYW5kIGByZXN1bWUoKWAgbXV0YXRlIHBlci1ydW4gaW5zdGFuY2Ugc3RhdGVcbiAgICogKHRyYXZlcnNlciwgcnVuSWQsIGV4ZWN1dGlvbiBjb3VudGVyLCBjaGVja3BvaW50KSBhbmQgY2xlYXIgYXR0YWNoZWRcbiAgICogcmVjb3JkZXJzIOKAlCBhIHNlY29uZCBjb25jdXJyZW50IGVudHJ5IG9uIHRoZSBTQU1FIGV4ZWN1dG9yIHdvdWxkXG4gICAqIGludGVybGVhdmUgcnVuSWRzIGFuZCBjcm9zcy1jb250YW1pbmF0ZSByZWNvcmRlci9uYXJyYXRpdmUgc3RhdGUsIGFuZFxuICAgKiBgZ2V0Q2hlY2twb2ludCgpYCB3b3VsZCByZXR1cm4gd2hpY2hldmVyIHJ1biBwYXVzZWQgbGFzdC4gT25lIGV4ZWN1dG9yID1cbiAgICogb25lIGluLWZsaWdodCBleGVjdXRpb247IGNyZWF0ZSBhbiBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uXG4gICAqIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuXG4gICAqL1xuICBwcml2YXRlIF9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuXG4gIC8vIFNZTkMgUkVRVUlSRUQ6IGV2ZXJ5IG9wdGlvbmFsIGZpZWxkIGhlcmUgbXVzdCBtaXJyb3IgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zXG4gIC8vIEFORCBiZSBhc3NpZ25lZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb24gYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoKS5cbiAgLy8gQWRkaW5nIGEgZmllbGQgdG8gb25seSBvbmUgb2YgdGhlIHRocmVlIHBsYWNlcyBjYXVzZXMgc2lsZW50IG9taXNzaW9uLlxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IHtcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+O1xuICAgIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gICAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICByZWFkVHJhY2tpbmc/OiBSZWFkVHJhY2tpbmdNb2RlO1xuICAgIHdyaXRlVHJhY2tpbmc/OiBXcml0ZVRyYWNraW5nTW9kZTtcbiAgICBjb21taXRWYWx1ZXM/OiBDb21taXRWYWx1ZXNNb2RlO1xuICAgIHdyaXRlUHJvdmVuYW5jZT86IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogKioyLXBhcmFtIGZvcm0qKiAoYWxzbyBzdXBwb3J0ZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZsb3dDaGFydCAtIFRoZSBjb21waWxlZCBGbG93Q2hhcnQgcmV0dXJuZWQgYnkgYGZsb3dDaGFydCguLi4pLmJ1aWxkKClgXG4gICAqIEBwYXJhbSBmYWN0b3J5T3JPcHRpb25zIC0gQSBgU2NvcGVGYWN0b3J5PFRTY29wZT5gIE9SIGEgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+YCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgZmFjdG9yeU9yT3B0aW9ucz86IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT4sXG4gICkge1xuICAgIC8vIERldGVjdCBvcHRpb25zLW9iamVjdCBmb3JtIHZzIGZhY3RvcnkgZm9ybVxuICAgIGxldCBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgaW5pdGlhbENvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHJlYWRPbmx5Q29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogKChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUhhbmRsZXJzOiBTdHJlYW1IYW5kbGVycyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc2NvcGVQcm90ZWN0aW9uTW9kZTogU2NvcGVQcm90ZWN0aW9uTW9kZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVhZFRyYWNraW5nOiBSZWFkVHJhY2tpbmdNb2RlIHwgdW5kZWZpbmVkO1xuICAgIGxldCB3cml0ZVRyYWNraW5nOiBXcml0ZVRyYWNraW5nTW9kZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlIHwgdW5kZWZpbmVkO1xuICAgIGxldCB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnlPck9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIDItcGFyYW0gZm9ybTogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAgICBzY29wZUZhY3RvcnkgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoZmFjdG9yeU9yT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPcHRpb25zIG9iamVjdCBmb3JtXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICAgIHJlYWRUcmFja2luZyA9IG9wdHMucmVhZFRyYWNraW5nO1xuICAgICAgd3JpdGVUcmFja2luZyA9IG9wdHMud3JpdGVUcmFja2luZztcbiAgICAgIGNvbW1pdFZhbHVlcyA9IG9wdHMuY29tbWl0VmFsdWVzO1xuICAgICAgd3JpdGVQcm92ZW5hbmNlID0gb3B0cy53cml0ZVByb3ZlbmFuY2U7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICByZWFkVHJhY2tpbmcsXG4gICAgICB3cml0ZVRyYWNraW5nLFxuICAgICAgY29tbWl0VmFsdWVzLFxuICAgICAgd3JpdGVQcm92ZW5hbmNlLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzLmpzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICAgIC8qKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkg4oCUIHdoZXJlIHRoZSByZXN1bWVkIHRyYXZlcnNhbFxuICAgICAgICogIHN0YXJ0cyAoYHJlc3VtZS5zdGFydGApIGFuZCB3aGF0IGVhY2ggc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aFxuICAgICAgICogIHRha2VzIG9uIGl0cyBmaXJzdCBlbnRyeS4gVGhlIHRyYXZlcnNlciBzdGlsbCB3YWxrcyB0aGUgUkVBTCBjaGFydFxuICAgICAgICogIChgZmMucm9vdGAsIGBmYy5zdWJmbG93c2ApOiB0aGUgcmUtZW50cnkgaXMgbmV2ZXIgYSBub2RlIGFuIGlkIGNhblxuICAgICAgICogIHJlc29sdmUgdG8uIFVuZGVmaW5lZCBvbiBub3JtYWwgcnVuKCkgcGF0aHMuICovXG4gICAgICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAgIH0sXG4gICk6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5mbG93Q2hhcnRBcmdzO1xuICAgIGNvbnN0IGZjID0gYXJncy5mbG93Q2hhcnQ7XG4gICAgY29uc3QgbmFycmF0aXZlRmxhZyA9IHRoaXMubmFycmF0aXZlRW5hYmxlZCB8fCAoZmMuZW5hYmxlTmFycmF0aXZlID8/IGZhbHNlKTtcblxuICAgIC8vIOKUgOKUgCBDb21wb3NlZCBzY29wZSBmYWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIENvbGxlY3QgYWxsIHNjb3BlIG1vZGlmaWVycyAocmVjb3JkZXJzLCByZWRhY3Rpb24pIGludG8gYSBzaW5nbGUgbGlzdCxcbiAgICAvLyB0aGVuIGNyZWF0ZSBPTkUgZmFjdG9yeSB0aGF0IGFwcGxpZXMgdGhlbSBpbiBhIGxvb3AuIFJlcGxhY2VzIHRoZVxuICAgIC8vIHByZXZpb3VzIDQtZGVlcCBjbG9zdXJlIG5lc3Rpbmcgd2l0aCBhIGZsYXQsIGRlYnVnZ2FibGUgY29tcG9zaXRpb24uXG5cbiAgICBpZiAob3ZlcnJpZGVzPy5wcmVzZXJ2ZVJlY29yZGVycykge1xuICAgICAgLy8gUmVzdW1lIG1vZGU6IGtlZXAgZXhpc3RpbmcgY29tYmluZWRSZWNvcmRlciBzbyBuYXJyYXRpdmUgYWNjdW11bGF0ZXNcbiAgICB9IGVsc2UgaWYgKG5hcnJhdGl2ZUZsYWcpIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IG5ldyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyKHRoaXMubmFycmF0aXZlT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSh0aGlzLnJlZGFjdGlvblBvbGljeSk7XG5cbiAgICAvLyBCdWlsZCBtb2RpZmllciBsaXN0IOKAlCBlYWNoIG1vZGlmaWVyIHJlY2VpdmVzIHRoZSBzY29wZSBhZnRlciBjcmVhdGlvblxuICAgIHR5cGUgU2NvcGVNb2RpZmllciA9IChzY29wZTogYW55KSA9PiB2b2lkO1xuICAgIGNvbnN0IG1vZGlmaWVyczogU2NvcGVNb2RpZmllcltdID0gW107XG5cbiAgICAvLyAxLiBOYXJyYXRpdmUgcmVjb3JkZXIgKGlmIGVuYWJsZWQpXG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmNvbWJpbmVkUmVjb3JkZXI7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFVzZXItcHJvdmlkZWQgc2NvcGUgcmVjb3JkZXJzXG4gICAgaWYgKHRoaXMuc2NvcGVSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycztcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjb3JkZXJzKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyYi4gRGVmZXJyZWQtb2JzZXJ2ZXIgc2NvcGUgdGFwIChSRkMtMDAxIEJsb2NrIDcpIOKAlCBhIHN5bnRoZXRpY1xuICAgIC8vIHJlY29yZGVyIHdob3NlIGhvb2tzIENBUFRVUkUgaW50byB0aGUgYm91bmRlZCBxdWV1ZSBpbnN0ZWFkIG9mIGRvaW5nXG4gICAgLy8gb2JzZXJ2ZXIgd29yay4gSXQgcmlkZXMgdGhlIHNhbWUgcGVyLXN0YWdlIHJlY29yZGVyIGxpc3QgYXMgaW5saW5lXG4gICAgLy8gcmVjb3JkZXJzLCBzbyBpdCByZWNlaXZlcyBleGFjdGx5IHRoZSBwb3N0LXJlZGFjdGlvbiBldmVudHMgdGhleSBkby5cbiAgICAvLyBBYnNlbnQgKHplcm8gd29yaywgaWRlbnRpY2FsIGxpc3QpIHdoZW4gbm9ib2R5IG9wdGVkIGludG8gZGVmZXJyYWwuXG4gICAgY29uc3Qgc2NvcGVUYXAgPSB0aGlzLmRlZmVycmVkVGllcj8uYnVpbGRTY29wZVRhcCgpO1xuICAgIGlmIChzY29wZVRhcCkge1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihzY29wZVRhcCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpLiBBXG4gICAgLy8gYFNjb3BlRmFjYWRlYCBhbHJlYWR5IHJlYWRzIHRoZSBydW4ncyBydWxlIHRocm91Z2ggaXRzIGNvbnRleHQgKHRoZVxuICAgIC8vIHJ1bGUgaXMgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3QgYmVsb3cpOyB0aGlzIGNhbGwgaXMgdGhlIGxlZ2FjeVxuICAgIC8vIHByb3RvY29sIGZvciBjdXN0b20gc2NvcGVzIHRoYXQgYXJlIG5vdCBmYWNhZGVzLCBhbmQgb24gYSBmYWNhZGUgaXRcbiAgICAvLyByZS1zdGF0ZXMgdGhlIGV4ZWN1dG9yJ3MgcG9saWN5IG9uIHRoZSBzaGFyZWQgcnVsZSAoYSBuby1vcCkuXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBUaGUgbWFya2VkLWtleXMgc2V0IGlzIEFMV0FZUyB3aXJlZCB1cCAodW5jb25kaXRpb25hbCDigJQgZW5zdXJlcyBjcm9zcy1zdGFnZVxuICAgIC8vIHByb3BhZ2F0aW9uIGV2ZW4gd2l0aG91dCBhIHBvbGljeSwgYmVjYXVzZSBzdGFnZXMgY2FuIGNhbGwgc2V0VmFsdWUoa2V5LCB2YWwsIHRydWUpXG4gICAgLy8gZm9yIHBlci1jYWxsIHJlZGFjdGlvbikuIE9wdGlvbmFsIG1vZGlmaWVycyAocmVjb3JkZXJzLCBwb2xpY3kpIGFyZSBpbiB0aGUgbGlzdC5cbiAgICBjb25zdCBiYXNlRmFjdG9yeSA9IGFyZ3Muc2NvcGVGYWN0b3J5O1xuICAgIGNvbnN0IHNoYXJlZFJlZGFjdGVkS2V5cyA9IHRoaXMucmVkYWN0aW9uUnVsZS5tYXJrZWRLZXlzKCk7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICAvLyBUaGUgZmlyc3Qgc3RhZ2UgdGhpcyB0cmF2ZXJzYWwgcnVuczogdGhlIHJlc3VtZSdzIGVudHJ5LCBlbHNlIHRoZSBjaGFydCByb290LlxuICAgIGNvbnN0IGVmZmVjdGl2ZVJvb3QgPSBvdmVycmlkZXM/LnJlc3VtZT8uc3RhcnQgPz8gZmMucm9vdDtcbiAgICBjb25zdCBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCA9IG92ZXJyaWRlcz8uaW5pdGlhbENvbnRleHQgPz8gYXJncy5pbml0aWFsQ29udGV4dDtcblxuICAgIGxldCBydW50aW1lOiBFeGVjdXRpb25SdW50aW1lO1xuICAgIGlmIChvdmVycmlkZXM/LmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgLy8gUmVzdW1lIG1vZGU6IHJldXNlIGV4aXN0aW5nIHJ1bnRpbWUgc28gZXhlY3V0aW9uIHRyZWUgY29udGludWVzIGZyb20gcGF1c2UgcG9pbnQuXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSAoZnVsbCB0cmVlKSwgdGhlbiBhZHZhbmNlXG4gICAgICAvLyByb290U3RhZ2VDb250ZXh0IHRvIGEgY29udGludWF0aW9uIGZyb20gdGhlIGxlYWYgKGZvciB0cmF2ZXJzYWwpLlxuICAgICAgcnVudGltZSA9IG92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWU7XG4gICAgICBydW50aW1lLnByZXNlcnZlU25hcHNob3RSb290KCk7XG4gICAgICBsZXQgbGVhZiA9IHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICAgIHdoaWxlIChsZWFmLm5leHQpIGxlYWYgPSBsZWFmLm5leHQ7XG4gICAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBsZWFmLmNyZWF0ZU5leHQoJycsIGVmZmVjdGl2ZVJvb3QubmFtZSwgZWZmZWN0aXZlUm9vdC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5uYW1lLFxuICAgICAgICBlZmZlY3RpdmVSb290LmlkLFxuICAgICAgICBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgICBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlZGFjdGlvbiBydWxlICg5LjE5LjApOiBPTkUgb3duZXIgb2YgdGhlIHZlcmRpY3QgZm9yIHRoZSB3aG9sZVxuICAgIC8vIHJ1biwgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lJ3Mgcm9vdCBjb250ZXh0IHNvIGV2ZXJ5IGRlc2NlbmRhbnQgYW5kXG4gICAgLy8gZXZlcnkgc3ViZmxvdyByb290IHJldGFpbnMgdW5kZXIgaXQg4oCUIHRoZSBzYW1lIGFuY2hvciBhbmQgdGhlIHNhbWVcbiAgICAvLyByZXN1bWUtcGF0aCBvcmRlcmluZyBhcyB0aGUgbWlycm9yIGFuZCB0aGUgZm91ciBkaWFscy4gSW5zdGFsbGVkIGV2ZW5cbiAgICAvLyB3aXRob3V0IGEgcG9saWN5OiBhIHBlci1jYWxsIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAgbWFya3MgdGhlIGtleVxuICAgIC8vIG9uIHRoaXMgcnVsZSwgYW5kIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsXG4gICAgLy8gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKSBob25vdXIgdGhhdCBtYXJrIHRocm91Z2ggaXQuXG4gICAgLy8gT1JERVIgTUFUVEVSUzogYmVmb3JlIHRoZSBtaXJyb3IgYmVsb3cg4oCUIHRoZSBtaXJyb3IncyBTRUVEIGlzIHNjcnViYmVkXG4gICAgLy8gd2l0aCB0aGlzIHJ1bGUgKGEgc2VlZGVkLCBuZXZlciByZS13cml0dGVuIHBvbGljeSBrZXkgaXMgc2VydmVkKS5cbiAgICBydW50aW1lLnVzZVJlZGFjdGlvbih0aGlzLnJlZGFjdGlvblJ1bGUpO1xuXG4gICAgLy8gV2hlbiBhIHJlZGFjdGlvbiBwb2xpY3kgaXMgY29uZmlndXJlZCwgbWFpbnRhaW4gYSBwYXJhbGxlbCByZWRhY3RlZFxuICAgIC8vIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgIGR1cmluZyB0cmF2ZXJzYWwuIEVhY2ggY29tbWl0IGFwcGxpZXMgdGhlXG4gICAgLy8gYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCBzYW1lIG9uZXMgZmVkIHRvIHRoZSBldmVudCBsb2cg4oCUXG4gICAgLy8gc28gYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCByZXR1cm5zIGEgc2NydWJiZWQgc2hhcmVkU3RhdGUgYXRcbiAgICAvLyB6ZXJvIHBvc3QtcGFzcyBjb3N0LiBTa2lwcGVkIHdoZW4gbm8gcG9saWN5IGV4aXN0cyAoemVybyBhbGxvY2F0aW9uKS5cbiAgICBpZiAodGhpcy5yZWRhY3Rpb25Qb2xpY3kpIHtcbiAgICAgIHJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkLXRyYWNraW5nIHBvbGljeSAoIzE0KTogc2V0IG9uIHRoZSBydW50aW1lJ3Mgcm9vdCBjb250ZXh0IHNvIGV2ZXJ5XG4gICAgLy8gZGVzY2VuZGFudCBjb250ZXh0IChjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkKSBhbmQgc3ViZmxvdyByb290IGluaGVyaXRzLlxuICAgIC8vIEFwcGxpZWQgQUZURVIgdGhlIHJlc3VtZS1wYXRoIHJvb3Qgc3dhcCBhYm92ZSBzbyB0aGUgY29udGludWF0aW9uIHJvb3RcbiAgICAvLyBjYXJyaWVzIHRoZSBwb2xpY3kgdG9vLiBTa2lwcGVkIGZvciB0aGUgZGVmYXVsdCAnZnVsbCcg4oCUIHplcm8gd29yay5cbiAgICBjb25zdCByZWFkVHJhY2tpbmcgPSBhcmdzLnJlYWRUcmFja2luZztcbiAgICBpZiAocmVhZFRyYWNraW5nICE9PSB1bmRlZmluZWQgJiYgcmVhZFRyYWNraW5nICE9PSAnZnVsbCcpIHtcbiAgICAgIHJ1bnRpbWUudXNlUmVhZFRyYWNraW5nKHJlYWRUcmFja2luZyk7XG4gICAgfVxuXG4gICAgLy8gV3JpdGUtdHJhY2tpbmcgcG9saWN5ICgjMTNjLUEpOiBpZGVudGljYWwgcGx1bWJpbmcgdG8gcmVhZFRyYWNraW5nIOKAlFxuICAgIC8vIHNhbWUgcm9vdC1jb250ZXh0IGFuY2hvciwgc2FtZSBpbmhlcml0YW5jZSwgc2FtZSByZXN1bWUtcGF0aCBvcmRlcmluZy5cbiAgICBjb25zdCB3cml0ZVRyYWNraW5nID0gYXJncy53cml0ZVRyYWNraW5nO1xuICAgIGlmICh3cml0ZVRyYWNraW5nICE9PSB1bmRlZmluZWQgJiYgd3JpdGVUcmFja2luZyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBydW50aW1lLnVzZVdyaXRlVHJhY2tpbmcod3JpdGVUcmFja2luZyk7XG4gICAgfVxuXG4gICAgLy8gQ29tbWl0LXZhbHVlcyBlbmNvZGluZyAoIzEzYy1CKTogaWRlbnRpY2FsIHBsdW1iaW5nIHRvIHRoZSB0d28gZGlhbHNcbiAgICAvLyBhYm92ZSDigJQgcm9vdC1jb250ZXh0IGFuY2hvciwgY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCBpbmhlcml0YW5jZSxcbiAgICAvLyBTdWJmbG93RXhlY3V0b3IgZHVjay1wdXNoLCByZXN1bWUtcGF0aCByZS1hcHBsaWNhdGlvbi4gU2tpcHBlZCBmb3IgdGhlXG4gICAgLy8gZGVmYXVsdCAnZnVsbCcg4oCUIHplcm8gd29yaywgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZy5cbiAgICBjb25zdCBjb21taXRWYWx1ZXMgPSBhcmdzLmNvbW1pdFZhbHVlcztcbiAgICBpZiAoY29tbWl0VmFsdWVzICE9PSB1bmRlZmluZWQgJiYgY29tbWl0VmFsdWVzICE9PSAnZnVsbCcpIHtcbiAgICAgIHJ1bnRpbWUudXNlQ29tbWl0VmFsdWVzKGNvbW1pdFZhbHVlcyk7XG4gICAgfVxuXG4gICAgLy8gUGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZSAoI1AxKTogaWRlbnRpY2FsIHBsdW1iaW5nIHRvIHRoZSB0aHJlZSBkaWFsc1xuICAgIC8vIGFib3ZlIOKAlCByb290LWNvbnRleHQgYW5jaG9yLCBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkIGluaGVyaXRhbmNlLFxuICAgIC8vIFN1YmZsb3dFeGVjdXRvciBkdWNrLXB1c2gsIHJlc3VtZS1wYXRoIHJlLWFwcGxpY2F0aW9uLiBTa2lwcGVkIGZvciB0aGVcbiAgICAvLyBkZWZhdWx0ICdvZmYnIOKAlCB6ZXJvIHdvcmssIGJ5dGUtaWRlbnRpY2FsIGNvbW1pdCBsb2cuXG4gICAgY29uc3Qgd3JpdGVQcm92ZW5hbmNlID0gYXJncy53cml0ZVByb3ZlbmFuY2U7XG4gICAgaWYgKHdyaXRlUHJvdmVuYW5jZSAhPT0gdW5kZWZpbmVkICYmIHdyaXRlUHJvdmVuYW5jZSAhPT0gJ29mZicpIHtcbiAgICAgIHJ1bnRpbWUudXNlV3JpdGVQcm92ZW5hbmNlKHdyaXRlUHJvdmVuYW5jZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAvLyBBbHdheXMgdGhlIFJFQUwgY2hhcnQg4oCUIGV2ZXJ5IGlkIChsb29wIHRhcmdldHMsIGEgcmUtdmlzaXQgb2YgdGhlXG4gICAgICAvLyBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQuIEEgcmVzdW1lIG9ubHkgbW92ZXMgd2hlcmUgdGhlXG4gICAgICAvLyB0cmF2ZXJzYWwgU1RBUlRTIChgZW50cnlgKSwgb25jZS5cbiAgICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0ICYmIHsgZW50cnk6IG92ZXJyaWRlcy5yZXN1bWUuc3RhcnQgfSksXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0UGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IG92ZXJyaWRlcy5yZXN1bWUuc3RhcnRQZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lICYmIHsgcmVzdW1lOiBvdmVycmlkZXMucmVzdW1lIH0pLFxuICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGUgPz8gYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IGFyZ3Muc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICBzaWduYWwsXG4gICAgICBleGVjdXRpb25FbnY6IGVudixcbiAgICAgIGZsb3dSZWNvcmRlcnM6IHRoaXMuYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlcixcbiAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgICAgLi4uKG1heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnMgfSksXG4gICAgfSk7XG4gIH1cblxuICBlbmFibGVOYXJyYXRpdmUob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucykgdGhpcy5uYXJyYXRpdmVPcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5IHRoYXQgYXBwbGllcyB0byBhbGwgc3RhZ2VzLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqL1xuICBzZXRSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJlZGFjdGlvblBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZShwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuIEVxdWl2YWxlbnQgdG8gdGhlIGByZWFkVHJhY2tpbmdgXG4gICAqIGNvbnN0cnVjdG9yIG9wdGlvbiDigJQgc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMucmVhZFRyYWNraW5nfVxuICAgKiBmb3IgdGhlIG1vZGUgc2VtYW50aWNzICgnZnVsbCcgZGVmYXVsdCAvICdzdW1tYXJ5JyAvICdvZmYnKS5cbiAgICovXG4gIHNldFJlYWRUcmFja2luZyhtb2RlOiBSZWFkVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLnJlYWRUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3cml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKS5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLiBFcXVpdmFsZW50IHRvIHRoZSBgd3JpdGVUcmFja2luZ2BcbiAgICogY29uc3RydWN0b3Igb3B0aW9uIOKAlCBzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nfVxuICAgKiBmb3IgdGhlIG1vZGUgc2VtYW50aWNzICgnZnVsbCcgZGVmYXVsdCAvICdzdW1tYXJ5JyAvICdvZmYnKSwgdGhlXG4gICAqIG9uQ29tbWl0LXBheWxvYWQgY29uc2VxdWVuY2UsIGFuZCB0aGUgcmVkYWN0aW9uLXByZWNlZGVuY2UgcnVsZS5cbiAgICovXG4gIHNldFdyaXRlVHJhY2tpbmcobW9kZTogV3JpdGVUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3Mud3JpdGVUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb21taXQtdmFsdWVzIGVuY29kaW5nIHBvbGljeSBmb3IgdGhlIGNvbW1pdCBsb2cgKCMxM2MtQikuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gRXF1aXZhbGVudCB0byB0aGUgYGNvbW1pdFZhbHVlc2BcbiAgICogY29uc3RydWN0b3Igb3B0aW9uIOKAlCBzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5jb21taXRWYWx1ZXN9XG4gICAqIGZvciB0aGUgbW9kZSBzZW1hbnRpY3MgKCdmdWxsJyBkZWZhdWx0IC8gJ2RlbHRhJyksIHRoZSB2ZXJiLXF1YWxpZmllZFxuICAgKiBgb3ZlcndyaXRlYCBjb25zZXF1ZW5jZSwgYW5kIHRoZSBgY29tbWl0VmFsdWVBdGAgbWlncmF0aW9uIGhlbHBlci5cbiAgICovXG4gIHNldENvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmNvbW1pdFZhbHVlcyA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMucmVkYWN0aW9uUnVsZS5yZXBvcnQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQYXVzZS9SZXN1bWUg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoZWNrcG9pbnQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGF1c2VkIGV4ZWN1dGlvbiwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIGxhc3QgcnVuIGNvbXBsZXRlZCB3aXRob3V0IHBhdXNpbmcuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIEpTT04tc2VyaWFsaXphYmxlIOKAlCBzdG9yZSBpdCBpbiBSZWRpcywgUG9zdGdyZXMsIGxvY2FsU3RvcmFnZSwgZXRjLlxuICAgKlxuICAgKiBJdCBpcyBmdWxseSBERVRBQ0hFRCBmcm9tIGVuZ2luZSBzdGF0ZTogZXZlcnkgZmllbGQgd2FzIGRlZXAtY29waWVkIGF0XG4gICAqIHBhdXNlIHRpbWUgKHNlZSBgYnVpbGRQYXVzZUNoZWNrcG9pbnRgKS4gSG9sZGluZywgbXV0YXRpbmcsIG9yIHBlcnNpc3RpbmdcbiAgICogaXQgY2Fubm90IGFmZmVjdCB0aGUgZXhlY3V0b3IsIGFuZCBhIGxhdGVyIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGNhbm5vdFxuICAgKiBtdXRhdGUgYSBjaGVja3BvaW50IHlvdSBhbHJlYWR5IHN0b3JlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIHJ1bidzIGNvbW1pdCBsb2cuIE8oMSkg4oCUIGRpcmVjdCBsZW5ndGhcbiAgICogcmVhZCwgbm8gc25hcHNob3QgbWF0ZXJpYWxpemF0aW9uLiBVc2UgdGhpcyB0byBzdGFtcCBjb21taXRcbiAgICogaW5kaWNlcyBvbiBvYnNlcnZlciBldmVudHMgKGUuZy4sIGBCb3VuZGFyeVJlY29yZGVyYCBzdG9yaW5nXG4gICAqIGBjb21taXRJZHhCZWZvcmVgIC8gYGNvbW1pdElkeEFmdGVyYCBwZXIgZG9tYWluIGV2ZW50IGZvclxuICAgKiBgQ29tbWl0UmFuZ2VJbmRleGAgcXVlcmllcyDigJQgc2VlIGBmb290cHJpbnRqcy90cmFjZWApLlxuICAgKlxuICAgKiBSZXR1cm5zIDAgYmVmb3JlIGFueSBydW47IGFmdGVyLCByZXR1cm5zIHRoZSBjdW11bGF0aXZlIGNvbW1pdFxuICAgKiBjb3VudCBhY3Jvc3MgdGhlIGV4ZWN1dG9yJ3MgbGlmZXRpbWUgKGluY2x1ZGluZyByZXN1bWVzKS5cbiAgICpcbiAgICogSU1QTEVNRU5UQVRJT04gTk9URTogdGhpcyByZXR1cm5zIGBydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoYCxcbiAgICogd2hpY2ggaXMgdGhlIHNhbWUgdmFsdWUgYXMgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nLmxlbmd0aGAuIFRoZVxuICAgKiBuYW1pbmcgYXN5bW1ldHJ5IGlzIGhpc3RvcmljYWwg4oCUIHRoZSB1bmRlcmx5aW5nIGBFdmVudExvZ2AgZmllbGRcbiAgICogaXMgbmFtZWQgYGV4ZWN1dGlvbkhpc3RvcnlgIGJ1dCBzdG9yZXMgdGhlIGBDb21taXRCdW5kbGVbXWAgdGhhdFxuICAgKiBgY29tbWl0TG9nYCBleHBvc2VzLiBUaGV5IGFsd2F5cyByZXBvcnQgdGhlIHNhbWUgTEVOR1RIICh2ZXJpZmllZCBieSB0aGVcbiAgICogXCJtYXRjaGVzIGNvbW1pdExvZy5sZW5ndGhcIiBpbnRlZ3JhdGlvbiB0ZXN0KTsgc2luY2UgOS4xNy4wIHRoZSBzbmFwc2hvdFxuICAgKiBzZXJ2ZXMgYSBkZXRhY2hlZCBmcm96ZW4gQ09QWSBvZiB0aGUgYXJyYXksIG5vdCB0aGUgbGl2ZSBvbmUuXG4gICAqL1xuICBnZXRDb21taXRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVudGltZT8uZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIGNhbGxzIHRoZSBwYXVzZWQgc3RhZ2UncyBgcmVzdW1lRm5gIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIGlucHV0IChvciwgZm9yIGFuIGBpbnRlcnJ1cHQoKWAgcGF1c2UsIHJlLXJ1bnMgdGhlIHN0YWdlIHdpdGggdGhlXG4gICAqIGFuc3dlciksIHRoZW4gY29udGludWVzIHdpdGggd2hhdGV2ZXIgcmFuIGFmdGVyIHRoYXQgc3RhZ2Ugb24gdGhlIHJ1biDigJRcbiAgICogaXRzIG93biBgbmV4dGAsIG9yIHRoZSBjb250aW51YXRpb24gb2YgdGhlIGRlY2lkZXIsIHNlbGVjdG9yIG9yIGZvcmsgdGhhdFxuICAgKiBkaXNwYXRjaGVkIGl0LCBhdCBldmVyeSBsZXZlbCBvZiB0aGUgcGF1c2UgcGF0aCDigJQgYW5kIGZyb20gdGhlcmUgd2Fsa3MgdGhlXG4gICAqIGNoYXJ0IGFzIGJ1aWx0LiBXaGVuIHBhcmFsbGVsIHNpYmxpbmdzIHBhdXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0XG4gICAqIChgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCksIHRoZSBydW4gcGF1c2VzIGFnYWluIHdpdGggdGhlIG5leHQgc2libGluZydzXG4gICAqIHF1ZXN0aW9uIG9uY2UgdGhpcyBvbmUncyBicmFuY2ggaXMgZG9uZTsgdGhlIGZhbi1vdXQncyBqb2luIHJ1bnMgYWZ0ZXIgdGhlXG4gICAqIGxhc3QgYW5zd2VyLiBTZWUgYFJlc3VtZUVudHJ5YCAoYGZvb3RwcmludGpzL2FkdmFuY2VkYCkuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGNhbiBjb21lIGZyb20gYGdldENoZWNrcG9pbnQoKWAgb24gYSBwcmV2aW91cyBydW4sIG9yIGZyb21cbiAgICogYSBzZXJpYWxpemVkIGNoZWNrcG9pbnQgc3RvcmVkIGluIFJlZGlzL1Bvc3RncmVzL2xvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogKipSZWNvcmRlci9uYXJyYXRpdmUgc3RhdGUgZGVwZW5kcyBvbiB0aGUgcmVzdW1lIG1vZGUuKiogUmVzdW1pbmcgb24gdGhlIFNBTUVcbiAgICogZXhlY3V0b3IgdGhhdCByYW4gcHJlc2VydmVzIGFuZCBhY2N1bXVsYXRlcyBuYXJyYXRpdmUvbWV0cmljcy9kZWJ1ZyBhY3Jvc3MgdGhlXG4gICAqIHBhdXNlL3Jlc3VtZSBjeWNsZSAocHJlc2VydmVSZWNvcmRlcnMpLiBSZXN1bWluZyBvbiBhIEZSRVNIIGV4ZWN1dG9yXG4gICAqIChyZWNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWQgY2hlY2twb2ludCkgc3RhcnRzIHdpdGggZW1wdHkgcmVjb3JkZXIgc3RhdGUg4oCUXG4gICAqIGNvbGxlY3Qgd2hhdCB5b3UgbmVlZCBiZWZvcmUgZGlzY2FyZGluZyB0aGUgcGF1c2VkIGV4ZWN1dG9yLiBBIGZyZXNoIGBydW5JZGBcbiAgICogaXMgZ2VuZXJhdGVkIGVpdGhlciB3YXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJvY2VzcyBBIOKAlCBhZnRlciBhIHBhdXNlLCBwZXJzaXN0IHRoZSBjaGVja3BvaW50OlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBQcm9jZXNzIEIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpIOKAlCByZXN0b3JlIGFuZCByZXN1bWU6XG4gICAqIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKHJlc3RvcmVkLCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJyB8ICdtYXhJdGVyYXRpb25zJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBSZS1lbnRyYW5jeSBndWFyZCBGSVJTVCDigJQgcmVzdW1lKCkgbXV0YXRlcyB0aGUgc2FtZSBwZXItcnVuIHN0YXRlIHJ1bigpXG4gICAgLy8gZG9lcyAodHJhdmVyc2VyLCBydW5JZCwgY2hlY2twb2ludCksIHNvIHJlc3VtZS1kdXJpbmctcnVuIGFuZFxuICAgIC8vIGRvdWJsZS1yZXN1bWUgYXJlIHRoZSBzYW1lIGNvcnJ1cHRpb24gY2xhc3MgYXMgY29uY3VycmVudCBydW4oKS5cbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiByZXN1bWUoKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyAnICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIOKUgOKUgCBWYWxpZGF0ZSBjaGVja3BvaW50IHN0cnVjdHVyZSAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSkg4pSA4pSAXG4gICAgLy8gKGxhc3RDaGVja3BvaW50IGlzIHdpcGVkIEFGVEVSIHZhbGlkYXRpb24g4oCUIGEgcmVqZWN0ZWQgY2hlY2twb2ludCBtdXN0XG4gICAgLy8gbm90IGRlc3Ryb3kgdGhlIGV4ZWN1dG9yJ3MgZXhpc3RpbmcgY2hlY2twb2ludCBzdGF0ZS4pXG4gICAgaWYgKFxuICAgICAgIWNoZWNrcG9pbnQgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgIT09ICdvYmplY3QnIHx8XG4gICAgICBjaGVja3BvaW50LnNoYXJlZFN0YXRlID09PSBudWxsIHx8XG4gICAgICBBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc2hhcmVkU3RhdGUgbXVzdCBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBwYXVzZWRTdGFnZUlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnN1YmZsb3dQYXRoKSB8fFxuICAgICAgIWNoZWNrcG9pbnQuc3ViZmxvd1BhdGguZXZlcnkoKHM6IHVua25vd24pID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzdWJmbG93UGF0aCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGF1c2VkIG5vZGUgaW4gdGhlIGdyYXBoXG4gICAgY29uc3QgcGF1c2VkTm9kZSA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aCk7XG4gICAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtjaGVja3BvaW50LnBhdXNlZFN0YWdlSWR9JyBub3QgZm91bmQgaW4gZmxvd2NoYXJ0LiBgICtcbiAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFR3byByZS1lbnRyeSBzaGFwZXMsIGNob3NlbiBieSBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQ6XG4gICAgLy9cbiAgICAvLyAgIOKAoiBpbnRlcnJ1cHQoKSAgICAgIOKGkiBSRS1SVU4gVEhFIFNUQUdFJ1MgT1dOIEZVTkNUSU9OIEZST00gSVRTIFRPUC5cbiAgICAvLyAgICAgU3RhZ2VzIGFyZSBhdG9taWMgKHRoZSBzYW1lIGxhdyBgcmVzdW1lT25FcnJvcmAgc3RhdGVzKTogYSBzdGFnZSB0aGF0XG4gICAgLy8gICAgIHN0b3BwZWQgbWlkLWJvZHkgaGFzIG5vIGhhbGYgdG8gcmVzdW1lIGludG8sIHNvIHRoZSB3aG9sZSBib2R5IHJ1bnNcbiAgICAvLyAgICAgYWdhaW4gYW5kIHRoZSBhbnN3ZXIgY29tZXMgYmFjayBvdXQgb2YgdGhlIGBpbnRlcnJ1cHQoKWAgY2FsbCBpdHNlbGYuXG4gICAgLy8gICAgIEV2ZXJ5dGhpbmcgdGhlIGJvZHkgZGlkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIHJlLWRvbmUg4oCUIHdoaWNoIGlzXG4gICAgLy8gICAgIHdoeSB0aGUgZG9jcyB0ZWxsIHlvdSB0byBrZWVwIHRoYXQgaGFsZiBpZGVtcG90ZW50LlxuICAgIC8vICAg4oCiIGFkZFBhdXNhYmxlRnVuY3Rpb24g4oaSIHJ1biB0aGUgZGVjbGFyZWQgYHJlc3VtZUZuYC5cbiAgICAvL1xuICAgIC8vIFRoZSBkaXNjcmltaW5hbnQgaXMgb24gdGhlIGNoZWNrcG9pbnQsIHNvIHRoaXMgd29ya3MgY3Jvc3MtZXhlY3V0b3JcbiAgICAvLyAoYSBjaGVja3BvaW50IHJlc3RvcmVkIGZyb20gUmVkaXMgb24gYSBmcmVzaCBwcm9jZXNzIHJlc3VtZXMgdGhlIHNhbWUgd2F5KS5cbiAgICBjb25zdCBpc0ludGVycnVwdFJlc3VtZSA9IGNoZWNrcG9pbnQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnO1xuICAgIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbiAmJiAhaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpLCBvciBzdGFnZXMgdGhhdCBwYXVzZWQgdmlhIGludGVycnVwdCgpLCBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVGhlIHJlc3VtZSBoYWxmIOKAlCB3aGF0IHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBydW5zLlxuICAgIC8vIHJlc3VtZUZuIHNpZ25hdHVyZSBpcyAoc2NvcGUsIGlucHV0KSBwZXIgUGF1c2FibGVIYW5kbGVyIOKAlCB3cmFwIHRvIG1hdGNoIFN0YWdlRnVuY3Rpb24oc2NvcGUsIGJyZWFrRm4pLlxuICAgIGxldCByZXN1bWVTdGFnZUZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgaWYgKGlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEZuID1cbiAgICAgICAgcGF1c2VkTm9kZS5mbiA/P1xuICAgICAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LnN0YWdlTWFwLmdldChwYXVzZWROb2RlLmlkKSA/P1xuICAgICAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LnN0YWdlTWFwLmdldChwYXVzZWROb2RlLm5hbWUpO1xuICAgICAgaWYgKCFvcmlnaW5hbEZuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIHBhdXNlZCB2aWEgaW50ZXJydXB0KCkgYnV0IGl0cyBgICtcbiAgICAgICAgICAgICdzdGFnZSBmdW5jdGlvbiBpcyBubyBsb25nZXIgaW4gdGhlIGNoYXJ0LiBUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCAnICtcbiAgICAgICAgICAgICd3YXMgY3JlYXRlZC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmVzdW1lU3RhZ2VGbiA9IChzY29wZSwgYnJlYWtGbiwgc3RyZWFtQ2FsbGJhY2spID0+IHtcbiAgICAgICAgLy8gRGVwb3NpdCB0aGUgYW5zd2VyIGZvciBUSElTIHNjb3BlIGluc3RhbmNlIGJlZm9yZSB0aGUgYm9keSBydW5zLCBzb1xuICAgICAgICAvLyB0aGUgYGludGVycnVwdCgpYCBjYWxsIHRoYXQgdGhyZXcgbGFzdCB0aW1lIHJldHVybnMgaXQgdGhpcyB0aW1lLlxuICAgICAgICAvLyBLZXllZCBieSBzY29wZSBpZGVudGl0eSDigJQgc2FmZSB3aGVuIHNldmVyYWwgYnJhbmNoZXMgcmVzdW1lIGF0IG9uY2UuXG4gICAgICAgIHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIoc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsRm4oc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VtZUZuID0gcGF1c2VkTm9kZS5yZXN1bWVGbiE7XG4gICAgICByZXN1bWVTdGFnZUZuID0gKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3VtZUZuKHNjb3BlLCByZXN1bWVJbnB1dCkgYXMgVE91dCB8IFByb21pc2U8VE91dD47XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFRoZSBwYXVzZWQgc3RhZ2UncyBTVEFORC1JTjogdGhlIHN0YWdlJ3MgT1dOIG5vZGUg4oCUIGlkLCBuYW1lLFxuICAgIC8vIGRlc2NyaXB0aW9uLCB0YWdzLCBhbmQgaXRzIHNoYXBlIChhIGRlY2lkZXIncyBicmFuY2hlcywgYSBzZWxlY3RvcidzLCBhXG4gICAgLy8gZm9yayBwYXJlbnQncyBjaGlsZHJlbiwgaXRzIGBuZXh0YCkg4oCUIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZVxuICAgIC8vIHJlc3VtZSBoYWxmLiBCdWlsdCBmcm9tIHRoZSB3aG9sZSBub2RlIHNvIGFuIGBpbnRlcnJ1cHQoKWAgcmFpc2VkIGluc2lkZVxuICAgIC8vIGEgZGVjaWRlciwgc2VsZWN0b3Igb3IgZm9yay1wYXJlbnQgZnVuY3Rpb24gRElTUEFUQ0hFUyBvbiByZXN1bWUsIGFzIHRoZVxuICAgIC8vIHN0YWdlIGRpZCBvbiB0aGUgcnVuIChiZWZvcmUgOS4yOC4wIG9ubHkgZm4vbmV4dC90YWdzL3JldHJ5IHdlcmUgY29waWVkXG4gICAgLy8gYW5kIHRoZSBkaXNwYXRjaCB3YXMgc2lsZW50bHkgc2tpcHBlZCkuIEl0IGlzIHdoZXJlIHRoZSByZXN1bWVkXG4gICAgLy8gdHJhdmVyc2FsIHN0YXJ0cyDigJQgYW5kIG5vdGhpbmcgZWxzZTogaXQgaXMgbmV2ZXIgaW4gYSBub2RlIG1hcCBvciB0aGVcbiAgICAvLyBzdWJmbG93IGRpY3Rpb25hcnksIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgaWQgZmluZHMgdGhlIFJFQUxcbiAgICAvLyBzdGFnZSwgd2hpY2ggcGF1c2VzIGFnYWluIChzZWUgUmVzdW1lRW50cnkpLiBXaGF0IHJ1bnMgYWZ0ZXIgaXQg4oCUIGl0c1xuICAgIC8vIG93biBgbmV4dGAsIGVsc2UgaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24g4oCUIGlzIGF0dGFjaGVkIGJ5XG4gICAgLy8gYFJlc3VtZUVudHJ5LnBsYW5gLCBmcm9tIHRoZSBjaGFydC5cbiAgICBjb25zdCBzdGFuZEluID0gc3RhbmRJbkZvcihwYXVzZWROb2RlLCByZXN1bWVTdGFnZUZuLCBpc0ludGVycnVwdFJlc3VtZSk7XG5cbiAgICAvLyBXaGVyZSB0aGUgcmVzdW1lIHJlLWVudGVycywgcGxhbm5lZCBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdDpcbiAgICAvL1xuICAgIC8vICAg4oCiIFRPUC1MRVZFTCBQQVVTRSAoc3ViZmxvd1BhdGggZW1wdHkpOiB0aGUgcmVzdW1lZCB0cmF2ZXJzYWwgc3RhcnRzXG4gICAgLy8gICAgIGF0IHRoZSBzdGFuZC1pbi5cbiAgICAvLyAgIOKAoiBQQVVTRSBJTlNJREUgU1VCRkxPV1M6IGl0IHN0YXJ0cyBhdCB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3dcbiAgICAvLyAgICAgb24gdGhlIHBhdGgsIHNvIHRoZSBvdXRwdXRNYXBwZXJzIGFuZCB0aGUgcGFyZW50J3MgY29udGludWF0aW9uXG4gICAgLy8gICAgIHJ1bi4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXRoIGlzIGVudGVyZWQgT05DRSB0aHJvdWdoIGl0cyBob3A6IGl0c1xuICAgIC8vICAgICBuZXN0ZWQgcnVudGltZSBpcyBzZWVkZWQgZnJvbSBpdHMgY2FwdHVyZSAoaW4gcGxhY2Ugb2YgdGhlXG4gICAgLy8gICAgIGlucHV0TWFwcGVyJ3MgdmFsdWVzKSBhbmQgaXRzIHRyYXZlcnNhbCBzdGFydHMgYXQgdGhlIG1vdW50IG9mIHRoZVxuICAgIC8vICAgICBuZXh0IHN1YmZsb3cg4oCUIG9yLCBhdCB0aGUgbGVhZiwgYXQgdGhlIHN0YW5kLWluLiBBbiBvdXRlciBzdWJmbG93J3NcbiAgICAvLyAgICAgc3RhZ2VzIGJlZm9yZSB0aGF0IG1vdW50IGRvIG5vdCBydW4gYWdhaW4uXG4gICAgLy8gICDigKIgQVQgRVZFUlkgTEVWRUwgdGhlIGVudHJ5IGNhcnJpZXMgd2hhdCBpdHMgZGlzcGF0Y2hlciB3b3VsZCBoYXZlIHJ1blxuICAgIC8vICAgICBhZnRlciBpdCDigJQgYSBkZWNpZGVyJ3MgYG5leHRgLCBhIHNlbGVjdG9yJ3MsIGEgZm9yaydzIGpvaW4g4oCUIHNvIGFcbiAgICAvLyAgICAgc3ViZmxvdyBtb3VudGVkIGFzIGEgYnJhbmNoIG9yIGEgZm9yayBjaGlsZCBoYW5kcyBjb250cm9sIGJhY2sgdG9cbiAgICAvLyAgICAgaXRzIHBhcmVudCdzIGNvbnRpbnVhdGlvbiBhdCB0aGUgcGFyZW50J3MgbGV2ZWwuXG4gICAgLy8gICDigKIgUGFyYWxsZWwgc2libGluZ3MgdGhhdCBwYXVzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCB3YWl0IGluXG4gICAgLy8gICAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgOiBlYWNoIGlzIHJhaXNlZCBhZ2FpbiBpbiB0dXJuLCBhbmQgdGhlXG4gICAgLy8gICAgIGpvaW4gcnVucyBvbmx5IG9uY2UgdGhlIGxhc3Qgb25lIGlzIHJlc3VtZWQuXG4gICAgLy9cbiAgICAvLyBFdmVyeXRoaW5nIGVsc2Ugd2Fsa3MgdGhlIFJFQUwgY2hhcnQ6IGBmYy5yb290YCBhbmQgYGZjLnN1YmZsb3dzYCBhcmVcbiAgICAvLyB1bnRvdWNoZWQsIHNvIGV2ZXJ5IGxhdGVyIGxvb3AgdGFyZ2V0IGFuZCBldmVyeSBsYXRlciBzdWJmbG93IGVudHJ5XG4gICAgLy8gKHJlYWwgcm9vdCwgaW5wdXRNYXBwZXIpIHJlc29sdmVzIGFzIGl0IHdvdWxkIG9uIGEgcnVuLiBSZWZ1c2VkIEhFUkUg4oCUXG4gICAgLy8gYmVmb3JlIGFueSBzdGF0ZSBpcyB0b3VjaGVkIOKAlCB3aGVuIHRoZSBjaGVja3BvaW50J3MgcGF0aCBkb2VzIG5vdCBmaXRcbiAgICAvLyB0aGlzIGNoYXJ0LlxuICAgIC8vXG4gICAgLy8gQ2xvbmUtaW46IHRoZSBjYXB0dXJlcyBzZWVkIG5lc3RlZCBydW50aW1lcyAoc2hhbGxvdy1tZXJnZWQgaW50byBlYWNoXG4gICAgLy8gbmVzdGVkIFNoYXJlZE1lbW9yeSksIHNvIHdpdGhvdXQgYSBjb3B5IHRoZSBlbmdpbmUgd291bGQgaG9sZCBsaXZlXG4gICAgLy8gcmVmZXJlbmNlcyBpbnRvIHRoZSBjYWxsZXIncyBjaGVja3BvaW50IG9iamVjdCDigJQgY2FsbGVyIG11dGF0aW9ucyB3b3VsZFxuICAgIC8vIGJsZWVkIGludG8gdGhlIHJlc3VtZWQgcnVuIGFuZCBlbmdpbmUgd3JpdGVzIHdvdWxkIHJlYWNoIGEgY2hlY2twb2ludFxuICAgIC8vIHRoZSBjYWxsZXIgbWF5IGhhdmUgYWxyZWFkeSBwZXJzaXN0ZWQuIFRoZSBzYW1lIGZvciB0aGUgd2FpdGluZ1xuICAgIC8vIHNpYmxpbmdzJyBjYXB0dXJlcy5cbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG4gICAgY29uc3QgcmVzdW1lRW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZmMucm9vdCxcbiAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgIHBhdGg6IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgsXG4gICAgICBjYXB0dXJlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlcyksXG4gICAgICBzdGFuZEluLFxuICAgICAgLi4uKGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcyAhPT0gdW5kZWZpbmVkICYmIHsgcGVuZGluZ1BhdXNlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcykgfSksXG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgU2VlZCB0aGUgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyICsgcGVyLXN0YWdlIHZpc2l0IGNvdW50cyDilIDilIBcbiAgICAvL1xuICAgIC8vIE9ubHkgbm93IOKAlCBldmVyeSByZWZ1c2FsIGFib3ZlICh0aGUgY2hlY2twb2ludCdzIHNoYXBlLCB0aGUgcGF1c2VkXG4gICAgLy8gc3RhZ2UsIHRoZSBwbGFuKSBsZWF2ZXMgdGhlIGV4ZWN1dG9yIGV4YWN0bHkgYXMgaXQgd2FzLiBNVVNUIHJ1biBiZWZvcmVcbiAgICAvLyB0aGUgY291bnRlciBpcyBSRUFEIGJlbG93ICh0aGUgc3RhbmQtaW4ncyBydW50aW1lU3RhZ2VJZCBmb3JcbiAgICAvLyBgb25SZXN1bWVgKSBBTkQgYmVmb3JlIGNyZWF0ZVRyYXZlcnNlcigpIGhhbmRzIHRoZSB0cmF2ZXJzZXIgdGhlc2VcbiAgICAvLyBvYmplY3RzIEJZIFJFRkVSRU5DRS4gU2VlZGluZyBrZWVwcyBydW50aW1lU3RhZ2VJZHMgdW5pcXVlIGFuZFxuICAgIC8vIGxvb3BJdGVyYXRpb24gbW9ub3RvbmljIGFjcm9zcyBhIENST1NTLWV4ZWN1dG9yIHJlc3VtZSAoYSBmcmVzaFxuICAgIC8vIGV4ZWN1dG9yIHN0YXJ0cyBib3RoIGF0IDAvZW1wdHk7IHRoZSBjaGVja3BvaW50IGNhcnJpZXMgdGhlIHBhdXNlLXRpbWVcbiAgICAvLyB2YWx1ZXMpLlxuICAgIC8vXG4gICAgLy8gTVVUQVRFLCBuZXZlciBSRVBMQUNFOiBgX2V4ZWN1dGlvbkNvdW50ZXJgIGFuZCBgX3Zpc2l0Q291bnRzYCBhcmUgc2hhcmVkXG4gICAgLy8gYnkgcmVmZXJlbmNlIGludG8gdGhlIHRyYXZlcnNlciAoYW5kLCB0cmFuc2l0aXZlbHksIGV2ZXJ5IHN1YmZsb3dcbiAgICAvLyB0cmF2ZXJzZXIg4oCUIHNlZSBGbG93Y2hhcnRUcmF2ZXJzZXIncyBzdWItdHJhdmVyc2VyIGZhY3RvcnkpLiBBc3NpZ25pbmcgYVxuICAgIC8vIGZyZXNoIG9iamVjdCBoZXJlIHdvdWxkIHNldmVyIHRoYXQgc2hhcmVkIHJlZmVyZW5jZS4gQm90aCBmaWVsZHMgYXJlXG4gICAgLy8gb3B0aW9uYWwgb24gdGhlIGNoZWNrcG9pbnQgKG9sZGVyIHBlcnNpc3RlZCBjaGVja3BvaW50cyBvbWl0IHRoZW0pIOKAlCBza2lwXG4gICAgLy8gc2VlZGluZyB3aGVuIGFic2VudCwgcHJlc2VydmluZyB0aGUgcHJldmlvdXMgYmVoYXZpb3IuIFNhbWUtZXhlY3V0b3JcbiAgICAvLyByZXN1bWUgaXMgaWRlbXBvdGVudDogYXQgcGF1c2UgdGhlIGluc3RhbmNlIHZhbHVlcyBhbHJlYWR5IGVxdWFsIHRoZVxuICAgIC8vIGNoZWNrcG9pbnQncywgc28gcmUtc2VlZGluZyB0aGVtIGNoYW5nZXMgbm90aGluZy5cbiAgICBpZiAodHlwZW9mIGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlID0gY2hlY2twb2ludC5leGVjdXRpb25Db3VudDtcbiAgICB9XG4gICAgaWYgKGNoZWNrcG9pbnQudmlzaXRDb3VudHMpIHtcbiAgICAgIHRoaXMuX3Zpc2l0Q291bnRzLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IFtzdGFnZUlkLCBjb3VudF0gb2YgT2JqZWN0LmVudHJpZXMoY2hlY2twb2ludC52aXNpdENvdW50cykpIHtcbiAgICAgICAgdGhpcy5fdmlzaXRDb3VudHMuc2V0KHN0YWdlSWQsIGNvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gKFdpcGVkIG9ubHkgbm93OiBldmVyeSByZWZ1c2FsIGFib3ZlIGxlYXZlcyB0aGUgZXhlY3V0b3IncyBleGlzdGluZ1xuICAgIC8vIGNoZWNrcG9pbnQgdW50b3VjaGVkLilcbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gRG9uJ3QgY2xlYXIgcmVjb3JkZXJzIOKAlCByZXN1bWUgY29udGludWVzIGZyb20gcHJldmlvdXMgc3RhdGUuXG4gICAgLy8gTmFycmF0aXZlLCBtZXRyaWNzLCBkZWJ1ZyBlbnRyaWVzIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZS5cbiAgICAvL1xuICAgIC8vIFR3by1tb2RlIHJlc3VtZTpcbiAgICAvLyAgIOKAoiBTYW1lLWV4ZWN1dG9yIChydW4oKSBwcmV2aW91c2x5IGNhbGxlZCBvbiBUSElTIGluc3RhbmNlKTpcbiAgICAvLyAgICAgcmV1c2UgdGhlIGV4aXN0aW5nIHJ1bnRpbWUgc28gdGhlIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlc1xuICAgIC8vICAgICBmcm9tIHRoZSBwYXVzZSBwb2ludCBhbmQgcmVjb3JkZXJzL25hcnJhdGl2ZSBhY2N1bXVsYXRlLlxuICAgIC8vICAg4oCiIENyb3NzLWV4ZWN1dG9yIChmcmVzaCBleGVjdXRvciByZWNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWRcbiAgICAvLyAgICAgY2hlY2twb2ludCk6IHNlZWQgYSBORVcgcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgIC8vICAgICBzbyByZXN1bWUgaGFuZGxlcnMgY2FuIHJlYWQgcHJlLXBhdXNlIHNjb3BlLiBUaGUgZXhlY3V0aW9uXG4gICAgLy8gICAgIHRyZWUgc3RhcnRzIGF0IHRoZSByZXN1bWUgZW50cnkg4oCUIHdlIGRvbid0IGhhdmUgdGhlIHByZXZpb3VzXG4gICAgLy8gICAgIHRyYXZlcnNhbCdzIHRyZWUgb24gYSBmcmVzaCBwcm9jZXNzIGFueXdheS5cbiAgICBjb25zdCBzYW1lRXhlY3V0b3IgPSB0aGlzLl9oYXNSdW5CZWZvcmU7XG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gc2FtZUV4ZWN1dG9yXG4gICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cbiAgICAvLyBSZXN1bWUgZ2V0cyBhIE5FVyBydW5JZCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1bi5cbiAgICAvLyBPcmlnaW5hbCBydW5JZCBpcyByZWNvdmVyYWJsZSBmcm9tIGNoZWNrcG9pbnQgbWV0YWRhdGEgaWYgYSBjb25zdW1lclxuICAgIC8vIG5lZWRzIGNyb3NzLXJ1biBhdWRpdCAod2UgZG9uJ3Qgc3RvcmUgaXQgb24gdGhlIGNoZWNrcG9pbnQgdG9kYXk7XG4gICAgLy8gZnV0dXJlIGVuaGFuY2VtZW50KS4gU2VlIGBydW5JZC50c2AuXG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuXG4gICAgLy8gSW5pdGlhbCBjb250ZXh0OiBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAg4oCUIHRoZSB0b3AgbGV2ZWwncyB2aWV3IGF0IHRoZVxuICAgIC8vIHBhdXNlIChhIHN1YmZsb3cncyBvdXRwdXRNYXBwZXIgd3JpdGVzIGJhY2sgaW50byBpdCkuIFNhbWUtZXhlY3V0b3IsIHRoZVxuICAgIC8vIGV4aXN0aW5nIHJ1bnRpbWUgaXMgcmV1c2VkIGFuZCB0aGlzIGlzIG1vb3QsIGJ1dCBwYXNzZWQgZm9yIGNvbnNpc3RlbmN5LlxuICAgIC8vIENsb25lLWluIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIGNhcHR1cmVzOiBgaW5pdGlhbENvbnRleHRgIHNlZWRzXG4gICAgLy8gdGhlIGZyZXNoIFNoYXJlZE1lbW9yeSB2aWEgYG1lcmdlQ29udGV4dFdpbnNgLCB3aGljaCBjb3BpZXMgb25seSB0aGUgVE9QXG4gICAgLy8gbGV2ZWwg4oCUIG5lc3RlZCBvYmplY3RzIHdvdWxkIGFsaWFzIHRoZSBjYWxsZXIncyBjaGVja3BvaW50LlxuICAgIGNvbnN0IHJlc3VtZUluaXRpYWxDb250ZXh0ID0gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpO1xuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihcbiAgICAgIG9wdGlvbnM/LnNpZ25hbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIG9wdGlvbnM/LmVudixcbiAgICAgIG9wdGlvbnM/Lm1heERlcHRoLFxuICAgICAgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucyxcbiAgICAgIHtcbiAgICAgICAgaW5pdGlhbENvbnRleHQ6IHJlc3VtZUluaXRpYWxDb250ZXh0LFxuICAgICAgICBwcmVzZXJ2ZVJlY29yZGVyczogdHJ1ZSxcbiAgICAgICAgLi4uKGV4aXN0aW5nUnVudGltZSA/IHsgZXhpc3RpbmdSdW50aW1lIH0gOiB7fSksXG4gICAgICAgIHJlc3VtZTogcmVzdW1lRW50cnksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBGaXJlIG9uUmVzdW1lIGV2ZW50IG9uIGFsbCByZWNvcmRlcnMgKGZsb3cgKyBzY29wZSkuIFN0YW1wIHRoZVxuICAgIC8vIHN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciB0aGUgcmVzdW1lZCBzdGFnZSB3aXRoIHRoZSBORVdcbiAgICAvLyBydW5JZCBzbyBjb25zdW1lcnMgZGV0ZWN0IFwidGhpcyBpcyBhIGZyZXNoIGxvZ2ljYWwgcnVuXCIgdmlhXG4gICAgLy8gdGhlIHNhbWUgcnVuSWQtY2hhbmdlIHBhdHRlcm4gdGhleSB1c2UgZm9yIGBvblJ1blN0YXJ0YC5cbiAgICAvL1xuICAgIC8vIFRoZSBydW50aW1lU3RhZ2VJZCBpcyB0aGUgU1RBTkQtSU4ncyBvd246IGl0IHJ1bnMgYWZ0ZXIgb25lIG1vdW50IHBlclxuICAgIC8vIHN1YmZsb3cgb24gdGhlIHBhdGggKGVhY2ggZW50ZXJlZCBhdCBpdHMgbW91bnQpLCBzbyBpdHMgZXhlY3V0aW9uIGluZGV4XG4gICAgLy8gaXMgdGhlIGNvdW50ZXIgcGx1cyB0aGUgcGF0aCdzIGxlbmd0aCDigJQgdGhlIGV2ZW50IGFuZCB0aGUgc3RhbmQtaW4nc1xuICAgIC8vIGNvbW1pdCBuYW1lIHRoZSBzYW1lIGV4ZWN1dGlvbi4gKEZpcmVkIGJlZm9yZSB0aGUgdHJhdmVyc2FsIG9uIHB1cnBvc2U6XG4gICAgLy8gYG9uUmVzdW1lYCBwcmVjZWRlcyBgb25SdW5TdGFydGAsIHdoaWNoIHJlY29yZGVycyByZWx5IG9uIHRvIGFkb3B0IHRoZVxuICAgIC8vIG5ldyBydW5JZCB3aXRob3V0IHJlc2V0dGluZy4pIFRoZSBvbmUgc2hhcGUgd2hlcmUgdGhlIGluZGV4IGNhbm5vdCBiZVxuICAgIC8vIGtub3duIHVwIGZyb250IOKAlCBhIGRlZ3JhZGVkIGNoZWNrcG9pbnQgbWlzc2luZyBhbiBPVVRFUiBzdWJmbG93J3NcbiAgICAvLyBjYXB0dXJlLCB3aG9zZSBvcGVuaW5nIHN0YWdlcyB0aGVuIHJlLXJ1biDigJQgbmFtZXMgdGhlIHBsYW5uZWQgcG9zaXRpb24uXG4gICAgY29uc3QgaGFzSW5wdXQgPSByZXN1bWVJbnB1dCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0ZXBzQmVmb3JlU3RhbmRJbiA9IHJlc3VtZUVudHJ5LnN0ZXBzQmVmb3JlU3RhbmRJbiA/PyBjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bWVSdW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSArIHN0ZXBzQmVmb3JlU3RhbmRJbik7XG4gICAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0OiB7XG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWw6ICdmbG93JyBhcyBjb25zdCxcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHRoaXMuY29tYmluZWRSZWNvcmRlci5vblJlc3VtZShmbG93UmVzdW1lRXZlbnQpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHIub25SZXN1bWU/LihmbG93UmVzdW1lRXZlbnQpO1xuXG4gICAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgcGlwZWxpbmVJZDogJycsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHIub25SZXN1bWU/LihzY29wZVJlc3VtZUV2ZW50KTtcblxuICAgIC8vIERlZmVycmVkIHRpZXIgKFJGQy0wMDEpOiB0aGVzZSBleGVjdXRvci1zeW50aGVzaXplZCBvblJlc3VtZSBldmVudHNcbiAgICAvLyBieXBhc3MgdGhlIHBlci1zdGFnZSBkaXNwYXRjaCBzaXRlcywgc28gY2FwdHVyZSB0aGVtIGRpcmVjdGx5LlxuICAgIGlmICh0aGlzLmRlZmVycmVkVGllcikge1xuICAgICAgdGhpcy5kZWZlcnJlZFRpZXIuY2FwdHVyZSgnZmxvdycsICdvblJlc3VtZScsIHJlc3VtZVJ1bnRpbWVTdGFnZUlkLCB0aGlzLl9jdXJyZW50UnVuSWQsIGZsb3dSZXN1bWVFdmVudCk7XG4gICAgICB0aGlzLmRlZmVycmVkVGllci5jYXB0dXJlKFxuICAgICAgICAnc2NvcGUnLFxuICAgICAgICAnb25SZXN1bWUnLFxuICAgICAgICBzY29wZVJlc3VtZUV2ZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzY29wZVJlc3VtZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICAgIHNjb3BlUmVzdW1lRXZlbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uL2xvb2t1cCB0aHJvd3MgYWJvdmUgKG5vdGhpbmcgY2FuIGxlYWsgdGhlXG4gICAgLy8gZmxhZyk7IG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHJhY2UtZnJlZS5cbiAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgdGhpcy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHRoaXMuYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZnVsbHkgREVUQUNIRUQgY2hlY2twb2ludCBmcm9tIGEgY2F1Z2h0IFBhdXNlU2lnbmFsLlxuICAgKlxuICAgKiBFdmVyeSBmaWVsZCBpcyBkZWVwLWNvcGllZCB2aWEgb25lIGBzdHJ1Y3R1cmVkQ2xvbmVgIG9mIHRoZSBhc3NlbWJsZWRcbiAgICogY2hlY2twb2ludCwgYmVjYXVzZSB0aGUgcmF3IHBpZWNlcyBhbGlhcyBsaXZlIGVuZ2luZSBzdGF0ZTpcbiAgICpcbiAgICogICAtIGBzaGFyZWRTdGF0ZWAgSVMgYFNoYXJlZE1lbW9yeWAncyBpbnRlcm5hbCBjb250ZXh0IG9iamVjdCDigJQgdGhlIGFsaWFzXG4gICAqICAgICBvbmx5IGRldGFjaGVzIGF0IHRoZSBuZXh0IGNvbW1pdCAoYGFwcGx5U21hcnRNZXJnZWAgcmVidWlsZHMgaXQpLCBhbmRcbiAgICogICAgIGFmdGVyIGEgcGF1c2UgdGhlcmUgaXMgbm8gbmV4dCBjb21taXQgdW50aWwgcmVzdW1lLlxuICAgKiAgIC0gYGV4ZWN1dGlvblRyZWVgIG5vZGVzIGFyZSBmcmVzaCwgYnV0IHRoZWlyIGBsb2dzYC9gZXJyb3JzYC9gbWV0cmljc2AvXG4gICAqICAgICBgZXZhbHNgL2BzdGFnZVJlYWRzYC9gZmxvd01lc3NhZ2VzYCBmaWVsZHMgcmVmZXJlbmNlIGxpdmVcbiAgICogICAgIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBiYWdzIHRoYXQga2VlcCBhY2N1bXVsYXRpbmcgb24gc2FtZS1leGVjdXRvclxuICAgKiAgICAgcmVzdW1lLlxuICAgKiAgIC0gYHN1YmZsb3dTdGF0ZXNgIHZhbHVlcyBhcmUgc2hhbGxvdyBjb3BpZXMgd2hvc2UgTkVTVEVEIG9iamVjdHMgYWxpYXNcbiAgICogICAgIHN1YmZsb3cgbWVtb3J5LCBhbmQgdGhleSBnZXQgc2VlZGVkIGJhY2sgaW50byBsaXZlIHJ1bnRpbWVzIG9uIHJlc3VtZS5cbiAgICogICAtIGBzdWJmbG93UmVzdWx0c2AgdmFsdWVzIHN0YXkgcmVmZXJlbmNlZCBieSB0aGUgdHJhdmVyc2VyJ3MgcmVzdWx0cyBtYXAuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIHBlcnNpc3RlZCBieSBjb250cmFjdCAoXCJzdG9yZSBpbiBSZWRpcy9Qb3N0Z3Jlc1wiKSDigJQgaXRcbiAgICogbXVzdCBuZXZlciBzaGFyZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW5naW5lLiBQYXVzZSBpcyBub3QgYSBob3QgcGF0aDsgdGhlXG4gICAqIGNsb25lIGNvc3QgaXMgaXJyZWxldmFudC5cbiAgICpcbiAgICogVGhlIEpTT04tc2FmZSBjaGVja3BvaW50IGNvbnRyYWN0IChubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcylcbiAgICogZ292ZXJucyBDT05TVU1FUi1vd25lZCBkYXRhIOKAlCBidXQgdGhlIGV4ZWN1dGlvblRyZWUncyBkaWFnbm9zdGljIGJhZ3NcbiAgICogYWNjZXB0IEFOWSB2YWx1ZSBhdCB3cml0ZSB0aW1lIHdpdGhvdXQgY2xvbmluZyAoJGRlYnVnLyRlcnJvci8kbWV0cmljL1xuICAgKiAkZXZhbCBzdG9yZSByYXcgcmVmZXJlbmNlcyksIHNvIGEgY29udHJhY3QtY29tcGxpYW50IHJ1biBjYW4gc3RpbGwgY2FycnlcbiAgICogYSBub24tY2xvbmVhYmxlIGRpYWdub3N0aWMuIE9ic2VydmFiaWxpdHkgc2lkZS1iYWdzIG5ldmVyIGFib3J0IHRyYXZlcnNhbFxuICAgKiBhbnl3aGVyZSBlbHNlIGluIHRoZSBsaWJyYXJ5LCBzbyB0aGV5IG11c3Qgbm90IGFib3J0IHRoZSBwYXVzZSBlaXRoZXI6XG4gICAqIG9uIGNsb25lIGZhaWx1cmUgd2Ugc2FuaXRpemUgdGhlIGRpYWdub3N0aWMgYmFncyAobm9uLWNsb25lYWJsZSB2YWx1ZXNcbiAgICogYmVjb21lICdbbm9uLXNlcmlhbGl6YWJsZTog4oCmXScgbWFya2VycyDigJQgdGhlIGxpdmUgZW5naW5lIGJhZ3MgYXJlIG5ldmVyXG4gICAqIHRvdWNoZWQpIGFuZCByZXRyeS4gSWYgdGhlIHJldHJ5IFNUSUxMIGZhaWxzLCB0aGUgdmlvbGF0aW9uIGlzIGluXG4gICAqIGNvbnN1bWVyLW93bmVkIGRhdGEgKHJlYWxpc3RpY2FsbHkgYHBhdXNlRGF0YWAg4oCUIGEgZnVuY3Rpb24gY2FuIG5ldmVyXG4gICAqIHJlYWNoIHNoYXJlZCBzdGF0ZSBpbiB0aGUgZmlyc3QgcGxhY2U6IFRyYW5zYWN0aW9uQnVmZmVyIGNsb25lcyBldmVyeVxuICAgKiB3cml0dGVuIHZhbHVlIGF0IHdyaXRlIHRpbWUsIHNvIHRoZSBvZmZlbmRpbmcgd3JpdGUgYWxyZWFkeSByZWplY3RlZClcbiAgICogYW5kIHdlIHRocm93IGEgREVTQ1JJUFRJVkUgY29udHJhY3QgZXJyb3IgbmFtaW5nIHRoZSBvZmZlbmRpbmdcbiAgICogY2hlY2twb2ludCBmaWVsZChzKS4gQSBuYWtlZCBEYXRhQ2xvbmVFcnJvciBuZXZlciBlc2NhcGVzLlxuICAgKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUgKGBzdWJmbG93U3RhdGVzYCkgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RpbmcgaXQgb250byB0aGVcbiAgICogY2hlY2twb2ludCBoZXJlIGxldHMgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIHJlc3RvcmUgcHJlLXBhdXNlIHN1YmZsb3dcbiAgICogc2NvcGUgKGUuZy4gYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWApLiBFbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQYXVzZUNoZWNrcG9pbnQoc2lnbmFsOiBQYXVzZVNpZ25hbCk6IEZsb3djaGFydENoZWNrcG9pbnQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIC8vIExlYW4gc3ViZmxvd1Jlc3VsdHMgZm9yIHRoZSBjaGVja3BvaW50IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpOlxuICAgIC8vICAg4oCiIERST1AgdGhlIHBlci1pdGVyYXRpb24gbW91bnQtcnVudGltZVN0YWdlSWQga2V5cyAoJyMnKSB0aGF0IHRoZSBzbmFwc2hvdCBkdWFsLWtleXMg4oCUXG4gICAgLy8gICAgIHRoZXkgd291bGQgRE9VQkxFIHRoZSBjaGVja3BvaW50LCBhbmQgcmVzdW1lIHJlc3RvcmVzIHNjb3BlIGZyb20gYHN1YmZsb3dTdGF0ZXNgLCBub3QgdGhlc2UuXG4gICAgLy8gICDigKIgU1RSSVAgZWFjaCBzdWJmbG93J3MgYHRyZWVDb250ZXh0Lmhpc3RvcnlgIOKAlCByZXN1bWUgTkVWRVIgcmVhZHMgYHN1YmZsb3dSZXN1bHRzYCAoaXRcbiAgICAvLyAgICAgcmVzdG9yZXMgZnJvbSBgc3ViZmxvd1N0YXRlc2AgKyBgc2hhcmVkU3RhdGVgKSwgc28gdGhlIHBlci1zdWJmbG93IGNvbW1pdCBsb2cgaXMgcHVyZVxuICAgIC8vICAgICBjaGVja3BvaW50IGJsb2F0LiBUaGUgZmxhdCBhZ2VudCdzIGNoZWNrcG9pbnQgY2FycmllcyBubyBjb21taXQgaGlzdG9yeSBlaXRoZXIg4oaSIHN5bW1ldHJpYy5cbiAgICBjb25zdCBsZWFuU3ViZmxvd1Jlc3VsdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc2ZSZXN1bHRzKSB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCcjJykpIGNvbnRpbnVlOyAvLyBwZXItaXRlcmF0aW9uIGtleXMgYXJlIHNuYXBzaG90LW9ubHlcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyB1bmtub3duIGFzIHsgdHJlZUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgaWYgKHY/LnRyZWVDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHRyZWVDdHhSZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNrIG9mIE9iamVjdC5rZXlzKHYudHJlZUNvbnRleHQpKSB7XG4gICAgICAgICAgaWYgKGNrICE9PSAnaGlzdG9yeScpIHRyZWVDdHhSZXN0W2NrXSA9IHYudHJlZUNvbnRleHRbY2tdOyAvLyBzdHJpcCB0aGUgcGVyLXN1YmZsb3cgY29tbWl0IGxvZ1xuICAgICAgICB9XG4gICAgICAgIGxlYW5TdWJmbG93UmVzdWx0c1trZXldID0geyAuLi4odmFsdWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIHRyZWVDb250ZXh0OiB0cmVlQ3R4UmVzdCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVhblN1YmZsb3dSZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHtcbiAgICAgIHNoYXJlZFN0YXRlOiBzbmFwc2hvdC5zaGFyZWRTdGF0ZSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICBwYXVzZWRTdGFnZUlkOiBzaWduYWwuc3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBzaWduYWwuc3ViZmxvd1BhdGgsXG4gICAgICBwYXVzZURhdGE6IHNpZ25hbC5wYXVzZURhdGEsXG4gICAgICBzdWJmbG93U3RhdGVzOiBzaWduYWwuc3ViZmxvd1N0YXRlcyxcbiAgICAgIC8vIENvdW50ZXIgY29udGludWl0eSDigJQgc2VlZGVkIGJhY2sgaW4gcmVzdW1lKCkgc28gcnVudGltZVN0YWdlSWRzIHN0YXlcbiAgICAgIC8vIHVuaXF1ZSBhbmQgbG9vcEl0ZXJhdGlvbiBzdGF5cyBtb25vdG9uaWMgYWNyb3NzIGEgQ1JPU1MtZXhlY3V0b3IgcmVzdW1lXG4gICAgICAvLyAoYm90aCBhcmUgcGxhaW4gbnVtYmVyL3JlY29yZCwgc28gdGhleSByaWRlIHRoZSBzaW5nbGUgc3RydWN0dXJlZENsb25lXG4gICAgICAvLyBiZWxvdyB1bnRvdWNoZWQpLiBTZWUgdGVzdC9saWIvcGF1c2UvcmVzdW1lLWV4ZWN1dGlvbi1jb3VudGVyLWNvbnRpbnVpdHkudGVzdC50cy5cbiAgICAgIGV4ZWN1dGlvbkNvdW50OiB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlLFxuICAgICAgdmlzaXRDb3VudHM6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLl92aXNpdENvdW50cyksXG4gICAgICAuLi4oT2JqZWN0LmtleXMobGVhblN1YmZsb3dSZXN1bHRzKS5sZW5ndGggPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IGxlYW5TdWJmbG93UmVzdWx0cyB9KSxcbiAgICAgIC8vIEludm9rZXIgY29udGV4dCDigJQgY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWwgYnViYmxlLXVwIChub3QgdHJlZS13YWxrZWQpXG4gICAgICAuLi4oc2lnbmFsLmludm9rZXJTdGFnZUlkICYmIHsgaW52b2tlclN0YWdlSWQ6IHNpZ25hbC5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgIC4uLihzaWduYWwuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IHNpZ25hbC5jb250aW51YXRpb25TdGFnZUlkIH0pLFxuICAgICAgLy8gUGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyBmcm9tIHRoZSBzYW1lIGZhbi1vdXQsIHdhaXRpbmcgdGhlaXIgdHVyblxuICAgICAgLy8gKDkuMjguMCkuIEFic2VudCB3aGVuIG9ubHkgb25lIGNoaWxkIHBhdXNlZCDigJQgdGhlIHNoYXBlIGV2ZXJ5XG4gICAgICAvLyBlYXJsaWVyIGNoZWNrcG9pbnQgaGFzLlxuICAgICAgLi4uKHNpZ25hbC5wZW5kaW5nUGF1c2VzLmxlbmd0aCA+IDAgJiYgeyBwZW5kaW5nUGF1c2VzOiBzaWduYWwucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgIC8vIEhPVyB0aGUgcGF1c2Ugd2FzIHJhaXNlZC4gT25lIGNoZWNrcG9pbnQgc2hhcGUsIG9uZSBleHRyYSBvcHRpb25hbFxuICAgICAgLy8gZmllbGQg4oCUIGFuIGludGVycnVwdCgpIHBhdXNlIGlzIG5vdCBhIHNlY29uZCBraW5kIG9mIGNoZWNrcG9pbnQsIGl0IGlzXG4gICAgICAvLyB0aGUgc2FtZSBjaGVja3BvaW50IHRoYXQgcmVzdW1lKCkgcmUtZW50ZXJzIGRpZmZlcmVudGx5IChzdGFnZSB0b3AgdnNcbiAgICAgIC8vIHJlc3VtZUZuKS4gQWJzZW50IGZvciBldmVyeSBwcmUtOS4xNC4wIGNoZWNrcG9pbnQsIHdoaWNoIGlzIGNvcnJlY3QuXG4gICAgICAuLi4oc2lnbmFsLnBhdXNlZEJ5ICYmIHsgcGF1c2VkQnk6IHNpZ25hbC5wYXVzZWRCeSB9KSxcbiAgICAgIHBhdXNlZEF0OiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb24tY2xvbmVhYmxlIGRpYWdub3N0aWNzIG11c3Qgbm90IHN3YWxsb3cgdGhlIHBhdXNlIOKAlCBzYW5pdGl6ZSB0aGVcbiAgICAgIC8vIGV4ZWN1dGlvblRyZWUncyBiYWdzIChtYXJrZXJzIHJlcGxhY2UgdGhlIG9mZmVuZGVycykgYW5kIHJldHJ5LlxuICAgICAgdHJ5IHtcbiAgICAgICAgY2hlY2twb2ludC5leGVjdXRpb25UcmVlID0gc2FuaXRpemVEaWFnbm9zdGljQmFncyhjaGVja3BvaW50LmV4ZWN1dGlvblRyZWUgYXMgU3RhZ2VTbmFwc2hvdCk7XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludCk7XG4gICAgICB9IGNhdGNoIChyZXRyeUVycm9yKSB7XG4gICAgICAgIC8vIEdlbnVpbmUgSlNPTi1zYWZlIGNvbnRyYWN0IHZpb2xhdGlvbiBpbiBjb25zdW1lci1vd25lZCBkYXRhLlxuICAgICAgICB0aHJvdyBkZXNjcmliZUNoZWNrcG9pbnRDbG9uZUZhaWx1cmUoY2hlY2twb2ludCwgcmV0cnlFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELlxuICAgKiBIYW5kbGVzIHN1YmZsb3cgcGF0aHMgYnkgZHJpbGxpbmcgaW50byByZWdpc3RlcmVkIHN1YmZsb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTm9kZUluR3JhcGgoc3RhZ2VJZDogc3RyaW5nLCBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmMgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0O1xuXG4gICAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVG9wLWxldmVsOiBERlMgZnJvbSByb290XG4gICAgICByZXR1cm4gdGhpcy5kZnNGaW5kKGZjLnJvb3QsIHN0YWdlSWQpO1xuICAgIH1cblxuICAgIC8vIFN1YmZsb3c6IGRyaWxsIGludG8gdGhlIHN1YmZsb3cgY2hhaW4sIHRoZW4gc2VhcmNoIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3RcbiAgICBsZXQgc3ViZmxvd1Jvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgICBpZiAoIXN1YmZsb3cpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgICB9XG4gICAgaWYgKCFzdWJmbG93Um9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5kZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG4gIHByaXZhdGUgZGZzRmluZChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gICAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmRmc0ZpbmQoY2hpbGQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLm5leHQpIHJldHVybiB0aGlzLmRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHNjb3BlIFNjb3BlUmVjb3JkZXIgdG8gb2JzZXJ2ZSBkYXRhIG9wZXJhdGlvbnMgKHJlYWRzLCB3cml0ZXMsIGNvbW1pdHMpLlxuICAgKiBBdXRvbWF0aWNhbGx5IGF0dGFjaGVkIHRvIGV2ZXJ5IFNjb3BlRmFjYWRlIGNyZWF0ZWQgZHVyaW5nIHRyYXZlcnNhbC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogSWYgYSByZWNvcmRlciB3aXRoIHRoZSBzYW1lIGBpZGAgaXMgYWxyZWFkeSBhdHRhY2hlZCxcbiAgICogaXQgaXMgcmVwbGFjZWQgKG5vdCBkdXBsaWNhdGVkKS4gVGhpcyBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcgd2hlbiBib3RoXG4gICAqIGEgZnJhbWV3b3JrIGFuZCB0aGUgdXNlciBhdHRhY2ggdGhlIHNhbWUgcmVjb3JkZXIgdHlwZS5cbiAgICpcbiAgICogQnVpbHQtaW4gcmVjb3JkZXJzIHVzZSBhdXRvLWluY3JlbWVudCBJRHMgKGBtZXRyaWNzLTFgLCBgZGVidWctMWAsIC4uLikgYnlcbiAgICogZGVmYXVsdCwgc28gbXVsdGlwbGUgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgY29leGlzdC4gVG8gb3ZlcnJpZGVcbiAgICogYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIsIHBhc3MgdGhlIHNhbWUgd2VsbC1rbm93biBJRC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBNdWx0aXBsZSByZWNvcmRlcnMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyDigJQgZWFjaCBnZXRzIGEgdW5pcXVlIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCkpO1xuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBEZWJ1Z1JlY29yZGVyKHsgdmVyYm9zaXR5OiAnbWluaW1hbCcgfSkpO1xuICAgKlxuICAgKiAvLyBPdmVycmlkZSBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciBieSBwYXNzaW5nIGl0cyB3ZWxsLWtub3duIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdtZXRyaWNzJykpO1xuICAgKlxuICAgKiAvLyBBdHRhY2hpbmcgdHdpY2Ugd2l0aCBzYW1lIElEIHJlcGxhY2VzIChubyBkb3VibGUtY291bnRpbmcpXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpO1xuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTsgLy8gcmVwbGFjZXMgcHJldmlvdXNcbiAgICogYGBgXG4gICAqXG4gICAqICoqRGVsaXZlcnkgdGllciAoUkZDLTAwMSk6KiogcGFzcyBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCB0byB0YWtlIHRoZVxuICAgKiByZWNvcmRlciBvdXQgb2YgdGhlIGVuZ2luZSdzIGhvdCBwYXRoIOKAlCBldmVudHMgYXJlIGNhcHR1cmVkIGludG8gYVxuICAgKiBib3VuZGVkIHF1ZXVlIGFuZCBkZWxpdmVyZWQgYXQgdGhlIG5leHQgbWljcm90YXNrIGNoZWNrcG9pbnQgKFwib25lIGJlYXRcbiAgICogYmVoaW5kXCIpLiBPbWl0dGluZyBgZGVsaXZlcnlgIGtlZXBzIHRoZSBoaXN0b3JpY2FsIHN5bmNocm9ub3VzIGNhbGwsXG4gICAqIGJ5dGUtaWRlbnRpY2FsIHRvIHByZXZpb3VzIHJlbGVhc2VzLiBSZS1hdHRhY2hpbmcgdGhlIHNhbWUgYGlkYCB3aXRoIGFcbiAgICogZGlmZmVyZW50IHRpZXIgU1dBUFMgdGllcnMgY2xlYW5seSDigJQgbmV2ZXIgZG91YmxlIGRlbGl2ZXJ5LiBTZWVcbiAgICogYGRvY3MvZ3VpZGVzL29ic2VydmVycy1kZWZlcnJlZC5tZGAuXG4gICAqL1xuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgLy8gVGllciBzd2FwLCBib3RoIGRpcmVjdGlvbnM6IGFuIGlkIGxpdmVzIG9uIGV4YWN0bHkgT05FIHRpZXIgcGVyIGxpc3QuXG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgaWYgKG9wdGlvbnM/LmRlbGl2ZXJ5ID09PSAnZGVmZXJyZWQnKSB7XG4gICAgICB0aGlzLmVuc3VyZURlZmVycmVkVGllcihvcHRpb25zKS5yZWdpc3RlcihyZWNvcmRlciwgeyBzY29wZTogdHJ1ZSB9LCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kZWZlcnJlZFRpZXI/LnJlbW92ZUZyb21MaXN0cyhyZWNvcmRlci5pZCwgeyBzY29wZTogdHJ1ZSB9KTtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSBjcmVhdGUgdGhlIGV4ZWN1dG9yJ3MgT05FIGRlZmVycmVkLW9ic2VydmVyIHRpZXIgKG9uZSBtZXJnZWRcbiAgICogcXVldWUsIHRvdGFsIGV2ZW50IG9yZGVyIGFjcm9zcyBhbGwgdGhyZWUgY2hhbm5lbHMpLiBUaGUgRklSU1QgZGVmZXJyZWRcbiAgICogYXR0YWNoJ3Mgb3B0aW9ucyBjb25maWd1cmUgdGhlIGRpc3BhdGNoZXI7IGxhdGVyIGRpZmZlcmluZyBvcHRpb25zIGFyZVxuICAgKiBkZXYtd2FybmVkIGFuZCBpZ25vcmVkIChzZWUgYEF0dGFjaFJlY29yZGVyT3B0aW9uc2ApLlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVEZWZlcnJlZFRpZXIob3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IERlZmVycmVkT2JzZXJ2ZXJUaWVyIHtcbiAgICBpZiAoIXRoaXMuZGVmZXJyZWRUaWVyKSB0aGlzLmRlZmVycmVkVGllciA9IG5ldyBEZWZlcnJlZE9ic2VydmVyVGllcihvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFRpZXI7XG4gIH1cblxuICAvLyDilIDilIDilIAgRGV0YWNoIChUNCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIEJhcmUtZXhlY3V0b3IgZW50cnkgcG9pbnQgZm9yIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICAvLyBVc2UgZnJvbSBvdXRzaWRlIGFueSBjaGFydCAoY29uc3VtZXIgY29kZSB0aGF0IHdhbnRzIHRvIGRldGFjaCB3b3JrXG4gIC8vIHdpdGhvdXQgZmlyc3QgcnVubmluZyBhIHBhcmVudCBjaGFydCkuIEZvciBkZXRhY2ggRlJPTSBJTlNJREUgYSBzdGFnZSxcbiAgLy8gdXNlIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIC8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAg4oCUXG4gIC8vIHRob3NlIG1pbnQgcmVmSWRzIGZyb20gdGhlIGNhbGxpbmcgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCBmb3IgdHJhY2VcbiAgLy8gY29ycmVsYXRpb247IHRoZSBiYXJlLWV4ZWN1dG9yIGVudHJpZXMgdXNlIGEgc3ludGhldGljIHByZWZpeFxuICAvLyAoYF9fZXhlY3V0b3JfX2ApIGluc3RlYWQuXG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm4gYSBgRGV0YWNoSGFuZGxlYFxuICAgKiB0aGUgY2FsbGVyIGNhbiBgd2FpdCgpYCBvbiAoUHJvbWlzZSkgb3IgcmVhZCBgLnN0YXR1c2AgZnJvbSAoc3luYykuXG4gICAqXG4gICAqIFRoZSBkcml2ZXIgaXMgYSBSRVFVSVJFRCBmaXJzdCBhcmd1bWVudCDigJQgdGhlcmUgaXMgbm8gbGlicmFyeS1kZWZhdWx0LFxuICAgKiB0byBrZWVwIHRoZSBlbmdpbmUgZnJlZSBvZiBkcml2ZXIgaW1wb3J0cyBhbmQgdG8gbWFrZSB0aGUgY2hvaWNlIG9mXG4gICAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGV4cGxpY2l0IGF0IHRoZSBjYWxsIHNpdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBleGVjID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKHBhcmVudENoYXJ0KTtcbiAgICogY29uc3QgaGFuZGxlID0gZXhlYy5kZXRhY2hBbmRKb2luTGF0ZXIobWljcm90YXNrQmF0Y2hEcml2ZXIsIHRlbGVtZXRyeUNoYXJ0LCB7IGV2ZW50OiAneCcgfSk7XG4gICAqIGF3YWl0IGhhbmRsZS53YWl0KCk7IC8vIG9wdGlvbmFsXG4gICAqIGBgYFxuICAgKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlIHtcbiAgICByZXR1cm4gX2RldGFjaEFuZEpvaW5MYXRlcihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCBESVNDQVJEIHRoZSBoYW5kbGUuXG4gICAqIFVzZSBmb3IgdGVsZW1ldHJ5IGV4cG9ydHMgLyBmaXJlLWFuZC1mb3JnZXQgc2lkZSBlZmZlY3RzIHdoZXJlIHRoZVxuICAgKiBjYWxsZXIgZG9lc24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEVycm9ycyByYWlzZWQgYnkgdGhlIGNoaWxkIHN0aWxsIGxhbmQgb24gdGhlIChkaXNjYXJkZWQpIGhhbmRsZSDigJQgdGhleVxuICAgKiBnbyBzaWxlbnQgdW5sZXNzIHN1cmZhY2VkIHRocm91Z2ggYSByZWNvcmRlci4gRm9yIG9ic2VydmFibGUgZGV0YWNoLFxuICAgKiBwcmVmZXIgYGRldGFjaEFuZEpvaW5MYXRlcmAgYW5kIHN1cmZhY2UgZmFpbHVyZXMgdmlhIGAud2FpdCgpLmNhdGNoKClgLlxuICAgKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQge1xuICAgIF9kZXRhY2hBbmRGb3JnZXQoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRCDigJQgYm90aCBkZWxpdmVyeSB0aWVycy4gKi9cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gICAgdGhpcy5kZWZlcnJlZFRpZXI/LnJlbW92ZUZyb21MaXN0cyhpZCwgeyBzY29wZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzIChib3RoIHRpZXJzKS4gKi9cbiAgZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVSZWNvcmRlcnMsIC4uLih0aGlzLmRlZmVycmVkVGllcj8uc2NvcGVMaXN0UmVjb3JkZXJzKCkgPz8gW10pXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBGbG93UmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgRmxvd1JlY29yZGVyIHRvIG9ic2VydmUgY29udHJvbCBmbG93IGV2ZW50cy5cbiAgICogQXV0b21hdGljYWxseSBlbmFibGVzIG5hcnJhdGl2ZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkg4oCUIHJlY29yZGVycyBhcmUgcGFzc2VkIHRvIHRoZSB0cmF2ZXJzZXIgYXQgY3JlYXRpb24gdGltZS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKlxuICAgKiAqKkRlbGl2ZXJ5IHRpZXIgKFJGQy0wMDEpOioqIHBhc3MgYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgZm9yXG4gICAqIG5leHQtY2hlY2twb2ludCBkZWxpdmVyeSBvZmYgdGhlIGhvdCBwYXRoIOKAlCBzZWUgYGF0dGFjaFNjb3BlUmVjb3JkZXJgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICAvLyBUaWVyIHN3YXAsIGJvdGggZGlyZWN0aW9uczogYW4gaWQgbGl2ZXMgb24gZXhhY3RseSBPTkUgdGllciBwZXIgbGlzdC5cbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucz8uZGVsaXZlcnkgPT09ICdkZWZlcnJlZCcpIHtcbiAgICAgIHRoaXMuZW5zdXJlRGVmZXJyZWRUaWVyKG9wdGlvbnMpLnJlZ2lzdGVyKHJlY29yZGVyLCB7IGZsb3c6IHRydWUgfSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVmZXJyZWRUaWVyPy5yZW1vdmVGcm9tTGlzdHMocmVjb3JkZXIuaWQsIHsgZmxvdzogdHJ1ZSB9KTtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBGbG93UmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hGbG93UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgICB0aGlzLmRlZmVycmVkVGllcj8ucmVtb3ZlRnJvbUxpc3RzKGlkLCB7IGZsb3c6IHRydWUgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVycywgLi4uKHRoaXMuZGVmZXJyZWRUaWVyPy5mbG93TGlzdFJlY29yZGVycygpID8/IFtdKV07XG4gIH1cblxuICAvLyDilIDilIDilIAgQ29tYmluZWQgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSByZWNvcmRlciB0aGF0IG1heSBvYnNlcnZlIG11bHRpcGxlIGV2ZW50IHN0cmVhbXMgKHNjb3BlXG4gICAqIGRhdGEtZmxvdywgY29udHJvbC1mbG93LCBvciBib3RoKS4gRGV0ZWN0cyBhdCBydW50aW1lIHdoaWNoIHN0cmVhbXMgdGhlXG4gICAqIHJlY29yZGVyIGhhcyBtZXRob2RzIGZvciBhbmQgcm91dGVzIGl0IHRvIHRoZSBjb3JyZWN0IGludGVybmFsIGNoYW5uZWxzLlxuICAgKlxuICAgKiBQcmVmZXJyZWQgb3ZlciBjYWxsaW5nIGBhdHRhY2hTY29wZVJlY29yZGVyYCBhbmQgYGF0dGFjaEZsb3dSZWNvcmRlcmBcbiAgICogc2VwYXJhdGVseSwgYmVjYXVzZSBmb3JnZXR0aW5nIG9uZSBvZiB0aGUgdHdvIGlzIGEgc2lsZW50IGZvb3QtZ3VuIOKAlFxuICAgKiBoYWxmIHlvdXIgZXZlbnRzIG5ldmVyIGZpcmUgYW5kIHRoZXJlIGlzIG5vIHJ1bnRpbWUgd2FybmluZy4gV2l0aFxuICAgKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdGhlIGxpYnJhcnkgZ3VhcmFudGVlcyB0aGUgcmVjb3JkZXIncyBkZWNsYXJlZFxuICAgKiBtZXRob2RzIGFsbCBmaXJlLCBhbmQgYWRkcyBubyBvdmVyaGVhZCB2ZXJzdXMgdHdvIGV4cGxpY2l0IGNhbGxzLlxuICAgKlxuICAgKiAjIyBJZGVtcG90ZW5jeVxuICAgKlxuICAgKiBJZGVtcG90ZW50IGJ5IGBpZGAgYWNyb3NzIEFMTCBjaGFubmVscyDigJQgcmUtYXR0YWNoaW5nIHdpdGggdGhlIHNhbWUgYGlkYFxuICAgKiByZXBsYWNlcyB0aGUgcHJldmlvdXMgaW5zdGFuY2UgZXZlcnl3aGVyZSBpdCB3YXMgcmVnaXN0ZXJlZC4gTWl4aW5nXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHgpYCB3aXRoIGEgcHJpb3IgYGF0dGFjaFNjb3BlUmVjb3JkZXIoeSlgIG9yXG4gICAqIGBhdHRhY2hGbG93UmVjb3JkZXIoeSlgIHRoYXQgc2hhcmUgYHguaWQgPT09IHkuaWRgIGlzIGFsc28gc2FmZTogdGhlXG4gICAqIGNvbWJpbmVkIGF0dGFjaCByZXBsYWNlcyB0aGUgc2luZ2xlLWNoYW5uZWwgcmVnaXN0cmF0aW9uIG9uIHdoaWNoZXZlclxuICAgKiBjaGFubmVsKHMpIGB4YCBoYXMgbWV0aG9kcyBmb3IuIE5vIGR1cGxpY2F0ZSBmaXJpbmdzIG9jY3VyLlxuICAgKlxuICAgKiAjIyBOYXJyYXRpdmUgYWN0aXZhdGlvblxuICAgKlxuICAgKiBJZiB0aGUgcmVjb3JkZXIgaGFzIGFueSBjb250cm9sLWZsb3cgbWV0aG9kcywgYGVuYWJsZU5hcnJhdGl2ZSgpYCBpc1xuICAgKiBjYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCAodGhlIG5hcnJhdGl2ZSBzdWJzeXN0ZW0gaXMgcmVxdWlyZWQgdG8gZW1pdFxuICAgKiBjb250cm9sLWZsb3cgZXZlbnRzKS4gRGF0YS1mbG93LW9ubHkgcmVjb3JkZXJzIGRvIE5PVCBhY3RpdmF0ZSB0aGVcbiAgICogbmFycmF0aXZlLlxuICAgKlxuICAgKiAjIyBEZXRlY3Rpb24gcnVsZVxuICAgKlxuICAgKiBPbmx5ICoqb3duKiogZXZlbnQgbWV0aG9kcyBjb3VudCAoc2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgKS4gTWV0aG9kc1xuICAgKiBpbmhlcml0ZWQgdmlhIHRoZSBwcm90b3R5cGUgY2hhaW4gYXJlIGlnbm9yZWQg4oCUIHRoaXMgcHJvdGVjdHMgYWdhaW5zdFxuICAgKiBhY2NpZGVudGFsIGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gYXR0YWNoaW5nIGhhbmRsZXJzIHlvdSBuZXZlclxuICAgKiBkZWNsYXJlZC4gQSByZWNvcmRlciB0aGF0IHByb3ZpZGVzIG9ubHkgYGNsZWFyYC9gdG9TbmFwc2hvdGAgaXMgYVxuICAgKiBuby1vcCBhbmQgZW1pdHMgYSBkZXYtbW9kZSB3YXJuaW5nIHRvIHN1cmZhY2UgdGhlIGxpa2VseSBtaXN0YWtlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGEgPSBoYXNSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0Zsb3cgPSBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNFbWl0ID0gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG5cbiAgICAvLyBEZWxpdmVyeSB0aWVyIChSRkMtMDAxKTogb3B0aW9ucyBiYWcgT1IgdGhlIHJlY29yZGVyJ3Mgb3duXG4gICAgLy8gYGRlbGl2ZXJ5OiAnZGVmZXJyZWQnYCBmaWVsZC4gVGhlIGZpZWxkIGlzIGEgc3RyaW5nIOKAlCBjaGFubmVsIHJvdXRpbmdcbiAgICAvLyBhYm92ZSBjb3VudHMgZXZlbnQtTUVUSE9EIHByb3BlcnRpZXMgb25seSwgc28gZGVjbGFyaW5nIGl0IG5ldmVyXG4gICAgLy8gY2hhbmdlcyB3aGljaCBjaGFubmVscyB0aGUgcmVjb3JkZXIgbGFuZHMgb24uXG4gICAgY29uc3QgZGVsaXZlcnkgPSBvcHRpb25zPy5kZWxpdmVyeSA/PyByZWNvcmRlci5kZWxpdmVyeTtcbiAgICBjb25zdCB0aWVyT3B0aW9uczogQXR0YWNoUmVjb3JkZXJPcHRpb25zIHwgdW5kZWZpbmVkID0gZGVsaXZlcnkgPT09IHVuZGVmaW5lZCA/IG9wdGlvbnMgOiB7IC4uLm9wdGlvbnMsIGRlbGl2ZXJ5IH07XG5cbiAgICAvLyBFbWl0IHJlY29yZGVycyBsaXZlIG9uIHRoZSBTQU1FIGNoYW5uZWwgYXMgZGF0YS1mbG93IHJlY29yZGVyc1xuICAgIC8vIChTY29wZUZhY2FkZSBpdGVyYXRlcyBgX3JlY29yZGVyc2AgZm9yIG9uRW1pdCBkaXNwYXRjaCkuIFNvXG4gICAgLy8gYXR0YWNoRW1pdFJlY29yZGVyIGludGVybmFsbHkgY2FsbHMgYXR0YWNoU2NvcGVSZWNvcmRlciDigJQgYnV0IHdlIHdhbnQgdG9cbiAgICAvLyBhdm9pZCBkb3VibGUtYXR0YWNoIHdoZW4gdGhlIHJlY29yZGVyIGltcGxlbWVudHMgQk9USCBvbkVtaXQgQU5EXG4gICAgLy8gb3RoZXIgU2NvcGVSZWNvcmRlciBtZXRob2RzLiBTaG9ydC1jaXJjdWl0OiBpZiBoYXNEYXRhIE9SIGhhc0VtaXQsIHRoZVxuICAgIC8vIHJlY29yZGVyIGxhbmRzIG9uIHRoZSBzY29wZS1yZWNvcmRlciBsaXN0IGV4YWN0bHkgb25jZS5cbiAgICBpZiAoaGFzRGF0YSB8fCBoYXNFbWl0KSB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlciwgdGllck9wdGlvbnMpO1xuICAgIGlmIChoYXNGbG93KSB0aGlzLmF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlciBhcyBGbG93UmVjb3JkZXIsIHRpZXJPcHRpb25zKTtcblxuICAgIGlmICghaGFzRGF0YSAmJiAhaGFzRmxvdyAmJiAhaGFzRW1pdCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gRGV2LW1vZGUgb25seTogc2lsZW50IHNraXBzIGFyZSBpbnZpc2libGUgYW5kIHByb2R1Y2UgaGFyZC10by1kZWJ1Z1xuICAgICAgLy8gXCJ3aHkgZGlkbid0IG15IHJlY29yZGVyIGZpcmVcIiByZXBvcnRzLiBQZXIgbGlicmFyeSBjb252ZW50aW9uLCBnYXRlZFxuICAgICAgLy8gb24gdGhlIGNlbnRyYWwgaXNEZXZNb2RlKCkgZmxhZyAobm90IHByb2Nlc3MuZW52KSBzbyBjb25zdW1lcnMgY2FuXG4gICAgICAvLyBjb250cm9sIGRldiB0b29saW5nIGNlbnRyYWxseSB2aWEgZW5hYmxlRGV2TW9kZSgpL2Rpc2FibGVEZXZNb2RlKCkuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludGpzXSBhdHRhY2hDb21iaW5lZFJlY29yZGVyOiByZWNvcmRlciAnJHtyZWNvcmRlci5pZH0nIGhhcyBgICtcbiAgICAgICAgICAnbm8gb2JzZXJ2ZXIgZXZlbnQgbWV0aG9kcyDigJQgbm90aGluZyB0byBhdHRhY2guIERpZCB5b3UgZm9yZ2V0IHRvICcgK1xuICAgICAgICAgICdhZGQgYW4gb24qIGhhbmRsZXIgKG9uV3JpdGUsIG9uRGVjaXNpb24sIG9uU3ViZmxvd0VudHJ5LCAuLi4pPyAnICtcbiAgICAgICAgICAnTm90ZTogb25seSBPV04gcHJvcGVydGllcyBjb3VudDsgbWV0aG9kcyBvbiB0aGUgcHJvdG90eXBlIGNoYWluICcgK1xuICAgICAgICAgICdhcmUgaWdub3JlZCBvbiBwdXJwb3NlLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjb21iaW5lZCByZWNvcmRlciBmcm9tIGFsbCBjaGFubmVscyBpdCB3YXMgYXR0YWNoZWQgdG8uXG4gICAqIFNhZmUgdG8gY2FsbCBpZiB0aGUgcmVjb3JkZXIgd2FzIG9ubHkgb24gb25lIGNoYW5uZWwgb3IgbmV2ZXIgYXR0YWNoZWQuXG4gICAqL1xuICBkZXRhY2hDb21iaW5lZFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFbWl0IFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCAoUGhhc2UgMykg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbiBgRW1pdFJlY29yZGVyYCDigJQgYW4gb2JzZXJ2ZXIgZm9yIGNvbnN1bWVyLWVtaXR0ZWQgc3RydWN0dXJlZFxuICAgKiBldmVudHMgZmlyZWQgdmlhIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAuXG4gICAqXG4gICAqIEludGVybmFsbHksIGVtaXQgcmVjb3JkZXJzIHNoYXJlIHRoZSBzY29wZS1yZWNvcmRlciBjaGFubmVsIGJlY2F1c2VcbiAgICogZW1pdCBldmVudHMgZmlyZSBmcm9tIGluc2lkZSBgU2NvcGVGYWNhZGVgIGR1cmluZyBzdGFnZSBleGVjdXRpb24sXG4gICAqIHNhbWUgdGltaW5nIGFzIGBvblJlYWRgL2BvbldyaXRlYC4gVGhpcyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSB0aGF0XG4gICAqIGRlbGVnYXRlcyB0byBgYXR0YWNoU2NvcGVSZWNvcmRlcmAg4oCUIGNvbnN1bWVycyBjYW4gYWxzbyB1c2VcbiAgICogYGF0dGFjaFNjb3BlUmVjb3JkZXJgIGRpcmVjdGx5IGZvciBhIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBCT1RIXG4gICAqIGBvbldyaXRlYCBhbmQgYG9uRW1pdGAuIEVpdGhlciBhcHByb2FjaCBwbGFjZXMgdGhlIHJlY29yZGVyIG9uIHRoZVxuICAgKiBzYW1lIHVuZGVybHlpbmcgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IGBpZGA6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGJ5IGlkLiBTYWZlIHRvIGNhbGwgaWYgbmV2ZXIgYXR0YWNoZWQuICovXG4gIGRldGFjaEVtaXRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIChib3RoIGRlbGl2ZXJ5IHRpZXJzKVxuICAgKiBmaWx0ZXJlZCB0byB0aG9zZSB0aGF0IGltcGxlbWVudCBgb25FbWl0YC4gVXNlZnVsIGZvciBpbnNwZWN0aW9uIGR1cmluZ1xuICAgKiB0ZXN0aW5nLlxuICAgKi9cbiAgZ2V0RW1pdFJlY29yZGVycygpOiBFbWl0UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVSZWNvcmRlcnMoKS5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIOKAlCB0aGUgc2luZ2xlIHB1YmxpYyBuYXJyYXRpdmUgQVBJLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmRcbiAgICogZGVwdGguIENvbnN1bWVycyByZW5kZXIgaG93ZXZlciB0aGV5IHdhbnQ7IGNhbGwgYC5tYXAoZSA9PiBlLnRleHQpYFxuICAgKiBpZiBhIGZsYXQgYHN0cmluZ1tdYCBpcyBuZWVkZWQgbG9jYWxseS5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIEZsb3dSZWNvcmRlcnMgbGlzdC4gV2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCxcbiAgICogaW5jbHVkZXMgdGhlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKHdoaWNoIGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhXG4gICAqIGVudHJpZXMgaW5saW5lKS4gUGx1cyBhbnkgdXNlci1hdHRhY2hlZCByZWNvcmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKTogRmxvd1JlY29yZGVyW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlcnMucHVzaCh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZWNvcmRlcnMucHVzaCguLi50aGlzLmZsb3dSZWNvcmRlcnMpO1xuICAgIC8vIERlZmVycmVkLW9ic2VydmVyIGZsb3cgdGFwIChSRkMtMDAxIEJsb2NrIDcpIOKAlCBjYXB0dXJlcyBldmVyeSBmbG93XG4gICAgLy8gZXZlbnQgZm9yIGRlZmVycmVkIGxpc3RlbmVycy4gQXBwZW5kZWQgbGlrZSBhbnkgb3RoZXIgZmxvdyByZWNvcmRlcixcbiAgICAvLyBzbyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciBzaXRlIG5lZWRzIG5vIHRpZXIgbG9naWMgb2YgaXRzIG93bi5cbiAgICBjb25zdCBmbG93VGFwID0gdGhpcy5kZWZlcnJlZFRpZXI/LmJ1aWxkRmxvd1RhcCgpO1xuICAgIGlmIChmbG93VGFwKSByZWNvcmRlcnMucHVzaChmbG93VGFwKTtcbiAgICByZXR1cm4gcmVjb3JkZXJzLmxlbmd0aCA+IDAgPyByZWNvcmRlcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgY2hhcnQuIFJlc29sdmVzIHdoZW4gdGhlIHJ1biBmaW5pc2hlcyDigJQgb3IgcGF1c2VzLCBpZiBhXG4gICAqIHBhdXNhYmxlIHN0YWdlIHJldHVybmVkIGRhdGEgKGNoZWNrIGBpc1BhdXNlZCgpYCBhZnRlcndhcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBgeyBpbnB1dCwgZW52IH1gIOKAlCBgaW5wdXRgIGlzIHRoZSBmcm96ZW4gYnVzaW5lc3MgaW5wdXRcbiAgICogICAocmVhZCBpbiBhIHN0YWdlIHZpYSBgc2NvcGUuJGdldEFyZ3MoKWApOyBgZW52YCBpcyBpbmZyYXN0cnVjdHVyZSBjb250ZXh0XG4gICAqICAgbGlrZSBgeyBzaWduYWwsIHRpbWVvdXRNcywgdHJhY2VJZCB9YCAocmVhZCB2aWEgYHNjb3BlLiRnZXRFbnYoKWApLlxuICAgKlxuICAgKiBBZnRlciBpdCByZXNvbHZlcywgcmVhZCByZXN1bHRzIG9mZiB0aGUgZXhlY3V0b3I6XG4gICAqIC0gYGdldFNuYXBzaG90KClgIOKAlCBmdWxsIHN0YXRlLCBjb21taXQgbG9nLCBleGVjdXRpb24gdHJlZS5cbiAgICogLSBgZ2V0TmFycmF0aXZlRW50cmllcygpYCDigJQgdGhlIHBsYWluLUVuZ2xpc2ggdHJhY2UgKGNhbGwgYGVuYWJsZU5hcnJhdGl2ZSgpYFxuICAgKiAgIG9yIGF0dGFjaCBhIGBuYXJyYXRpdmUoKWAgcmVjb3JkZXIgZmlyc3QpLlxuICAgKiAtIGBpc1BhdXNlZCgpYCDigJQgdHJ1ZSBpZiBhIHN0YWdlIHBhdXNlZDsgdGhlbiB1c2UgYGdldENoZWNrcG9pbnQoKWAgLyBgcmVzdW1lKClgLlxuICAgKlxuICAgKiBPbmUgcnVuIGF0IGEgdGltZSBwZXIgZXhlY3V0b3Ig4oCUIGl0IGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsXG4gICAqIGNoZWNrcG9pbnQpLiBDcmVhdGUgb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi5cbiAgICovXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBSZS1lbnRyYW5jeSBndWFyZCBGSVJTVCDigJQgYmVmb3JlIGNsZWFyaW5nIHJlY29yZGVycyBvciB0b3VjaGluZyBhbnlcbiAgICAvLyBwZXItcnVuIGZpZWxkLCBzbyBhIHJlamVjdGVkIGNvbmN1cnJlbnQgY2FsbCBsZWF2ZXMgdGhlIGluLWZsaWdodCBydW5cbiAgICAvLyBjb21wbGV0ZWx5IHVudG91Y2hlZC5cbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiBydW4oKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyAnICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGlucHV0IGFnYWluc3QgaW5wdXRTY2hlbWEgaWYgYm90aCBhcmUgcHJlc2VudC4gVmFsaWRhdGlvbiBydW5zXG4gICAgLy8gQkVGT1JFIHRoZSB0aW1lb3V0IHRpbWVyIGlzIGNyZWF0ZWQgc28gYSByZWplY3RlZCBpbnB1dCBjYW4ndCBsZWFrIGFcbiAgICAvLyBwZW5kaW5nIHRpbWVyIChzYW1lIFwiZmFpbGVkIGVudHJ5IGxlYXZlcyBubyBzaWRlIGVmZmVjdHNcIiBydWxlIGFzIHRoZVxuICAgIC8vIHJlLWVudHJhbmN5IGd1YXJkIGFib3ZlKS5cbiAgICBsZXQgdmFsaWRhdGVkSW5wdXQgPSBvcHRpb25zPy5pbnB1dDtcbiAgICBpZiAodmFsaWRhdGVkSW5wdXQgJiYgdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSkge1xuICAgICAgdmFsaWRhdGVkSW5wdXQgPSB2YWxpZGF0ZUlucHV0KHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEsIHZhbGlkYXRlZElucHV0KTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cbiAgICB0aGlzLmRlZmVycmVkVGllcj8uY2xlYXJSZWNvcmRlcnMoKTtcblxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTsgLy8gUmVzZXQgY291bnRlciBvbiBmcmVzaCBydW5cbiAgICB0aGlzLl92aXNpdENvdW50cyA9IG5ldyBNYXAoKTsgLy8gUmVzZXQgbG9vcC1pdGVyYXRpb24gY291bnRzIG9uIGZyZXNoIHJ1biAodHdpbiBvZiBfZXhlY3V0aW9uQ291bnRlcilcbiAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7IC8vIEZyZXNoIHJ1bklkIHBlciBydW4oKSBjYWxsXG4gICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gbWFyayBzbyBhIGxhdGVyIHJlc3VtZSgpIHRha2VzIHRoZVxuICAgIC8vIHNhbWUtZXhlY3V0b3IgYnJhbmNoIChyZXVzZSBydW50aW1lLCBhY2N1bXVsYXRlIGV4ZWN1dGlvbiB0cmVlKS5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKFxuICAgICAgc2lnbmFsLFxuICAgICAgdmFsaWRhdGVkSW5wdXQsXG4gICAgICBvcHRpb25zPy5lbnYsXG4gICAgICBvcHRpb25zPy5tYXhEZXB0aCxcbiAgICAgIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsXG4gICAgKTtcbiAgICAvLyBTZXQgQUZURVIgYWxsIHN5bmMgdmFsaWRhdGlvbiB0aHJvd3MgKG5vdGhpbmcgYWJvdmUgY2FuIGxlYWsgdGhlIGZsYWcpO1xuICAgIC8vIG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHRoaXMgaXMgcmFjZS1mcmVlLlxuICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCkgYXQgdGhlIFJFU09MVkUgYm91bmRhcnk6IGV2ZXJ5XG4gICAgICAvLyBjYXB0dXJlZC1idXQtdW5kZWxpdmVyZWQgb2JzZXJ2ZXIgZXZlbnQgaXMgZGVsaXZlcmVkIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGJlZm9yZSBydW4oKSByZXR1cm5zIOKAlCBcIm9uZSBiZWF0IGJlaGluZFwiIG5ldmVyIGJlY29tZXMgXCJsb3N0IGF0IGV4aXRcIi5cbiAgICAgIHRoaXMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBUZXJtaW5hbCBmbHVzaCBhdCB0aGUgUEFVU0UgYW5kIFJFSkVDVCBib3VuZGFyaWVzIOKAlCB0aGlzIGlzIHRoZVxuICAgICAgLy8gT1VURVJNT1NUIGhhbmRsZXIgKGEgcGF1c2UgcmUtdGhyb3dzIHRocm91Z2ggc3ViZmxvdyB0cmF2ZXJzZXJzXG4gICAgICAvLyB3aXRob3V0IGV4aXQgZXZlbnRzLCBzbyBwZXItdHJhdmVyc2VyIGhvb2tzIHdvdWxkIG1pc3MgaXQpLiBSdW5zXG4gICAgICAvLyBiZWZvcmUgdGhlIGNoZWNrcG9pbnQgaXMgZXhwb3NlZCBhbmQgYmVmb3JlIHRoZSBlcnJvciByZWFjaGVzIHRoZVxuICAgICAgLy8gY2FsbGVyLlxuICAgICAgdGhpcy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAvLyBCdWlsZCBhIGRldGFjaGVkIGNoZWNrcG9pbnQgZnJvbSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZSDigJQgc2VlXG4gICAgICAgIC8vIGJ1aWxkUGF1c2VDaGVja3BvaW50KCkgZm9yIHRoZSBkZWVwLWNvcHkgcmF0aW9uYWxlLlxuICAgICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdGhpcy5idWlsZFBhdXNlQ2hlY2twb2ludChlcnJvcik7XG4gICAgICAgIC8vIFJldHVybiBhIFBhdXNlUmVzdWx0LXNoYXBlZCB2YWx1ZSBzbyBjYWxsZXJzIGNhbiBjaGVjayB3aXRob3V0IHRyeS9jYXRjaFxuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgICBpZiAodGltZW91dElkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgYmFja2xvZywgdGhlbiBhd2FpdCBhc3luYyBsaXN0ZW5lclxuICAgKiBjb21wbGV0aW9ucyB1bmRlciBhIGRlYWRsaW5lIChSRkMtMDAxIEJsb2NrIDgg4oCUIHRoZSBzZXJ2ZXJsZXNzIC9cbiAgICogZ3JhY2VmdWwtc2h1dGRvd24gcGF0dGVybjogY2FsbCBiZWZvcmUgdGhlIHByb2Nlc3MgZnJlZXplcyBvciBleGl0cyBzb1xuICAgKiBcIm9uZSBiZWF0IGJlaGluZFwiIHdvcmsgaXMgbm90IGxvc3QpLiBSZXNvbHZlcyBpbW1lZGlhdGVseSB3aXRoIHplcm9zXG4gICAqIHdoZW4gbm8gZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGV2ZXIgYXR0YWNoZWQuIGBwZW5kaW5nID09PSAwYCBtZWFucyBhXG4gICAqIGZ1bGwgZHJhaW47IGEgbm9uLXplcm8gYHBlbmRpbmdgIHJlcG9ydHMgY29udGludWF0aW9ucyAocGx1cyBhbnkgcXVldWVkXG4gICAqIGV2ZW50cykgc3RpbGwgb3V0c3RhbmRpbmcgYXQgdGhlIGRlYWRsaW5lIOKAlCBob25lc3QsIG5ldmVyIHNpbGVudC5cbiAgICovXG4gIGRyYWluT2JzZXJ2ZXJzKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxPYnNlcnZlckRyYWluUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmRlZmVycmVkVGllcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IDAsIGZhaWxlZDogMCwgcGVuZGluZzogMCB9KTtcbiAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFRpZXIuZHJhaW4ob3B0cyk7XG4gIH1cblxuICAvLyDilIDilIDilIAgSW50cm9zcGVjdGlvbiDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBXaGVuIGB0cnVlYCwgYHNoYXJlZFN0YXRlYCBjb21lcyBmcm9tIHRoZSBwYXJhbGxlbFxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciAoaWYgbWFpbnRhaW5lZCDigJQgc2VlIGBzZXRSZWRhY3Rpb25Qb2xpY3lgKS4gVGhpcyBpc1xuICAgKiAgIHRoZSBzYWZlIHZpZXcgZm9yIGV4cG9ydGluZyB0cmFjZXMgZXh0ZXJuYWxseSAocGFzdGUgaW50byBhIHZpZXdlcixcbiAgICogICBzaGFyZSB3aXRoIHN1cHBvcnQpLiBXaGVuIG5vIHJlZGFjdGlvbiBwb2xpY3kgaXMgY29uZmlndXJlZCB0aGVcbiAgICogICByZWRhY3RlZCBtaXJyb3IgaXMgbm90IG1haW50YWluZWQsIHNvIHRoaXMgZmxhZyBpcyBhIG5vLW9wIOKAlFxuICAgKiAgIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIHJhdyB3b3JraW5nIG1lbW9yeSBlaXRoZXIgd2F5LiBEZWZhdWx0IGBmYWxzZWAuXG4gICAqXG4gICAqICAgVGhlIGNvbW1pdCBsb2cgaXMgYWxyZWFkeSByZWRhY3RlZCBhdCB3cml0ZS10aW1lIHJlZ2FyZGxlc3Mgb2YgdGhpc1xuICAgKiAgIGZsYWcsIGFuZCB0aGUgZXhlY3V0aW9uIHRyZWUgY2FycmllcyBvbmx5IHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqICAgYHN1YmZsb3dSZXN1bHRzWypdLnRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGZvbGxvd3MgdGhlIGZsYWcgdG9vXG4gICAqICAgKDkuMjAuMCk6IHVuZGVyIGByZWRhY3Q6IHRydWVgIGl0IGlzIGVhY2ggc3ViZmxvdydzIG93biByZWRhY3RlZFxuICAgKiAgIG1pcnJvcjsgcGxhaW4sIHRoZSBzdWJmbG93J3MgbGl2ZSBoZWFwLlxuICAgKlxuICAgKiAqKlRyZWF0IGBzaGFyZWRTdGF0ZWAgYXMgUkVBRC1PTkxZLioqIEluIHByb2R1Y3Rpb24gaXQgaXMgYSBsaXZlIHZpZXcgb2ZcbiAgICogdGhlIGVuZ2luZSdzIHdvcmtpbmcgbWVtb3J5ICh6ZXJvIGNvcHkgY29zdCkg4oCUIG11dGF0aW5nIGl0IGNvcnJ1cHRzXG4gICAqIGVuZ2luZSBzdGF0ZS4gSW4gZGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBpdCBpcyBhIGRlZXAtZnJvemVuIENMT05FLFxuICAgKiBzbyBhbnkgY29uc3VtZXIgbXV0YXRpb24gdGhyb3dzIGxvdWRseSBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgc2lsZW50bHkuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3Qob3B0aW9ucykgYXMgUnVudGltZVNuYXBzaG90O1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gRGV2LW1vZGUgbXV0YXRpb24gZ3VhcmQ6IGZyZWV6ZSBhIENMT05FLCBuZXZlciB0aGUgbGl2ZSBlbmdpbmVcbiAgICAgIC8vIHN0YXRlIOKAlCBgc25hcHNob3Quc2hhcmVkU3RhdGVgIGFsaWFzZXMgU2hhcmVkTWVtb3J5J3MgaW50ZXJuYWxcbiAgICAgIC8vIGNvbnRleHQgdW50aWwgdGhlIG5leHQgY29tbWl0IHJlYnVpbGRzIGl0IChwb3N0LXJ1bjogZm9yZXZlcikuXG4gICAgICAvLyBQcm9kdWN0aW9uIHN0YXlzIHplcm8tY29weTsgY2xvbmUtYWx3YXlzIGlzIGEgbWVhc3VyZWQgZGVjaXNpb25cbiAgICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgICAvLyBOT1RFOiBkZWVwRnJlZXplIChyZXVzZWQgZnJvbSByZWFkb25seUlucHV0KSBmcmVlemVzIHBsYWluIG9iamVjdHMvXG4gICAgICAvLyBhcnJheXMgb25seSDigJQgTWFwL1NldCBJTlRFUk5BTFMgc3RheSBtdXRhYmxlIChgbWFwLnNldCgpYCBvbiB0aGVcbiAgICAgIC8vIGZyb3plbiBjbG9uZSB3b24ndCB0aHJvdykuIFRoZSBDTE9ORSBzdGlsbCBpc29sYXRlcyB0aGUgZW5naW5lLlxuICAgICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICAgIH1cbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAgIC8vIFVuZGVyIGByZWRhY3Q6IHRydWVgIGVhY2ggc3ViZmxvdydzIGBnbG9iYWxDb250ZXh0YCBpcyBpdHMgb3duIG1pcnJvclxuICAgICAgLy8gKDkuMjAuMCkg4oCUIHNlcnZlZCwgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSByZWNvcmQgKHNlZVxuICAgICAgLy8gZW5naW5lL2hhbmRsZXJzL3NlcnZlZFN1YmZsb3dSZXN1bHRzLnRzKS4gUGxhaW46IHRoZSByZWNvcmRzIGFzIHRoZXkgYXJlLlxuICAgICAgc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMgPSBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhzZlJlc3VsdHMsIG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkZXJTbmFwc2hvdHMgPSB0aGlzLmNvbGxlY3RSZWNvcmRlclNuYXBzaG90cygpO1xuICAgIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgICB9XG5cbiAgICAvLyBSRkMtMDAxIEJsb2NrIDk6IHRoZSBkZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIHN1cmZhY2UuIFByZXNlbnRcbiAgICAvLyBPTkxZIHdoZW4gYSBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQgb24gdGhpcyBleGVjdXRvciDigJRcbiAgICAvLyB6ZXJvLWNvc3QgZGlzY2lwbGluZSBmb3IgZXZlcnlvbmUgZWxzZS5cbiAgICBpZiAodGhpcy5kZWZlcnJlZFRpZXIpIHtcbiAgICAgIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMgPSB0aGlzLmRlZmVycmVkVGllci5nZXRTdGF0cygpO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IGB0b1NuYXBzaG90KClgIGJ1bmRsZXMgZnJvbSBldmVyeSBhdHRhY2hlZCByZWNvcmRlciDigJQgT05FIGVudHJ5XG4gICAqIHBlciByZWNvcmRlciBpZCwgYWNyb3NzIGFsbCBjaGFubmVscyBhbmQgYm90aCBkZWxpdmVyeSB0aWVycy5cbiAgICpcbiAgICogVGhlIGRlZHVwZSBpcyBsb2FkLWJlYXJpbmcsIG5vdCB0aWRpbmVzcy4gQSByZWNvcmRlciB0aGF0IGltcGxlbWVudHMgYVxuICAgKiBzaGFyZWQtbmFtZSBob29rIChgb25FcnJvcmAgLyBgb25QYXVzZWAgLyBgb25SZXN1bWVgIOKAlCBkZWNsYXJlZCBvbiBCT1RIXG4gICAqIHRoZSBzY29wZSBhbmQgZmxvdyBpbnRlcmZhY2VzKSBpcyBsZWdpdGltYXRlbHkgcmVnaXN0ZXJlZCBvbiBCT1RIIGlubGluZVxuICAgKiBsaXN0cyBieSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnbjogZWFjaCBjaGFubmVsXG4gICAqIGNhbGxzIHRoZSBob29rIHdpdGggaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuIGBNZXRyaWNSZWNvcmRlci5vblBhdXNlYCBpc1xuICAgKiB0aGUgZXZlcnlkYXkgY2FzZS4gV2Fsa2luZyB0aGUgbGlzdHMgd2l0aG91dCBhIHNoYXJlZCBgc2VlbmAgc2V0IHR1cm5lZFxuICAgKiB0aGF0IGludG8gYSBEVVBMSUNBVEVEIHNuYXBzaG90IGVudHJ5IChzYW1lIGlkIHR3aWNlKSwgd2hpY2ggYnJlYWtzIGV2ZXJ5XG4gICAqIGNvbnN1bWVyIHRoYXQgaW5kZXhlcyBgc25hcHNob3QucmVjb3JkZXJzYCBieSBpZC5cbiAgICpcbiAgICogT3JkZXJpbmcgaXMgc2NvcGUgbGlzdCDihpIgZmxvdyBsaXN0IOKGkiBkZWZlcnJlZCB0aWVyLCBhbmQgdGhlIEZJUlNUIGJ1bmRsZVxuICAgKiBmb3IgYW4gaWQgd2lucy4gQSByZWNvcmRlciB3aXRoIG5vIGB0b1NuYXBzaG90YCBuZXZlciBjbGFpbXMgYW4gaWQsIHNvIGl0XG4gICAqIGNhbm5vdCBzaGFkb3cgYSBzYW1lLWlkIHJlY29yZGVyIHRoYXQgZG9lcyBoYXZlIG9uZS5cbiAgICpcbiAgICogVGhlIHJvdyBpcyBSRUJVSUxUIGZpZWxkIGJ5IGZpZWxkIHJhdGhlciB0aGFuIHNwcmVhZCwgc28gdGhhdCBhIHJlY29yZGVyXG4gICAqIGNhbm5vdCBzbXVnZ2xlIGFuIGBpZGAgb2YgaXRzIG93biBjaG9vc2luZyBpbnRvIHRoZSBzbmFwc2hvdCAodGhlIGlkIGlzXG4gICAqIHRoZSBleGVjdXRvcidzLCBhbmQgY29uc3VtZXJzIGluZGV4IGJ5IGl0KS4gVGhlIGNvc3Qgb2YgdGhhdCBpcyByZWFsOlxuICAgKiBhbnl0aGluZyB0aGUgcmVjb3JkZXIgcmV0dXJucyBhbmQgdGhpcyBsaXN0IGZvcmdldHMgaXMgZHJvcHBlZCBpblxuICAgKiBzaWxlbmNlLiBgbWV0YWAgaXMgb24gdGhlIGxpc3QgZm9yIGV4YWN0bHkgdGhhdCByZWFzb24g4oCUIGEgcmVjb3JkZXIgdGhhdFxuICAgKiBzaGlwcyBtb3JlIHRoYW4gb25lIGJ1bmRsZSBzaGFwZSBuZWVkcyBvbmUgZmllbGQgYW4gb2ZmbGluZSByZWFkZXIgY2FuXG4gICAqIGJyYW5jaCBvbiwgYW5kIHVudGlsIGl0IHdhcyBjb3BpZWQgaGVyZSB0aGUgb25seSBwbGFjZSB0byBzYXkgd2hpY2hcbiAgICogc2hhcGUgeW91IHdlcmUgaG9sZGluZyB3YXMgdGhlIHByb3NlIGluIGBkZXNjcmlwdGlvbmAuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3RSZWNvcmRlclNuYXBzaG90cygpOiBSZWNvcmRlclNuYXBzaG90W10ge1xuICAgIGNvbnN0IG91dDogUmVjb3JkZXJTbmFwc2hvdFtdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNvbGxlY3QgPSAocjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFyLnRvU25hcHNob3QgfHwgc2Vlbi5oYXMoci5pZCkpIHJldHVybjtcbiAgICAgIHNlZW4uYWRkKHIuaWQpO1xuICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICBtZXRhOiBzbmFwLm1ldGEsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSBjb2xsZWN0KHIpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIGNvbGxlY3Qocik7XG4gICAgaWYgKHRoaXMuZGVmZXJyZWRUaWVyKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5kZWZlcnJlZFRpZXIuc2NvcGVMaXN0UmVjb3JkZXJzKCkpIGNvbGxlY3Qocik7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5kZWZlcnJlZFRpZXIuZmxvd0xpc3RSZWNvcmRlcnMoKSkgY29sbGVjdChyKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
|