footprintjs 8.2.0 → 8.3.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.
@@ -71,6 +71,21 @@ class FlowchartTraverser {
71
71
  * resolver before another traverser has finished using it.
72
72
  */
73
73
  resolvedLazySubflows = new Set();
74
+ /**
75
+ * Per-traverser overlay of dynamic StageNode returns, keyed by `node.id`.
76
+ * Phase 4 writes patches HERE instead of mutating the shared built-chart
77
+ * node objects (same isolation convention as `resolvedLazySubflows`).
78
+ * All engine reads of the patched fields go through the `eff*` accessors
79
+ * below. The map dies with the traverser — one run, one overlay — so a
80
+ * fresh executor over the same built chart always sees the original graph.
81
+ *
82
+ * Keyed by the node OBJECT (WeakMap), not `node.id`: a dynamic child that
83
+ * reuses a built node's id must NOT make the built node inherit the patch
84
+ * (id-keyed lookup caused phantom double-execution). `patchCount` is the
85
+ * fast-path check — WeakMap has no `size`.
86
+ */
87
+ dynamicPatches = new WeakMap();
88
+ patchCount = 0;
74
89
  /**
75
90
  * Recursion depth counter for executeNode.
76
91
  * Each recursive executeNode call increments this; decrements on exit (try/finally).
@@ -155,8 +170,11 @@ class FlowchartTraverser {
155
170
  const deps = this.createDeps(opts);
156
171
  // Build O(1) node ID map from the root graph (avoids repeated DFS on every loopTo())
157
172
  const nodeIdMap = this.buildNodeIdMap(opts.root);
158
- // Initialize handler modules
159
- this.nodeResolver = new NodeResolver_js_1.NodeResolver(deps, nodeIdMap);
173
+ // Initialize handler modules.
174
+ // NodeResolver's DFS fallback resolves loop targets against the LIVE
175
+ // runtime shape, so it reads children through the dynamic-patch overlay
176
+ // (a loop can target a node added by a dynamic StageNode return).
177
+ this.nodeResolver = new NodeResolver_js_1.NodeResolver(deps, nodeIdMap, (n) => this.effChildren(n));
160
178
  this.childrenExecutor = new ChildrenExecutor_js_1.ChildrenExecutor(deps, this.executeNode.bind(this));
161
179
  this.stageRunner = new StageRunner_js_1.StageRunner(deps);
162
180
  this.continuationResolver = new ContinuationResolver_js_1.ContinuationResolver(deps, this.nodeResolver, (nodeId, count) => this.structureManager.updateIterationCount(nodeId, count));
@@ -361,6 +379,67 @@ class FlowchartTraverser {
361
379
  // Fallback: look up by name (supports hand-crafted stageMaps in tests and advanced use)
362
380
  return this.stageMap.get(node.name);
363
381
  }
382
+ // ─────────────── Dynamic-patch overlay accessors ───────────────
383
+ //
384
+ // Every engine read of a field that Phase 4 can patch (children,
385
+ // nextNodeSelector, subflow meta) goes through these. Fast path: charts
386
+ // with no dynamic returns never allocate and pay one `size === 0` check.
387
+ getPatch(node) {
388
+ if (this.patchCount === 0)
389
+ return undefined;
390
+ return this.dynamicPatches.get(node);
391
+ }
392
+ getOrCreatePatch(node) {
393
+ let patch = this.dynamicPatches.get(node);
394
+ if (!patch) {
395
+ patch = {};
396
+ this.dynamicPatches.set(node, patch);
397
+ this.patchCount++;
398
+ }
399
+ return patch;
400
+ }
401
+ /** Effective children: dynamic patch first, then the built node's children. */
402
+ effChildren(node) {
403
+ return this.getPatch(node)?.children ?? node.children;
404
+ }
405
+ /** Effective output-based selector: dynamic patch first, then the built node's. */
406
+ effSelector(node) {
407
+ return this.getPatch(node)?.nextNodeSelector ?? node.nextNodeSelector;
408
+ }
409
+ /** Effective subflow-root marker (true when a dynamic subflow was patched on). */
410
+ effIsSubflowRoot(node) {
411
+ const meta = this.getPatch(node)?.subflowMeta;
412
+ return meta ? true : node.isSubflowRoot;
413
+ }
414
+ /** Effective subflow id (patched verbatim by a dynamic subflow return). */
415
+ effSubflowId(node) {
416
+ const meta = this.getPatch(node)?.subflowMeta;
417
+ return meta ? meta.subflowId : node.subflowId;
418
+ }
419
+ /**
420
+ * Materialize the effective view of a node — field-identical to what the
421
+ * pre-overlay code produced by mutating the shared node. Used where a node
422
+ * is handed to a helper executor (NodeResolver / SubflowExecutor /
423
+ * ChildrenExecutor) so helpers never read stale built fields. Returns the
424
+ * node itself (no allocation) when it carries no patch.
425
+ */
426
+ effNode(node) {
427
+ const patch = this.getPatch(node);
428
+ if (!patch)
429
+ return node;
430
+ const merged = { ...node };
431
+ if (patch.subflowMeta) {
432
+ merged.isSubflowRoot = true;
433
+ merged.subflowId = patch.subflowMeta.subflowId;
434
+ merged.subflowName = patch.subflowMeta.subflowName;
435
+ merged.subflowMountOptions = patch.subflowMeta.subflowMountOptions;
436
+ }
437
+ if (patch.children)
438
+ merged.children = patch.children;
439
+ if (patch.nextNodeSelector)
440
+ merged.nextNodeSelector = patch.nextNodeSelector;
441
+ return merged;
442
+ }
364
443
  async executeStage(node, stageFunc, context, breakFn) {
365
444
  // runtimeStageId is assigned in executeNode() before traversalContext creation,
366
445
  // ensuring scope events and flow events use the same value.
@@ -386,11 +465,15 @@ class FlowchartTraverser {
386
465
  `Last stage: '${node.name}'. ` +
387
466
  'For loopTo() pipelines, consider adding a break condition or using RunOptions.maxDepth to raise the limit.');
388
467
  }
389
- // Attach builder metadata to context for snapshot enrichment
468
+ // Attach builder metadata to context for snapshot enrichment.
469
+ // Subflow meta reads go through the dynamic-patch overlay — a node
470
+ // patched by a dynamic-subflow return re-enters executeNode and must
471
+ // classify as a subflow without the shared node ever being mutated.
390
472
  if (node.description)
391
473
  context.description = node.description;
392
- if (node.isSubflowRoot && node.subflowId)
393
- context.subflowId = node.subflowId;
474
+ const effSubflowId = this.effSubflowId(node);
475
+ if (this.effIsSubflowRoot(node) && effSubflowId)
476
+ context.subflowId = effSubflowId;
394
477
  // Assign runtimeStageId BEFORE traversalContext creation — ensures scope events
395
478
  // (buffered by runtimeStageId) and flow events (flushed by traversalContext.runtimeStageId)
396
479
  // use the same value. Must happen before executeStage AND before traversalContext.
@@ -438,11 +521,14 @@ class FlowchartTraverser {
438
521
  this.resolvedLazySubflows.add(node.subflowId);
439
522
  }
440
523
  // ─── Phase 0: CLASSIFY — subflow detection ───
441
- if (node.isSubflowRoot && node.subflowId) {
442
- const resolvedNode = this.nodeResolver.resolveSubflowReference(node);
524
+ if (this.effIsSubflowRoot(node) && effSubflowId) {
525
+ // Hand helpers the EFFECTIVE node view (built fields + dynamic patch)
526
+ // so SubflowExecutor/NodeResolver never read stale built fields.
527
+ const mountNode = this.effNode(node);
528
+ const resolvedNode = this.nodeResolver.resolveSubflowReference(mountNode);
443
529
  const subflowOutput = await this.subflowExecutor.executeSubflow(resolvedNode, context, breakFlag, branchPath, this.subflowResults, traversalContext);
444
- const isReferenceBasedSubflow = resolvedNode !== node;
445
- const hasChildren = Boolean(node.children && node.children.length > 0);
530
+ const isReferenceBasedSubflow = resolvedNode !== mountNode;
531
+ const hasChildren = Boolean(mountNode.children && mountNode.children.length > 0);
446
532
  const shouldExecuteContinuation = isReferenceBasedSubflow || hasChildren;
447
533
  // ─── Break-flag check AFTER subflow returns ───
448
534
  // If the subflow was mounted with `propagateBreak: true` and broke
@@ -462,7 +548,10 @@ class FlowchartTraverser {
462
548
  const isScopeBasedDecider = Boolean(node.deciderFn);
463
549
  const isScopeBasedSelector = Boolean(node.selectorFn);
464
550
  const isDeciderNode = isScopeBasedDecider;
465
- const hasChildren = Boolean(node.children?.length);
551
+ const hasChildren = Boolean(this.effChildren(node)?.length);
552
+ // `next` is never overlaid — a dynamic next applies only to the visit
553
+ // that produced it (handled via the `dynamicNext` local below), so the
554
+ // built chart's next is always the correct continuation here.
466
555
  const hasNext = Boolean(node.next);
467
556
  const originalNext = node.next;
468
557
  // ─── Phase 1: VALIDATE — node invariants ───
@@ -518,10 +607,10 @@ class FlowchartTraverser {
518
607
  // since id-keyed stageMaps would otherwise cause loop targets to be executed directly.
519
608
  const isLoopRef = nextNode.isLoopRef === true ||
520
609
  (!this.getStageFn(nextNode) &&
521
- !nextNode.children?.length &&
610
+ !this.effChildren(nextNode)?.length &&
522
611
  !nextNode.deciderFn &&
523
612
  !nextNode.selectorFn &&
524
- !nextNode.isSubflowRoot);
613
+ !this.effIsSubflowRoot(nextNode));
525
614
  if (isLoopRef) {
526
615
  return this.continuationResolver.resolve(nextNode, node, context, breakFlag, branchPath, this.executeNode.bind(this));
527
616
  }
@@ -569,15 +658,20 @@ class FlowchartTraverser {
569
658
  const dynamicNode = stageOutput;
570
659
  context.addLog('isDynamic', true);
571
660
  context.addLog('dynamicPattern', 'StageNodeReturn');
572
- // Dynamic subflow auto-registration
661
+ // Dynamic subflow auto-registration. The subflow meta lands in the
662
+ // traverser-local overlay (NOT on the shared node); the immediate
663
+ // executeNode re-entry sees it through the eff* accessors and
664
+ // classifies the node as a subflow mount in Phase 0.
573
665
  if (dynamicNode.isSubflowRoot && dynamicNode.subflowDef && dynamicNode.subflowId) {
574
666
  context.addLog('dynamicPattern', 'dynamicSubflow');
575
667
  context.addLog('dynamicSubflowId', dynamicNode.subflowId);
576
668
  this.autoRegisterSubflowDef(dynamicNode.subflowId, dynamicNode.subflowDef, node.id);
577
- node.isSubflowRoot = true;
578
- node.subflowId = dynamicNode.subflowId;
579
- node.subflowName = dynamicNode.subflowName;
580
- node.subflowMountOptions = dynamicNode.subflowMountOptions;
669
+ this.getOrCreatePatch(node).subflowMeta = {
670
+ isSubflowRoot: true,
671
+ subflowId: dynamicNode.subflowId,
672
+ subflowName: dynamicNode.subflowName,
673
+ subflowMountOptions: dynamicNode.subflowMountOptions,
674
+ };
581
675
  this.structureManager.updateDynamicSubflow(node.id, dynamicNode.subflowId, dynamicNode.subflowName, dynamicNode.subflowDef?.buildTimeStructure);
582
676
  return await this.executeNode(node, context, breakFlag, branchPath);
583
677
  }
@@ -590,48 +684,52 @@ class FlowchartTraverser {
590
684
  }
591
685
  }
592
686
  }
593
- // Dynamic children (fork pattern)
687
+ // Dynamic children (fork pattern) — patched into the overlay;
688
+ // Phase 5 below reads them back through effChildren/effSelector.
594
689
  if (dynamicNode.children && dynamicNode.children.length > 0) {
595
- node.children = dynamicNode.children;
690
+ this.getOrCreatePatch(node).children = dynamicNode.children;
596
691
  context.addLog('dynamicChildCount', dynamicNode.children.length);
597
692
  context.addLog('dynamicChildIds', dynamicNode.children.map((c) => c.id));
598
693
  this.structureManager.updateDynamicChildren(node.id, dynamicNode.children, Boolean(dynamicNode.nextNodeSelector), Boolean(dynamicNode.deciderFn));
599
694
  if (typeof dynamicNode.nextNodeSelector === 'function') {
600
- node.nextNodeSelector = dynamicNode.nextNodeSelector;
695
+ this.getOrCreatePatch(node).nextNodeSelector = dynamicNode.nextNodeSelector;
601
696
  context.addLog('hasSelector', true);
602
697
  }
603
698
  }
604
- // Dynamic next (linear continuation)
699
+ // Dynamic next (linear continuation) — stays a LOCAL: it applies
700
+ // only to this visit (Phase 6 routes it through the
701
+ // ContinuationResolver), so the shared node's next is never touched
702
+ // and a loop revisit naturally sees the built continuation.
605
703
  if (dynamicNode.next) {
606
704
  dynamicNext = dynamicNode.next;
607
705
  this.structureManager.updateDynamicNext(node.id, dynamicNode.next);
608
- node.next = dynamicNode.next;
609
706
  context.addLog('hasDynamicNext', true);
610
707
  }
611
708
  stageOutput = undefined;
612
709
  }
613
- // Restore original next to avoid stale reference on loop revisit
614
- if (dynamicNext) {
615
- node.next = originalNext;
616
- }
617
710
  }
618
711
  // ─── Phase 5: CHILDREN — fork dispatch ───
619
- const hasChildrenAfterStage = Boolean(node.children?.length);
712
+ // Re-read through the overlay: Phase 4 may have just patched dynamic
713
+ // children/selector for THIS visit (or an earlier visit in this run).
714
+ const childrenAfterStage = this.effChildren(node);
715
+ const hasChildrenAfterStage = Boolean(childrenAfterStage?.length);
620
716
  if (hasChildrenAfterStage) {
621
- context.addLog('totalChildren', node.children?.length);
717
+ context.addLog('totalChildren', childrenAfterStage?.length);
622
718
  context.addLog('orderOfExecution', 'ChildrenAfterStage');
623
719
  let nodeChildrenResults;
624
- if (node.nextNodeSelector) {
625
- nodeChildrenResults = await this.childrenExecutor.executeSelectedChildren(node.nextNodeSelector, node.children, stageOutput, context, branchPath, traversalContext, node.failFast);
720
+ const effSelectorFn = this.effSelector(node);
721
+ if (effSelectorFn) {
722
+ nodeChildrenResults = await this.childrenExecutor.executeSelectedChildren(effSelectorFn, childrenAfterStage, stageOutput, context, branchPath, traversalContext, node.failFast);
626
723
  }
627
724
  else {
628
- const childCount = node.children?.length ?? 0;
629
- const childNames = node.children?.map((c) => c.name).join(', ');
725
+ const childCount = childrenAfterStage?.length ?? 0;
726
+ const childNames = childrenAfterStage?.map((c) => c.name).join(', ');
630
727
  context.addFlowDebugMessage('children', `Executing all ${childCount} children in parallel: ${childNames}`, {
631
728
  count: childCount,
632
- targetStage: node.children?.map((c) => c.name),
729
+ targetStage: childrenAfterStage?.map((c) => c.name),
633
730
  });
634
- nodeChildrenResults = await this.childrenExecutor.executeNodeChildren(node, context, undefined, branchPath, traversalContext);
731
+ // effNode: ChildrenExecutor reads node.children/node.failFast itself.
732
+ nodeChildrenResults = await this.childrenExecutor.executeNodeChildren(this.effNode(node), context, undefined, branchPath, traversalContext);
635
733
  }
636
734
  // Fork-only: return bundle
637
735
  if (!hasNext && !dynamicNext) {
@@ -639,8 +737,8 @@ class FlowchartTraverser {
639
737
  }
640
738
  // Capture dynamic children as synthetic subflow result for UI
641
739
  const isDynamic = context.debug?.logContext?.isDynamic;
642
- if (isDynamic && node.children && node.children.length > 0) {
643
- this.captureDynamicChildrenResult(node, context);
740
+ if (isDynamic && childrenAfterStage && childrenAfterStage.length > 0) {
741
+ this.captureDynamicChildrenResult(node, childrenAfterStage, context);
644
742
  }
645
743
  }
646
744
  // ─── Phase 6: CONTINUE — dynamic next / linear next ───
@@ -671,13 +769,13 @@ class FlowchartTraverser {
671
769
  }
672
770
  }
673
771
  // ─────────────────────── Private Helpers ───────────────────────
674
- captureDynamicChildrenResult(node, context) {
772
+ captureDynamicChildrenResult(node, children, context) {
675
773
  const parentStageId = context.getStageId();
676
774
  const childStructure = {
677
775
  id: `${node.id}-children`,
678
776
  name: 'Dynamic Children',
679
777
  type: 'fork',
680
- children: node.children.map((c) => ({
778
+ children: children.map((c) => ({
681
779
  id: c.id,
682
780
  name: c.name,
683
781
  type: 'stage',
@@ -770,4 +868,4 @@ class FlowchartTraverser {
770
868
  }
771
869
  }
772
870
  exports.FlowchartTraverser = FlowchartTraverser;
773
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7OztBQUdILG1EQUFxRDtBQUVyRCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELHlFQUFtRTtBQUNuRSxpRkFBMkU7QUFDM0UscUVBQStEO0FBQy9ELGlFQUEyRDtBQUMzRCx1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCx1RUFBaUU7QUFFakUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsNERBQTJEO0FBcUUzRCxNQUFhLGtCQUFrQjtJQUNaLElBQUksQ0FBMEI7SUFDdkMsUUFBUSxDQUEyQztJQUMxQyxnQkFBZ0IsQ0FBb0I7SUFDN0MsUUFBUSxDQUFvRDtJQUNuRCxNQUFNLENBQVU7SUFDaEIsTUFBTSxDQUFlO0lBQ3JCLGVBQWUsQ0FBVTtJQUMxQzs7MEVBRXNFO0lBQ3JELGVBQWUsQ0FBVztJQUMzQztvRkFDZ0Y7SUFDL0QsS0FBSyxDQUFTO0lBRS9CLGtCQUFrQjtJQUNELFlBQVksQ0FBNkI7SUFDekMsZ0JBQWdCLENBQWlDO0lBQ2pELGVBQWUsQ0FBZ0M7SUFDL0MsV0FBVyxDQUE0QjtJQUN2QyxvQkFBb0IsQ0FBcUM7SUFDekQsY0FBYyxDQUErQjtJQUM3QyxlQUFlLENBQWdDO0lBQy9DLGdCQUFnQixDQUEwQjtJQUMxQyxrQkFBa0IsQ0FBd0I7SUFDMUMsc0JBQXNCLENBQXFDO0lBRTVFLGtCQUFrQjtJQUNWLGNBQWMsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUvRDs7Ozs7T0FLRztJQUNjLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFMUQ7Ozs7T0FJRztJQUNLLGFBQWEsR0FBRyxD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QU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQXdDLENBQUM7Z0JBQy9ELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUN4QyxXQUFXLEVBQ1gsU0FBUyxFQUNULFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUNyRCxVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7WUFDdkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUN6QyxTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUM1QixVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs7QUF0NkJILGdEQXU2QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3djaGFydFRyYXZlcnNlciDigJQgUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgb2YgU3RhZ2VOb2RlIGdyYXBoLlxuICpcbiAqIFVuaWZpZWQgdHJhdmVyc2FsIGFsZ29yaXRobSBmb3IgYWxsIG5vZGUgc2hhcGVzOlxuICogICBjb25zdCBwcmUgPSBhd2FpdCBwcmVwKCk7XG4gKiAgIGNvbnN0IFt4LCB5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtmeChwcmUpLCBmeShwcmUpXSk7XG4gKiAgIHJldHVybiBhd2FpdCBuZXh0KHgsIHkpO1xuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlIGZvbGxvd3MgNyBwaGFzZXM6XG4gKiAgIDAuIENMQVNTSUZZICDigJQgc3ViZmxvdyBkZXRlY3Rpb24sIGVhcmx5IGRlbGVnYXRpb25cbiAqICAgMS4gVkFMSURBVEUgIOKAlCBub2RlIGludmFyaWFudHMsIHJvbGUgbWFya2Vyc1xuICogICAyLiBFWEVDVVRFICAg4oCUIHJ1biBzdGFnZSBmbiwgY29tbWl0LCBicmVhayBjaGVja1xuICogICAzLiBEWU5BTUlDICAg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uLCBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLCBzdHJ1Y3R1cmUgdXBkYXRlc1xuICogICA0LiBDSElMRFJFTiAg4oCUIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBkaXNwYXRjaFxuICogICA1LiBDT05USU5VRSAg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IHJlc29sdXRpb25cbiAqICAgNi4gTEVBRiAgICAgIOKAlCBubyBjb250aW51YXRpb24sIHJldHVybiBvdXRwdXRcbiAqXG4gKiBCcmVhayBzZW1hbnRpY3M6IElmIGEgc3RhZ2UgY2FsbHMgYnJlYWtGbigpLCBjb21taXQgYW5kIFNUT1AuXG4gKiBQYXRjaCBtb2RlbDogU3RhZ2Ugd3JpdGVzIGludG8gbG9jYWwgcGF0Y2g7IGNvbW1pdFBhdGNoKCkgYWZ0ZXIgcmV0dXJuIG9yIHRocm93LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBpc1N0YWdlTm9kZVJldHVybiB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBDb250aW51YXRpb25SZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL0NvbnRpbnVhdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IERlY2lkZXJIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvRGVjaWRlckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFN0YWdlUnVubmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU3RhZ2VSdW5uZXIuanMnO1xuaW1wb3J0IHsgU3ViZmxvd0V4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi4vaGFuZGxlcnMvdHlwZXMuanMnO1xuaW1wb3J0IHsgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4uL25hcnJhdGl2ZS9GbG93UmVjb3JkZXJEaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIH0gZnJvbSAnLi4vbmFycmF0aXZlL051bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciwgSUNvbnRyb2xGbG93TmFycmF0aXZlLCBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQgfSBmcm9tICcuLi9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgSUxvZ2dlcixcbiAgTm9kZVJlc3VsdFR5cGUsXG4gIFNjb3BlRmFjdG9yeSxcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgVHJhdmVyc2FsUmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhdmVyc2VyT3B0aW9uczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gcmVjdXJzaXZlIGV4ZWN1dGVOb2RlIGRlcHRoLiBEZWZhdWx0cyB0byBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEggKDUwMCkuXG4gICAqIE92ZXJyaWRlIGluIHRlc3RzIG9yIHVudXN1YWxseSBkZWVwIHBpcGVsaW5lcy5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHNldCB0aGlzIHRvIHRoZSBzdWJmbG93J3MgSUQuXG4gICAqIFByb3BhZ2F0ZWQgdG8gVHJhdmVyc2FsQ29udGV4dCBzbyBuYXJyYXRpdmUgZW50cmllcyBjYXJyeSB0aGUgY29ycmVjdCBzdWJmbG93SWQuXG4gICAqL1xuICBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgZnJvbSBwYXJlbnQgdHJhdmVyc2VyLiBTdWJmbG93cyBjb250aW51ZSB0aGUgcGFyZW50J3MgbnVtYmVyaW5nLiAqL1xuICBleGVjdXRpb25Db3VudGVyPzogeyB2YWx1ZTogbnVtYmVyIH07XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBmcm9tIGEgY2hlY2twb2ludCwgb24gdGhlIHJlc3VtZSBwYXRoLlxuICAgKiBGb3J3YXJkZWQgdG8gYEhhbmRsZXJEZXBzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWVgIHNvIFN1YmZsb3dFeGVjdXRvclxuICAgKiBjYW4gcmUtc2VlZCBuZXN0ZWQgcnVudGltZXMgZnJvbSBwcmUtcGF1c2Ugc3RhdGUgaW5zdGVhZCBvZiBydW5uaW5nXG4gICAqIHRoZSBpbnB1dE1hcHBlci4gVW5kZWZpbmVkIG9uIG5vcm1hbCBgcnVuKClgIHBhdGhzLlxuICAgKi9cbiAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqXG4gICAqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFRocmVhZGVkIGludG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dFxuICAgKiB0aGlzIHRyYXZlcnNlciBwcm9kdWNlcyBzbyByZWNvcmRlcnMgY2FuIHNjb3BlIHN0YXRlIHRvIGEgc2luZ2xlIHJ1bi5cbiAgICogU3ViZmxvdyB0cmF2ZXJzZXJzIGluaGVyaXQgdGhlIHBhcmVudCdzIHJ1bklkICh0aGUgc3ViZmxvdyBpcyBwYXJ0IG9mXG4gICAqIHRoZSBzYW1lIHJ1biBmcm9tIHRoZSBjb25zdW1lcidzIFBPVikuIFJlcXVpcmVkIGZpZWxkIOKAlCBldmVyeSBldmVudFxuICAgKiBuZWVkcyBpdC4gU2VlIGBydW5uZXIvcnVuSWQudHNgLlxuICAgKi9cbiAgcnVuSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogRnJvemVuIHZhbHVlIHBhc3NlZCB2aWEgYHJ1bih7aW5wdXR9KWAuIFN1cmZhY2VkIG9uIGBvblJ1blN0YXJ0YCBhdCB0aGVcbiAgICogIHRvcC1sZXZlbCB0cmF2ZXJzYWwgc28gY29uc3VtZXJzIChlLmcuIGBJbk91dFJlY29yZGVyYCkgY2FuIGJyYWNrZXRcbiAgICogIHRoZSBydW4gd2l0aCB0aGUgc2FtZSBwYXlsb2FkIHNoYXBlIHRoYXQgc3ViZmxvd3MgYWxyZWFkeSBoYXZlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBTdGFtcGVkIG9udG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC5cbiAgICogIEluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgc28gYWxsIGV2ZW50cyBvZiBvbmUgcnVuIHNoYXJlIG9uZSBydW5JZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmVjdXJzaW9uIGRlcHRoIGNvdW50ZXIgZm9yIGV4ZWN1dGVOb2RlLlxuICAgKiBFYWNoIHJlY3Vyc2l2ZSBleGVjdXRlTm9kZSBjYWxsIGluY3JlbWVudHMgdGhpczsgZGVjcmVtZW50cyBvbiBleGl0ICh0cnkvZmluYWxseSkuXG4gICAqIFByZXZlbnRzIGNhbGwtc3RhY2sgb3ZlcmZsb3cgb24gaW5maW5pdGUgbG9vcHMgb3IgZXhjZXNzaXZlbHkgZGVlcCBzdGFnZSBjaGFpbnMuXG4gICAqL1xuICBwcml2YXRlIF9leGVjdXRlRGVwdGggPSAwO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgbXV0YWJsZSBleGVjdXRpb24gY291bnRlciDigJQgbW9ub3RvbmljLCBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uLlxuICAgKiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gaW5kaWNlcyBhcmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBhIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkNvdW50ZXI6IHsgdmFsdWU6IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gcmVjdXJzaXZlIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqIDUwMCBjb21mb3J0YWJseSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBwaXBlbGluZSBkZXB0aCAoaW5jbHVkaW5nIGRlZXBseSBuZXN0ZWRcbiAgICogc3ViZmxvd3MpIHdoaWxlIHByZXZlbnRpbmcgY2FsbC1zdGFjayBvdmVyZmxvdyAofjEwIDAwMCBmcmFtZXMgaW4gVjgpLlxuICAgKlxuICAgKiAqKk5vdGUgb24gY291bnRpbmc6KiogdGhlIGNvdW50ZXIgaW5jcmVtZW50cyBvbmNlIHBlciBgZXhlY3V0ZU5vZGVgIGNhbGwsIG5vdCBvbmNlIHBlclxuICAgKiBsb2dpY2FsIHVzZXIgc3RhZ2UuIFN1YmZsb3cgcm9vdCBlbnRyeSBhbmQgc3ViZmxvdyBjb250aW51YXRpb24gYWZ0ZXIgcmV0dXJuIGVhY2ggY29zdFxuICAgKiBvbmUgdGljay4gRm9yIHBpcGVsaW5lcyB3aXRoIG1hbnkgbmVzdGVkIHN1YmZsb3dzLCBidWRnZXQgcm91Z2hseSAyIMOXIChhdmcgc3RhZ2VzIHBlclxuICAgKiBzdWJmbG93KSBvZiBoZWFkcm9vbSB3aGVuIGNvbXB1dGluZyBhIGN1c3RvbSBgbWF4RGVwdGhgIHZpYSBgUnVuT3B0aW9ucy5tYXhEZXB0aGAuXG4gICAqXG4gICAqICoqTm90ZSBvbiBsb29wczoqKiBmb3IgYGxvb3BUbygpYCBwaXBlbGluZXMsIHRoaXMgZGVwdGggZ3VhcmQgYW5kIGBDb250aW51YXRpb25SZXNvbHZlcmAnc1xuICAgKiBpdGVyYXRpb24gbGltaXQgYXJlIGluZGVwZW5kZW50IOKAlCB0aGUgbG93ZXIgb25lIGZpcmVzIGZpcnN0LiBUaGUgZGVmYXVsdCBkZXB0aCBndWFyZCAoNTAwKVxuICAgKiBmaXJlcyBiZWZvcmUgdGhlIGRlZmF1bHQgaXRlcmF0aW9uIGxpbWl0ICgxMDAwKSBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSDigJQgY29uY3VycmVudFxuICAgKiBleGVjdXRpb25zIHJhY2Ugb24gYF9leGVjdXRlRGVwdGhgLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXIgY29uY3VycmVudFxuICAgKiBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0gb3B0cy5leGVjdXRpb25Db3VudGVyID8/IHsgdmFsdWU6IDAgfTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuXG4gICAgLy8gQnVpbGQgTygxKSBub2RlIElEIG1hcCBmcm9tIHRoZSByb290IGdyYXBoIChhdm9pZHMgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpKVxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzXG4gICAgdGhpcy5ub2RlUmVzb2x2ZXIgPSBuZXcgTm9kZVJlc29sdmVyKGRlcHMsIG5vZGVJZE1hcCk7XG4gICAgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yID0gbmV3IENoaWxkcmVuRXhlY3V0b3IoZGVwcywgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YWdlUnVubmVyID0gbmV3IFN0YWdlUnVubmVyKGRlcHMpO1xuICAgIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIgPSBuZXcgQ29udGludWF0aW9uUmVzb2x2ZXIoZGVwcywgdGhpcy5ub2RlUmVzb2x2ZXIsIChub2RlSWQsIGNvdW50KSA9PlxuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUl0ZXJhdGlvbkNvdW50KG5vZGVJZCwgY291bnQpLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIEZsb3djaGFydFRyYXZlcnNlciBpbnN0YW5jZXMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICAgKiBDYXB0dXJlcyBwYXJlbnQgY29uZmlnIGluIGNsb3N1cmUg4oCUIFN1YmZsb3dFeGVjdXRvciBwcm92aWRlcyBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAgICogRWFjaCBzdWJmbG93IGdldHMgYSBmdWxsIHRyYXZlcnNlciB3aXRoIGFsbCA3IHBoYXNlcyAoZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShcbiAgICBwYXJlbnRPcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4sXG4gICk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIENhcHR1cmUgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHN0YXRlIOKAlCBmYWN0b3J5IHJlYWRzIHRoZSBDVVJSRU5UIHN0YXRlIHdoZW4gY2FsbGVkLFxuICAgIC8vIG5vdCB0aGUgc3RhdGUgYXQgZmFjdG9yeSBjcmVhdGlvbiB0aW1lLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSBsYXp5IHN1YmZsb3cgcmVzb2x1dGlvblxuICAgIC8vIG1heSBhZGQgZW50cmllcyB0byBzdGFnZU1hcC9zdWJmbG93cyBiZWZvcmUgYSBuZXN0ZWQgc3ViZmxvdyBpcyBlbmNvdW50ZXJlZC5cbiAgICBjb25zdCBwYXJlbnRTdGFnZU1hcCA9IHRoaXMuc3RhZ2VNYXA7XG4gICAgY29uc3QgcGFyZW50U3ViZmxvd3MgPSB0aGlzLnN1YmZsb3dzO1xuICAgIGNvbnN0IG5hcnJhdGl2ZUdlbmVyYXRvciA9IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yO1xuXG4gICAgcmV0dXJuIChzdWJmbG93T3B0cykgPT4ge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgcm9vdDogc3ViZmxvd09wdHMucm9vdCxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIC8vIFNoYXJlIGNvdW50ZXIg4oCUIHN1YmZsb3cgY29udGludWVzIGdsb2JhbCBudW1iZXJpbmdcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gRm9yd2FyZCB0aGUgcmVzdW1lLW9ubHkgc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBzbyBuZXN0ZWRcbiAgICAgICAgLy8gU3ViZmxvd0V4ZWN1dG9ycyBjYW4gcmUtc2VlZCBkZWVwZXItbmVzdGVkIHJ1bnRpbWVzIChlLmcuXG4gICAgICAgIC8vIFNlcXVlbmNlKEFnZW50KC4uLikpIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLihwYXJlbnRPcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHBhcmVudE9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICByZWFkT25seUNvbnRleHQ6IG9wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgZXhlY3V0aW9uRW52OiBvcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvcjogdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgIC4uLihvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGRzIHRoZSB0b3AtbGV2ZWwgYnJlYWsgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIGBleGVjdXRlKClgLiBLZXB0IGFzXG4gICAqIGEgZmllbGQgKG5vdCBhIGxvY2FsKSBzbyBgZ2V0QnJlYWtTdGF0ZSgpYCBjYW4gc3VyZmFjZSB0aGUgZmluYWwgc3RhdGVcbiAgICogZm9yIGNhbGxlcnMgbGlrZSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGF0IGltcGxlbWVudCBgcHJvcGFnYXRlQnJlYWtgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9wQnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgdGhpcy5fdG9wQnJlYWtGbGFnID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiAnX19yb290X18nLFxuICAgICAgcnVudGltZVN0YWdlSWQ6ICdfX3Jvb3RfXyMwJyxcbiAgICAgIHN0YWdlTmFtZTogJ19fcm9vdF9fJyxcbiAgICAgIGRlcHRoOiAwLFxuICAgIH07XG4gICAgaWYgKGlzVG9wTGV2ZWwpIHtcbiAgICAgIC8vIGByZWFkT25seUNvbnRleHRgIGlzIHRoZSBlbmdpbmUncyB2aWV3IG9mIGBydW4oe2lucHV0fSlgIOKAlCBwYXNzZWRcbiAgICAgIC8vIHRocm91Z2ggZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFzIHRoZSB2YWxpZGF0ZWQgaW5wdXQuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1blN0YXJ0KHRoaXMucmVhZE9ubHlDb250ZXh0LCByb290Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gVG9wLWxldmVsIHJ1bnMgY2xvc2UgdGhlaXIgYm91bmRhcnkgU1lNTUVUUklDQUxMWTogZXZlcnkgb25SdW5TdGFydFxuICAgIC8vIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIG9uUnVuRW5kIChjbGVhbikgb3Igb25SdW5GYWlsZWQgKGVycm9yKS5cbiAgICAvLyBXaXRob3V0IHRoZSBjYXRjaCwgYSB0aHJvd24gcnVuIGZpcmVkIG9uUnVuU3RhcnQgdGhlbiBub3RoaW5nIOKAlCBhXG4gICAgLy8gbW9uaXRvciBjb3VsZG4ndCB0ZWxsIFwic3RpbGwgcnVubmluZ1wiIGZyb20gXCJjcmFzaGVkLlwiIFBhdXNlIGlzIE5PVFxuICAgIC8vIGFuIGVycm9yIChpdCdzIGV4cGVjdGVkIHN1c3BlbnNpb24pLCBzbyBpdCBza2lwcyBvblJ1bkZhaWxlZCBhbmRcbiAgICAvLyByZS10aHJvd3MgdW50b3VjaGVkLiBUaGUgc3RhZ2UtbGV2ZWwgY2F0Y2ggYWxyZWFkeSByZWNvcmRlZCB0aGVcbiAgICAvLyBmYWlsaW5nIHN0YWdlIChvbkVycm9yICsgY29tbWl0KTsgdGhpcyBhZGRzIHRoZSBydW4tbGV2ZWwgdGVybWluYWxcbiAgICAvLyBzaWduYWwuIFRoZSBlcnJvciBzdGlsbCBwcm9wYWdhdGVzIOKAlCB0aGlzIGlzIG9ic2VydmF0aW9uLCBub3RcbiAgICAvLyByZWNvdmVyeS4gU3ViZmxvdyB0cmF2ZXJzZXJzIGRvbid0IGZpcmUgcnVuIGV2ZW50czsgdGhlaXIgZXJyb3JzXG4gICAgLy8gYnViYmxlIHVwIGFuZCBzdXJmYWNlIGhlcmUgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICBpZiAoIWlzVG9wTGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVOb2RlKHRoaXMucm9vdCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHRoaXMucm9vdCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChleHRyYWN0RXJyb3JJbmZvKGVycm9yKSwgcm9vdENvbnRleHQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRW5kKHJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnJlYWsgc3RhdGUgY2FwdHVyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgbW9zdCByZWNlbnQgYGV4ZWN1dGUoKWAuXG4gICAqIGBzaG91bGRCcmVha2AgaXMgdHJ1ZSB3aGVuIGEgc3RhZ2UgY2FsbGVkIGBzY29wZS4kYnJlYWsocmVhc29uKWA7IHRoZVxuICAgKiBvcHRpb25hbCBgcmVhc29uYCBjYXJyaWVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIHByb3BhZ2F0ZSBhbiBpbm5lciBzdWJmbG93J3MgYnJlYWsgdXAgdG9cbiAgICogdGhlIHBhcmVudCB0cmF2ZXJzZXIgd2hlbiB0aGUgbW91bnQgc2V0cyBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdG9wQnJlYWtGbGFnIH07XG4gIH1cblxuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlTWFuYWdlci5nZXRTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyk7XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIERlcHRoLWd1YXJkZWQgYXQgTUFYX0VYRUNVVEVfREVQVEggdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gb24gY3ljbGljIGdyYXBocy5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3QgdmlzaXQgPSAobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGlmIChkZXB0aCA+IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCkgcmV0dXJuO1xuICAgICAgaWYgKG1hcC5oYXMobm9kZS5pZCkpIHJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkIChhdm9pZHMgaW5maW5pdGUgbG9vcHMgb24gY3ljbGljIHJlZnMpXG4gICAgICBtYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB2aXNpdChjaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5leHQpIHZpc2l0KG5vZGUubmV4dCwgZGVwdGggKyAxKTtcbiAgICB9O1xuICAgIHZpc2l0KHJvb3QsIDApO1xuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCDigJQgdGhlIGNvcmUgYWxnb3JpdGhtLlxuICAgKiBFYWNoIGNhbGwgcHJvY2Vzc2VzIG9uZSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyDilIDilIDilIAgUmVjdXJzaW9uIGRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIEVhY2ggYGF3YWl0IGV4ZWN1dGVOb2RlKC4uLilgIGtlZXBzIHRoZSBjYWxsaW5nIGZyYW1lIG9uIHRoZSBzdGFjay5cbiAgICAvLyBXaXRob3V0IGEgY2FwLCBhbiBpbmZpbml0ZSBsb29wIG9yIGFuIGV4Y2Vzc2l2ZWx5IGRlZXAgc3RhZ2UgY2hhaW4gd2lsbFxuICAgIC8vIGV2ZW50dWFsbHkgb3ZlcmZsb3cgdGhlIFY4IGNhbGwgc3RhY2sgKH4xMCAwMDAgZnJhbWVzKSB3aXRoIGEgY3J5cHRpY1xuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIiBlcnJvci4gIFdlIGZhaWwgZWFybHkgd2l0aCBhIGNsZWFyXG4gICAgLy8gbWVzc2FnZSBzbyB1c2VycyBjYW4gZGlhZ25vc2UgdGhlIGNhdXNlIChpbmZpbml0ZSBsb29wLCBtaXNzaW5nIGJyZWFrLCBldGMuKS5cbiAgICAvLyBUaGUgaW5jcmVtZW50IGlzIGluc2lkZSBgdHJ5YCBzbyBgZmluYWxseWAgYWx3YXlzIGRlY3JlbWVudHMg4oCUIG5vIGZyYWdpbGVcbiAgICAvLyBnYXAgYmV0d2VlbiBjaGVjayBhbmQgdHJ5IGVudHJ5LlxuICAgIHRyeSB7XG4gICAgICBpZiAoKyt0aGlzLl9leGVjdXRlRGVwdGggPiB0aGlzLl9tYXhEZXB0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZsb3djaGFydFRyYXZlcnNlcjogbWF4aW11bSB0cmF2ZXJzYWwgZGVwdGggZXhjZWVkZWQgKCR7dGhpcy5fbWF4RGVwdGh9KS4gYCArXG4gICAgICAgICAgICAnQ2hlY2sgZm9yIGluZmluaXRlIGxvb3BzIG9yIG1pc3NpbmcgYnJlYWsgY29uZGl0aW9ucyBpbiB5b3VyIGZsb3djaGFydC4gJyArXG4gICAgICAgICAgICBgTGFzdCBzdGFnZTogJyR7bm9kZS5uYW1lfScuIGAgK1xuICAgICAgICAgICAgJ0ZvciBsb29wVG8oKSBwaXBlbGluZXMsIGNvbnNpZGVyIGFkZGluZyBhIGJyZWFrIGNvbmRpdGlvbiBvciB1c2luZyBSdW5PcHRpb25zLm1heERlcHRoIHRvIHJhaXNlIHRoZSBsaW1pdC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRhY2ggYnVpbGRlciBtZXRhZGF0YSB0byBjb250ZXh0IGZvciBzbmFwc2hvdCBlbnJpY2htZW50XG4gICAgICBpZiAobm9kZS5kZXNjcmlwdGlvbikgY29udGV4dC5kZXNjcmlwdGlvbiA9IG5vZGUuZGVzY3JpcHRpb247XG4gICAgICBpZiAobm9kZS5pc1N1YmZsb3dSb290ICYmIG5vZGUuc3ViZmxvd0lkKSBjb250ZXh0LnN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkO1xuXG4gICAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgICAvLyAoYnVmZmVyZWQgYnkgcnVudGltZVN0YWdlSWQpIGFuZCBmbG93IGV2ZW50cyAoZmx1c2hlZCBieSB0cmF2ZXJzYWxDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKVxuICAgICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlLiBNdXN0IGhhcHBlbiBiZWZvcmUgZXhlY3V0ZVN0YWdlIEFORCBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dC5cbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICAgIGNvbnRleHQucnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKG5vZGUuaWQsIGlkeCk7XG5cbiAgICAgIC8vIEJ1aWxkIHRyYXZlcnNhbCBjb250ZXh0IGZvciByZWNvcmRlciBldmVudHMg4oCUIGNyZWF0ZWQgb25jZSBwZXIgc3RhZ2UsIHNoYXJlZCBieSBhbGwgZXZlbnRzXG4gICAgICBjb25zdCB0cmF2ZXJzYWxDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgICAgc3RhZ2VJZDogbm9kZS5pZCA/PyBjb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICAgIHN1YmZsb3dJZDogY29udGV4dC5zdWJmbG93SWQgPz8gdGhpcy5wYXJlbnRTdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dQYXRoOiBicmFuY2hQYXRoIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgZGVwdGg6IHRoaXMuY29tcHV0ZUNvbnRleHREZXB0aChjb250ZXh0KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYTogTEFaWSBSRVNPTFZFIOKAlCBkZWZlcnJlZCBzdWJmbG93IHJlc29sdXRpb24g4pSA4pSA4pSAXG4gICAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAgIC8vIGNvbmN1cnJlbnQgdHJhdmVyc2VycyBkbyBub3QgcmFjZSBvbiBub2RlLnN1YmZsb3dSZXNvbHZlciBvciBjbGVhciBpdCBmb3IgZWFjaCBvdGhlci5cbiAgICAgIGlmIChub2RlLmlzU3ViZmxvd1Jvb3QgJiYgbm9kZS5zdWJmbG93UmVzb2x2ZXIgJiYgIXRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuaGFzKG5vZGUuc3ViZmxvd0lkISkpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLnByZWZpeE5vZGVUcmVlKHJlc29sdmVkLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIG5vZGUuc3ViZmxvd0lkISk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHJlc29sdmVkIHN1YmZsb3cgKHNhbWUgcGF0aCBhcyBlYWdlciByZWdpc3RyYXRpb24pXG4gICAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgICAgLy8gTWVyZ2Ugc3RhZ2VNYXAgZW50cmllc1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiByZXNvbHZlZC5zdGFnZU1hcCkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhwcmVmaXhlZEtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgICBpZiAocmVzb2x2ZWQuc3ViZmxvd3MpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMocmVzb2x2ZWQuc3ViZmxvd3MpKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke25vZGUuc3ViZmxvd0lkfS8ke2tleX1gO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSkge1xuICAgICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHJ1bnRpbWUgc3RydWN0dXJlIHdpdGggdGhlIG5vdy1yZXNvbHZlZCBzcGVjXG4gICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgIG5vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgIHJlc29sdmVkLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgICAgLy8gd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIFN0YWdlTm9kZSBncmFwaCAod2hpY2ggd291bGQgcmFjZSBjb25jdXJyZW50IHRyYXZlcnNlcnMpLlxuICAgICAgICB0aGlzLnJlc29sdmVkTGF6eVN1YmZsb3dzLmFkZChub2RlLnN1YmZsb3dJZCEpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMDogQ0xBU1NJRlkg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uIOKUgOKUgOKUgFxuICAgICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dJZCkge1xuICAgICAgICBjb25zdCByZXNvbHZlZE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5yZXNvbHZlU3ViZmxvd1JlZmVyZW5jZShub2RlKTtcblxuICAgICAgICBjb25zdCBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5zdWJmbG93RXhlY3V0b3IuZXhlY3V0ZVN1YmZsb3coXG4gICAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93ID0gcmVzb2x2ZWROb2RlICE9PSBub2RlO1xuICAgICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4obm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgICAgLy8g4pSA4pSA4pSAIEJyZWFrLWZsYWcgY2hlY2sgQUZURVIgc3ViZmxvdyByZXR1cm5zIOKUgOKUgOKUgFxuICAgICAgICAvLyBJZiB0aGUgc3ViZmxvdyB3YXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAgYW5kIGJyb2tlXG4gICAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgICAgLy8gU3RvcCB0aGUgb3V0ZXIgdHJhdmVyc2FsIGhlcmUg4oCUIGRvIG5vdCBydW4gdGhlIG5leHQgbGluZWFyIHN0YWdlLlxuICAgICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5uZXh0ICYmIHNob3VsZEV4ZWN1dGVDb250aW51YXRpb24pIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShub2RlLm5leHQsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgICAgY29uc3QgaGFzU3RhZ2VGdW5jdGlvbiA9IEJvb2xlYW4oc3RhZ2VGdW5jKTtcbiAgICAgIGNvbnN0IGlzU2NvcGVCYXNlZERlY2lkZXIgPSBCb29sZWFuKG5vZGUuZGVjaWRlckZuKTtcbiAgICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgICAgY29uc3QgaXNEZWNpZGVyTm9kZSA9IGlzU2NvcGVCYXNlZERlY2lkZXI7XG4gICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4obm9kZS5jaGlsZHJlbj8ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGhhc05leHQgPSBCb29sZWFuKG5vZGUubmV4dCk7XG4gICAgICBjb25zdCBvcmlnaW5hbE5leHQgPSBub2RlLm5leHQ7XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgICAgaWYgKCFoYXNTdGFnZUZ1bmN0aW9uICYmICFpc0RlY2lkZXJOb2RlICYmICFpc1Njb3BlQmFzZWRTZWxlY3RvciAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYE5vZGUgJyR7bm9kZS5uYW1lfScgbXVzdCBkZWZpbmU6IGVtYmVkZGVkIGZuIE9SIGEgc3RhZ2VNYXAgZW50cnkgT1IgaGF2ZSBjaGlsZHJlbi9kZWNpZGVyYDtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdEZWNpZGVyIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJvbGUgbWFya2VycyBmb3IgZGVidWcgcGFuZWxzXG4gICAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICAgIGVsc2UgaWYgKGhhc0NoaWxkcmVuKSBjb250ZXh0LnNldEFzRm9yaygpO1xuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayBoYW5kbGVyIHdpcmVkIHRvIHRoZSBzY29wZS4gQ2FwdHVyZXMgdGhlIG9wdGlvbmFsIHJlYXNvblxuICAgICAgLy8gcGFzc2VkIHZpYSBgc2NvcGUuJGJyZWFrKHJlYXNvbilgIGFuZCBwYXJrcyBpdCBvbiB0aGUgYnJlYWtGbGFnIHNvXG4gICAgICAvLyBkb3duc3RyZWFtIGNvZGUgKEZsb3dSZWNvcmRlci5vbkJyZWFrLCBzdWJmbG93IHByb3BhZ2F0aW9uKSBjYW5cbiAgICAgIC8vIHN1cmZhY2UgaXQuIEEgc2Vjb25kICRicmVhayBjYWxsIGluIHRoZSBzYW1lIHN0YWdlIGtlZXBzIHRoZSBGSVJTVFxuICAgICAgLy8gcmVhc29uIOKAlCBmaXJzdC1icmVhay13aW5zIOKAlCBtYXRjaGluZyB0aGUgXCJleGVjdXRpb24gc3RvcHBlZFwiIHN0b3J5LlxuICAgICAgY29uc3QgYnJlYWtGbiA9IChyZWFzb24/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSByZWFzb247XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYTogU0VMRUNUT1Ig4oCUIHNjb3BlLWJhc2VkIG11bHRpLWNob2ljZSDilIDilIDilIBcbiAgICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBzdGFnZUZ1bmMhLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dCEubmFtZSwgbm9kZS5uZXh0IS5pZCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYjogREVDSURFUiDigJQgc2NvcGUtYmFzZWQgc2luZ2xlLWNob2ljZSBjb25kaXRpb25hbCBicmFuY2gg4pSA4pSA4pSAXG4gICAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgICBjb25zdCBkZWNpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5kZWNpZGVySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgICAgaWYgKGhhc05leHQgJiYgIWJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcbiAgICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgICAvLyBzaW5jZSBpZC1rZXllZCBzdGFnZU1hcHMgd291bGQgb3RoZXJ3aXNlIGNhdXNlIGxvb3AgdGFyZ2V0cyB0byBiZSBleGVjdXRlZCBkaXJlY3RseS5cbiAgICAgICAgICBjb25zdCBpc0xvb3BSZWYgPVxuICAgICAgICAgICAgbmV4dE5vZGUuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAgICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0Tm9kZSkgJiZcbiAgICAgICAgICAgICAgIW5leHROb2RlLmNoaWxkcmVuPy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgIW5leHROb2RlLmRlY2lkZXJGbiAmJlxuICAgICAgICAgICAgICAhbmV4dE5vZGUuc2VsZWN0b3JGbiAmJlxuICAgICAgICAgICAgICAhbmV4dE5vZGUuaXNTdWJmbG93Um9vdCk7XG5cbiAgICAgICAgICBpZiAoaXNMb29wUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlKFxuICAgICAgICAgICAgICBuZXh0Tm9kZSxcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGUobmV4dE5vZGUsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgICAgbGV0IHN0YWdlT3V0cHV0OiBUT3V0IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGR5bmFtaWNOZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHN0YWdlRnVuYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YWdlT3V0cHV0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdywgbm90IGFuIGVycm9yIOKAlCBmaXJlIG5hcnJhdGl2ZSwgY29tbWl0LCByZS10aHJvdy5cbiAgICAgICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblBhdXNlKG5vZGUubmFtZSwgbm9kZS5pZCwgZXJyb3IucGF1c2VEYXRhLCBlcnJvci5zdWJmbG93UGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgZXJyb3IudG9TdHJpbmcoKSwgZXJyb3IsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvciB9KTtcbiAgICAgICAgICBjb250ZXh0LmFkZEVycm9yKCdzdGFnZUV4ZWN1dGlvbkVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2xpbmVhcicpO1xuXG4gICAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgICAgLy8gc3RhZ2UncyAkYnJlYWsocmVhc29uKSBjYWxsIE9SIGJ5IGEgc3ViZmxvdydzIHByb3BhZ2F0ZUJyZWFrLlxuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsobm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0LCBicmVha0ZsYWcucmVhc29uKTtcbiAgICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDilIDilIDilIAgUGhhc2UgNDogRFlOQU1JQyDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNOb2RlID0gc3RhZ2VPdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdTdGFnZU5vZGVSZXR1cm4nKTtcblxuICAgICAgICAgIC8vIER5bmFtaWMgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvblxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5pc1N1YmZsb3dSb290ICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYgJiYgZHluYW1pY05vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljU3ViZmxvd0lkJywgZHluYW1pY05vZGUuc3ViZmxvd0lkKTtcblxuICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGR5bmFtaWNOb2RlLnN1YmZsb3dJZCwgZHluYW1pY05vZGUuc3ViZmxvd0RlZiwgbm9kZS5pZCk7XG5cbiAgICAgICAgICAgIG5vZGUuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICAgICAgICBub2RlLnN1YmZsb3dJZCA9IGR5bmFtaWNOb2RlLnN1YmZsb3dJZDtcbiAgICAgICAgICAgIG5vZGUuc3ViZmxvd05hbWUgPSBkeW5hbWljTm9kZS5zdWJmbG93TmFtZTtcbiAgICAgICAgICAgIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnM7XG5cbiAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5vZGUsIGNvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgY2hpbGRyZW4gZm9yIHN1YmZsb3dEZWZcbiAgICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgY2hpbGQuc3ViZmxvd0RlZiAmJiBjaGlsZC5zdWJmbG93SWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoY2hpbGQuc3ViZmxvd0lkLCBjaGlsZC5zdWJmbG93RGVmLCBjaGlsZC5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgICAgY2hpbGQuaWQsXG4gICAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybilcbiAgICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4gJiYgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGR5bmFtaWNOb2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNDaGlsZENvdW50JywgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgICAnZHluYW1pY0NoaWxkSWRzJyxcbiAgICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmlkKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IpLFxuICAgICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLmRlY2lkZXJGbiksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgbm9kZS5uZXh0Tm9kZVNlbGVjdG9yID0gZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc1NlbGVjdG9yJywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRHluYW1pYyBuZXh0IChsaW5lYXIgY29udGludWF0aW9uKVxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgICBkeW5hbWljTmV4dCA9IGR5bmFtaWNOb2RlLm5leHQ7XG4gICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY05leHQobm9kZS5pZCwgZHluYW1pY05vZGUubmV4dCk7XG4gICAgICAgICAgICBub2RlLm5leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc0R5bmFtaWNOZXh0JywgdHJ1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhZ2VPdXRwdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIG5leHQgdG8gYXZvaWQgc3RhbGUgcmVmZXJlbmNlIG9uIGxvb3AgcmV2aXNpdFxuICAgICAgICBpZiAoZHluYW1pY05leHQpIHtcbiAgICAgICAgICBub2RlLm5leHQgPSBvcmlnaW5hbE5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDU6IENISUxEUkVOIOKAlCBmb3JrIGRpc3BhdGNoIOKUgOKUgOKUgFxuICAgICAgY29uc3QgaGFzQ2hpbGRyZW5BZnRlclN0YWdlID0gQm9vbGVhbihub2RlLmNoaWxkcmVuPy5sZW5ndGgpO1xuXG4gICAgICBpZiAoaGFzQ2hpbGRyZW5BZnRlclN0YWdlKSB7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgbm9kZS5jaGlsZHJlbj8ubGVuZ3RoKTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgICAgbGV0IG5vZGVDaGlsZHJlblJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPjtcblxuICAgICAgICBpZiAobm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSB7XG4gICAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICAgIG5vZGUubmV4dE5vZGVTZWxlY3RvcixcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4hLFxuICAgICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYnJhbmNoUGF0aCBhcyBzdHJpbmcsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICAgbm9kZS5mYWlsRmFzdCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBub2RlLmNoaWxkcmVuPy5sZW5ndGggPz8gMDtcbiAgICAgICAgICBjb25zdCBjaGlsZE5hbWVzID0gbm9kZS5jaGlsZHJlbj8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdjaGlsZHJlbicsIGBFeGVjdXRpbmcgYWxsICR7Y2hpbGRDb3VudH0gY2hpbGRyZW4gaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gLCB7XG4gICAgICAgICAgICBjb3VudDogY2hpbGRDb3VudCxcbiAgICAgICAgICAgIHRhcmdldFN0YWdlOiBub2RlLmNoaWxkcmVuPy5tYXAoKGMpID0+IGMubmFtZSksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3JrLW9ubHk6IHJldHVybiBidW5kbGVcbiAgICAgICAgaWYgKCFoYXNOZXh0ICYmICFkeW5hbWljTmV4dCkge1xuICAgICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhcHR1cmUgZHluYW1pYyBjaGlsZHJlbiBhcyBzeW50aGV0aWMgc3ViZmxvdyByZXN1bHQgZm9yIFVJXG4gICAgICAgIGNvbnN0IGlzRHluYW1pYyA9IGNvbnRleHQuZGVidWc/LmxvZ0NvbnRleHQ/LmlzRHluYW1pYztcbiAgICAgICAgaWYgKGlzRHluYW1pYyAmJiBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChub2RlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgICAgaWYgKGR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmUoXG4gICAgICAgICAgZHluYW1pY05leHQsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAgIC8vIERldGVjdCBsb29wIHJlZmVyZW5jZSBub2RlcyBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBtYXJrZWQgd2l0aCBpc0xvb3BSZWYgZmxhZy5cbiAgICAgICAgLy8gUm91dGUgdGhyb3VnaCBDb250aW51YXRpb25SZXNvbHZlciBmb3IgcHJvcGVyIElEIHJlc29sdXRpb24sIGl0ZXJhdGlvblxuICAgICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLlxuICAgICAgICBjb25zdCBpc0xvb3BSZWZlcmVuY2UgPSBuZXh0Tm9kZS5pc0xvb3BSZWY7XG5cbiAgICAgICAgaWYgKGlzTG9vcFJlZmVyZW5jZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmUoXG4gICAgICAgICAgICBuZXh0Tm9kZSxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uTmV4dChub2RlLm5hbWUsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICAgIHRhcmdldFN0YWdlOiBuZXh0Tm9kZS5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShuZXh0Tm9kZSwgbmV4dEN0eCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDc6IExFQUYg4oCUIG5vIGNvbnRpbnVhdGlvbiDilIDilIDilIBcbiAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fZXhlY3V0ZURlcHRoLS07XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFByaXZhdGUgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFN0YWdlSWQgPSBjb250ZXh0LmdldFN0YWdlSWQoKTtcblxuICAgIGNvbnN0IGNoaWxkU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgICBpZDogYCR7bm9kZS5pZH0tY2hpbGRyZW5gLFxuICAgICAgbmFtZTogJ0R5bmFtaWMgQ2hpbGRyZW4nLFxuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4hLm1hcCgoYykgPT4gKHtcbiAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hpbGRTdGFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdHggb2YgY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGNoaWxkQ3R4LmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU3RhZ2VzW3NuYXBzaG90Lm5hbWUgfHwgc25hcHNob3QuaWRdID0ge1xuICAgICAgICAgIG5hbWU6IHNuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgb3V0cHV0OiBzbmFwc2hvdC5sb2dzLFxuICAgICAgICAgIGVycm9yczogc25hcHNob3QuZXJyb3JzLFxuICAgICAgICAgIG1ldHJpY3M6IHNuYXBzaG90Lm1ldHJpY3MsXG4gICAgICAgICAgc3RhdHVzOiBzbmFwc2hvdC5lcnJvcnMgJiYgT2JqZWN0LmtleXMoc25hcHNob3QuZXJyb3JzKS5sZW5ndGggPiAwID8gJ2Vycm9yJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLnNldChub2RlLmlkLCB7XG4gICAgICBzdWJmbG93SWQ6IG5vZGUuaWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5uYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDoge30sXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IGNoaWxkU3RhZ2VzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQsXG4gICAgICBwaXBlbGluZVN0cnVjdHVyZTogY2hpbGRTdHJ1Y3R1cmUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVDb250ZXh0RGVwdGgoY29udGV4dDogU3RhZ2VDb250ZXh0KTogbnVtYmVyIHtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBjdXJyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBkZXB0aDtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgY29uc3QgY2xvbmU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgY2xvbmUubmFtZSA9IGAke3ByZWZpeH0vJHtub2RlLm5hbWV9YDtcbiAgICBjbG9uZS5pZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5pZH1gO1xuICAgIGlmIChjbG9uZS5zdWJmbG93SWQpIGNsb25lLnN1YmZsb3dJZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5zdWJmbG93SWR9YDtcbiAgICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHRoaXMucHJlZml4Tm9kZVRyZWUoY2xvbmUubmV4dCwgcHJlZml4KTtcbiAgICBpZiAoY2xvbmUuY2hpbGRyZW4pIHtcbiAgICAgIGNsb25lLmNoaWxkcmVuID0gY2xvbmUuY2hpbGRyZW4ubWFwKChjKSA9PiB0aGlzLnByZWZpeE5vZGVUcmVlKGMsIHByZWZpeCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwcml2YXRlIGF1dG9SZWdpc3RlclN1YmZsb3dEZWYoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd0RlZjogTm9uTnVsbGFibGU8U3RhZ2VOb2RlWydzdWJmbG93RGVmJ10+LFxuICAgIG1vdW50Tm9kZUlkPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyB0aGlzLnN1YmZsb3dzIGlzIGFsd2F5cyBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3I7IHRoZSBudWxsIGd1YXJkIGJlbG93IGlzIHVucmVhY2hhYmxlLlxuICAgIGNvbnN0IHN1YmZsb3dzRGljdCA9IHRoaXMuc3ViZmxvd3M7XG5cbiAgICAvLyBGaXJzdC13cml0ZS13aW5zXG4gICAgY29uc3QgaXNOZXdSZWdpc3RyYXRpb24gPSAhc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF07XG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uICYmIHN1YmZsb3dEZWYucm9vdCkge1xuICAgICAgc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF0gPSB7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dEZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICAgICAgLi4uKHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlID8geyBidWlsZFRpbWVTdHJ1Y3R1cmU6IHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlIH0gOiB7fSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzIChwYXJlbnQgZW50cmllcyBwcmVzZXJ2ZWQpXG4gICAgaWYgKHN1YmZsb3dEZWYuc3RhZ2VNYXApIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIEFycmF5LmZyb20oc3ViZmxvd0RlZi5zdGFnZU1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KGtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgIGlmIChzdWJmbG93RGVmLnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd0RlZi5zdWJmbG93cykpIHtcbiAgICAgICAgaWYgKCFzdWJmbG93c0RpY3Rba2V5XSkge1xuICAgICAgICAgIHN1YmZsb3dzRGljdFtrZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3VudE5vZGVJZCkge1xuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICBtb3VudE5vZGVJZCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSBGbG93UmVjb3JkZXJzIG9ubHkgb24gZmlyc3QgcmVnaXN0cmF0aW9uIChtYXRjaGVzIGZpcnN0LXdyaXRlLXdpbnMpXG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uKSB7XG4gICAgICBjb25zdCBzdWJmbG93TmFtZSA9IHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lIHx8IHN1YmZsb3dJZDtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd1JlZ2lzdGVyZWQoXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uZGVzY3JpcHRpb24sXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
871
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7OztBQUdILG1EQUFxRDtBQUVyRCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELHlFQUFtRTtBQUNuRSxpRkFBMkU7QUFDM0UscUVBQStEO0FBQy9ELGlFQUEyRDtBQUMzRCx1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCx1RUFBaUU7QUFFakUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsNERBQTJEO0FBdUczRCxNQUFhLGtCQUFrQjtJQUNaLElBQUksQ0FBMEI7SUFDdkMsUUFBUSxDQUEyQztJQUMxQyxnQkFBZ0IsQ0FBb0I7SUFDN0MsUUFBUSxDQUFvRDtJQUNuRCxNQUFNLENBQVU7SUFDaEIsTUFBTSxDQUFlO0lBQ3JCLGVBQWUsQ0FBVTtJQUMxQzs7MEVBRXNFO0lBQ3JELGVBQWUsQ0FBVztJQUMzQztvRkFDZ0Y7SUFDL0QsS0FBSyxDQUFTO0lBRS9CLGtCQUFrQjtJQUNELFlBQVksQ0FBNkI7SUFDekMsZ0JBQWdCLENBQWlDO0lBQ2pELGVBQWUsQ0FBZ0M7SUFDL0MsV0FBVyxDQUE0QjtJQUN2QyxvQkFBb0IsQ0FBcUM7SUFDekQsY0FBYyxDQUErQjtJQUM3QyxlQUFlLENBQWdDO0lBQy9DLGdCQUFnQixDQUEwQjtJQUMxQyxrQkFBa0IsQ0FBd0I7SUFDMUMsc0JBQXNCLENBQXFDO0lBRTVFLGtCQUFrQjtJQUNWLGNBQWMsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUvRDs7Ozs7T0FLRztJQUNjLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFMUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ2MsY0FB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dEIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FDekMsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFDNUIsVUFBVSxDQUFDLGtCQUFrQixDQUM5QixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7O0FBaGhDSCxnREFpaENDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Y2hhcnRUcmF2ZXJzZXIg4oCUIFByZS1vcmRlciBERlMgdHJhdmVyc2FsIG9mIFN0YWdlTm9kZSBncmFwaC5cbiAqXG4gKiBVbmlmaWVkIHRyYXZlcnNhbCBhbGdvcml0aG0gZm9yIGFsbCBub2RlIHNoYXBlczpcbiAqICAgY29uc3QgcHJlID0gYXdhaXQgcHJlcCgpO1xuICogICBjb25zdCBbeCwgeV0gPSBhd2FpdCBQcm9taXNlLmFsbChbZngocHJlKSwgZnkocHJlKV0pO1xuICogICByZXR1cm4gYXdhaXQgbmV4dCh4LCB5KTtcbiAqXG4gKiBGb3IgZWFjaCBub2RlLCBleGVjdXRlTm9kZSBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDEuIFZBTElEQVRFICDigJQgbm9kZSBpbnZhcmlhbnRzLCByb2xlIG1hcmtlcnNcbiAqICAgMi4gRVhFQ1VURSAgIOKAlCBydW4gc3RhZ2UgZm4sIGNvbW1pdCwgYnJlYWsgY2hlY2tcbiAqICAgMy4gRFlOQU1JQyAgIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiwgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbiwgc3RydWN0dXJlIHVwZGF0ZXNcbiAqICAgNC4gQ0hJTERSRU4gIOKAlCBmb3JrL3NlbGVjdG9yL2RlY2lkZXIgZGlzcGF0Y2hcbiAqICAgNS4gQ09OVElOVUUgIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCByZXNvbHV0aW9uXG4gKiAgIDYuIExFQUYgICAgICDigJQgbm8gY29udGludWF0aW9uLCByZXR1cm4gb3V0cHV0XG4gKlxuICogQnJlYWsgc2VtYW50aWNzOiBJZiBhIHN0YWdlIGNhbGxzIGJyZWFrRm4oKSwgY29tbWl0IGFuZCBTVE9QLlxuICogUGF0Y2ggbW9kZWw6IFN0YWdlIHdyaXRlcyBpbnRvIGxvY2FsIHBhdGNoOyBjb21taXRQYXRjaCgpIGFmdGVyIHJldHVybiBvciB0aHJvdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgaXNTdGFnZU5vZGVSZXR1cm4gfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHsgQ2hpbGRyZW5FeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgQ29udGludWF0aW9uUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBEZWNpZGVySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0RlY2lkZXJIYW5kbGVyLmpzJztcbmltcG9ydCB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL05vZGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBSdW50aW1lU3RydWN0dXJlTWFuYWdlciB9IGZyb20gJy4uL2hhbmRsZXJzL1J1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdG9ySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1NlbGVjdG9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCBwcm9wYWdhdGVzIHRvIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuICovXG4gIGV4ZWN1dGlvbkVudj86IGltcG9ydCgnLi4vLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52O1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBuYXJyYXRpdmVFbmFibGVkPzogYm9vbGVhbjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBsb2dnZXI6IElMb2dnZXI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKiogUHJlLWNvbmZpZ3VyZWQgRmxvd1JlY29yZGVycyB0byBhdHRhY2ggd2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZC4gKi9cbiAgZmxvd1JlY29yZGVycz86IEZsb3dSZWNvcmRlcltdO1xuICAvKipcbiAgICogUHJlLWNvbmZpZ3VyZWQgbmFycmF0aXZlIGdlbmVyYXRvci4gSWYgcHJvdmlkZWQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgKiBmbG93UmVjb3JkZXJzIGFuZCBuYXJyYXRpdmVFbmFibGVkLiBVc2VkIGJ5IHRoZSBzdWJmbG93IHRyYXZlcnNlciBmYWN0b3J5XG4gICAqIHRvIHNoYXJlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmUgZ2VuZXJhdG9yIHdpdGggc3ViZmxvdyB0cmF2ZXJzZXJzLlxuICAgKi9cbiAgbmFycmF0aXZlR2VuZXJhdG9yPzogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICAvKipcbiAgICogTWF4aW11bSByZWN1cnNpdmUgZXhlY3V0ZU5vZGUgZGVwdGguIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICogT3ZlcnJpZGUgaW4gdGVzdHMgb3IgdW51c3VhbGx5IGRlZXAgcGlwZWxpbmVzLlxuICAgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgdHJhdmVyc2VyIHJ1bnMgaW5zaWRlIGEgc3ViZmxvdywgc2V0IHRoaXMgdG8gdGhlIHN1YmZsb3cncyBJRC5cbiAgICogUHJvcGFnYXRlZCB0byBUcmF2ZXJzYWxDb250ZXh0IHNvIG5hcnJhdGl2ZSBlbnRyaWVzIGNhcnJ5IHRoZSBjb3JyZWN0IHN1YmZsb3dJZC5cbiAgICovXG4gIHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciBmcm9tIHBhcmVudCB0cmF2ZXJzZXIuIFN1YmZsb3dzIGNvbnRpbnVlIHRoZSBwYXJlbnQncyBudW1iZXJpbmcuICovXG4gIGV4ZWN1dGlvbkNvdW50ZXI/OiB7IHZhbHVlOiBudW1iZXIgfTtcbiAgLyoqXG4gICAqIFBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGZyb20gYSBjaGVja3BvaW50LCBvbiB0aGUgcmVzdW1lIHBhdGguXG4gICAqIEZvcndhcmRlZCB0byBgSGFuZGxlckRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZWAgc28gU3ViZmxvd0V4ZWN1dG9yXG4gICAqIGNhbiByZS1zZWVkIG5lc3RlZCBydW50aW1lcyBmcm9tIHByZS1wYXVzZSBzdGF0ZSBpbnN0ZWFkIG9mIHJ1bm5pbmdcbiAgICogdGhlIGlucHV0TWFwcGVyLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogRnJvemVuIHZhbHVlIHBhc3NlZCB2aWEgYHJ1bih7aW5wdXR9KWAuIFN1cmZhY2VkIG9uIGBvblJ1blN0YXJ0YCBhdCB0aGVcbiAgICogIHRvcC1sZXZlbCB0cmF2ZXJzYWwgc28gY29uc3VtZXJzIChlLmcuIGBJbk91dFJlY29yZGVyYCkgY2FuIGJyYWNrZXRcbiAgICogIHRoZSBydW4gd2l0aCB0aGUgc2FtZSBwYXlsb2FkIHNoYXBlIHRoYXQgc3ViZmxvd3MgYWxyZWFkeSBoYXZlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBTdGFtcGVkIG9udG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC5cbiAgICogIEluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgc28gYWxsIGV2ZW50cyBvZiBvbmUgcnVuIHNoYXJlIG9uZSBydW5JZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBvdmVybGF5IG9mIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybnMsIGtleWVkIGJ5IGBub2RlLmlkYC5cbiAgICogUGhhc2UgNCB3cml0ZXMgcGF0Y2hlcyBIRVJFIGluc3RlYWQgb2YgbXV0YXRpbmcgdGhlIHNoYXJlZCBidWlsdC1jaGFydFxuICAgKiBub2RlIG9iamVjdHMgKHNhbWUgaXNvbGF0aW9uIGNvbnZlbnRpb24gYXMgYHJlc29sdmVkTGF6eVN1YmZsb3dzYCkuXG4gICAqIEFsbCBlbmdpbmUgcmVhZHMgb2YgdGhlIHBhdGNoZWQgZmllbGRzIGdvIHRocm91Z2ggdGhlIGBlZmYqYCBhY2Nlc3NvcnNcbiAgICogYmVsb3cuIFRoZSBtYXAgZGllcyB3aXRoIHRoZSB0cmF2ZXJzZXIg4oCUIG9uZSBydW4sIG9uZSBvdmVybGF5IOKAlCBzbyBhXG4gICAqIGZyZXNoIGV4ZWN1dG9yIG92ZXIgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIGdyYXBoLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgbm9kZSBPQkpFQ1QgKFdlYWtNYXApLCBub3QgYG5vZGUuaWRgOiBhIGR5bmFtaWMgY2hpbGQgdGhhdFxuICAgKiByZXVzZXMgYSBidWlsdCBub2RlJ3MgaWQgbXVzdCBOT1QgbWFrZSB0aGUgYnVpbHQgbm9kZSBpbmhlcml0IHRoZSBwYXRjaFxuICAgKiAoaWQta2V5ZWQgbG9va3VwIGNhdXNlZCBwaGFudG9tIGRvdWJsZS1leGVjdXRpb24pLiBgcGF0Y2hDb3VudGAgaXMgdGhlXG4gICAqIGZhc3QtcGF0aCBjaGVjayDigJQgV2Vha01hcCBoYXMgbm8gYHNpemVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljUGF0Y2hlcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4+KCk7XG4gIHByaXZhdGUgcGF0Y2hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2lvbiBkZXB0aCBjb3VudGVyIGZvciBleGVjdXRlTm9kZS5cbiAgICogRWFjaCByZWN1cnNpdmUgZXhlY3V0ZU5vZGUgY2FsbCBpbmNyZW1lbnRzIHRoaXM7IGRlY3JlbWVudHMgb24gZXhpdCAodHJ5L2ZpbmFsbHkpLlxuICAgKiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIGluZmluaXRlIGxvb3BzIG9yIGV4Y2Vzc2l2ZWx5IGRlZXAgc3RhZ2UgY2hhaW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBfZXhlY3V0ZURlcHRoID0gMDtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIG1heGltdW0gZGVwdGggKHNldCBmcm9tIFRyYXZlcnNlck9wdGlvbnMubWF4RGVwdGggb3IgdGhlIGNsYXNzIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4RGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHJlY3Vyc2l2ZSBleGVjdXRlTm9kZSBkZXB0aCBiZWZvcmUgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiA1MDAgY29tZm9ydGFibHkgY292ZXJzIGFueSByZWFsaXN0aWMgcGlwZWxpbmUgZGVwdGggKGluY2x1ZGluZyBkZWVwbHkgbmVzdGVkXG4gICAqIHN1YmZsb3dzKSB3aGlsZSBwcmV2ZW50aW5nIGNhbGwtc3RhY2sgb3ZlcmZsb3cgKH4xMCAwMDAgZnJhbWVzIGluIFY4KS5cbiAgICpcbiAgICogKipOb3RlIG9uIGNvdW50aW5nOioqIHRoZSBjb3VudGVyIGluY3JlbWVudHMgb25jZSBwZXIgYGV4ZWN1dGVOb2RlYCBjYWxsLCBub3Qgb25jZSBwZXJcbiAgICogbG9naWNhbCB1c2VyIHN0YWdlLiBTdWJmbG93IHJvb3QgZW50cnkgYW5kIHN1YmZsb3cgY29udGludWF0aW9uIGFmdGVyIHJldHVybiBlYWNoIGNvc3RcbiAgICogb25lIHRpY2suIEZvciBwaXBlbGluZXMgd2l0aCBtYW55IG5lc3RlZCBzdWJmbG93cywgYnVkZ2V0IHJvdWdobHkgMiDDlyAoYXZnIHN0YWdlcyBwZXJcbiAgICogc3ViZmxvdykgb2YgaGVhZHJvb20gd2hlbiBjb21wdXRpbmcgYSBjdXN0b20gYG1heERlcHRoYCB2aWEgYFJ1bk9wdGlvbnMubWF4RGVwdGhgLlxuICAgKlxuICAgKiAqKk5vdGUgb24gbG9vcHM6KiogZm9yIGBsb29wVG8oKWAgcGlwZWxpbmVzLCB0aGlzIGRlcHRoIGd1YXJkIGFuZCBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3NcbiAgICogaXRlcmF0aW9uIGxpbWl0IGFyZSBpbmRlcGVuZGVudCDigJQgdGhlIGxvd2VyIG9uZSBmaXJlcyBmaXJzdC4gVGhlIGRlZmF1bHQgZGVwdGggZ3VhcmQgKDUwMClcbiAgICogZmlyZXMgYmVmb3JlIHRoZSBkZWZhdWx0IGl0ZXJhdGlvbiBsaW1pdCAoMTAwMCkgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3Qgc2FmZSBmb3IgY29uY3VycmVudCBgLmV4ZWN1dGUoKWAgY2FsbHMgb24gdGhlIHNhbWUgaW5zdGFuY2Ug4oCUIGNvbmN1cnJlbnRcbiAgICogZXhlY3V0aW9ucyByYWNlIG9uIGBfZXhlY3V0ZURlcHRoYC4gVXNlIGEgc2VwYXJhdGUgYEZsb3djaGFydFRyYXZlcnNlcmAgcGVyIGNvbmN1cnJlbnRcbiAgICogZXhlY3V0aW9uLiBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFsd2F5cyBjcmVhdGVzIGEgZnJlc2ggdHJhdmVyc2VyIHBlciBjYWxsLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9FWEVDVVRFX0RFUFRIID0gNTAwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPikge1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0cy5tYXhEZXB0aCA/PyBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEg7XG4gICAgaWYgKG1heERlcHRoIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heERlcHRoIG11c3QgYmUgPj0gMScpO1xuICAgIHRoaXMuX21heERlcHRoID0gbWF4RGVwdGg7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5yb290ID0gb3B0cy5yb290O1xuICAgIC8vIFNoYWxsb3ctY29weSBzdGFnZU1hcCBhbmQgc3ViZmxvd3Mgc28gdGhhdCBsYXp5LXJlc29sdXRpb24gbXV0YXRpb25zXG4gICAgLy8gKHByZWZpeGVkIGVudHJpZXMgYWRkZWQgZHVyaW5nIGV4ZWN1dGlvbikgc3RheSBzY29wZWQgdG8gVEhJUyB0cmF2ZXJzZXJcbiAgICAvLyBhbmQgZG8gbm90IGVzY2FwZSB0byB0aGUgc2hhcmVkIEZsb3dDaGFydCBvYmplY3QuIFdpdGhvdXQgdGhlIGNvcHksXG4gICAgLy8gY29uY3VycmVudCBGbG93Q2hhcnRFeGVjdXRvciBydW5zIHNoYXJpbmcgdGhlIHNhbWUgRmxvd0NoYXJ0IHdvdWxkIHJhY2VcbiAgICAvLyBvbiB0aGVzZSB0d28gbXV0YWJsZSBkaWN0aW9uYXJpZXMuXG4gICAgdGhpcy5zdGFnZU1hcCA9IG5ldyBNYXAob3B0cy5zdGFnZU1hcCk7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lID0gb3B0cy5leGVjdXRpb25SdW50aW1lO1xuICAgIHRoaXMuc3ViZmxvd3MgPSBvcHRzLnN1YmZsb3dzID8geyAuLi5vcHRzLnN1YmZsb3dzIH0gOiB7fTtcbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyO1xuICAgIHRoaXMuc2lnbmFsID0gb3B0cy5zaWduYWw7XG4gICAgdGhpcy5wYXJlbnRTdWJmbG93SWQgPSBvcHRzLnBhcmVudFN1YmZsb3dJZDtcbiAgICB0aGlzLnJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgIHRoaXMucnVuSWQgPSBvcHRzLnJ1bklkO1xuXG4gICAgLy8gU3RydWN0dXJlIG1hbmFnZXIgKGRlZXAtY2xvbmVzIGJ1aWxkLXRpbWUgc3RydWN0dXJlKVxuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlciA9IG5ldyBSdW50aW1lU3RydWN0dXJlTWFuYWdlcigpO1xuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci5pbml0KG9wdHMuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIC8vIE5hcnJhdGl2ZSBnZW5lcmF0b3JcbiAgICAvLyBQcmlvcml0eTogZXhwbGljaXQgbmFycmF0aXZlR2VuZXJhdG9yID4gZmxvd1JlY29yZGVycyA+IGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyID4gbnVsbC5cbiAgICAvLyBTdWJmbG93IHRyYXZlcnNlcnMgcmVjZWl2ZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlR2VuZXJhdG9yIHNvIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2UuXG4gICAgaWYgKG9wdHMubmFycmF0aXZlR2VuZXJhdG9yKSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG9wdHMubmFycmF0aXZlR2VuZXJhdG9yO1xuICAgIH0gZWxzZSBpZiAob3B0cy5uYXJyYXRpdmVFbmFibGVkKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gbmV3IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICAgIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgIC8vIElmIGN1c3RvbSBGbG93UmVjb3JkZXJzIGFyZSBwcm92aWRlZCwgdXNlIHRoZW07IG90aGVyd2lzZSBhdHRhY2ggZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXJcbiAgICAgIGlmIChvcHRzLmZsb3dSZWNvcmRlcnMgJiYgb3B0cy5mbG93UmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmRlciBvZiBvcHRzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKG5ldyBOYXJyYXRpdmVGbG93UmVjb3JkZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gZGlzcGF0Y2hlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBuZXcgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2hhcmVkIGRlcHMgYmFnXG4gICAgY29uc3QgZGVwcyA9IHRoaXMuY3JlYXRlRGVwcyhvcHRzKTtcblxuICAgIC8vIEJ1aWxkIE8oMSkgbm9kZSBJRCBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaCAoYXZvaWRzIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSlcbiAgICBjb25zdCBub2RlSWRNYXAgPSB0aGlzLmJ1aWxkTm9kZUlkTWFwKG9wdHMucm9vdCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgbW9kdWxlcy5cbiAgICAvLyBOb2RlUmVzb2x2ZXIncyBERlMgZmFsbGJhY2sgcmVzb2x2ZXMgbG9vcCB0YXJnZXRzIGFnYWluc3QgdGhlIExJVkVcbiAgICAvLyBydW50aW1lIHNoYXBlLCBzbyBpdCByZWFkcyBjaGlsZHJlbiB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXlcbiAgICAvLyAoYSBsb29wIGNhbiB0YXJnZXQgYSBub2RlIGFkZGVkIGJ5IGEgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJuKS5cbiAgICB0aGlzLm5vZGVSZXNvbHZlciA9IG5ldyBOb2RlUmVzb2x2ZXIoZGVwcywgbm9kZUlkTWFwLCAobikgPT4gdGhpcy5lZmZDaGlsZHJlbihuKSk7XG4gICAgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yID0gbmV3IENoaWxkcmVuRXhlY3V0b3IoZGVwcywgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YWdlUnVubmVyID0gbmV3IFN0YWdlUnVubmVyKGRlcHMpO1xuICAgIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIgPSBuZXcgQ29udGludWF0aW9uUmVzb2x2ZXIoZGVwcywgdGhpcy5ub2RlUmVzb2x2ZXIsIChub2RlSWQsIGNvdW50KSA9PlxuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUl0ZXJhdGlvbkNvdW50KG5vZGVJZCwgY291bnQpLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIEZsb3djaGFydFRyYXZlcnNlciBpbnN0YW5jZXMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICAgKiBDYXB0dXJlcyBwYXJlbnQgY29uZmlnIGluIGNsb3N1cmUg4oCUIFN1YmZsb3dFeGVjdXRvciBwcm92aWRlcyBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAgICogRWFjaCBzdWJmbG93IGdldHMgYSBmdWxsIHRyYXZlcnNlciB3aXRoIGFsbCA3IHBoYXNlcyAoZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShcbiAgICBwYXJlbnRPcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4sXG4gICk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIENhcHR1cmUgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHN0YXRlIOKAlCBmYWN0b3J5IHJlYWRzIHRoZSBDVVJSRU5UIHN0YXRlIHdoZW4gY2FsbGVkLFxuICAgIC8vIG5vdCB0aGUgc3RhdGUgYXQgZmFjdG9yeSBjcmVhdGlvbiB0aW1lLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSBsYXp5IHN1YmZsb3cgcmVzb2x1dGlvblxuICAgIC8vIG1heSBhZGQgZW50cmllcyB0byBzdGFnZU1hcC9zdWJmbG93cyBiZWZvcmUgYSBuZXN0ZWQgc3ViZmxvdyBpcyBlbmNvdW50ZXJlZC5cbiAgICBjb25zdCBwYXJlbnRTdGFnZU1hcCA9IHRoaXMuc3RhZ2VNYXA7XG4gICAgY29uc3QgcGFyZW50U3ViZmxvd3MgPSB0aGlzLnN1YmZsb3dzO1xuICAgIGNvbnN0IG5hcnJhdGl2ZUdlbmVyYXRvciA9IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yO1xuXG4gICAgcmV0dXJuIChzdWJmbG93T3B0cykgPT4ge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgcm9vdDogc3ViZmxvd09wdHMucm9vdCxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIC8vIFNoYXJlIGNvdW50ZXIg4oCUIHN1YmZsb3cgY29udGludWVzIGdsb2JhbCBudW1iZXJpbmdcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gRm9yd2FyZCB0aGUgcmVzdW1lLW9ubHkgc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBzbyBuZXN0ZWRcbiAgICAgICAgLy8gU3ViZmxvd0V4ZWN1dG9ycyBjYW4gcmUtc2VlZCBkZWVwZXItbmVzdGVkIHJ1bnRpbWVzIChlLmcuXG4gICAgICAgIC8vIFNlcXVlbmNlKEFnZW50KC4uLikpIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLihwYXJlbnRPcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHBhcmVudE9wdHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICByZWFkT25seUNvbnRleHQ6IG9wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgZXhlY3V0aW9uRW52OiBvcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvcjogdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgIC4uLihvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvcHRzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGRzIHRoZSB0b3AtbGV2ZWwgYnJlYWsgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIGBleGVjdXRlKClgLiBLZXB0IGFzXG4gICAqIGEgZmllbGQgKG5vdCBhIGxvY2FsKSBzbyBgZ2V0QnJlYWtTdGF0ZSgpYCBjYW4gc3VyZmFjZSB0aGUgZmluYWwgc3RhdGVcbiAgICogZm9yIGNhbGxlcnMgbGlrZSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGF0IGltcGxlbWVudCBgcHJvcGFnYXRlQnJlYWtgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9wQnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgdGhpcy5fdG9wQnJlYWtGbGFnID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0OiBUcmF2ZXJzYWxDb250ZXh0ID0ge1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiAnX19yb290X18nLFxuICAgICAgcnVudGltZVN0YWdlSWQ6ICdfX3Jvb3RfXyMwJyxcbiAgICAgIHN0YWdlTmFtZTogJ19fcm9vdF9fJyxcbiAgICAgIGRlcHRoOiAwLFxuICAgIH07XG4gICAgaWYgKGlzVG9wTGV2ZWwpIHtcbiAgICAgIC8vIGByZWFkT25seUNvbnRleHRgIGlzIHRoZSBlbmdpbmUncyB2aWV3IG9mIGBydW4oe2lucHV0fSlgIOKAlCBwYXNzZWRcbiAgICAgIC8vIHRocm91Z2ggZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFzIHRoZSB2YWxpZGF0ZWQgaW5wdXQuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1blN0YXJ0KHRoaXMucmVhZE9ubHlDb250ZXh0LCByb290Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gVG9wLWxldmVsIHJ1bnMgY2xvc2UgdGhlaXIgYm91bmRhcnkgU1lNTUVUUklDQUxMWTogZXZlcnkgb25SdW5TdGFydFxuICAgIC8vIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIG9uUnVuRW5kIChjbGVhbikgb3Igb25SdW5GYWlsZWQgKGVycm9yKS5cbiAgICAvLyBXaXRob3V0IHRoZSBjYXRjaCwgYSB0aHJvd24gcnVuIGZpcmVkIG9uUnVuU3RhcnQgdGhlbiBub3RoaW5nIOKAlCBhXG4gICAgLy8gbW9uaXRvciBjb3VsZG4ndCB0ZWxsIFwic3RpbGwgcnVubmluZ1wiIGZyb20gXCJjcmFzaGVkLlwiIFBhdXNlIGlzIE5PVFxuICAgIC8vIGFuIGVycm9yIChpdCdzIGV4cGVjdGVkIHN1c3BlbnNpb24pLCBzbyBpdCBza2lwcyBvblJ1bkZhaWxlZCBhbmRcbiAgICAvLyByZS10aHJvd3MgdW50b3VjaGVkLiBUaGUgc3RhZ2UtbGV2ZWwgY2F0Y2ggYWxyZWFkeSByZWNvcmRlZCB0aGVcbiAgICAvLyBmYWlsaW5nIHN0YWdlIChvbkVycm9yICsgY29tbWl0KTsgdGhpcyBhZGRzIHRoZSBydW4tbGV2ZWwgdGVybWluYWxcbiAgICAvLyBzaWduYWwuIFRoZSBlcnJvciBzdGlsbCBwcm9wYWdhdGVzIOKAlCB0aGlzIGlzIG9ic2VydmF0aW9uLCBub3RcbiAgICAvLyByZWNvdmVyeS4gU3ViZmxvdyB0cmF2ZXJzZXJzIGRvbid0IGZpcmUgcnVuIGV2ZW50czsgdGhlaXIgZXJyb3JzXG4gICAgLy8gYnViYmxlIHVwIGFuZCBzdXJmYWNlIGhlcmUgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICBpZiAoIWlzVG9wTGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVOb2RlKHRoaXMucm9vdCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHRoaXMucm9vdCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChleHRyYWN0RXJyb3JJbmZvKGVycm9yKSwgcm9vdENvbnRleHQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRW5kKHJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnJlYWsgc3RhdGUgY2FwdHVyZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiB0aGUgbW9zdCByZWNlbnQgYGV4ZWN1dGUoKWAuXG4gICAqIGBzaG91bGRCcmVha2AgaXMgdHJ1ZSB3aGVuIGEgc3RhZ2UgY2FsbGVkIGBzY29wZS4kYnJlYWsocmVhc29uKWA7IHRoZVxuICAgKiBvcHRpb25hbCBgcmVhc29uYCBjYXJyaWVzIHRoZSBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIHByb3BhZ2F0ZSBhbiBpbm5lciBzdWJmbG93J3MgYnJlYWsgdXAgdG9cbiAgICogdGhlIHBhcmVudCB0cmF2ZXJzZXIgd2hlbiB0aGUgbW91bnQgc2V0cyBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fdG9wQnJlYWtGbGFnIH07XG4gIH1cblxuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlTWFuYWdlci5nZXRTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyk7XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIERlcHRoLWd1YXJkZWQgYXQgTUFYX0VYRUNVVEVfREVQVEggdG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gb24gY3ljbGljIGdyYXBocy5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3QgdmlzaXQgPSAobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGlmIChkZXB0aCA+IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCkgcmV0dXJuO1xuICAgICAgaWYgKG1hcC5oYXMobm9kZS5pZCkpIHJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkIChhdm9pZHMgaW5maW5pdGUgbG9vcHMgb24gY3ljbGljIHJlZnMpXG4gICAgICBtYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB2aXNpdChjaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5leHQpIHZpc2l0KG5vZGUubmV4dCwgZGVwdGggKyAxKTtcbiAgICB9O1xuICAgIHZpc2l0KHJvb3QsIDApO1xuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICkge1xuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGlzIGFzc2lnbmVkIGluIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24sXG4gICAgLy8gZW5zdXJpbmcgc2NvcGUgZXZlbnRzIGFuZCBmbG93IGV2ZW50cyB1c2UgdGhlIHNhbWUgdmFsdWUuXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gIH1cblxuICAvKipcbiAgICogUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwg4oCUIHRoZSBjb3JlIGFsZ29yaXRobS5cbiAgICogRWFjaCBjYWxsIHByb2Nlc3NlcyBvbmUgbm9kZSB0aHJvdWdoIGFsbCA3IHBoYXNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8g4pSA4pSA4pSAIFJlY3Vyc2lvbiBkZXB0aCBndWFyZCDilIDilIDilIBcbiAgICAvLyBFYWNoIGBhd2FpdCBleGVjdXRlTm9kZSguLi4pYCBrZWVwcyB0aGUgY2FsbGluZyBmcmFtZSBvbiB0aGUgc3RhY2suXG4gICAgLy8gV2l0aG91dCBhIGNhcCwgYW4gaW5maW5pdGUgbG9vcCBvciBhbiBleGNlc3NpdmVseSBkZWVwIHN0YWdlIGNoYWluIHdpbGxcbiAgICAvLyBldmVudHVhbGx5IG92ZXJmbG93IHRoZSBWOCBjYWxsIHN0YWNrICh+MTAgMDAwIGZyYW1lcykgd2l0aCBhIGNyeXB0aWNcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IuICBXZSBmYWlsIGVhcmx5IHdpdGggYSBjbGVhclxuICAgIC8vIG1lc3NhZ2Ugc28gdXNlcnMgY2FuIGRpYWdub3NlIHRoZSBjYXVzZSAoaW5maW5pdGUgbG9vcCwgbWlzc2luZyBicmVhaywgZXRjLikuXG4gICAgLy8gVGhlIGluY3JlbWVudCBpcyBpbnNpZGUgYHRyeWAgc28gYGZpbmFsbHlgIGFsd2F5cyBkZWNyZW1lbnRzIOKAlCBubyBmcmFnaWxlXG4gICAgLy8gZ2FwIGJldHdlZW4gY2hlY2sgYW5kIHRyeSBlbnRyeS5cbiAgICB0cnkge1xuICAgICAgaWYgKCsrdGhpcy5fZXhlY3V0ZURlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heGltdW0gdHJhdmVyc2FsIGRlcHRoIGV4Y2VlZGVkICgke3RoaXMuX21heERlcHRofSkuIGAgK1xuICAgICAgICAgICAgJ0NoZWNrIGZvciBpbmZpbml0ZSBsb29wcyBvciBtaXNzaW5nIGJyZWFrIGNvbmRpdGlvbnMgaW4geW91ciBmbG93Y2hhcnQuICcgK1xuICAgICAgICAgICAgYExhc3Qgc3RhZ2U6ICcke25vZGUubmFtZX0nLiBgICtcbiAgICAgICAgICAgICdGb3IgbG9vcFRvKCkgcGlwZWxpbmVzLCBjb25zaWRlciBhZGRpbmcgYSBicmVhayBjb25kaXRpb24gb3IgdXNpbmcgUnVuT3B0aW9ucy5tYXhEZXB0aCB0byByYWlzZSB0aGUgbGltaXQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudC5cbiAgICAgIC8vIFN1YmZsb3cgbWV0YSByZWFkcyBnbyB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXkg4oCUIGEgbm9kZVxuICAgICAgLy8gcGF0Y2hlZCBieSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4gcmUtZW50ZXJzIGV4ZWN1dGVOb2RlIGFuZCBtdXN0XG4gICAgICAvLyBjbGFzc2lmeSBhcyBhIHN1YmZsb3cgd2l0aG91dCB0aGUgc2hhcmVkIG5vZGUgZXZlciBiZWluZyBtdXRhdGVkLlxuICAgICAgaWYgKG5vZGUuZGVzY3JpcHRpb24pIGNvbnRleHQuZGVzY3JpcHRpb24gPSBub2RlLmRlc2NyaXB0aW9uO1xuICAgICAgY29uc3QgZWZmU3ViZmxvd0lkID0gdGhpcy5lZmZTdWJmbG93SWQobm9kZSk7XG4gICAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBlZmZTdWJmbG93SWQ7XG5cbiAgICAgIC8vIEFzc2lnbiBydW50aW1lU3RhZ2VJZCBCRUZPUkUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbiDigJQgZW5zdXJlcyBzY29wZSBldmVudHNcbiAgICAgIC8vIChidWZmZXJlZCBieSBydW50aW1lU3RhZ2VJZCkgYW5kIGZsb3cgZXZlbnRzIChmbHVzaGVkIGJ5IHRyYXZlcnNhbENvbnRleHQucnVudGltZVN0YWdlSWQpXG4gICAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUuIE11c3QgaGFwcGVuIGJlZm9yZSBleGVjdXRlU3RhZ2UgQU5EIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0LlxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSsrO1xuICAgICAgY29udGV4dC5ydW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQobm9kZS5pZCwgaWR4KTtcblxuICAgICAgLy8gQnVpbGQgdHJhdmVyc2FsIGNvbnRleHQgZm9yIHJlY29yZGVyIGV2ZW50cyDigJQgY3JlYXRlZCBvbmNlIHBlciBzdGFnZSwgc2hhcmVkIGJ5IGFsbCBldmVudHNcbiAgICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQ6IFRyYXZlcnNhbENvbnRleHQgPSB7XG4gICAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgICBzdGFnZUlkOiBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICBwYXJlbnRTdGFnZUlkOiBjb250ZXh0LnBhcmVudD8uc3RhZ2VJZCxcbiAgICAgICAgc3ViZmxvd0lkOiBjb250ZXh0LnN1YmZsb3dJZCA/PyB0aGlzLnBhcmVudFN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgICAgICBkZXB0aDogdGhpcy5jb21wdXRlQ29udGV4dERlcHRoKGNvbnRleHQpLFxuICAgICAgfTtcblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAgIC8vIEd1YXJkIHVzZXMgdGhlIHBlci10cmF2ZXJzZXIgcmVzb2x2ZWRMYXp5U3ViZmxvd3Mgc2V0IChub3QgdGhlIHNoYXJlZCBub2RlKSBzb1xuICAgICAgLy8gY29uY3VycmVudCB0cmF2ZXJzZXJzIGRvIG5vdCByYWNlIG9uIG5vZGUuc3ViZmxvd1Jlc29sdmVyIG9yIGNsZWFyIGl0IGZvciBlYWNoIG90aGVyLlxuICAgICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IG5vZGUuc3ViZmxvd1Jlc29sdmVyKCk7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMucHJlZml4Tm9kZVRyZWUocmVzb2x2ZWQucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZS5zdWJmbG93SWQhKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgICAgdGhpcy5zdWJmbG93c1tub2RlLnN1YmZsb3dJZCFdID0geyByb290OiBwcmVmaXhlZFJvb3QgfTtcblxuICAgICAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBgJHtub2RlLnN1YmZsb3dJZH0vJHtrZXl9YDtcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQocHJlZml4ZWRLZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgICAgIGlmIChyZXNvbHZlZC5zdWJmbG93cykge1xuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7bm9kZS5zdWJmbG93SWR9LyR7a2V5fWA7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgIG5vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgcmVzb2x2ZWQuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hcmsgYXMgcmVzb2x2ZWQgZm9yIFRISVMgdHJhdmVyc2VyIOKAlCBwZXItdHJhdmVyc2VyIHNldCBwcmV2ZW50cyByZS1lbnRyeVxuICAgICAgICAvLyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgU3RhZ2VOb2RlIGdyYXBoICh3aGljaCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgdHJhdmVyc2VycykuXG4gICAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwOiBDTEFTU0lGWSDigJQgc3ViZmxvdyBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgICAvLyBIYW5kIGhlbHBlcnMgdGhlIEVGRkVDVElWRSBub2RlIHZpZXcgKGJ1aWx0IGZpZWxkcyArIGR5bmFtaWMgcGF0Y2gpXG4gICAgICAgIC8vIHNvIFN1YmZsb3dFeGVjdXRvci9Ob2RlUmVzb2x2ZXIgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuXG4gICAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWROb2RlID0gdGhpcy5ub2RlUmVzb2x2ZXIucmVzb2x2ZVN1YmZsb3dSZWZlcmVuY2UobW91bnROb2RlKTtcblxuICAgICAgICBjb25zdCBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5zdWJmbG93RXhlY3V0b3IuZXhlY3V0ZVN1YmZsb3coXG4gICAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93ID0gcmVzb2x2ZWROb2RlICE9PSBtb3VudE5vZGU7XG4gICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbihtb3VudE5vZGUuY2hpbGRyZW4gJiYgbW91bnROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgICAgLy8g4pSA4pSA4pSAIEJyZWFrLWZsYWcgY2hlY2sgQUZURVIgc3ViZmxvdyByZXR1cm5zIOKUgOKUgOKUgFxuICAgICAgICAvLyBJZiB0aGUgc3ViZmxvdyB3YXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAgYW5kIGJyb2tlXG4gICAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgICAgLy8gU3RvcCB0aGUgb3V0ZXIgdHJhdmVyc2FsIGhlcmUg4oCUIGRvIG5vdCBydW4gdGhlIG5leHQgbGluZWFyIHN0YWdlLlxuICAgICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5uZXh0ICYmIHNob3VsZEV4ZWN1dGVDb250aW51YXRpb24pIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShub2RlLm5leHQsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgICAgY29uc3QgaGFzU3RhZ2VGdW5jdGlvbiA9IEJvb2xlYW4oc3RhZ2VGdW5jKTtcbiAgICAgIGNvbnN0IGlzU2NvcGVCYXNlZERlY2lkZXIgPSBCb29sZWFuKG5vZGUuZGVjaWRlckZuKTtcbiAgICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgICAgY29uc3QgaXNEZWNpZGVyTm9kZSA9IGlzU2NvcGVCYXNlZERlY2lkZXI7XG4gICAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4odGhpcy5lZmZDaGlsZHJlbihub2RlKT8ubGVuZ3RoKTtcbiAgICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgICAgLy8gdGhhdCBwcm9kdWNlZCBpdCAoaGFuZGxlZCB2aWEgdGhlIGBkeW5hbWljTmV4dGAgbG9jYWwgYmVsb3cpLCBzbyB0aGVcbiAgICAgIC8vIGJ1aWx0IGNoYXJ0J3MgbmV4dCBpcyBhbHdheXMgdGhlIGNvcnJlY3QgY29udGludWF0aW9uIGhlcmUuXG4gICAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxOZXh0ID0gbm9kZS5uZXh0O1xuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMTogVkFMSURBVEUg4oCUIG5vZGUgaW52YXJpYW50cyDilIDilIDilIBcbiAgICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBOb2RlICcke25vZGUubmFtZX0nIG11c3QgZGVmaW5lOiBlbWJlZGRlZCBmbiBPUiBhIHN0YWdlTWFwIGVudHJ5IE9SIGhhdmUgY2hpbGRyZW4vZGVjaWRlcmA7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3RvciAmJiAhaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlbGVjdG9yIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgICAgaWYgKCFoYXNTdGFnZUZ1bmN0aW9uKSB7XG4gICAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSBjb250ZXh0LnNldEFzRGVjaWRlcigpO1xuICAgICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnJlYWsgaGFuZGxlciB3aXJlZCB0byB0aGUgc2NvcGUuIENhcHR1cmVzIHRoZSBvcHRpb25hbCByZWFzb25cbiAgICAgIC8vIHBhc3NlZCB2aWEgYHNjb3BlLiRicmVhayhyZWFzb24pYCBhbmQgcGFya3MgaXQgb24gdGhlIGJyZWFrRmxhZyBzb1xuICAgICAgLy8gZG93bnN0cmVhbSBjb2RlIChGbG93UmVjb3JkZXIub25CcmVhaywgc3ViZmxvdyBwcm9wYWdhdGlvbikgY2FuXG4gICAgICAvLyBzdXJmYWNlIGl0LiBBIHNlY29uZCAkYnJlYWsgY2FsbCBpbiB0aGUgc2FtZSBzdGFnZSBrZWVwcyB0aGUgRklSU1RcbiAgICAgIC8vIHJlYXNvbiDigJQgZmlyc3QtYnJlYWstd2lucyDigJQgbWF0Y2hpbmcgdGhlIFwiZXhlY3V0aW9uIHN0b3BwZWRcIiBzdG9yeS5cbiAgICAgIGNvbnN0IGJyZWFrRm4gPSAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChyZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gcmVhc29uO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JSZXN1bHQgPSBhd2FpdCB0aGlzLnNlbGVjdG9ySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGhhc05leHQpIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5vZGUubmV4dCEsIG5leHRDdHgsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgMmI6IERFQ0lERVIg4oCUIHNjb3BlLWJhc2VkIHNpbmdsZS1jaG9pY2UgY29uZGl0aW9uYWwgYnJhbmNoIOKUgOKUgOKUgFxuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIHtcbiAgICAgICAgY29uc3QgZGVjaWRlclJlc3VsdCA9IGF3YWl0IHRoaXMuZGVjaWRlckhhbmRsZXIuaGFuZGxlU2NvcGVCYXNlZChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFmdGVyIGJyYW5jaCBleGVjdXRpb24sIGZvbGxvdyBkZWNpZGVyJ3Mgb3duIG5leHQgKGUuZy4sIGxvb3BUbyB0YXJnZXQpXG4gICAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG4gICAgICAgICAgLy8gVXNlIHRoZSBpc0xvb3BSZWYgZmxhZyBzZXQgYnkgbG9vcFRvKCkg4oCUIGRvIG5vdCByZWx5IG9uIHN0YWdlTWFwIGFic2VuY2UsXG4gICAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgICAgY29uc3QgaXNMb29wUmVmID1cbiAgICAgICAgICAgIG5leHROb2RlLmlzTG9vcFJlZiA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgKCF0aGlzLmdldFN0YWdlRm4obmV4dE5vZGUpICYmXG4gICAgICAgICAgICAgICF0aGlzLmVmZkNoaWxkcmVuKG5leHROb2RlKT8ubGVuZ3RoICYmXG4gICAgICAgICAgICAgICFuZXh0Tm9kZS5kZWNpZGVyRm4gJiZcbiAgICAgICAgICAgICAgIW5leHROb2RlLnNlbGVjdG9yRm4gJiZcbiAgICAgICAgICAgICAgIXRoaXMuZWZmSXNTdWJmbG93Um9vdChuZXh0Tm9kZSkpO1xuXG4gICAgICAgICAgaWYgKGlzTG9vcFJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZShcbiAgICAgICAgICAgICAgbmV4dE5vZGUsXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5leHROb2RlLCBuZXh0Q3R4LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBBYm9ydCBjaGVjayDigJQgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uIOKUgOKUgOKUgFxuICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgICAgdGhpcy5zaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyB0aGlzLnNpZ25hbC5yZWFzb24gOiBuZXcgRXJyb3IodGhpcy5zaWduYWwucmVhc29uID8/ICdBYm9ydGVkJyk7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDM6IEVYRUNVVEUg4oCUIHJ1biBzdGFnZSBmdW5jdGlvbiDilIDilIDilIBcbiAgICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBkeW5hbWljTmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChzdGFnZUZ1bmMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShub2RlLm5hbWUsIG5vZGUuaWQsIGVycm9yLnBhdXNlRGF0YSwgZXJyb3Iuc3ViZmxvd1BhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIGVycm9yLnRvU3RyaW5nKCksIGVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgICAgY29udGV4dC5hZGRFcnJvcignc3RhZ2VFeGVjdXRpb25FcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCB0aGUgb3B0aW9uYWwgcmVhc29uIGNhcHR1cmVkIG9uIGJyZWFrRmxhZyDigJQgc2V0IGJ5IHRoZVxuICAgICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAgICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDQ6IERZTkFNSUMg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uIOKUgOKUgOKUgFxuICAgICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBpc1N0YWdlTm9kZVJldHVybihzdGFnZU91dHB1dCkpIHtcbiAgICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdpc0R5bmFtaWMnLCB0cnVlKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgICAvLyBEeW5hbWljIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24uIFRoZSBzdWJmbG93IG1ldGEgbGFuZHMgaW4gdGhlXG4gICAgICAgICAgLy8gdHJhdmVyc2VyLWxvY2FsIG92ZXJsYXkgKE5PVCBvbiB0aGUgc2hhcmVkIG5vZGUpOyB0aGUgaW1tZWRpYXRlXG4gICAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgICAvLyBjbGFzc2lmaWVzIHRoZSBub2RlIGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5pc1N1YmZsb3dSb290ICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYgJiYgZHluYW1pY05vZGUuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljU3ViZmxvd0lkJywgZHluYW1pY05vZGUuc3ViZmxvd0lkKTtcblxuICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGR5bmFtaWNOb2RlLnN1YmZsb3dJZCwgZHluYW1pY05vZGUuc3ViZmxvd0RlZiwgbm9kZS5pZCk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgICAgICAgc3ViZmxvd0lkOiBkeW5hbWljTm9kZS5zdWJmbG93SWQsXG4gICAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgc3ViZmxvd01vdW50T3B0aW9uczogZHluYW1pY05vZGUuc3ViZmxvd01vdW50T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5vZGUsIGNvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgY2hpbGRyZW4gZm9yIHN1YmZsb3dEZWZcbiAgICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgY2hpbGQuc3ViZmxvd0RlZiAmJiBjaGlsZC5zdWJmbG93SWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoY2hpbGQuc3ViZmxvd0lkLCBjaGlsZC5zdWJmbG93RGVmLCBjaGlsZC5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgICAgY2hpbGQuaWQsXG4gICAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93SWQhLFxuICAgICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgICAvLyBQaGFzZSA1IGJlbG93IHJlYWRzIHRoZW0gYmFjayB0aHJvdWdoIGVmZkNoaWxkcmVuL2VmZlNlbGVjdG9yLlxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbiAmJiBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljQ2hpbGRDb3VudCcsIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZyhcbiAgICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5kZWNpZGVyRm4pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5uZXh0Tm9kZVNlbGVjdG9yID0gZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgY29udGV4dC5hZGRMb2coJ2hhc1NlbGVjdG9yJywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRHluYW1pYyBuZXh0IChsaW5lYXIgY29udGludWF0aW9uKSDigJQgc3RheXMgYSBMT0NBTDogaXQgYXBwbGllc1xuICAgICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgICAvLyBDb250aW51YXRpb25SZXNvbHZlciksIHNvIHRoZSBzaGFyZWQgbm9kZSdzIG5leHQgaXMgbmV2ZXIgdG91Y2hlZFxuICAgICAgICAgIC8vIGFuZCBhIGxvb3AgcmV2aXNpdCBuYXR1cmFsbHkgc2VlcyB0aGUgYnVpbHQgY29udGludWF0aW9uLlxuICAgICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgICBkeW5hbWljTmV4dCA9IGR5bmFtaWNOb2RlLm5leHQ7XG4gICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY05leHQobm9kZS5pZCwgZHluYW1pY05vZGUubmV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGFnZU91dHB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNTogQ0hJTERSRU4g4oCUIGZvcmsgZGlzcGF0Y2gg4pSA4pSA4pSAXG4gICAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAgIC8vIGNoaWxkcmVuL3NlbGVjdG9yIGZvciBUSElTIHZpc2l0IChvciBhbiBlYXJsaWVyIHZpc2l0IGluIHRoaXMgcnVuKS5cbiAgICAgIGNvbnN0IGNoaWxkcmVuQWZ0ZXJTdGFnZSA9IHRoaXMuZWZmQ2hpbGRyZW4obm9kZSk7XG4gICAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgICAgaWYgKGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSkge1xuICAgICAgICBjb250ZXh0LmFkZExvZygndG90YWxDaGlsZHJlbicsIGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgICAgbGV0IG5vZGVDaGlsZHJlblJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPjtcblxuICAgICAgICBjb25zdCBlZmZTZWxlY3RvckZuID0gdGhpcy5lZmZTZWxlY3Rvcihub2RlKTtcbiAgICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVTZWxlY3RlZENoaWxkcmVuKFxuICAgICAgICAgICAgZWZmU2VsZWN0b3JGbixcbiAgICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgICBzdGFnZU91dHB1dCxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgICBub2RlLmZhaWxGYXN0LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY2hpbGRDb3VudCA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoID8/IDA7XG4gICAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdjaGlsZHJlbicsIGBFeGVjdXRpbmcgYWxsICR7Y2hpbGRDb3VudH0gY2hpbGRyZW4gaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gLCB7XG4gICAgICAgICAgICBjb3VudDogY2hpbGRDb3VudCxcbiAgICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIGVmZk5vZGU6IENoaWxkcmVuRXhlY3V0b3IgcmVhZHMgbm9kZS5jaGlsZHJlbi9ub2RlLmZhaWxGYXN0IGl0c2VsZi5cbiAgICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgICB0aGlzLmVmZk5vZGUobm9kZSksXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmstb25seTogcmV0dXJuIGJ1bmRsZVxuICAgICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGVDaGlsZHJlblJlc3VsdHMhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgICAgY29uc3QgaXNEeW5hbWljID0gY29udGV4dC5kZWJ1Zz8ubG9nQ29udGV4dD8uaXNEeW5hbWljO1xuICAgICAgICBpZiAoaXNEeW5hbWljICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChub2RlLCBjaGlsZHJlbkFmdGVyU3RhZ2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA2OiBDT05USU5VRSDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQg4pSA4pSA4pSAXG4gICAgICBpZiAoZHluYW1pY05leHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZShcbiAgICAgICAgICBkeW5hbWljTmV4dCxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGxvb3AgcmVmZXJlbmNlIG5vZGVzIGNyZWF0ZWQgYnkgbG9vcFRvKCkg4oCUIG1hcmtlZCB3aXRoIGlzTG9vcFJlZiBmbGFnLlxuICAgICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAgIC8vIHRyYWNraW5nLCBhbmQgbmFycmF0aXZlIGdlbmVyYXRpb24uXG4gICAgICAgIGNvbnN0IGlzTG9vcFJlZmVyZW5jZSA9IG5leHROb2RlLmlzTG9vcFJlZjtcblxuICAgICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZShcbiAgICAgICAgICAgIG5leHROb2RlLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ25leHQnLCBgTW92aW5nIHRvICR7bmV4dE5vZGUubmFtZX0gc3RhZ2VgLCB7XG4gICAgICAgICAgdGFyZ2V0U3RhZ2U6IG5leHROb2RlLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKG5leHROb2RlLCBuZXh0Q3R4LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9leGVjdXRlRGVwdGgtLTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHJpdmF0ZSBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZHJlbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudFN0YWdlSWQgPSBjb250ZXh0LmdldFN0YWdlSWQoKTtcblxuICAgIGNvbnN0IGNoaWxkU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgICBpZDogYCR7bm9kZS5pZH0tY2hpbGRyZW5gLFxuICAgICAgbmFtZTogJ0R5bmFtaWMgQ2hpbGRyZW4nLFxuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLm1hcCgoYykgPT4gKHtcbiAgICAgICAgaWQ6IGMuaWQsXG4gICAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2hpbGRTdGFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdHggb2YgY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGNoaWxkQ3R4LmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU3RhZ2VzW3NuYXBzaG90Lm5hbWUgfHwgc25hcHNob3QuaWRdID0ge1xuICAgICAgICAgIG5hbWU6IHNuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgb3V0cHV0OiBzbmFwc2hvdC5sb2dzLFxuICAgICAgICAgIGVycm9yczogc25hcHNob3QuZXJyb3JzLFxuICAgICAgICAgIG1ldHJpY3M6IHNuYXBzaG90Lm1ldHJpY3MsXG4gICAgICAgICAgc3RhdHVzOiBzbmFwc2hvdC5lcnJvcnMgJiYgT2JqZWN0LmtleXMoc25hcHNob3QuZXJyb3JzKS5sZW5ndGggPiAwID8gJ2Vycm9yJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLnNldChub2RlLmlkLCB7XG4gICAgICBzdWJmbG93SWQ6IG5vZGUuaWQsXG4gICAgICBzdWJmbG93TmFtZTogbm9kZS5uYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDoge30sXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IGNoaWxkU3RhZ2VzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IFtdLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQsXG4gICAgICBwaXBlbGluZVN0cnVjdHVyZTogY2hpbGRTdHJ1Y3R1cmUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVDb250ZXh0RGVwdGgoY29udGV4dDogU3RhZ2VDb250ZXh0KTogbnVtYmVyIHtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBjdXJyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBkZXB0aDtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICghbm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgY29uc3QgY2xvbmU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgY2xvbmUubmFtZSA9IGAke3ByZWZpeH0vJHtub2RlLm5hbWV9YDtcbiAgICBjbG9uZS5pZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5pZH1gO1xuICAgIGlmIChjbG9uZS5zdWJmbG93SWQpIGNsb25lLnN1YmZsb3dJZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5zdWJmbG93SWR9YDtcbiAgICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHRoaXMucHJlZml4Tm9kZVRyZWUoY2xvbmUubmV4dCwgcHJlZml4KTtcbiAgICBpZiAoY2xvbmUuY2hpbGRyZW4pIHtcbiAgICAgIGNsb25lLmNoaWxkcmVuID0gY2xvbmUuY2hpbGRyZW4ubWFwKChjKSA9PiB0aGlzLnByZWZpeE5vZGVUcmVlKGMsIHByZWZpeCkpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBwcml2YXRlIGF1dG9SZWdpc3RlclN1YmZsb3dEZWYoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd0RlZjogTm9uTnVsbGFibGU8U3RhZ2VOb2RlWydzdWJmbG93RGVmJ10+LFxuICAgIG1vdW50Tm9kZUlkPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICAvLyB0aGlzLnN1YmZsb3dzIGlzIGFsd2F5cyBpbml0aWFsaXplZCBpbiB0aGUgY29uc3RydWN0b3I7IHRoZSBudWxsIGd1YXJkIGJlbG93IGlzIHVucmVhY2hhYmxlLlxuICAgIGNvbnN0IHN1YmZsb3dzRGljdCA9IHRoaXMuc3ViZmxvd3M7XG5cbiAgICAvLyBGaXJzdC13cml0ZS13aW5zXG4gICAgY29uc3QgaXNOZXdSZWdpc3RyYXRpb24gPSAhc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF07XG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uICYmIHN1YmZsb3dEZWYucm9vdCkge1xuICAgICAgc3ViZmxvd3NEaWN0W3N1YmZsb3dJZF0gPSB7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dEZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICAgICAgLi4uKHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlID8geyBidWlsZFRpbWVTdHJ1Y3R1cmU6IHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlIH0gOiB7fSksXG4gICAgICB9IGFzIGFueTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzIChwYXJlbnQgZW50cmllcyBwcmVzZXJ2ZWQpXG4gICAgaWYgKHN1YmZsb3dEZWYuc3RhZ2VNYXApIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIEFycmF5LmZyb20oc3ViZmxvd0RlZi5zdGFnZU1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KGtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgIGlmIChzdWJmbG93RGVmLnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd0RlZi5zdWJmbG93cykpIHtcbiAgICAgICAgaWYgKCFzdWJmbG93c0RpY3Rba2V5XSkge1xuICAgICAgICAgIHN1YmZsb3dzRGljdFtrZXldID0gZGVmIGFzIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb3VudE5vZGVJZCkge1xuICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICBtb3VudE5vZGVJZCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSBGbG93UmVjb3JkZXJzIG9ubHkgb24gZmlyc3QgcmVnaXN0cmF0aW9uIChtYXRjaGVzIGZpcnN0LXdyaXRlLXdpbnMpXG4gICAgaWYgKGlzTmV3UmVnaXN0cmF0aW9uKSB7XG4gICAgICBjb25zdCBzdWJmbG93TmFtZSA9IHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lIHx8IHN1YmZsb3dJZDtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd1JlZ2lzdGVyZWQoXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uZGVzY3JpcHRpb24sXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==