@cqa-lib/cqa-ui 1.1.396 → 1.1.398

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.
@@ -54,6 +54,26 @@ export class StepRendererComponent {
54
54
  return this.getDebugPointSetHandler(this.step);
55
55
  return false;
56
56
  }
57
+ /**
58
+ * Safely trigger change detection on a child component.
59
+ * Calls detectChanges() only if the child's ngOnInit has already run (i.e. config is built).
60
+ * Before initialization, falls back to markForCheck() which queues CD for the next cycle
61
+ * without forcing immediate template evaluation.
62
+ */
63
+ safeDetectChanges(componentRef) {
64
+ if (!componentRef?.injector)
65
+ return;
66
+ const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
67
+ if (!instanceCdr)
68
+ return;
69
+ if (StepRendererComponent.componentInitialized.get(this.container)) {
70
+ instanceCdr.markForCheck();
71
+ instanceCdr.detectChanges();
72
+ }
73
+ else {
74
+ instanceCdr.markForCheck();
75
+ }
76
+ }
57
77
  ngOnChanges(changes) {
58
78
  if (!this.container || !this.step)
59
79
  return;
@@ -79,13 +99,7 @@ export class StepRendererComponent {
79
99
  // Try to update selectedIteration if iterations are available
80
100
  this.updateLoopStepSelectedIteration(instance, currentValue);
81
101
  // Trigger change detection on the loop-step component
82
- if (componentRef.injector) {
83
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
84
- if (instanceCdr) {
85
- instanceCdr.markForCheck();
86
- instanceCdr.detectChanges();
87
- }
88
- }
102
+ this.safeDetectChanges(componentRef);
89
103
  }
90
104
  }
91
105
  }
@@ -103,13 +117,7 @@ export class StepRendererComponent {
103
117
  instance.config.stepNumber = currentValue;
104
118
  }
105
119
  // Trigger change detection on the component instance
106
- if (componentRef.injector) {
107
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
108
- if (instanceCdr) {
109
- instanceCdr.markForCheck();
110
- instanceCdr.detectChanges();
111
- }
112
- }
120
+ this.safeDetectChanges(componentRef);
113
121
  }
114
122
  }
115
123
  }
@@ -135,13 +143,7 @@ export class StepRendererComponent {
135
143
  }
136
144
  }
137
145
  // Trigger change detection on the component instance
138
- if (componentRef.injector) {
139
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
140
- if (instanceCdr) {
141
- instanceCdr.markForCheck();
142
- instanceCdr.detectChanges();
143
- }
144
- }
146
+ this.safeDetectChanges(componentRef);
145
147
  }
146
148
  }
147
149
  // If downloadingStepId changed, update file-download instance isDownloading
@@ -151,13 +153,7 @@ export class StepRendererComponent {
151
153
  if (instance && componentRef && this.getEffectiveStepType(currentStep) === 'file-download') {
152
154
  const tid = currentStep.testStepResultId;
153
155
  instance.isDownloading = !!tid && this.downloadingStepId === tid;
154
- if (componentRef.injector) {
155
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
156
- if (instanceCdr) {
157
- instanceCdr.markForCheck();
158
- instanceCdr.detectChanges();
159
- }
160
- }
156
+ this.safeDetectChanges(componentRef);
161
157
  }
162
158
  }
163
159
  // If isDebug, debugPointSet or getDebugPointSetHandler changed (e.g. user toggled debug in portal/Storybook), update nested instance
@@ -235,13 +231,7 @@ export class StepRendererComponent {
235
231
  subscribedEvents.add('stepMoreOptionSelect');
236
232
  }
237
233
  }
238
- if (componentRef.injector) {
239
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
240
- if (instanceCdr) {
241
- instanceCdr.markForCheck();
242
- instanceCdr.detectChanges();
243
- }
244
- }
234
+ this.safeDetectChanges(componentRef);
245
235
  }
246
236
  }
247
237
  // Get step identifiers (use effective type: generateDocument -> file-download)
@@ -502,8 +492,6 @@ export class StepRendererComponent {
502
492
  if (currentStep.displayType === 'condition' && currentStep.nestedSteps !== undefined) {
503
493
  const currentNestedSteps = currentStep.nestedSteps || [];
504
494
  const previousNestedSteps = previousStep.nestedSteps || [];
505
- console.log('🔄 step-renderer: currentNestedSteps', currentNestedSteps);
506
- console.log('🔄 step-renderer: previousNestedSteps', previousNestedSteps);
507
495
  // Use deep comparison to detect content changes, not just reference changes
508
496
  // This is critical when switching between IF and ELSE_IF branches
509
497
  if (this.hasNestedStepsChanged(currentNestedSteps, previousNestedSteps)) {
@@ -513,11 +501,6 @@ export class StepRendererComponent {
513
501
  instance.config.nestedSteps = [...currentNestedSteps];
514
502
  }
515
503
  hasChanges = true;
516
- console.log('🔄 step-renderer: nestedSteps updated for condition-step', {
517
- stepId: currentStep.id,
518
- previousCount: previousNestedSteps.length,
519
- currentCount: currentNestedSteps.length
520
- });
521
504
  }
522
505
  }
523
506
  // Special handling for file-download (including generateDocument): sync from generateDocumentResult
@@ -641,19 +624,7 @@ export class StepRendererComponent {
641
624
  // Trigger change detection on the component instance if there were changes
642
625
  // This ensures only the nested step updates without affecting parent steps
643
626
  if (hasChanges) {
644
- if (componentRef.injector) {
645
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
646
- if (instanceCdr) {
647
- instanceCdr.markForCheck();
648
- instanceCdr.detectChanges();
649
- }
650
- }
651
- else if (instance.cdr) {
652
- instance.cdr.detectChanges();
653
- }
654
- else if (instance.changeDetectorRef) {
655
- instance.changeDetectorRef.detectChanges();
656
- }
627
+ this.safeDetectChanges(componentRef);
657
628
  // Don't call markForCheck on this component to avoid triggering parent re-renders
658
629
  }
659
630
  }
@@ -822,6 +793,7 @@ export class StepRendererComponent {
822
793
  }
823
794
  StepRendererComponent.componentInstances.delete(this.container);
824
795
  StepRendererComponent.componentRefs.delete(this.container);
796
+ StepRendererComponent.componentInitialized.delete(this.container);
825
797
  this.lastStepId = currentStepId;
826
798
  this.lastStepType = currentStepType;
827
799
  }
@@ -1025,7 +997,6 @@ export class StepRendererComponent {
1025
997
  }
1026
998
  // Special handling for loop-step: initialize iterations if not present
1027
999
  if (this.isLoopStep(this.step) && !instance.iterations) {
1028
- console.log(" changes['selectedIterationId'] step", this.selectedIterationId, instance.iterations);
1029
1000
  // Use handler if available, otherwise try to initialize from step.executedResult.stepResult
1030
1001
  if (this.getLoopIterationsHandler) {
1031
1002
  instance.iterations = this.getLoopIterationsHandler(this.step);
@@ -1066,7 +1037,6 @@ export class StepRendererComponent {
1066
1037
  }
1067
1038
  // Special handling for loop-step: set defaultIteration and selectedIterationId
1068
1039
  if (this.isLoopStep(this.step)) {
1069
- console.log(" changes['selectedIterationId'] step 2", this.selectedIterationId, instance.iterations);
1070
1040
  // Set defaultIteration to 'last' if not already set
1071
1041
  if (!instance.defaultIteration) {
1072
1042
  instance.defaultIteration = 'last';
@@ -1479,9 +1449,11 @@ export class StepRendererComponent {
1479
1449
  instanceCdr.markForCheck();
1480
1450
  }
1481
1451
  }
1482
- // Emit ready event after component is created and initialized
1483
- // Use setTimeout to ensure the component is fully rendered
1452
+ // Mark component as initialized after the next CD cycle completes.
1453
+ // By then, the child's ngOnInit will have run and config is built.
1454
+ // After this, safeDetectChanges() will use detectChanges() for immediate updates.
1484
1455
  setTimeout(() => {
1456
+ StepRendererComponent.componentInitialized.set(this.container, true);
1485
1457
  this.componentReady.emit();
1486
1458
  }, 0);
1487
1459
  }
@@ -1544,13 +1516,7 @@ export class StepRendererComponent {
1544
1516
  // Update the step object's expanded property to keep it in sync
1545
1517
  this.step.expanded = currentExpanded;
1546
1518
  // Trigger change detection
1547
- if (componentRef.injector) {
1548
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
1549
- if (instanceCdr) {
1550
- instanceCdr.markForCheck();
1551
- instanceCdr.detectChanges();
1552
- }
1553
- }
1519
+ this.safeDetectChanges(componentRef);
1554
1520
  }
1555
1521
  // Check if iterations are now available and we need to update selectedIteration
1556
1522
  if (this.isLoopStep(this.step) && this.selectedIterationId) {
@@ -1562,13 +1528,7 @@ export class StepRendererComponent {
1562
1528
  const shouldBeSelected = iterations.find((iter) => iter.id === selectedIterationId);
1563
1529
  if (shouldBeSelected && currentSelectedIteration?.id !== selectedIterationId) {
1564
1530
  this.updateLoopStepSelectedIteration(instance, selectedIterationId);
1565
- if (componentRef.injector) {
1566
- const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
1567
- if (instanceCdr) {
1568
- instanceCdr.markForCheck();
1569
- instanceCdr.detectChanges();
1570
- }
1571
- }
1531
+ this.safeDetectChanges(componentRef);
1572
1532
  }
1573
1533
  }
1574
1534
  }
@@ -1613,6 +1573,10 @@ export class StepRendererComponent {
1613
1573
  StepRendererComponent.componentInstances = new WeakMap();
1614
1574
  StepRendererComponent.componentRefs = new WeakMap();
1615
1575
  StepRendererComponent.subscribedEventEmitters = new WeakMap(); // Track which EventEmitters have been subscribed to
1576
+ // Track whether child component's ngOnInit has run (config is built).
1577
+ // detectChanges() must NOT be called before initialization — it forces template
1578
+ // evaluation which crashes on undefined config properties.
1579
+ StepRendererComponent.componentInitialized = new WeakMap();
1616
1580
  StepRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, deps: [{ token: STEP_COMPONENT_MAP }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1617
1581
  StepRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepRendererComponent, selector: "cqa-step-renderer", inputs: { step: "step", onExpandHandler: "onExpandHandler", getConditionBranchesHandler: "getConditionBranchesHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selectedIterationId: "selectedIterationId", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", isLive: "isLive", isDebug: "isDebug", debugPointSet: "debugPointSet", getDebugPointSetHandler: "getDebugPointSetHandler", onDebugPointChangeHandler: "onDebugPointChangeHandler", onEditStepHandler: "onEditStepHandler", addStepMenuOptions: "addStepMenuOptions", onAddStepOptionSelectHandler: "onAddStepOptionSelectHandler", stepMoreMenuOptions: "stepMoreMenuOptions", onStepMoreOptionSelectHandler: "onStepMoreOptionSelectHandler", getAddStepMenuOptionsForNested: "getAddStepMenuOptionsForNested", getStepMoreMenuOptionsForNested: "getStepMoreMenuOptionsForNested", stepNumber: "stepNumber", parentSkipped: "parentSkipped" }, outputs: { addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", addStepInsideLoop: "addStepInsideLoop", componentReady: "componentReady" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<ng-container #container></ng-container>', isInline: true });
1618
1582
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, decorators: [{
@@ -1722,4 +1686,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1722
1686
  }], componentReady: [{
1723
1687
  type: Output
1724
1688
  }] } });
1725
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbk4sT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBK0ZoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXBFdkIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUV4QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFlBQU8sR0FBYSxLQUFLLENBQUM7UUFvQm5DLDRGQUE0RjtRQUNuRixrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUN6QyxtR0FBbUc7UUFDekYsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQTZELENBQUM7UUFDOUcsaUhBQWlIO1FBQ3ZHLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUE4RCxDQUFDO1FBQ2hILG9IQUFvSDtRQUMxRyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQyxDQUFDLDBDQUEwQztRQThCdkYsZUFBVSxHQUEyQixJQUFJLENBQUM7UUFDMUMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBQzdCLDRCQUF1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QUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFFRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBRUcsK0JBQStCO3NCQUF2QyxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBBZnRlclZpZXdJbml0LCBEb0NoZWNrLCBJbmplY3QsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnRSZWYsIFNpbXBsZUNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXhlY3V0aW9uU3RlcENvbmZpZywgQWRkU3RlcE1lbnVPcHRpb24sIFN0ZXBNb3JlTWVudU9wdGlvbiB9IGZyb20gJy4uL2V4ZWN1dGlvbi1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX0NPTVBPTkVOVF9NQVAgfSBmcm9tICcuLi9zdGVwLXJlZ2lzdHJ5LnRva2VuJztcblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBhcHByb3ByaWF0ZSBzdGVwIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgc3RlcCB0eXBlLlxuICogVXNlcyBkeW5hbWljIGNvbXBvbmVudCBsb2FkaW5nIGFuZCBhbiBpbmplY3Rpb24gdG9rZW4gdG8gYnJlYWsgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gKiBiZXR3ZWVuIHN0ZXAgY29tcG9uZW50cyBpbiBBbmd1bGFyIEl2eSBwYXJ0aWFsIGNvbXBpbGF0aW9uIG1vZGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLXJlbmRlcmVyJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+J1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwUmVuZGVyZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIERvQ2hlY2sge1xuICBASW5wdXQoKSBzdGVwITogRXhlY3V0aW9uU3RlcENvbmZpZztcbiAgQElucHV0KCkgb25FeHBhbmRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGlzU3RlcExvYWRpbmdIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzU3RlcEV4cGFuZGVkSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyPzogKGR1cmF0aW9uOiBudW1iZXIpID0+IG51bWJlcjtcbiAgQElucHV0KCkgZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQW5hbHl6ZUhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblZpZXdGdWxsTG9nc0hhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblNlbGZIZWFsQWN0aW9uSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyPzogKCkgPT4geyBpc0xvYWRpbmdBY2NlcHQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9OyBpc0xvYWRpbmdNb2RpZnlBY2NlcHQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IH07XG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmU/OiBhbnk7XG4gIEBJbnB1dCgpIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogYW55O1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBmb3JtYXRBY3Rpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/OiAoc3RlcDogYW55LCBicmFuY2g6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcsIGV2ZW50PzogRXZlbnQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiAncmVxdWVzdEJvZHknIHwgJ3Jlc3BvbnNlQm9keScgfCAncmVxdWVzdEhlYWRlcnMnIHwgJ3Jlc3BvbnNlSGVhZGVycycgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Eb3dubG9hZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZU5hbWU6IHN0cmluZzsgZmlsZVBhdGg/OiBzdHJpbmc7IGZpbGVUeXBlOiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkZpbGVQYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBmaWxlUGF0aDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25UZXh0Q29waWVkSGFuZGxlcj86IChldmVudDogeyB0ZXh0OiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBqdW1wVG9UaW1lc3RhbXBIYW5kbGVyPzogKHRpbWVzdGFtcDogbnVtYmVyLCB0ZXN0U3RlcElkPzogbnVtYmVyIHwgc3RyaW5nKSA9PiB2b2lkO1xuICBASW5wdXQoKSBkb3dubG9hZGluZ1N0ZXBJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuICBASW5wdXQoKSBpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNEZWJ1Zz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFdoZW4gc2V0LCB1c2VkIGRpcmVjdGx5IGZvciB0aGUgcmVuZGVyZWQgc3RlcCdzIGRlYnVnUG9pbnRTZXQgc28gdGhlIGljb24gc3RhdGUgcHJvcGFnYXRlcyB3aGVuIHRvZ2dsZWQgKGUuZy4gaW4gU3Rvcnlib29rKS4gKi9cbiAgQElucHV0KCkgZGVidWdQb2ludFNldD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGdldERlYnVnUG9pbnRTZXRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIG9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgdmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIEVkaXQgaWNvbiBvbiBhIHN0ZXAgKHdoZW4gaXNEZWJ1ZyBpcyB0cnVlKS4gUmVjZWl2ZXMgdGhlIHN0ZXAgY29uZmlnIHNvIHRoZSBwYXJlbnQgY2FuIG9wZW4gYW4gZWRpdG9yLiAqL1xuICBASW5wdXQoKSBvbkVkaXRTdGVwSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogQWRkLXN0ZXAgbWVudSBvcHRpb25zIChlLmcuIFwiQWRkIGJlZm9yZVwiLCBcIkFkZCBhZnRlclwiKS4gV2hlbiBzZXQsIHBhc3NlZCB0byBhbGwgcmVuZGVyZWQgc3RlcHM7IHdoZW4gdW5zZXQsIHN0ZXBzIHVzZSB0aGVpciBkZWZhdWx0LiBNYW5hZ2VkIGxpa2UgaHR0cE1ldGhvZE9wdGlvbnMgaW4gdGhlIEFQSSBlZGl0IHNlY3Rpb24uICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBNZW51T3B0aW9ucz86IEFkZFN0ZXBNZW51T3B0aW9uW107XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBQbHVzIG1lbnUuIFJlY2VpdmVzIHRoZSBvcHRpb24gYW5kIHRoZSBzdGVwIGNvbmZpZy4gKi9cbiAgQElucHV0KCkgb25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgLyoqIE1vcmUgb3B0aW9ucyAodGhyZWUtZG90KSBtZW51IG9wdGlvbnMuIFdoZW4gc2V0LCBwYXNzZWQgdG8gYWxsIHJlbmRlcmVkIHN0ZXBzLiAqL1xuICBASW5wdXQoKSBzdGVwTW9yZU1lbnVPcHRpb25zPzogU3RlcE1vcmVNZW51T3B0aW9uW107XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBNb3JlIG9wdGlvbnMgKHRocmVlLWRvdCkgbWVudS4gUmVjZWl2ZXMgdGhlIG9wdGlvbiBhbmQgdGhlIHN0ZXAgY29uZmlnLiAqL1xuICBASW5wdXQoKSBvblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbiwgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwYXNzZWQgdG8gbG9vcC9jb25kaXRpb24gc3RlcHMgc28gdGhleSBjYW4gc3VwcGx5IHBlci1zdGVwIG1lbnUgb3B0aW9ucyB0byB0aGVpciBuZXN0ZWQgc3RlcC1yZW5kZXJlcnMgKHN1cHBvcnRzIGFyYml0cmFyeSBuZXN0aW5nKS4gKi9cbiAgQElucHV0KCkgZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IEFkZFN0ZXBNZW51T3B0aW9uW107XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwYXNzZWQgdG8gbG9vcC9jb25kaXRpb24gc3RlcHMgc28gdGhleSBjYW4gc3VwcGx5IHBlci1zdGVwIG1lbnUgb3B0aW9ucyB0byB0aGVpciBuZXN0ZWQgc3RlcC1yZW5kZXJlcnMgKHN1cHBvcnRzIGFyYml0cmFyeSBuZXN0aW5nKS4gKi9cbiAgQElucHV0KCkgZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZD86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBTdGVwTW9yZU1lbnVPcHRpb25bXTtcbiAgQElucHV0KCkgc3RlcE51bWJlcj86IHN0cmluZztcbiAgLyoqIFdoZW4gdHJ1ZSwgdGhlIHBhcmVudCBzdGVwIGlzIHNraXBwZWQg4oCUIGJyZWFrcG9pbnRzIG9uIGFsbCBuZXN0ZWQgc3RlcHMgYXJlIGRpc2FibGVkLiAqL1xuICBASW5wdXQoKSBwYXJlbnRTa2lwcGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIEFkZCAocGx1cykgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHsgb3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbjsgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBNb3JlIG9wdGlvbnMgKHRocmVlLWRvdCkgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIHN0ZXBNb3JlT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uOyBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZyB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFwiKyBBZGQgc3RlcCBpbnNpZGUgbG9vcFwiIG9uIGEgKHBvc3NpYmx5IG5lc3RlZCkgbG9vcCBzdGVwLiBQYXlsb2FkIGlzIHRoZSBsb29wIHN0ZXAuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwSW5zaWRlTG9vcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY29tcG9uZW50UmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBjb21wb25lbnQgaXMgbG9hZGVkIGFuZCByZWFkeVxuXG4gIC8qKiBFZmZlY3RpdmUgdHlwZSBmb3IgY29tcG9uZW50IGxvb2t1cDogJ2ZpbGUtZG93bmxvYWQnIHdoZW4gdGVzdFN0ZXBUeXBlID09PSAnZ2VuZXJhdGVEb2N1bWVudCcsICdsb29wJyBmb3IgRk9SX0xPT1AvV0hJTEVfTE9PUC4gKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVTdGVwVHlwZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdCA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgIGNvbnN0IHR5cGUgPSAoc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlIHx8IHQgfHwgJyc7XG4gICAgaWYgKHQgPT09ICdnZW5lcmF0ZURvY3VtZW50JykgcmV0dXJuICdmaWxlLWRvd25sb2FkJztcbiAgICBpZiAodHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCB0eXBlID09PSAnV0hJTEVfTE9PUCcpIHJldHVybiAnbG9vcCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc3RlcCBpcyBhIGxvb3Agc3RlcCAoZm9yLCB3aGlsZSwgb3IgZ2VuZXJpYyBsb29wKS4gKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IChzdGVwIGFzIGFueSkuZGlzcGxheVR5cGUgfHwgKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgJyc7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdsb29wJyB8fCB0eXBlID09PSAnRk9SX0xPT1AnIHx8IHR5cGUgPT09ICdXSElMRV9MT09QJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGVmZmVjdGl2ZSBkZWJ1Z1BvaW50U2V0IHNvIGl0IHByb3BhZ2F0ZXMgd2hlbiB0b2dnbGVkIChlLmcuIFN0b3J5Ym9vayBDb250cm9scykuICovXG4gIHByaXZhdGUgZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWJ1Z1BvaW50U2V0ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmRlYnVnUG9pbnRTZXQ7XG4gICAgaWYgKHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgJiYgdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcih0aGlzLnN0ZXApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMgPSBuZXcgV2Vha01hcDxhbnksIFNldDxzdHJpbmc+PigpOyAvLyBUcmFjayB3aGljaCBFdmVudEVtaXR0ZXJzIGhhdmUgYmVlbiBzdWJzY3JpYmVkIHRvXG4gIHByaXZhdGUgbGFzdFN0ZXBJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFN0ZXBUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1N0ZXBLZXk6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9sYXN0RGVidWdQb2ludERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0NPTVBPTkVOVF9NQVApIHByaXZhdGUgY29tcG9uZW50TWFwOiBNYXA8c3RyaW5nLCBUeXBlPGFueT4+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY2hhbmdlc1snc3RlcCddPy5jdXJyZW50VmFsdWUgfHwgdGhpcy5zdGVwO1xuICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8ucHJldmlvdXNWYWx1ZTtcblxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQgY2hhbmdlZCAoZm9yIGxvb3Agc3RlcHMpXG4gICAgLy8gJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50c3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2xvb3AnICYmIFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIubGVuZ3RoID4gMDtcblxuICAgIC8vIElmIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlZCBmb3IgYSBsb29wIHN0ZXAsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gJiYgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbklkIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcblxuICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgbG9vcC1zdGVwIGNvbXBvbmVudFxuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBzdGVwTnVtYmVyIGlucHV0IGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydzdGVwTnVtYmVyJ10gJiYgY2hhbmdlc1snc3RlcE51bWJlciddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzdGVwTnVtYmVyIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpc1VwbG9hZGluZ0Jhc2VsaW5lIG9yIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydpc1VwbG9hZGluZ0Jhc2VsaW5lJ10gfHwgY2hhbmdlc1snaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBpc1VwbG9hZGluZ0Jhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc1VwbG9hZGluZ0Jhc2VsaW5lID0gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpc01ha2luZ0N1cnJlbnRCYXNlbGluZSBpZiBpdCBjaGFuZ2VkXG4gICAgICAgIGlmIChjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICAgIC8vIEFsc28gdXBkYXRlIGluIGNvbmZpZyBpZiBpdCBleGlzdHNcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgZG93bmxvYWRpbmdTdGVwSWQgY2hhbmdlZCwgdXBkYXRlIGZpbGUtZG93bmxvYWQgaW5zdGFuY2UgaXNEb3dubG9hZGluZ1xuICAgIGlmIChjaGFuZ2VzWydkb3dubG9hZGluZ1N0ZXBJZCddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmICYmIHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgY29uc3QgdGlkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpc0RlYnVnLCBkZWJ1Z1BvaW50U2V0IG9yIGdldERlYnVnUG9pbnRTZXRIYW5kbGVyIGNoYW5nZWQgKGUuZy4gdXNlciB0b2dnbGVkIGRlYnVnIGluIHBvcnRhbC9TdG9yeWJvb2spLCB1cGRhdGUgbmVzdGVkIGluc3RhbmNlXG4gICAgaWYgKGNoYW5nZXNbJ2lzRGVidWcnXSB8fCBjaGFuZ2VzWydkZWJ1Z1BvaW50U2V0J10gfHwgY2hhbmdlc1snZ2V0RGVidWdQb2ludFNldEhhbmRsZXInXSB8fCBjaGFuZ2VzWydvbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyJ10gfHwgY2hhbmdlc1snb25FZGl0U3RlcEhhbmRsZXInXSB8fCBjaGFuZ2VzWydhZGRTdGVwTWVudU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyJ10gfHwgY2hhbmdlc1snc3RlcE1vcmVNZW51T3B0aW9ucyddIHx8IGNoYW5nZXNbJ29uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyJ10gfHwgY2hhbmdlc1snZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkJ10gfHwgY2hhbmdlc1snZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCddIHx8IGNoYW5nZXNbJ3BhcmVudFNraXBwZWQnXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyA9IHRoaXMuaXNEZWJ1ZztcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucGFyZW50U2tpcHBlZCA9ICEhdGhpcy5wYXJlbnRTa2lwcGVkO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gdGhpcy5nZXRFZmZlY3RpdmVEZWJ1Z1BvaW50U2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmFkZFN0ZXBNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwTWVudU9wdGlvbnMgPSB0aGlzLmFkZFN0ZXBNZW51T3B0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU1lbnVPcHRpb25zID0gdGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQ7XG4gICAgICAgIGlmICh0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgICAgLy8gRW5zdXJlIGRlYnVnIHBvaW50IGNsaWNrIGlzIHdpcmVkIHdoZW4gaXNEZWJ1ZyBiZWNvbWVzIHRydWUgKGUuZy4gdG9nZ2xlZCBpbiBTdG9yeWJvb2sgQ29udHJvbHMpXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj8uKHRoaXMuc3RlcCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZGVidWdQb2ludENoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIGVkaXQgc3RlcCB3aGVuIGlzRGVidWcgYW5kIGhhbmRsZXIgYXJlIHByZXNlbnRcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcCAmJiB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdlZGl0U3RlcCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2VkaXRTdGVwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgYWRkLXN0ZXAgb3B0aW9uIHNlbGVjdCB3aGVuIGlzRGVidWcgKGVtaXQgYW5kIG9wdGlvbmFsbHkgY2FsbCBoYW5kbGVyKVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2FkZFN0ZXBPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdC5zdWJzY3JpYmUoKG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgICB0aGlzLmFkZFN0ZXBPcHRpb25TZWxlY3QuZW1pdCh7IG9wdGlvbiwgc3RlcDogdGhpcy5zdGVwIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnYWRkU3RlcE9wdGlvblNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHN0ZXAgbW9yZSBvcHRpb24gc2VsZWN0IHdoZW4gaXNEZWJ1ZyAoZW1pdCBhbmQgb3B0aW9uYWxseSBjYWxsIGhhbmRsZXIpXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBzdGVwIGlkZW50aWZpZXJzICh1c2UgZWZmZWN0aXZlIHR5cGU6IGdlbmVyYXRlRG9jdW1lbnQgLT4gZmlsZS1kb3dubG9hZClcbiAgICBjb25zdCBjdXJyZW50U3RlcElkID0gY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBjdXJyZW50U3RlcC5pZDtcbiAgICBjb25zdCBjdXJyZW50U3RlcFR5cGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKGN1cnJlbnRTdGVwKSB8fCAoY3VycmVudFN0ZXAgYXMgYW55KS5kaXNwbGF5VHlwZTtcblxuICAgIC8vIFVzZSBzdG9yZWQgbGFzdFN0ZXBJZCBhbmQgbGFzdFN0ZXBUeXBlIHRvIHByb3Blcmx5IGRldGVjdCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gc3RlcCBvYmplY3QgcmVmZXJlbmNlIGRvZXNuJ3QgY2hhbmdlIGJ1dCBwcm9wZXJ0aWVzIGRvXG4gICAgLy8gT25seSBjaGVjayBmb3IgYWN0dWFsIElEL3R5cGUgY2hhbmdlcywgbm90IGp1c3QgcmVmZXJlbmNlIGNoYW5nZXNcbiAgICAvLyBjb25zdCBzdGVwVHlwZUNoYW5nZWQgPSAhcHJldmlvdXNTdGVwIHx8IGN1cnJlbnRTdGVwVHlwZSAhPT0gKHByZXZpb3VzU3RlcC5kaXNwbGF5VHlwZSB8fCB0aGlzLmxhc3RTdGVwVHlwZSk7XG4gICAgLy8gY29uc3Qgc3RlcElkQ2hhbmdlZCA9ICFwcmV2aW91c1N0ZXAgfHwgY3VycmVudFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHByZXZpb3VzU3RlcC5pZCB8fCB0aGlzLmxhc3RTdGVwSWQpO1xuICAgIGNvbnN0IHN0ZXBUeXBlQ2hhbmdlZCA9IGN1cnJlbnRTdGVwVHlwZSAhPT0gdGhpcy5sYXN0U3RlcFR5cGU7XG4gICAgY29uc3Qgc3RlcElkQ2hhbmdlZCA9IGN1cnJlbnRTdGVwSWQgIT09IHRoaXMubGFzdFN0ZXBJZDtcbiAgICBcbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIHN0ZXAgSUQgb3IgdHlwZSBhY3R1YWxseSBjaGFuZ2VkXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzIHdoZW4gb25seSBuZXN0ZWQgcHJvcGVydGllcyBjaGFuZ2VcbiAgICBpZiAoc3RlcFR5cGVDaGFuZ2VkIHx8IHN0ZXBJZENoYW5nZWQpIHtcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBleHBhbmRlZCBzdGF0ZSBjaGFuZ2VkICh1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgYXMgaXQgbWF5IGRlcGVuZCBvbiBwYXJlbnQgc3RhdGUpXG4gICAgbGV0IGV4cGFuZGVkQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmIChwcmV2aW91c1N0ZXAgJiYgY3VycmVudFN0ZXApIHtcbiAgICAgIGxldCBjdXJyZW50RXhwYW5kZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcHJldmlvdXNFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKGN1cnJlbnRTdGVwKTtcbiAgICAgICAgcHJldmlvdXNFeHBhbmRlZCA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKHByZXZpb3VzU3RlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50RXhwYW5kZWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgcHJldmlvdXNFeHBhbmRlZCA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZXhwYW5kZWRDaGFuZ2VkID0gY3VycmVudEV4cGFuZGVkICE9PSBwcmV2aW91c0V4cGFuZGVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBvbmx5IG5lc3RlZCBkYXRhIGNoYW5nZWQgKGNoaWxkcmVuLCBuZXN0ZWRTdGVwcywgc3RlcHMsIGV4cGFuZGVkKSwgXG4gICAgLy8gdXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJlbnQgc3RlcHMgZnJvbSBibGlua2luZyB3aGVuIG5lc3RlZCBzdGVwcyBleHBhbmRcbiAgICBjb25zdCBvbmx5TmVzdGVkRGF0YUNoYW5nZWQgPSBwcmV2aW91c1N0ZXAgJiYgKFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuc3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5zdGVwcyB8fFxuICAgICAgZXhwYW5kZWRDaGFuZ2VkIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgfHxcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHxcbiAgICAgICgoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuY29uZmlnPy5leHBhbmRlZClcbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXG4gICAgaWYgKG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCAmJiB0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBHZXQgdGhlIHN0b3JlZCBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIC8vIFVzZSBjb21wcmVoZW5zaXZlIHVwZGF0ZSBtZXRob2QgZnJvbSBvcmlnaW5hbFxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGN1cnJlbnRTdGVwLCBwcmV2aW91c1N0ZXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBvdGhlciBjaGFuZ2VzLCB1c2UgY29tcHJlaGVuc2l2ZSB1cGRhdGUgaWYgY29tcG9uZW50IGV4aXN0c1xuICAgIGlmICh0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBwcmV2aW91c1N0ZXAgJiYgY3VycmVudFN0ZXAgJiZcbiAgICAgICAgcHJldmlvdXNTdGVwLmRpc3BsYXlUeXBlID09PSBjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSAmJlxuICAgICAgICAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkKSA9PT0gKGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgY3VycmVudFN0ZXAuaWQpKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBuZXcgc3RlcCBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIGNvbnRhaW5lciBpcyBlbXB0eSAoY29tcG9uZW50IGRvZXNuJ3QgZXhpc3QgeWV0KVxuICAgIC8vIFRoaXMgcHJldmVudHMgdW5uZWNlc3NhcnkgcmVsb2Fkc1xuICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXA6IGFueSwgcHJldmlvdXNTdGVwOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgaWYgKCFpbnN0YW5jZSB8fCAhY29tcG9uZW50UmVmIHx8ICF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIC8vIExpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGNvbW1vbmx5IGNoYW5nZSBhbmQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgY29uc3QgaW1wb3J0YW50UHJvcGVydGllcyA9IFsnc3RhdHVzJywgJ2R1cmF0aW9uJywgJ2V4cGFuZGVkJywgJ3N1YlN0ZXBzJywgJ2NoaWxkcmVuJywgJ25lc3RlZFN0ZXBzJywgJ3N0ZXBzJyxcbiAgICAgICdleGVjdXRpb25EYXRhJywgJ2FjdGlvbicsICd0aXRsZScsICdyZXN1bHQnLCAnbWV0aG9kJywgJ2VuZHBvaW50JywgJ3N0YXR1c0NvZGUnLCAnYnJhbmNoZXMnLFxuICAgICAgJ3Jlc3BvbnNlVGltZScsICdhY3Rpb25zJywgJ2luaXRpYWxBY3Rpb25zJywgJ3Byb21wdCcsICdvcHRpbWl6ZWRSdW4nLCAnYWN0aW9uQ291bnQnLCAnaXRlcmF0aW9ucycsICdzZWxlY3RlZEl0ZXJhdGlvbklkJywgJ3N0ZXBOdW1iZXInLFxuICAgICAgJ2lzVXBsb2FkaW5nQmFzZWxpbmUnLCAnaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnLCAnc2VsZWN0ZWRUYWJJbnB1dCcsICdzdGVwRGVsZXRlZCddO1xuXG4gICAgLy8gVXBkYXRlIGltcG9ydGFudCBwcm9wZXJ0aWVzXG4gICAgaW1wb3J0YW50UHJvcGVydGllcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAvLyBGb3Igc2VsZWN0ZWRJdGVyYXRpb25JZCBvbiBsb29wIHN0ZXBzLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgIGlmIChrZXkgPT09ICdzZWxlY3RlZEl0ZXJhdGlvbklkJyAmJiB0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVHJ5IHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbiBpZiBpdGVyYXRpb25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaXRlcmF0aW9ucycgJiYgdGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSkge1xuICAgICAgICAvLyBXaGVuIGl0ZXJhdGlvbnMgYXJlIHVwZGF0ZWQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWZ0ZXIgaXRlcmF0aW9ucyBhcmUgdXBkYXRlZCwgdHJ5IHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbiBpZiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIHNldFxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkIHx8IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaXNVcGxvYWRpbmdCYXNlbGluZScgfHwga2V5ID09PSAnaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUnKSB7XG4gICAgICAgIC8vIEZvciBsb2FkaW5nIHN0YXRlIG9iamVjdHMsIGFsd2F5cyB1c2UgdGhlIGlucHV0IHZhbHVlICh0aGV5J3JlIHBhc3NlZCBmcm9tIHBhcmVudClcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0ga2V5ID09PSAnaXNVcGxvYWRpbmdCYXNlbGluZScgPyB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmUgOiB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIGlmIHRoZSByZWZlcmVuY2UgY2hhbmdlZCAobmV3IG9iamVjdCBjcmVhdGVkKVxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnc3RlcE51bWJlcicgJiYgdGhpcy5zdGVwTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gRm9yIHN0ZXBOdW1iZXIsIHByaW9yaXRpemUgdGhlIGlucHV0IHZhbHVlIG92ZXIgc3RlcCB2YWx1ZVxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FjdGlvbicgJiYgY3VycmVudFN0ZXAuZGlzcGxheVR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gRm9yIGFpLWFnZW50IHN0ZXBzLCBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBhY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGl0bGUgYW5kIHByb21wdCBmcm9tIGFjdGlvbiBpZiB0aGV5J3JlIG5vdCBzZXQgb3IgZW1wdHlcbiAgICAgICAgICBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnByb21wdCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5wcm9tcHQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIGZvciBvYmplY3RzL2FycmF5cywgc2hhbGxvdyBmb3IgcHJpbWl0aXZlc1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBpc0RlYnVnLCBwYXJlbnRTa2lwcGVkIGFuZCBkZWJ1Z1BvaW50U2V0IGZyb20gc3RlcC1yZW5kZXJlciBpbnB1dHMgKHBhcmVudCBtYXkgaGF2ZSB1cGRhdGVkIGFmdGVyIHRvZ2dsZSlcbiAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQgJiYgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyAhPT0gdGhpcy5pc0RlYnVnKSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5wYXJlbnRTa2lwcGVkICE9PSAhIXRoaXMucGFyZW50U2tpcHBlZCkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkucGFyZW50U2tpcHBlZCA9ICEhdGhpcy5wYXJlbnRTa2lwcGVkO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG5leHREZWJ1Z1BvaW50U2V0ID0gdGhpcy5nZXRFZmZlY3RpdmVEZWJ1Z1BvaW50U2V0KCk7XG4gICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgIT09IG5leHREZWJ1Z1BvaW50U2V0KSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gbmV4dERlYnVnUG9pbnRTZXQ7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIHVwZGF0ZSBhbGwgb3RoZXIgcHJvcGVydGllc1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRTdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYgIWltcG9ydGFudFByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgc3BlY2lhbCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nXG4gICAgaWYgKHRoaXMuaXNMb29wU3RlcChjdXJyZW50U3RlcCkgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFN0ZXAuZGlzcGxheVR5cGUgPT09ICdzdGVwLWdyb3VwJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzICE9PSBjaGlsZHJlbikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyA9IGNoaWxkcmVuO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnN0ZXBzID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN5bmMgZ3JvdXBOYW1lIGZyb20gYWN0aW9uXG4gICAgICBjb25zdCBuZXdHcm91cE5hbWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgJyc7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZ3JvdXBOYW1lICE9PSBuZXdHcm91cE5hbWUpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZ3JvdXBOYW1lID0gbmV3R3JvdXBOYW1lO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmdyb3VwTmFtZSA9IG5ld0dyb3VwTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIGJyYW5jaGVzIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudEJyYW5jaGVzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c0JyYW5jaGVzID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmJyYW5jaGVzIHx8IFtdO1xuXG4gICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBuZXN0ZWQgc3ViU3RlcHMgY2hhbmdlc1xuICAgICAgaWYgKHRoaXMuaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnRCcmFuY2hlcywgcHJldmlvdXNCcmFuY2hlcykpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byBlbnN1cmUgY2hhbmdlIGRldGVjdGlvbiB0cmlnZ2Vyc1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IFsuLi5jdXJyZW50QnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgfSkpXTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBlbnN1cmUgbmVzdGVkU3RlcHMgaXMgcHJvcGVybHkgdXBkYXRlZFxuICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gY2hpbGRyZW4gYXJlIGxvYWRlZCBmcm9tIHRoZSBBUEkgb3Igd2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXNcbiAgICBpZiAoY3VycmVudFN0ZXAuZGlzcGxheVR5cGUgPT09ICdjb25kaXRpb24nICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnROZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgY29uc3QgcHJldmlvdXNOZXN0ZWRTdGVwcyA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIHN0ZXAtcmVuZGVyZXI6IGN1cnJlbnROZXN0ZWRTdGVwcycsIGN1cnJlbnROZXN0ZWRTdGVwcyk7XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBwcmV2aW91c05lc3RlZFN0ZXBzJywgcHJldmlvdXNOZXN0ZWRTdGVwcyk7XG4gICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjb250ZW50IGNoYW5nZXMsIG5vdCBqdXN0IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gSUYgYW5kIEVMU0VfSUYgYnJhbmNoZXNcbiAgICAgIGlmICh0aGlzLmhhc05lc3RlZFN0ZXBzQ2hhbmdlZChjdXJyZW50TmVzdGVkU3RlcHMsIHByZXZpb3VzTmVzdGVkU3RlcHMpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gZW5zdXJlIGNoYW5nZSBkZXRlY3Rpb24gdHJpZ2dlcnNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IFsuLi5jdXJyZW50TmVzdGVkU3RlcHNdO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBuZXN0ZWRTdGVwcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCcsIHtcbiAgICAgICAgICBzdGVwSWQ6IGN1cnJlbnRTdGVwLmlkLFxuICAgICAgICAgIHByZXZpb3VzQ291bnQ6IHByZXZpb3VzTmVzdGVkU3RlcHMubGVuZ3RoLFxuICAgICAgICAgIGN1cnJlbnRDb3VudDogY3VycmVudE5lc3RlZFN0ZXBzLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBmaWxlLWRvd25sb2FkIChpbmNsdWRpbmcgZ2VuZXJhdGVEb2N1bWVudCk6IHN5bmMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgaWYgKHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgIGNvbnN0IGdkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBjb25zdCBwcmV2R2QgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBpZiAoZ2QgIT09IHByZXZHZCB8fCBnZD8uZmlsZU5hbWUgIT09IHByZXZHZD8uZmlsZU5hbWUgfHwgZ2Q/LmZpbGVUeXBlICE9PSBwcmV2R2Q/LmZpbGVUeXBlIHx8IGdkPy5zM0ZpbGVOYW1lICE9PSBwcmV2R2Q/LnMzRmlsZU5hbWUpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgY29uc3QgbmV4dERvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgIT09IG5leHREb3dubG9hZGluZykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gbmV4dERvd25sb2FkaW5nO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGVuc3VyZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGZyb20gaW5wdXQgaXMgdXNlZFxuICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAodGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBjb25zdCBpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdmFsdWVzIHRvIGhhbmRsZSBudWxsL3VuZGVmaW5lZCBjb25zaXN0ZW50bHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbDogYW55KSA9PiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWwpO1xuICAgICAgY29uc3QgY3VycmVudE5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBjb25zdCBpbnN0YW5jZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuXG4gICAgICBpZiAoY3VycmVudE5vcm1hbGl6ZWQgIT09IGluc3RhbmNlTm9ybWFsaXplZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBzdGF0ZSAtIHVzZSBzZXRJbnB1dCB0byBwcm9wZXJseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgLy8gQWx3YXlzIHJlY2FsY3VsYXRlIGV4cGFuZGVkIHN0YXRlIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZVxuICAgIGxldCBleHBhbmRlZFN0YXRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgZXhwYW5kZWRTdGF0ZSA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKGN1cnJlbnRTdGVwKTtcbiAgICB9IGVsc2UgaWYgKChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4cGFuZGVkU3RhdGUgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGV4cGFuZGVkIGlmIGl0IGNoYW5nZWRcbiAgICBpZiAoZXhwYW5kZWRTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAvLyBVc2Ugc2V0SW5wdXQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBASW5wdXQoKSBleHBhbmRlZCBwcm9wZXJ0eVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCBpbiBjaGlsZCBjb21wb25lbnRzXG4gICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIGV4cGFuZGVkU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIEFuZ3VsYXIgdmVyc2lvbnM6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICAvLyBNYW51YWxseSBjYWxsIG5nT25DaGFuZ2VzIGlmIHRoZSBjb21wb25lbnQgaW1wbGVtZW50cyBpdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGV4cGFuZGVkU3RhdGUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgIGlmIChjdXJyZW50U3RlcCkge1xuICAgICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHJlZmVyZW5jZSAtIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIGluY2x1ZGVkXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggY3VycmVudCBzdGVwIHRvIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIHN5bmNlZFxuICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLmN1cnJlbnRTdGVwIH07XG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxuICAgICAgLy8gVXNlIHRoZSBhbHJlYWR5IHVwZGF0ZWQgYnJhbmNoZXMgZnJvbSBpbnN0YW5jZSB0byBtYWludGFpbiByZWZlcmVuY2UgY29uc2lzdGVuY3lcbiAgICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3RlcCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgb24gdGhlIGluc3RhbmNlXG4gICAgaWYgKCdzdGVwJyBpbiBpbnN0YW5jZSkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IGN1cnJlbnRTdGVwO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgY29uc3QgcHJldmlvdXNTZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHNlbGZIZWFsQW5hbHlzaXMsIHByZXZpb3VzU2VsZkhlYWxBbmFseXNpcykpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzXG4gICAgLy8gVGhpcyBlbnN1cmVzIG9ubHkgdGhlIG5lc3RlZCBzdGVwIHVwZGF0ZXMgd2l0aG91dCBhZmZlY3RpbmcgcGFyZW50IHN0ZXBzXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNkcikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBjYWxsIG1hcmtGb3JDaGVjayBvbiB0aGlzIGNvbXBvbmVudCB0byBhdm9pZCB0cmlnZ2VyaW5nIHBhcmVudCByZS1yZW5kZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIGxvb3Atc3RlcCBzZWxlY3RlZEl0ZXJhdGlvbiB3aGVuIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlc1xuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXRlcmF0aW9ucyBtaWdodCBub3QgYmUgbG9hZGVkIHlldFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlOiBhbnksIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zIHx8IChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZz8uaXRlcmF0aW9ucyB8fCBbXTtcblxuICAgIGlmIChpdGVyYXRpb25zICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpdGVyYXRpb25zLmZpbmQoKGl0ZXI6IGFueSkgPT4gaXRlci5pZCA9PT0gc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgLy8gU3luYyB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgc2VsZWN0IGRlZmF1bHRcbiAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgaXRlcmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHRoZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIGFscmVhZHkgc2V0XG4gICAgLy8gYW5kIHdpbGwgYmUgdXNlZCB3aGVuIGl0ZXJhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSAoaGFuZGxlZCBpbiB1cGRhdGVDb21wb25lbnRJbnN0YW5jZSBhbmQgbmdEb0NoZWNrKVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWx1ZUNoYW5nZWQoY3VycmVudDogYW55LCBwcmV2aW91czogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gU2hhbGxvdyBjb21wYXJpc29uIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IHByZXZpb3VzID09IG51bGwpIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcblxuICAgIC8vIEZvciBhcnJheXMsIGNoZWNrIGxlbmd0aCBhbmQgcmVmZXJlbmNlXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICE9PSBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7IC8vIFJlZmVyZW5jZSBjaGVja1xuICAgIH1cblxuICAgIC8vIEZvciBvYmplY3RzLCBkbyBzaGFsbG93IGNvbXBhcmlzb24gKGNoZWNrIHJlZmVyZW5jZSlcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcmV2aW91cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIHByaW1pdGl2ZXNcbiAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBicmFuY2hlcyBhcnJheSB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgc3ViU3RlcHNcbiAgICovXG4gIHByaXZhdGUgaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIGJyYW5jaCBhbmQgaXRzIHN1YlN0ZXBzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoID0gcHJldmlvdXNbaV07XG5cbiAgICAgIGlmICghcHJldmlvdXNCcmFuY2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDaGVjayBpZiBicmFuY2ggcHJvcGVydGllcyBjaGFuZ2VkXG4gICAgICBpZiAoY3VycmVudEJyYW5jaC50eXBlICE9PSBwcmV2aW91c0JyYW5jaC50eXBlIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2gubGFiZWwgIT09IHByZXZpb3VzQnJhbmNoLmxhYmVsIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guZXhlY3V0ZWQgIT09IHByZXZpb3VzQnJhbmNoLmV4ZWN1dGVkIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guY29uZGl0aW9uVHlwZSAhPT0gcHJldmlvdXNCcmFuY2guY29uZGl0aW9uVHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3ViU3RlcHMgYXJyYXkgY2hhbmdlZCAobGVuZ3RoIG9yIHJlZmVyZW5jZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRTdWJTdGVwcyA9IGN1cnJlbnRCcmFuY2guc3ViU3RlcHMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c1N1YlN0ZXBzID0gcHJldmlvdXNCcmFuY2guc3ViU3RlcHMgfHwgW107XG5cbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMubGVuZ3RoICE9PSBwcmV2aW91c1N1YlN0ZXBzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudFN1YlN0ZXBzICE9PSBwcmV2aW91c1N1YlN0ZXBzKSByZXR1cm4gdHJ1ZTsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgY29tcGFyaXNvbiBmb3IgbmVzdGVkU3RlcHMgYXJyYXkgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgY29uZGl0aW9uIHN0ZXBzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYnJhbmNoZXNcbiAgICovXG4gIHByaXZhdGUgaGFzTmVzdGVkU3RlcHNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIHN0ZXAgYnkgSUQgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBhcnJheSBsZW5ndGggaXMgc2FtZSBidXQgY29udGVudCBkaWZmZXJzIChlLmcuLCBzd2l0Y2hpbmcgYnJhbmNoZXMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RlcCA9IGN1cnJlbnRbaV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c1N0ZXApIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDb21wYXJlIHN0ZXAgSURzIC0gaWYgSURzIGRpZmZlciwgY29udGVudCBoYXMgY2hhbmdlZFxuICAgICAgY29uc3QgY3VycmVudFN0ZXBJZCA9IGN1cnJlbnRTdGVwLmlkIHx8IGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXBJZCA9IHByZXZpb3VzU3RlcC5pZCB8fCBwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcblxuICAgICAgaWYgKGN1cnJlbnRTdGVwSWQgIT09IHByZXZpb3VzU3RlcElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGNoZWNrIGlmIHRoZSBzdGVwIHR5cGUgY2hhbmdlZCAoaW1wb3J0YW50IGZvciBicmFuY2ggc3dpdGNoaW5nKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLmRpc3BsYXlUeXBlICE9PSBwcmV2aW91c1N0ZXAuZGlzcGxheVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlc3RTdGVwVHlwZSBjaGFuZ2VkIChJRiB2cyBFTFNFX0lGIHZzIEVMU0UpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudGVzdFN0ZXBUeXBlICE9PSBwcmV2aW91c1N0ZXAudGVzdFN0ZXBUeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgdXBkYXRlIHRva2VuIGlmIHByZXNlbnQgKHVzZWQgdG8gZm9yY2UgcmUtcmVuZGVyKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLl91cGRhdGVUb2tlbiAmJiBjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gIT09IHByZXZpb3VzU3RlcC5fdXBkYXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwS2V5KHN0ZXA6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZyb20gaW1wb3J0YW50IHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VcbiAgICAvLyBJbmNsdWRlIGV4ZWN1dGlvbkRhdGEuc3RlcFN0YXR1cyBmb3IgbGl2ZSBleGVjdXRpb24gc2NlbmFyaW9zXG4gICAgY29uc3QgZXhlY3V0aW9uU3RhdHVzID0gc3RlcC5leGVjdXRpb25EYXRhPy5zdGVwU3RhdHVzIHx8IHN0ZXAuc3RhdHVzIHx8ICcnO1xuICAgIC8vIEluY2x1ZGUgYnJhbmNoZXMgbGVuZ3RoIGZvciBjb25kaXRpb24tc3RlcCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgYnJhbmNoZXNMZW5ndGggPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkubGVuZ3RoO1xuICAgIC8vIEluY2x1ZGUgdG90YWwgc3ViU3RlcHMgY291bnQgYWNyb3NzIGFsbCBicmFuY2hlcyBmb3IgbmVzdGVkIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCB0b3RhbFN1YlN0ZXBzID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLnJlZHVjZSgoc3VtOiBudW1iZXIsIGJyYW5jaDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgKGJyYW5jaC5zdWJTdGVwcz8ubGVuZ3RoIHx8IDApO1xuICAgIH0sIDApO1xuICAgIC8vIEluY2x1ZGUgaW5pdGlhbEFjdGlvbnMgbGVuZ3RoIGZvciBhcGktc3RlcCBsaXZlIGV4ZWN1dGlvbiBsb2dzXG4gICAgY29uc3QgaW5pdGlhbEFjdGlvbnNMZW5ndGggPSAoc3RlcC5pbml0aWFsQWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xuICAgIHJldHVybiBgJHtzdGVwLmlkIHx8ICcnfV8ke2V4ZWN1dGlvblN0YXR1c31fJHtzdGVwLnN0YXR1cyB8fCAnJ31fJHtzdGVwLmR1cmF0aW9uIHx8ICcnfV8ke3N0ZXAuZXhwYW5kZWQgfHwgZmFsc2V9XyR7KHN0ZXAuY2hpbGRyZW4gfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5uZXN0ZWRTdGVwcyB8fCBbXSkubGVuZ3RofV8keyhzdGVwLnN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7YnJhbmNoZXNMZW5ndGh9XyR7dG90YWxTdWJTdGVwc31fJHtzdGVwLnN0ZXBOdW1iZXIgfHwgJyd9XyR7c3RlcC5zdGVwRGVsZXRlZCB8fCBmYWxzZX1fJHtpbml0aWFsQWN0aW9uc0xlbmd0aH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50KCkge1xuICAgIFxuICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuc3RlcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkIHx8IHRoaXMuc3RlcC5pZDtcbiAgICBjb25zdCBjdXJyZW50U3RlcFR5cGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlO1xuXG4gICAgLy8gT25seSBjbGVhciBhbmQgcmVjcmVhdGUgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBjb25zdCBuZWVkc1JlY3JlYXRpb24gPSB0aGlzLmxhc3RTdGVwSWQgIT09IGN1cnJlbnRTdGVwSWQgfHwgdGhpcy5sYXN0U3RlcFR5cGUgIT09IGN1cnJlbnRTdGVwVHlwZTtcblxuICAgIGlmIChuZWVkc1JlY3JlYXRpb24pIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAvLyBDbGVhciBzdG9yZWQgaW5zdGFuY2Ugd2hlbiByZWNyZWF0aW5nXG4gICAgICBjb25zdCBvbGRJbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChvbGRJbnN0YW5jZSkge1xuICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZGVsZXRlKG9sZEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmRlbGV0ZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgICB0aGlzLmxhc3RTdGVwSWQgPSBjdXJyZW50U3RlcElkO1xuICAgICAgdGhpcy5sYXN0U3RlcFR5cGUgPSBjdXJyZW50U3RlcFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHNhbWUgc3RlcCwganVzdCB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IGNsZWFyaW5nXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXBkYXRlIGFsbCBwcm9wZXJ0aWVzXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgICAgLy8gVXNlIHNldElucHV0IGZvciBpbnB1dCBwcm9wZXJ0aWVzIHRvIHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdleHBhbmRlZCcgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgbmV3VmFsdWUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLnRoaXMuc3RlcCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFN5bmMgZmlsZS1kb3dubG9hZCAoZ2VuZXJhdGVEb2N1bWVudCkgcHJvcHMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVR5cGVGb3JVcGRhdGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlO1xuICAgICAgICBpZiAoZWZmZWN0aXZlVHlwZUZvclVwZGF0ZSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICAgICAgY29uc3QgZ2QgPSAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPSBnZD8uZmlsZVR5cGUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPz8gJyc7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGggPSBnZD8uczNGaWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgICBjb25zdCB0aWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlTmFtZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVBhdGggPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBldmVudCBzdWJzY3JpcHRpb25zIGFyZSBzdGlsbCBhY3RpdmUgZm9yIHNlbGZIZWFsQWN0aW9uXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbiAmJiB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XG4gICAgICAgICAgLy8gVHJhY2sgc3Vic2NyaXB0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdzZWxmSGVhbEFjdGlvbicpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3NlbGZIZWFsQWN0aW9uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyID0gdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcjtcbiAgICAgICAgLy8gU3luYyBpc0RlYnVnLCBwYXJlbnRTa2lwcGVkIGFuZCBkZWJ1Z1BvaW50U2V0IHNvIG5lc3RlZCBzdGVwcyAoZS5nLiBpbnNpZGUgbG9vcCkgYWx3YXlzIHNob3cgZGVidWcgaWNvbiB3aGVuIHBhcmVudCBoYXMgaXNEZWJ1ZyB0cnVlXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnICE9PSB0aGlzLmlzRGVidWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgICB9XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnBhcmVudFNraXBwZWQgPSAhIXRoaXMucGFyZW50U2tpcHBlZDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCA9IHRoaXMuZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpO1xuICAgICAgICBpZiAodGhpcy5hZGRTdGVwTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE1lbnVPcHRpb25zID0gdGhpcy5hZGRTdGVwTWVudU9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVNZW51T3B0aW9ucyA9IHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgICBpZiAodGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQ7XG4gICAgICAgIGlmICh0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlciA9IHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIgPSB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI7XG4gICAgICAgIC8vIEVuc3VyZSBkZWJ1ZyBwb2ludCBjbGljayBpcyB3aXJlZCB3aGVuIGlzRGVidWcgaXMgdHJ1ZSAoZS5nLiBhZnRlciB0b2dnbGluZyBpbiBTdG9yeWJvb2spXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj8uKHRoaXMuc3RlcCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZGVidWdQb2ludENoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwICYmIHRoaXMub25FZGl0U3RlcEhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2VkaXRTdGVwJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25FZGl0U3RlcEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZWRpdFN0ZXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0KSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdhZGRTdGVwT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRTdGVwT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2FkZFN0ZXBPcHRpb25TZWxlY3QnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc3RlcE1vcmVPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgICB0aGlzLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcbiAgICAgICAgLy8gQ29tcG9uZW50IGFscmVhZHkgZXhpc3RzIGFuZCBpcyByZWFkeSwgZW1pdCBpbW1lZGlhdGVseVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5LmVtaXQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZmZlY3RpdmVUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZSh0aGlzLnN0ZXApIHx8ICh0aGlzLnN0ZXAgYXMgYW55KS5kaXNwbGF5VHlwZTtcbiAgICBjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy5jb21wb25lbnRNYXAuZ2V0KGVmZmVjdGl2ZVR5cGUpO1xuXG4gICAgaWYgKGNvbXBvbmVudFR5cGUpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlO1xuXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHJlZiBpbiBXZWFrTWFwIGZvciBmdXR1cmUgdXBkYXRlc1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5zZXQodGhpcy5jb250YWluZXIsIGluc3RhbmNlKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLnNldCh0aGlzLmNvbnRhaW5lciwgY29tcG9uZW50UmVmKTtcblxuICAgICAgLy8gU3RvcmUgY29tcG9uZW50IHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLl9jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG5cbiAgICAgIC8vIFNwcmVhZCBjb25maWcgcHJvcGVydGllcyBhcyBpbmRpdmlkdWFsIGlucHV0cyBmb3IgY29tcG9uZW50cyB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgLy8gVGhpcyBzdXBwb3J0cyBib3RoIHBhdHRlcm5zOiBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGNvbmZpZyBkaXJlY3RseSBhbmQgdGhvc2UgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IG1hcCBjaGlsZHJlbiB0byBuZXN0ZWRTdGVwcyBpZiBuZXN0ZWRTdGVwcyBpcyBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHNldCBsb29wVHlwZSBiYXNlZCBvbiBhY3Rpb25OYW1lIG9yIHRlc3RTdGVwVHlwZVxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApKSB7XG4gICAgICAgIC8vIFNldCBsb29wVHlwZSBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uTmFtZTtcbiAgICAgICAgICBjb25zdCB0ZXN0U3RlcFR5cGUgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgICAgICAgIGlmIChhY3Rpb25OYW1lID09PSAnRk9SX0xPT1AnIHx8IHRlc3RTdGVwVHlwZSA9PT0gJ0ZPUl9MT09QJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUgPSAnZm9yJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbk5hbWUgPT09ICdXSElMRV9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdXSElMRV9MT09QJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUgPSAnd2hpbGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGl0bGUgaXMgc2V0IGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBpbml0aWFsaXplIGl0ZXJhdGlvbnMgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSAmJiAhKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gc3RlcFwiLCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQsIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMpXG4gICAgICAgIC8vIFVzZSBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHRyeSB0byBpbml0aWFsaXplIGZyb20gc3RlcC5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0XG4gICAgICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgPSB0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uc3RlcFJlc3VsdCAmJiBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0KSkge1xuICAgICAgICAgIC8vIEluaXRpYWxpemUgaXRlcmF0aW9ucyBkaXJlY3RseSBmcm9tIHN0ZXBSZXN1bHRcbiAgICAgICAgICBjb25zdCBpdGVyYXRpb25zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0LmZvckVhY2goKGl0ZXJhdGlvbjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVyYXRpb25JbmRleCA9IGl0ZXJhdGlvbi5pbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZXJhdGlvbi5pbmRleCAhPT0gbnVsbCA/IGl0ZXJhdGlvbi5pbmRleCA6IGl0ZXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHN0YXR1czogJ3N1Y2Nlc3MnIHwgJ2ZhaWxlZCcgfCAncGVuZGluZycgfCAncnVubmluZycgPSAncGVuZGluZyc7XG4gICAgICAgICAgICBpZiAoaXRlcmF0aW9uLnN0YXR1cykge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0dXNMb3dlciA9IGl0ZXJhdGlvbi5zdGF0dXMudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXR1c0xvd2VyID09PSAnc3VjY2VzcycgfHwgc3RhdHVzTG93ZXIgPT09ICdwYXNzZWQnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xvd2VyID09PSAnZmFpbHVyZScgfHwgc3RhdHVzTG93ZXIgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdydW5uaW5nJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2luX3Byb2dyZXNzJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdydW5uaW5nJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IGBpdGVyLSR7aXRlcmF0aW9uSW5kZXh9YCxcbiAgICAgICAgICAgICAgbGFiZWw6IGBpdGVyICR7aXRlcmF0aW9uSW5kZXh9YCxcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICAgIHN1YlN0ZXBzOiBbXSxcbiAgICAgICAgICAgICAgaW5kZXg6IGl0ZXJhdGlvbkluZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gaXRlcmF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayAoZGVidWcgb25seSk6IGVuc3VyZSBpdGVyYXRpb25zIGlzIGFsd2F5cyBhbiBlbXB0eSBhcnJheSAobm90IHVuZGVmaW5lZCkgc28gdGhlXG4gICAgICAgIC8vIEl0ZXJhdGlvbiBkcm9wZG93biByZW5kZXJzIGV2ZW4gZm9yIG5ld2x5IGFkZGVkIHN0ZXBzIHdpdGggbm8gZXhlY3V0aW9uIGRhdGEuXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGRlZmF1bHRJdGVyYXRpb24gYW5kIHNlbGVjdGVkSXRlcmF0aW9uSWRcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gc3RlcCAyXCIsIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCwgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucylcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRJdGVyYXRpb24gdG8gJ2xhc3QnIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uID0gJ2xhc3QnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkSXRlcmF0aW9uSWQgLSBwcmlvcml0aXplIGlucHV0IHZhbHVlLCB0aGVuIHN0ZXAgdmFsdWUsIHRoZW4gbGFzdCBpdGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNldCBzZWxlY3RlZEl0ZXJhdGlvbklkIHRvIGxhc3QgaXRlcmF0aW9uIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zO1xuICAgICAgICAgIGlmIChpdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoaXRlcmF0aW9ucykgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmICEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uID0gaXRlcmF0aW9uc1tpdGVyYXRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGxhc3RJdGVyYXRpb24uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHN0ZXAtZ3JvdXA6IG1hcCBjaGlsZHJlbiB0byBzdGVwcyAocHJlZmVyIGNoaWxkcmVuIG92ZXIgZW1wdHkgc3RlcHMgYXJyYXkpXG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnc3RlcC1ncm91cCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmdyb3VwTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgJyc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICEodGhpcy5zdGVwIGFzIGFueSkuc3RlcHM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBObyBjaGlsZHJlbiB5ZXQgYnV0IGVuc3VyZSBncm91cE5hbWUgaXMgc2V0XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmdyb3VwTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGUtZG93bmxvYWQgKGluY2x1ZGluZyBnZW5lcmF0ZURvY3VtZW50KTogc2V0IHByb3BzIGZyb20gZ2VuZXJhdGVEb2N1bWVudFJlc3VsdCBhbmQgd2lyZSBoYW5kbGVyc1xuICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICBjb25zdCBnZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkID0gKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgdGlkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmRvd25sb2FkZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS50aXRsZSkgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnRpdGxlID0gKGluc3RhbmNlIGFzIGFueSkudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkICYmIHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25Eb3dubG9hZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoQ29waWVkICYmIHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnRleHRDb3BpZWQgJiYgdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGV4dENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25UZXh0Q29waWVkSGFuZGxlciEoZXYpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogc2V0IGJyYW5jaGVzIGFuZCBjb25kaXRpb25UZXh0XG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBTZXQgYnJhbmNoZXMgLSBwcmlvcml0aXplIHN0ZXAuYnJhbmNoZXMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGhhbmRsZXJcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcyAmJiBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcykpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgZGVlcCBjb3B5IHRvIGVuc3VyZSBwcm9wZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzLm1hcCgoYnJhbmNoOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICghKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgJiYgdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyQnJhbmNoZXMgPSB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAgIC8vIENyZWF0ZSBkZWVwIGNvcHkgdG8gZW5zdXJlIHByb3BlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSBoYW5kbGVyQnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBjb25kaXRpb25UZXh0IGZyb20gYWN0aW9uIGlmIGNvbmRpdGlvblRleHQgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgaXNMb2FkaW5nIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNMb2FkaW5nID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhc3MgYWN0aXZlQnJhbmNoU3RlcElkIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgYWktYWdlbnQtc3RlcDogZW5zdXJlIHRpdGxlIGFuZCBwcm9tcHQgYXJlIHNldCBmcm9tIGFjdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2FpLWFnZW50Jykge1xuICAgICAgICAvLyBTZXQgdGl0bGUgZnJvbSBhY3Rpb24gaWYgdGl0bGUgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgcHJvbXB0IGZyb20gYWN0aW9uIGlmIHByb21wdCBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnByb21wdC50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBhY3Rpb25zIGFycmF5IGlzIHNldCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgJiYgdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgPSB0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGFjdGlvbkNvdW50IGlmIG5vdCBwcmVzZW50XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25Db3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgfHwgW107XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPSBhY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRUYWJJbnB1dCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkVGFiSW5wdXQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0ID0gJ2FjdGlvbi10cmFjZSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBjb21tb24gZXZlbnQgZW1pdHRlcnMgZm9yIGFwaSwgYWktYWdlbnQsIGxvb3AsIGNvbmRpdGlvbiwgYW5kIGJhc2ljIHN0ZXBzXG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnYXBpJyB8fCB0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdhaS1hZ2VudCcgfHwgdGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkgfHwgdGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJyB8fCB0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdiYXNpYycpIHtcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNvbW1vbiBvdXRwdXQgZXZlbnRzIGFuZCBjYWxsIGhhbmRsZXJzXG4gICAgICAgIC8vIEV2ZW50RW1pdHRlcnMgYXJlIFN1YmplY3RzLCBzbyB3ZSBjYW4gc3Vic2NyaWJlIHRvIHRoZW1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUgJiYgdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubWFrZUN1cnJlbnRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudXBsb2FkQmFzZWxpbmUgJiYgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZSAmJiB0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hbmFseXplLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQW5hbHl6ZUhhbmRsZXI/LigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3MgJiYgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3Muc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24gJiYgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikge1xuICAgICAgICAgIC8vIFRyYWNrIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc2VsZkhlYWxBY3Rpb24nKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzZWxmSGVhbEFjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBvbkpzb25QYXRoQ29waWVkSGFuZGxlciBpcyBzZXQgYXMgaW5wdXQgcHJvcGVydHkgKGxpbmUgODI1KSwgc28gd2UgZG9uJ3QgbmVlZCB0byBzdWJzY3JpYmUgdG8ganNvblBhdGhDb3BpZWQgZXZlbnRcbiAgICAgICAgLy8gVGhlIEFQSSBzdGVwIGNvbXBvbmVudCBjYWxscyB0aGUgaGFuZGxlciBkaXJlY3RseSwgYXZvaWRpbmcgZHVwbGljYXRlIGNhbGxzXG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogd2lyZSB1cCBvblZpZXdBbGxJdGVyYXRpb25zIGV2ZW50XG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkpIHtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMgJiYgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgdXAgYWRkU3RlcEluc2lkZUxvb3Agc28gbmVzdGVkIGxvb3AgXCJBZGQgc3RlcCBpbnNpZGUgbG9vcFwiIGJ1YmJsZXMgdG8gcGFyZW50ICh3b3JrcyBhdCBhbnkgbmVzdGluZyBsZXZlbClcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBJbnNpZGVMb29wKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdhZGRTdGVwSW5zaWRlTG9vcCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwSW5zaWRlTG9vcC5zdWJzY3JpYmUoKGxvb3BTdGVwOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRTdGVwSW5zaWRlTG9vcC5lbWl0KGxvb3BTdGVwICE9IG51bGwgPyBsb29wU3RlcCA6IHRoaXMuc3RlcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdhZGRTdGVwSW5zaWRlTG9vcCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIGRlYnVnIHBvaW50IHRvZ2dsZSBmb3IgYW55IHN0ZXAgdGhhdCBzdXBwb3J0cyBpdCAod2hlbiBpc0RlYnVnIGlzIHRydWUpXG4gICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2UgJiYgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSB7XG4gICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdkZWJ1Z1BvaW50Q2hhbmdlJykpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50Q2hhbmdlLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj8uKHRoaXMuc3RlcCwgdmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdkZWJ1Z1BvaW50Q2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBlZGl0IHN0ZXA6IHdoZW4gdXNlciBjbGlja3MgRWRpdCBpY29uLCBub3RpZnkgcGFyZW50IHdpdGggdGhlIHN0ZXAgY29uZmlnXG4gICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwICYmIHRoaXMub25FZGl0U3RlcEhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2VkaXRTdGVwJykpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVkaXRTdGVwSGFuZGxlcj8uKHRoaXMuc3RlcCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2VkaXRTdGVwJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBhZGQtc3RlcCBvcHRpb24gc2VsZWN0OiB3aGVuIHVzZXIgcGlja3MgYW4gb3B0aW9uIGZyb20gdGhlIFBsdXMgbWVudSwgZW1pdCBhbmQgb3B0aW9uYWxseSBjYWxsIGhhbmRsZXJcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdCkge1xuICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnYWRkU3RlcE9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdC5zdWJzY3JpYmUoKG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMub25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2FkZFN0ZXBPcHRpb25TZWxlY3QnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIHN0ZXAgbW9yZSBvcHRpb24gc2VsZWN0OiB3aGVuIHVzZXIgcGlja3MgYW4gb3B0aW9uIGZyb20gdGhlIHRocmVlLWRvdCBtZW51LCBlbWl0IGFuZCBvcHRpb25hbGx5IGNhbGwgaGFuZGxlclxuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU9wdGlvblNlbGVjdCkge1xuICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc3RlcE1vcmVPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXI/LihvcHRpb24sIHRoaXMuc3RlcCk7XG4gICAgICAgICAgICB0aGlzLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnc3RlcE1vcmVPcHRpb25TZWxlY3QnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogd2lyZSB1cCBvbkV4cGFuZCBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicpIHtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kICYmIHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIENhbGwgb25FeHBhbmRIYW5kbGVyIHdpdGggdGhlIHN0ZXAgY29uZmlnXG4gICAgICAgICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcj8uKHRoaXMuc3RlcCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2lyZSB1cCBvbkJyYW5jaENsaWNrRXZlbnQgZm9yIG5lc3RlZCBjb25kaXRpb24gc3RlcHNcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uQnJhbmNoQ2xpY2tFdmVudCAmJiB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkub25CcmFuY2hDbGlja0V2ZW50LnN1YnNjcmliZSgoYnJhbmNoOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/Lih0aGlzLnN0ZXAsIGJyYW5jaCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIGV4cGFuZGVkIHByb3BlcnR5IGlzIHBhc3NlZCBjb3JyZWN0bHlcbiAgICAgIC8vIFVzZSBpc1N0ZXBFeHBhbmRlZEhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHN0ZXAuZXhwYW5kZWQgb3Igc3RlcC5jb25maWcuZXhwYW5kZWRcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlciAmJiB0aGlzLnN0ZXApIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRTdGF0ZSA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSAodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSAodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUGFzcyBoYW5kbGVyIGZ1bmN0aW9ucyB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kSGFuZGxlciA9IHRoaXMub25FeHBhbmRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25FZGl0U3RlcEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRWRpdFN0ZXBIYW5kbGVyID0gdGhpcy5vbkVkaXRTdGVwSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmFkZFN0ZXBNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwTWVudU9wdGlvbnMgPSB0aGlzLmFkZFN0ZXBNZW51T3B0aW9ucztcbiAgICAgIGlmICh0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXIgPSB0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlTWVudU9wdGlvbnMgPSB0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXIgPSB0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgaWYgKHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgaWYgKHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIgPSB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5pc1N0ZXBMb2FkaW5nSGFuZGxlciA9IHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcEV4cGFuZGVkSGFuZGxlciA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlciA9IHRoaXMuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyID0gdGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBcGlBc3NlcnRpb25zSGFuZGxlciA9IHRoaXMuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZm9ybWF0QWN0aW9uc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyID0gdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIgPSB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25VcGxvYWRCYXNlbGluZUhhbmRsZXIgPSB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25BbmFseXplSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25BbmFseXplSGFuZGxlciA9IHRoaXMub25BbmFseXplSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3RnVsbExvZ3NIYW5kbGVyID0gdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIgPSB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlciA9IHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblN0ZXBDbGlja0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU3RlcENsaWNrSGFuZGxlciA9IHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyID0gdGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRG93bmxvYWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkRvd25sb2FkSGFuZGxlciA9IHRoaXMub25Eb3dubG9hZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkZpbGVQYXRoQ29waWVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25GaWxlUGF0aENvcGllZEhhbmRsZXIgPSB0aGlzLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25UZXh0Q29waWVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25UZXh0Q29waWVkSGFuZGxlciA9IHRoaXMub25UZXh0Q29waWVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmp1bXBUb1RpbWVzdGFtcEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmp1bXBUb1RpbWVzdGFtcEhhbmRsZXIgPSB0aGlzLmp1bXBUb1RpbWVzdGFtcEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgPSB0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlciA9IHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgIGlmICh0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lID0gdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc0xpdmUgPSB0aGlzLmlzTGl2ZTtcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyA9IHRoaXMuaXNEZWJ1ZztcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnBhcmVudFNraXBwZWQgPSAhIXRoaXMucGFyZW50U2tpcHBlZDtcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgIC8vIFBhc3Mgc3RlcE51bWJlciBpbnB1dCBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBzdGVwJ3Mgc3RlcE51bWJlclxuICAgICAgaWYgKHRoaXMuc3RlcE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcE51bWJlciA9IHRoaXMuc3RlcE51bWJlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUGFzcyB0aGUgc3RlcCBvYmplY3Qgc28gdG9nZ2xlSGVhZGVyIGNhbiB1c2UgaXRcbiAgICAgIGlmICh0aGlzLnN0ZXApIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXAgPSB0aGlzLnN0ZXA7XG5cbiAgICAgIC8vIFVwZGF0ZSBjb25kaXRpb24tc3RlcCBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBVcGRhdGUgYWN0aXZlQnJhbmNoU3RlcElkIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgYnJhbmNoZXMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbmVzdGVkU3RlcHMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvLyBTZXQgc2VsZkhlYWxBbmFseXNpcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIGNvbnN0IHNlbGZIZWFsQW5hbHlzaXMgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XG4gICAgICBpZiAoJ2NvbmZpZycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RlcCxcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlLWRvd25sb2FkJyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSxcbiAgICAgICAgICAgIGZpbGVUeXBlOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSxcbiAgICAgICAgICAgIGZpbGVQYXRoOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCxcbiAgICAgICAgICAgIGRvd25sb2FkZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkZWRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgc2VsZkhlYWxBbmFseXNpcyBpcyBpbmNsdWRlZCBpbiBjb25maWdcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVtaXQgcmVhZHkgZXZlbnQgYWZ0ZXIgY29tcG9uZW50IGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkXG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyBmdWxseSByZW5kZXJlZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkuZW1pdCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVzZSBuZ0RvQ2hlY2sgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gbmVzdGVkIHByb3BlcnRpZXMgdGhhdCBuZ09uQ2hhbmdlcyBtaWdodCBtaXNzXG4gICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAvLyBTeW5jIGlzRGVidWcgYW5kIGRlYnVnUG9pbnRTZXQgZnJvbSBzdGVwLXJlbmRlcmVyIGlucHV0cyBzbyBuZXN0ZWQgc3RlcHMgKGUuZy4gaW5zaWRlIGxvb3Avc3RlcC1ncm91cClcbiAgICAgIC8vIGFsd2F5cyByZWZsZWN0IHBhcmVudCBzdGF0ZSB3aGVuIHRvZ2dsZWQgKGUuZy4gU3Rvcnlib29rIENvbnRyb2xzKVxuICAgICAgY29uc3QgbmV4dERlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ICE9PSBuZXh0RGVidWdQb2ludFNldCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gbmV4dERlYnVnUG9pbnRTZXQ7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQgJiYgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyAhPT0gdGhpcy5pc0RlYnVnKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBuZXN0ZWQgc3RlcC1ncm91cHMgd2hlcmUgcGFyZW50IGV4cGFuc2lvbiBhZmZlY3RzIGNoaWxkIGV4cGFuc2lvblxuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikge1xuICAgICAgICBjdXJyZW50RXhwYW5kZWQgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VFeHBhbmRlZCA9IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkO1xuXG4gICAgICBpZiAoY3VycmVudEV4cGFuZGVkICE9PSB1bmRlZmluZWQgJiYgY3VycmVudEV4cGFuZGVkICE9PSBpbnN0YW5jZUV4cGFuZGVkKSB7XG4gICAgICAgIC8vIEV4cGFuZGVkIHN0YXRlIGNoYW5nZWQsIHVwZGF0ZSBpdCB1c2luZyBzZXRJbnB1dCB0byB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBpbnN0YW5jZUV4cGFuZGVkO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQoJ2V4cGFuZGVkJywgY3VycmVudEV4cGFuZGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogbWFudWFsbHkgdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkubmdPbkNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRFeHBhbmRlZCwgcHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGl0ZXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgYW5kIHdlIG5lZWQgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zIHx8IChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZz8uaXRlcmF0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgfHwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb24gPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbjtcblxuICAgICAgICAvLyBJZiBpdGVyYXRpb25zIGFyZSBhdmFpbGFibGUsIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgc2V0LCBidXQgc2VsZWN0ZWRJdGVyYXRpb24gaXMgbm90IHNldCBvciBkb2Vzbid0IG1hdGNoXG4gICAgICAgIGlmIChpdGVyYXRpb25zLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgIGNvbnN0IHNob3VsZEJlU2VsZWN0ZWQgPSBpdGVyYXRpb25zLmZpbmQoKGl0ZXI6IGFueSkgPT4gaXRlci5pZCA9PT0gc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgaWYgKHNob3VsZEJlU2VsZWN0ZWQgJiYgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uPy5pZCAhPT0gc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcblxuICAgICAgLy8gSWYgc3RlcCBwcm9wZXJ0aWVzIGNoYW5nZWQgKGV2ZW4gaWYgcmVmZXJlbmNlIGRpZG4ndCksIHVwZGF0ZSB0aGUgaW5zdGFuY2VcbiAgICAgIGlmIChjdXJyZW50S2V5ICE9PSB0aGlzLnByZXZpb3VzU3RlcEtleSkge1xuICAgICAgICAvLyBXZSBuZWVkIHRoZSBwcmV2aW91cyBzdGVwIHRvIGNvbXBhcmUsIHNvIHdlJ2xsIHVwZGF0ZSBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAgICAgIC8vIENyZWF0ZSBhIG1pbmltYWwgcHJldmlvdXMgc3RlcCBmcm9tIHRoZSBpbnN0YW5jZSdzIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdGVwOiBhbnkgPSB7XG4gICAgICAgICAgaWQ6IChpbnN0YW5jZSBhcyBhbnkpLmlkLFxuICAgICAgICAgIGRpc3BsYXlUeXBlOiAoaW5zdGFuY2UgYXMgYW55KS5kaXNwbGF5VHlwZSxcbiAgICAgICAgICBzdGF0dXM6IChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1cyxcbiAgICAgICAgICBkdXJhdGlvbjogKGluc3RhbmNlIGFzIGFueSkuZHVyYXRpb24sXG4gICAgICAgICAgZXhwYW5kZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkLFxuICAgICAgICAgIGNoaWxkcmVuOiAoaW5zdGFuY2UgYXMgYW55KS5jaGlsZHJlbixcbiAgICAgICAgICBuZXN0ZWRTdGVwczogKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMsXG4gICAgICAgICAgc3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzLFxuICAgICAgICAgIGV4ZWN1dGlvbkRhdGE6IChpbnN0YW5jZSBhcyBhbnkpLmV4ZWN1dGlvbkRhdGEsXG4gICAgICAgICAgYWN0aW9uOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb24sXG4gICAgICAgICAgdGl0bGU6IChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLFxuICAgICAgICAgIHJlc3VsdDogKGluc3RhbmNlIGFzIGFueSkucmVzdWx0LFxuICAgICAgICAgIG1ldGhvZDogKGluc3RhbmNlIGFzIGFueSkubWV0aG9kLFxuICAgICAgICAgIGVuZHBvaW50OiAoaW5zdGFuY2UgYXMgYW55KS5lbmRwb2ludCxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXNDb2RlLFxuICAgICAgICAgIHJlc3BvbnNlVGltZTogKGluc3RhbmNlIGFzIGFueSkucmVzcG9uc2VUaW1lLFxuICAgICAgICAgIGFjdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMsXG4gICAgICAgICAgcHJvbXB0OiAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQsXG4gICAgICAgICAgb3B0aW1pemVkUnVuOiAoaW5zdGFuY2UgYXMgYW55KS5vcHRpbWl6ZWRSdW4sXG4gICAgICAgICAgYWN0aW9uQ291bnQ6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50LFxuICAgICAgICAgIGl0ZXJhdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMsXG4gICAgICAgICAgc2VsZWN0ZWRJdGVyYXRpb25JZDogKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCxcbiAgICAgICAgICBicmFuY2hlczogKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMsXG4gICAgICAgICAgc3RlcE51bWJlcjogKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMuc3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSBjdXJyZW50S2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==
1689
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbk4sT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBbUdoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXhFdkIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUV4QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFlBQU8sR0FBYSxLQUFLLENBQUM7UUFvQm5DLDRGQUE0RjtRQUNuRixrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUN6QyxtR0FBbUc7UUFDekYsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQTZELENBQUM7UUFDOUcsaUhBQWlIO1FBQ3ZHLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUE4RCxDQUFDO1FBQ2hILG9IQUFvSDtRQUMxRyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQyxDQUFDLDBDQUEwQztRQWtDdkYsZUFBVSxHQUEyQixJQUFJLENBQUM7UUFDMUMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLG9CQUFlLEdBQVcsRUFBRSxDQUFDO1FBQzdCLDRCQUF1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QUE1QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUM4QyxTQUFTO3NCQUE1RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDekMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFFRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBRUcsK0JBQStCO3NCQUF2QyxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUVHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBBZnRlclZpZXdJbml0LCBEb0NoZWNrLCBJbmplY3QsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnRSZWYsIFNpbXBsZUNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXhlY3V0aW9uU3RlcENvbmZpZywgQWRkU3RlcE1lbnVPcHRpb24sIFN0ZXBNb3JlTWVudU9wdGlvbiB9IGZyb20gJy4uL2V4ZWN1dGlvbi1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX0NPTVBPTkVOVF9NQVAgfSBmcm9tICcuLi9zdGVwLXJlZ2lzdHJ5LnRva2VuJztcblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBhcHByb3ByaWF0ZSBzdGVwIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgc3RlcCB0eXBlLlxuICogVXNlcyBkeW5hbWljIGNvbXBvbmVudCBsb2FkaW5nIGFuZCBhbiBpbmplY3Rpb24gdG9rZW4gdG8gYnJlYWsgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gKiBiZXR3ZWVuIHN0ZXAgY29tcG9uZW50cyBpbiBBbmd1bGFyIEl2eSBwYXJ0aWFsIGNvbXBpbGF0aW9uIG1vZGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLXJlbmRlcmVyJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+J1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwUmVuZGVyZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIERvQ2hlY2sge1xuICBASW5wdXQoKSBzdGVwITogRXhlY3V0aW9uU3RlcENvbmZpZztcbiAgQElucHV0KCkgb25FeHBhbmRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGlzU3RlcExvYWRpbmdIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzU3RlcEV4cGFuZGVkSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyPzogKGR1cmF0aW9uOiBudW1iZXIpID0+IG51bWJlcjtcbiAgQElucHV0KCkgZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQW5hbHl6ZUhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblZpZXdGdWxsTG9nc0hhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblNlbGZIZWFsQWN0aW9uSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyPzogKCkgPT4geyBpc0xvYWRpbmdBY2NlcHQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9OyBpc0xvYWRpbmdNb2RpZnlBY2NlcHQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IH07XG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmU/OiBhbnk7XG4gIEBJbnB1dCgpIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogYW55O1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBmb3JtYXRBY3Rpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/OiAoc3RlcDogYW55LCBicmFuY2g6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcsIGV2ZW50PzogRXZlbnQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uSnNvblBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHBhdGg6IHN0cmluZzsgc291cmNlOiAncmVxdWVzdEJvZHknIHwgJ3Jlc3BvbnNlQm9keScgfCAncmVxdWVzdEhlYWRlcnMnIHwgJ3Jlc3BvbnNlSGVhZGVycycgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Eb3dubG9hZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZU5hbWU6IHN0cmluZzsgZmlsZVBhdGg/OiBzdHJpbmc7IGZpbGVUeXBlOiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkZpbGVQYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBmaWxlUGF0aDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25UZXh0Q29waWVkSGFuZGxlcj86IChldmVudDogeyB0ZXh0OiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBqdW1wVG9UaW1lc3RhbXBIYW5kbGVyPzogKHRpbWVzdGFtcDogbnVtYmVyLCB0ZXN0U3RlcElkPzogbnVtYmVyIHwgc3RyaW5nKSA9PiB2b2lkO1xuICBASW5wdXQoKSBkb3dubG9hZGluZ1N0ZXBJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuICBASW5wdXQoKSBpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNEZWJ1Zz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFdoZW4gc2V0LCB1c2VkIGRpcmVjdGx5IGZvciB0aGUgcmVuZGVyZWQgc3RlcCdzIGRlYnVnUG9pbnRTZXQgc28gdGhlIGljb24gc3RhdGUgcHJvcGFnYXRlcyB3aGVuIHRvZ2dsZWQgKGUuZy4gaW4gU3Rvcnlib29rKS4gKi9cbiAgQElucHV0KCkgZGVidWdQb2ludFNldD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGdldERlYnVnUG9pbnRTZXRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIG9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgdmFsdWU6IGJvb2xlYW4pID0+IHZvaWQ7XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIEVkaXQgaWNvbiBvbiBhIHN0ZXAgKHdoZW4gaXNEZWJ1ZyBpcyB0cnVlKS4gUmVjZWl2ZXMgdGhlIHN0ZXAgY29uZmlnIHNvIHRoZSBwYXJlbnQgY2FuIG9wZW4gYW4gZWRpdG9yLiAqL1xuICBASW5wdXQoKSBvbkVkaXRTdGVwSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogQWRkLXN0ZXAgbWVudSBvcHRpb25zIChlLmcuIFwiQWRkIGJlZm9yZVwiLCBcIkFkZCBhZnRlclwiKS4gV2hlbiBzZXQsIHBhc3NlZCB0byBhbGwgcmVuZGVyZWQgc3RlcHM7IHdoZW4gdW5zZXQsIHN0ZXBzIHVzZSB0aGVpciBkZWZhdWx0LiBNYW5hZ2VkIGxpa2UgaHR0cE1ldGhvZE9wdGlvbnMgaW4gdGhlIEFQSSBlZGl0IHNlY3Rpb24uICovXG4gIEBJbnB1dCgpIGFkZFN0ZXBNZW51T3B0aW9ucz86IEFkZFN0ZXBNZW51T3B0aW9uW107XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBQbHVzIG1lbnUuIFJlY2VpdmVzIHRoZSBvcHRpb24gYW5kIHRoZSBzdGVwIGNvbmZpZy4gKi9cbiAgQElucHV0KCkgb25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgLyoqIE1vcmUgb3B0aW9ucyAodGhyZWUtZG90KSBtZW51IG9wdGlvbnMuIFdoZW4gc2V0LCBwYXNzZWQgdG8gYWxsIHJlbmRlcmVkIHN0ZXBzLiAqL1xuICBASW5wdXQoKSBzdGVwTW9yZU1lbnVPcHRpb25zPzogU3RlcE1vcmVNZW51T3B0aW9uW107XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBNb3JlIG9wdGlvbnMgKHRocmVlLWRvdCkgbWVudS4gUmVjZWl2ZXMgdGhlIG9wdGlvbiBhbmQgdGhlIHN0ZXAgY29uZmlnLiAqL1xuICBASW5wdXQoKSBvblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbiwgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwYXNzZWQgdG8gbG9vcC9jb25kaXRpb24gc3RlcHMgc28gdGhleSBjYW4gc3VwcGx5IHBlci1zdGVwIG1lbnUgb3B0aW9ucyB0byB0aGVpciBuZXN0ZWQgc3RlcC1yZW5kZXJlcnMgKHN1cHBvcnRzIGFyYml0cmFyeSBuZXN0aW5nKS4gKi9cbiAgQElucHV0KCkgZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IEFkZFN0ZXBNZW51T3B0aW9uW107XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBwYXNzZWQgdG8gbG9vcC9jb25kaXRpb24gc3RlcHMgc28gdGhleSBjYW4gc3VwcGx5IHBlci1zdGVwIG1lbnUgb3B0aW9ucyB0byB0aGVpciBuZXN0ZWQgc3RlcC1yZW5kZXJlcnMgKHN1cHBvcnRzIGFyYml0cmFyeSBuZXN0aW5nKS4gKi9cbiAgQElucHV0KCkgZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZD86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBTdGVwTW9yZU1lbnVPcHRpb25bXTtcbiAgQElucHV0KCkgc3RlcE51bWJlcj86IHN0cmluZztcbiAgLyoqIFdoZW4gdHJ1ZSwgdGhlIHBhcmVudCBzdGVwIGlzIHNraXBwZWQg4oCUIGJyZWFrcG9pbnRzIG9uIGFsbCBuZXN0ZWQgc3RlcHMgYXJlIGRpc2FibGVkLiAqL1xuICBASW5wdXQoKSBwYXJlbnRTa2lwcGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIEFkZCAocGx1cykgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHsgb3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbjsgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBNb3JlIG9wdGlvbnMgKHRocmVlLWRvdCkgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIHN0ZXBNb3JlT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uOyBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZyB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFwiKyBBZGQgc3RlcCBpbnNpZGUgbG9vcFwiIG9uIGEgKHBvc3NpYmx5IG5lc3RlZCkgbG9vcCBzdGVwLiBQYXlsb2FkIGlzIHRoZSBsb29wIHN0ZXAuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwSW5zaWRlTG9vcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY29tcG9uZW50UmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBjb21wb25lbnQgaXMgbG9hZGVkIGFuZCByZWFkeVxuXG4gIC8qKiBFZmZlY3RpdmUgdHlwZSBmb3IgY29tcG9uZW50IGxvb2t1cDogJ2ZpbGUtZG93bmxvYWQnIHdoZW4gdGVzdFN0ZXBUeXBlID09PSAnZ2VuZXJhdGVEb2N1bWVudCcsICdsb29wJyBmb3IgRk9SX0xPT1AvV0hJTEVfTE9PUC4gKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVTdGVwVHlwZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdCA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgIGNvbnN0IHR5cGUgPSAoc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlIHx8IHQgfHwgJyc7XG4gICAgaWYgKHQgPT09ICdnZW5lcmF0ZURvY3VtZW50JykgcmV0dXJuICdmaWxlLWRvd25sb2FkJztcbiAgICBpZiAodHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCB0eXBlID09PSAnV0hJTEVfTE9PUCcpIHJldHVybiAnbG9vcCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc3RlcCBpcyBhIGxvb3Agc3RlcCAoZm9yLCB3aGlsZSwgb3IgZ2VuZXJpYyBsb29wKS4gKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IChzdGVwIGFzIGFueSkuZGlzcGxheVR5cGUgfHwgKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgJyc7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdsb29wJyB8fCB0eXBlID09PSAnRk9SX0xPT1AnIHx8IHR5cGUgPT09ICdXSElMRV9MT09QJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGVmZmVjdGl2ZSBkZWJ1Z1BvaW50U2V0IHNvIGl0IHByb3BhZ2F0ZXMgd2hlbiB0b2dnbGVkIChlLmcuIFN0b3J5Ym9vayBDb250cm9scykuICovXG4gIHByaXZhdGUgZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWJ1Z1BvaW50U2V0ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmRlYnVnUG9pbnRTZXQ7XG4gICAgaWYgKHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgJiYgdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcih0aGlzLnN0ZXApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMgPSBuZXcgV2Vha01hcDxhbnksIFNldDxzdHJpbmc+PigpOyAvLyBUcmFjayB3aGljaCBFdmVudEVtaXR0ZXJzIGhhdmUgYmVlbiBzdWJzY3JpYmVkIHRvXG4gIC8vIFRyYWNrIHdoZXRoZXIgY2hpbGQgY29tcG9uZW50J3MgbmdPbkluaXQgaGFzIHJ1biAoY29uZmlnIGlzIGJ1aWx0KS5cbiAgLy8gZGV0ZWN0Q2hhbmdlcygpIG11c3QgTk9UIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24g4oCUIGl0IGZvcmNlcyB0ZW1wbGF0ZVxuICAvLyBldmFsdWF0aW9uIHdoaWNoIGNyYXNoZXMgb24gdW5kZWZpbmVkIGNvbmZpZyBwcm9wZXJ0aWVzLlxuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbml0aWFsaXplZCA9IG5ldyBXZWFrTWFwPFZpZXdDb250YWluZXJSZWYsIGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgbGFzdFN0ZXBJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFN0ZXBUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1N0ZXBLZXk6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9sYXN0RGVidWdQb2ludERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0NPTVBPTkVOVF9NQVApIHByaXZhdGUgY29tcG9uZW50TWFwOiBNYXA8c3RyaW5nLCBUeXBlPGFueT4+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKiBDYWxscyBkZXRlY3RDaGFuZ2VzKCkgb25seSBpZiB0aGUgY2hpbGQncyBuZ09uSW5pdCBoYXMgYWxyZWFkeSBydW4gKGkuZS4gY29uZmlnIGlzIGJ1aWx0KS5cbiAgICogQmVmb3JlIGluaXRpYWxpemF0aW9uLCBmYWxscyBiYWNrIHRvIG1hcmtGb3JDaGVjaygpIHdoaWNoIHF1ZXVlcyBDRCBmb3IgdGhlIG5leHQgY3ljbGVcbiAgICogd2l0aG91dCBmb3JjaW5nIGltbWVkaWF0ZSB0ZW1wbGF0ZSBldmFsdWF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzYWZlRGV0ZWN0Q2hhbmdlcyhjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+KTogdm9pZCB7XG4gICAgaWYgKCFjb21wb25lbnRSZWY/LmluamVjdG9yKSByZXR1cm47XG4gICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICBpZiAoIWluc3RhbmNlQ2RyKSByZXR1cm47XG5cbiAgICBpZiAoU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluaXRpYWxpemVkLmdldCh0aGlzLmNvbnRhaW5lcikpIHtcbiAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50U3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8uY3VycmVudFZhbHVlIHx8IHRoaXMuc3RlcDtcbiAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBjaGFuZ2VzWydzdGVwJ10/LnByZXZpb3VzVmFsdWU7XG5cbiAgICAvLyBDaGVjayBpZiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0IGNoYW5nZWQgKGZvciBsb29wIHN0ZXBzKVxuICAgIC8vICYmIFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudHN0ZXAuZGlzcGxheVR5cGUgPT09ICdsb29wJyAmJiBcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDA7XG5cbiAgICAvLyBJZiBzZWxlY3RlZEl0ZXJhdGlvbklkIGNoYW5nZWQgZm9yIGEgbG9vcCBzdGVwLCB1cGRhdGUgaXQgZGlyZWN0bHlcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddICYmIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5wcmV2aW91c1ZhbHVlO1xuXG4gICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb25JZCB3aGVuIGlucHV0IGNoYW5nZXMgZnJvbSBwYXJlbnRcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVHJ5IHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvbiBpZiBpdGVyYXRpb25zIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGxvb3Atc3RlcCBjb21wb25lbnRcbiAgICAgICAgICB0aGlzLnNhZmVEZXRlY3RDaGFuZ2VzKGNvbXBvbmVudFJlZik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBzdGVwTnVtYmVyIGlucHV0IGNoYW5nZWQsIHVwZGF0ZSBuZXN0ZWQgY29tcG9uZW50IGluc3RhbmNlc1xuICAgIGlmIChjaGFuZ2VzWydzdGVwTnVtYmVyJ10gJiYgY2hhbmdlc1snc3RlcE51bWJlciddLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc3RlcE51bWJlciddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBzdGVwTnVtYmVyIHdoZW4gaW5wdXQgY2hhbmdlcyBmcm9tIHBhcmVudFxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcE51bWJlciA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICAgIHRoaXMuc2FmZURldGVjdENoYW5nZXMoY29tcG9uZW50UmVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzVXBsb2FkaW5nQmFzZWxpbmUgb3IgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSB8fCBjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgLy8gVXBkYXRlIGlzVXBsb2FkaW5nQmFzZWxpbmUgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoY2hhbmdlc1snaXNVcGxvYWRpbmdCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBpbiBjb25maWcgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJ10pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgICAgdGhpcy5zYWZlRGV0ZWN0Q2hhbmdlcyhjb21wb25lbnRSZWYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGRvd25sb2FkaW5nU3RlcElkIGNoYW5nZWQsIHVwZGF0ZSBmaWxlLWRvd25sb2FkIGluc3RhbmNlIGlzRG93bmxvYWRpbmdcbiAgICBpZiAoY2hhbmdlc1snZG93bmxvYWRpbmdTdGVwSWQnXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZiAmJiB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKGN1cnJlbnRTdGVwKSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICAgIGNvbnN0IHRpZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgIHRoaXMuc2FmZURldGVjdENoYW5nZXMoY29tcG9uZW50UmVmKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpc0RlYnVnLCBkZWJ1Z1BvaW50U2V0IG9yIGdldERlYnVnUG9pbnRTZXRIYW5kbGVyIGNoYW5nZWQgKGUuZy4gdXNlciB0b2dnbGVkIGRlYnVnIGluIHBvcnRhbC9TdG9yeWJvb2spLCB1cGRhdGUgbmVzdGVkIGluc3RhbmNlXG4gICAgaWYgKGNoYW5nZXNbJ2lzRGVidWcnXSB8fCBjaGFuZ2VzWydkZWJ1Z1BvaW50U2V0J10gfHwgY2hhbmdlc1snZ2V0RGVidWdQb2ludFNldEhhbmRsZXInXSB8fCBjaGFuZ2VzWydvbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyJ10gfHwgY2hhbmdlc1snb25FZGl0U3RlcEhhbmRsZXInXSB8fCBjaGFuZ2VzWydhZGRTdGVwTWVudU9wdGlvbnMnXSB8fCBjaGFuZ2VzWydvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyJ10gfHwgY2hhbmdlc1snc3RlcE1vcmVNZW51T3B0aW9ucyddIHx8IGNoYW5nZXNbJ29uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyJ10gfHwgY2hhbmdlc1snZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkJ10gfHwgY2hhbmdlc1snZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCddIHx8IGNoYW5nZXNbJ3BhcmVudFNraXBwZWQnXSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyA9IHRoaXMuaXNEZWJ1ZztcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucGFyZW50U2tpcHBlZCA9ICEhdGhpcy5wYXJlbnRTa2lwcGVkO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gdGhpcy5nZXRFZmZlY3RpdmVEZWJ1Z1BvaW50U2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmFkZFN0ZXBNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwTWVudU9wdGlvbnMgPSB0aGlzLmFkZFN0ZXBNZW51T3B0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU1lbnVPcHRpb25zID0gdGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQ7XG4gICAgICAgIGlmICh0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgICAgLy8gRW5zdXJlIGRlYnVnIHBvaW50IGNsaWNrIGlzIHdpcmVkIHdoZW4gaXNEZWJ1ZyBiZWNvbWVzIHRydWUgKGUuZy4gdG9nZ2xlZCBpbiBTdG9yeWJvb2sgQ29udHJvbHMpXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj8uKHRoaXMuc3RlcCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZGVidWdQb2ludENoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIGVkaXQgc3RlcCB3aGVuIGlzRGVidWcgYW5kIGhhbmRsZXIgYXJlIHByZXNlbnRcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcCAmJiB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdlZGl0U3RlcCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2VkaXRTdGVwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgYWRkLXN0ZXAgb3B0aW9uIHNlbGVjdCB3aGVuIGlzRGVidWcgKGVtaXQgYW5kIG9wdGlvbmFsbHkgY2FsbCBoYW5kbGVyKVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2FkZFN0ZXBPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdC5zdWJzY3JpYmUoKG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgICB0aGlzLmFkZFN0ZXBPcHRpb25TZWxlY3QuZW1pdCh7IG9wdGlvbiwgc3RlcDogdGhpcy5zdGVwIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnYWRkU3RlcE9wdGlvblNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHN0ZXAgbW9yZSBvcHRpb24gc2VsZWN0IHdoZW4gaXNEZWJ1ZyAoZW1pdCBhbmQgb3B0aW9uYWxseSBjYWxsIGhhbmRsZXIpXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhZmVEZXRlY3RDaGFuZ2VzKGNvbXBvbmVudFJlZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHN0ZXAgaWRlbnRpZmllcnMgKHVzZSBlZmZlY3RpdmUgdHlwZTogZ2VuZXJhdGVEb2N1bWVudCAtPiBmaWxlLWRvd25sb2FkKVxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSBjdXJyZW50U3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IGN1cnJlbnRTdGVwLmlkO1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApIHx8IChjdXJyZW50U3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlO1xuXG4gICAgLy8gVXNlIHN0b3JlZCBsYXN0U3RlcElkIGFuZCBsYXN0U3RlcFR5cGUgdG8gcHJvcGVybHkgZGV0ZWN0IGNoYW5nZXNcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBzdGVwIG9iamVjdCByZWZlcmVuY2UgZG9lc24ndCBjaGFuZ2UgYnV0IHByb3BlcnRpZXMgZG9cbiAgICAvLyBPbmx5IGNoZWNrIGZvciBhY3R1YWwgSUQvdHlwZSBjaGFuZ2VzLCBub3QganVzdCByZWZlcmVuY2UgY2hhbmdlc1xuICAgIC8vIGNvbnN0IHN0ZXBUeXBlQ2hhbmdlZCA9ICFwcmV2aW91c1N0ZXAgfHwgY3VycmVudFN0ZXBUeXBlICE9PSAocHJldmlvdXNTdGVwLmRpc3BsYXlUeXBlIHx8IHRoaXMubGFzdFN0ZXBUeXBlKTtcbiAgICAvLyBjb25zdCBzdGVwSWRDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcElkICE9PSAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkIHx8IHRoaXMubGFzdFN0ZXBJZCk7XG4gICAgY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gY3VycmVudFN0ZXBUeXBlICE9PSB0aGlzLmxhc3RTdGVwVHlwZTtcbiAgICBjb25zdCBzdGVwSWRDaGFuZ2VkID0gY3VycmVudFN0ZXBJZCAhPT0gdGhpcy5sYXN0U3RlcElkO1xuICAgIFxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAvLyBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IHJlbG9hZHMgd2hlbiBvbmx5IG5lc3RlZCBwcm9wZXJ0aWVzIGNoYW5nZVxuICAgIGlmIChzdGVwVHlwZUNoYW5nZWQgfHwgc3RlcElkQ2hhbmdlZCkge1xuICAgICAgdGhpcy5sYXN0U3RlcElkID0gY3VycmVudFN0ZXBJZDtcbiAgICAgIHRoaXMubGFzdFN0ZXBUeXBlID0gY3VycmVudFN0ZXBUeXBlO1xuICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICBsZXQgZXhwYW5kZWRDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBwcmV2aW91c0V4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIocHJldmlvdXNTdGVwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgXG4gICAgICBleHBhbmRlZENoYW5nZWQgPSBjdXJyZW50RXhwYW5kZWQgIT09IHByZXZpb3VzRXhwYW5kZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG9ubHkgbmVzdGVkIGRhdGEgY2hhbmdlZCAoY2hpbGRyZW4sIG5lc3RlZFN0ZXBzLCBzdGVwcywgZXhwYW5kZWQpLCBcbiAgICAvLyB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICAvLyBUaGlzIHByZXZlbnRzIHBhcmVudCBzdGVwcyBmcm9tIGJsaW5raW5nIHdoZW4gbmVzdGVkIHN0ZXBzIGV4cGFuZFxuICAgIGNvbnN0IG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCA9IHByZXZpb3VzU3RlcCAmJiAoXG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLnN0ZXBzIHx8XG4gICAgICBleHBhbmRlZENoYW5nZWQgfHxcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5icmFuY2hlcyB8fFxuICAgICAgKChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jb25maWc/LmV4cGFuZGVkKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICBpZiAob25seU5lc3RlZERhdGFDaGFuZ2VkICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB0aGUgc3RvcmVkIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIG1ldGhvZCBmcm9tIG9yaWdpbmFsXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIG90aGVyIGNoYW5nZXMsIHVzZSBjb21wcmVoZW5zaXZlIHVwZGF0ZSBpZiBjb21wb25lbnQgZXhpc3RzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCAmJlxuICAgICAgICBwcmV2aW91c1N0ZXAuZGlzcGxheVR5cGUgPT09IGN1cnJlbnRTdGVwLmRpc3BsYXlUeXBlICYmXG4gICAgICAgIChwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBwcmV2aW91c1N0ZXAuaWQpID09PSAoY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBjdXJyZW50U3RlcC5pZCkpIHtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG5ldyBzdGVwIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgY29udGFpbmVyIGlzIGVtcHR5IChjb21wb25lbnQgZG9lc24ndCBleGlzdCB5ZXQpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcDogYW55LCBwcmV2aW91c1N0ZXA6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICBpZiAoIWluc3RhbmNlIHx8ICFjb21wb25lbnRSZWYgfHwgIXRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgY29tbW9ubHkgY2hhbmdlIGFuZCBuZWVkIHRvIGJlIHVwZGF0ZWRcbiAgICBjb25zdCBpbXBvcnRhbnRQcm9wZXJ0aWVzID0gWydzdGF0dXMnLCAnZHVyYXRpb24nLCAnZXhwYW5kZWQnLCAnc3ViU3RlcHMnLCAnY2hpbGRyZW4nLCAnbmVzdGVkU3RlcHMnLCAnc3RlcHMnLFxuICAgICAgJ2V4ZWN1dGlvbkRhdGEnLCAnYWN0aW9uJywgJ3RpdGxlJywgJ3Jlc3VsdCcsICdtZXRob2QnLCAnZW5kcG9pbnQnLCAnc3RhdHVzQ29kZScsICdicmFuY2hlcycsXG4gICAgICAncmVzcG9uc2VUaW1lJywgJ2FjdGlvbnMnLCAnaW5pdGlhbEFjdGlvbnMnLCAncHJvbXB0JywgJ29wdGltaXplZFJ1bicsICdhY3Rpb25Db3VudCcsICdpdGVyYXRpb25zJywgJ3NlbGVjdGVkSXRlcmF0aW9uSWQnLCAnc3RlcE51bWJlcicsXG4gICAgICAnaXNVcGxvYWRpbmdCYXNlbGluZScsICdpc01ha2luZ0N1cnJlbnRCYXNlbGluZScsICdzZWxlY3RlZFRhYklucHV0JywgJ3N0ZXBEZWxldGVkJ107XG5cbiAgICAvLyBVcGRhdGUgaW1wb3J0YW50IHByb3BlcnRpZXNcbiAgICBpbXBvcnRhbnRQcm9wZXJ0aWVzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIEZvciBzZWxlY3RlZEl0ZXJhdGlvbklkIG9uIGxvb3Agc3RlcHMsIHByaW9yaXRpemUgdGhlIGlucHV0IHZhbHVlIG92ZXIgc3RlcCB2YWx1ZVxuICAgICAgaWYgKGtleSA9PT0gJ3NlbGVjdGVkSXRlcmF0aW9uSWQnICYmIHRoaXMuaXNMb29wU3RlcChjdXJyZW50U3RlcCkgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpdGVyYXRpb25zJyAmJiB0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApKSB7XG4gICAgICAgIC8vIFdoZW4gaXRlcmF0aW9ucyBhcmUgdXBkYXRlZCwgY2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb25cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZnRlciBpdGVyYXRpb25zIGFyZSB1cGRhdGVkLCB0cnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgc2V0XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgfHwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpc1VwbG9hZGluZ0Jhc2VsaW5lJyB8fCBrZXkgPT09ICdpc01ha2luZ0N1cnJlbnRCYXNlbGluZScpIHtcbiAgICAgICAgLy8gRm9yIGxvYWRpbmcgc3RhdGUgb2JqZWN0cywgYWx3YXlzIHVzZSB0aGUgaW5wdXQgdmFsdWUgKHRoZXkncmUgcGFzc2VkIGZyb20gcGFyZW50KVxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBrZXkgPT09ICdpc1VwbG9hZGluZ0Jhc2VsaW5lJyA/IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZSA6IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgaWYgdGhlIHJlZmVyZW5jZSBjaGFuZ2VkIChuZXcgb2JqZWN0IGNyZWF0ZWQpXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGVwTnVtYmVyJyAmJiB0aGlzLnN0ZXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBGb3Igc3RlcE51bWJlciwgcHJpb3JpdGl6ZSB0aGUgaW5wdXQgdmFsdWUgb3ZlciBzdGVwIHZhbHVlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuc3RlcE51bWJlcjtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYWN0aW9uJyAmJiBjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2FpLWFnZW50Jykge1xuICAgICAgICAvLyBGb3IgYWktYWdlbnQgc3RlcHMsIGVuc3VyZSB0aXRsZSBhbmQgcHJvbXB0IGFyZSBzZXQgZnJvbSBhY3Rpb25cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgLy8gVXBkYXRlIGFjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSB0aXRsZSBhbmQgcHJvbXB0IGZyb20gYWN0aW9uIGlmIHRoZXkncmUgbm90IHNldCBvciBlbXB0eVxuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkge1xuICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy50aXRsZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnByb21wdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucHJvbXB0ID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnByb21wdCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gZm9yIG9iamVjdHMvYXJyYXlzLCBzaGFsbG93IGZvciBwcmltaXRpdmVzXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGlzRGVidWcsIHBhcmVudFNraXBwZWQgYW5kIGRlYnVnUG9pbnRTZXQgZnJvbSBzdGVwLXJlbmRlcmVyIGlucHV0cyAocGFyZW50IG1heSBoYXZlIHVwZGF0ZWQgYWZ0ZXIgdG9nZ2xlKVxuICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnICE9PSB0aGlzLmlzRGVidWcpIHtcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnBhcmVudFNraXBwZWQgIT09ICEhdGhpcy5wYXJlbnRTa2lwcGVkKSB7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5wYXJlbnRTa2lwcGVkID0gISF0aGlzLnBhcmVudFNraXBwZWQ7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgbmV4dERlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCAhPT0gbmV4dERlYnVnUG9pbnRTZXQpIHtcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSBuZXh0RGVidWdQb2ludFNldDtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFsc28gdXBkYXRlIGFsbCBvdGhlciBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmtleXMoY3VycmVudFN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiAhaW1wb3J0YW50UHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzcGVjaWFsIHByb3BlcnRpZXMgdGhhdCBtaWdodCBuZWVkIHNwZWNpYWwgaGFuZGxpbmdcbiAgICBpZiAodGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgIT09IGNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcHMgPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc3luYyBncm91cE5hbWUgZnJvbSBhY3Rpb25cbiAgICAgIGNvbnN0IG5ld0dyb3VwTmFtZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmFjdGlvbiB8fCAnJztcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5ncm91cE5hbWUgIT09IG5ld0dyb3VwTmFtZSkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5ncm91cE5hbWUgPSBuZXdHcm91cE5hbWU7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZ3JvdXBOYW1lID0gbmV3R3JvdXBOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBlbnN1cmUgYnJhbmNoZXMgaXMgcHJvcGVybHkgdXBkYXRlZFxuICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IGNoYW5nZXMgaW4gbmVzdGVkIHN1YlN0ZXBzXG4gICAgaWYgKGN1cnJlbnRTdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoZXMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoZXMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG5cbiAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IG5lc3RlZCBzdWJTdGVwcyBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5oYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudEJyYW5jaGVzLCBwcmV2aW91c0JyYW5jaGVzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gWy4uLmN1cnJlbnRCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICB9KSldO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmJyYW5jaGVzID0gKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IGVuc3VyZSBuZXN0ZWRTdGVwcyBpcyBwcm9wZXJseSB1cGRhdGVkXG4gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBjaGlsZHJlbiBhcmUgbG9hZGVkIGZyb20gdGhlIEFQSSBvciB3aGVuIHN3aXRjaGluZyBicmFuY2hlc1xuICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudE5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c05lc3RlZFN0ZXBzID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzLCBub3QganVzdCByZWZlcmVuY2UgY2hhbmdlc1xuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIElGIGFuZCBFTFNFX0lGIGJyYW5jaGVzXG4gICAgICBpZiAodGhpcy5oYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudE5lc3RlZFN0ZXBzLCBwcmV2aW91c05lc3RlZFN0ZXBzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gWy4uLmN1cnJlbnROZXN0ZWRTdGVwc107XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBmaWxlLWRvd25sb2FkIChpbmNsdWRpbmcgZ2VuZXJhdGVEb2N1bWVudCk6IHN5bmMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgaWYgKHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgIGNvbnN0IGdkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBjb25zdCBwcmV2R2QgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBpZiAoZ2QgIT09IHByZXZHZCB8fCBnZD8uZmlsZU5hbWUgIT09IHByZXZHZD8uZmlsZU5hbWUgfHwgZ2Q/LmZpbGVUeXBlICE9PSBwcmV2R2Q/LmZpbGVUeXBlIHx8IGdkPy5zM0ZpbGVOYW1lICE9PSBwcmV2R2Q/LnMzRmlsZU5hbWUpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgY29uc3QgbmV4dERvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgIT09IG5leHREb3dubG9hZGluZykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gbmV4dERvd25sb2FkaW5nO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGVuc3VyZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGZyb20gaW5wdXQgaXMgdXNlZFxuICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAodGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBjb25zdCBpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdmFsdWVzIHRvIGhhbmRsZSBudWxsL3VuZGVmaW5lZCBjb25zaXN0ZW50bHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbDogYW55KSA9PiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWwpO1xuICAgICAgY29uc3QgY3VycmVudE5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBjb25zdCBpbnN0YW5jZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuXG4gICAgICBpZiAoY3VycmVudE5vcm1hbGl6ZWQgIT09IGluc3RhbmNlTm9ybWFsaXplZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBzdGF0ZSAtIHVzZSBzZXRJbnB1dCB0byBwcm9wZXJseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgLy8gQWx3YXlzIHJlY2FsY3VsYXRlIGV4cGFuZGVkIHN0YXRlIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZVxuICAgIGxldCBleHBhbmRlZFN0YXRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgZXhwYW5kZWRTdGF0ZSA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKGN1cnJlbnRTdGVwKTtcbiAgICB9IGVsc2UgaWYgKChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4cGFuZGVkU3RhdGUgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGV4cGFuZGVkIGlmIGl0IGNoYW5nZWRcbiAgICBpZiAoZXhwYW5kZWRTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAvLyBVc2Ugc2V0SW5wdXQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBASW5wdXQoKSBleHBhbmRlZCBwcm9wZXJ0eVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCBpbiBjaGlsZCBjb21wb25lbnRzXG4gICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIGV4cGFuZGVkU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIEFuZ3VsYXIgdmVyc2lvbnM6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICAvLyBNYW51YWxseSBjYWxsIG5nT25DaGFuZ2VzIGlmIHRoZSBjb21wb25lbnQgaW1wbGVtZW50cyBpdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGV4cGFuZGVkU3RhdGUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgIGlmIChjdXJyZW50U3RlcCkge1xuICAgICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHJlZmVyZW5jZSAtIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIGluY2x1ZGVkXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggY3VycmVudCBzdGVwIHRvIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIHN5bmNlZFxuICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLmN1cnJlbnRTdGVwIH07XG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxuICAgICAgLy8gVXNlIHRoZSBhbHJlYWR5IHVwZGF0ZWQgYnJhbmNoZXMgZnJvbSBpbnN0YW5jZSB0byBtYWludGFpbiByZWZlcmVuY2UgY29uc2lzdGVuY3lcbiAgICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3RlcCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgb24gdGhlIGluc3RhbmNlXG4gICAgaWYgKCdzdGVwJyBpbiBpbnN0YW5jZSkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IGN1cnJlbnRTdGVwO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgY29uc3QgcHJldmlvdXNTZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHNlbGZIZWFsQW5hbHlzaXMsIHByZXZpb3VzU2VsZkhlYWxBbmFseXNpcykpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzXG4gICAgLy8gVGhpcyBlbnN1cmVzIG9ubHkgdGhlIG5lc3RlZCBzdGVwIHVwZGF0ZXMgd2l0aG91dCBhZmZlY3RpbmcgcGFyZW50IHN0ZXBzXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuc2FmZURldGVjdENoYW5nZXMoY29tcG9uZW50UmVmKTtcbiAgICAgIC8vIERvbid0IGNhbGwgbWFya0ZvckNoZWNrIG9uIHRoaXMgY29tcG9uZW50IHRvIGF2b2lkIHRyaWdnZXJpbmcgcGFyZW50IHJlLXJlbmRlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgbG9vcC1zdGVwIHNlbGVjdGVkSXRlcmF0aW9uIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VzXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdGVyYXRpb25zIG1pZ2h0IG5vdCBiZSBsb2FkZWQgeWV0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2U6IGFueSwgc2VsZWN0ZWRJdGVyYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAvLyBTeW5jIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHdpdGggdGhlIGlucHV0IHZhbHVlXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgcHJvdmlkZWQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBpdGVyYXRpb25zIGFyZSBub3QgYXZhaWxhYmxlIHlldCwgdGhlIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgYWxyZWFkeSBzZXRcbiAgICAvLyBhbmQgd2lsbCBiZSB1c2VkIHdoZW4gaXRlcmF0aW9ucyBiZWNvbWUgYXZhaWxhYmxlIChoYW5kbGVkIGluIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlIGFuZCBuZ0RvQ2hlY2spXG4gIH1cblxuICBwcml2YXRlIGhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50OiBhbnksIHByZXZpb3VzOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBTaGFsbG93IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZXNcbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgcHJldmlvdXMgPT0gbnVsbCkgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzO1xuXG4gICAgLy8gRm9yIGFycmF5cywgY2hlY2sgbGVuZ3RoIGFuZCByZWZlcmVuY2VcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSB8fCBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgIT09IEFycmF5LmlzQXJyYXkocHJldmlvdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gcHJldmlvdXMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIG9iamVjdHMsIGRvIHNoYWxsb3cgY29tcGFyaXNvbiAoY2hlY2sgcmVmZXJlbmNlKVxuICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByZXZpb3VzID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICAvLyBGb3IgcHJpbWl0aXZlc1xuICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWVwIGNvbXBhcmlzb24gZm9yIGJyYW5jaGVzIGFycmF5IHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggYnJhbmNoIGFuZCBpdHMgc3ViU3RlcHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCcmFuY2ggPSBjdXJyZW50W2ldO1xuICAgICAgY29uc3QgcHJldmlvdXNCcmFuY2ggPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c0JyYW5jaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGJyYW5jaCBwcm9wZXJ0aWVzIGNoYW5nZWRcbiAgICAgIGlmIChjdXJyZW50QnJhbmNoLnR5cGUgIT09IHByZXZpb3VzQnJhbmNoLnR5cGUgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5sYWJlbCAhPT0gcHJldmlvdXNCcmFuY2gubGFiZWwgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5leGVjdXRlZCAhPT0gcHJldmlvdXNCcmFuY2guZXhlY3V0ZWQgfHxcbiAgICAgICAgY3VycmVudEJyYW5jaC5jb25kaXRpb25UeXBlICE9PSBwcmV2aW91c0JyYW5jaC5jb25kaXRpb25UeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzdWJTdGVwcyBhcnJheSBjaGFuZ2VkIChsZW5ndGggb3IgcmVmZXJlbmNlKVxuICAgICAgY29uc3QgY3VycmVudFN1YlN0ZXBzID0gY3VycmVudEJyYW5jaC5zdWJTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3ViU3RlcHMgPSBwcmV2aW91c0JyYW5jaC5zdWJTdGVwcyB8fCBbXTtcblxuICAgICAgaWYgKGN1cnJlbnRTdWJTdGVwcy5sZW5ndGggIT09IHByZXZpb3VzU3ViU3RlcHMubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMgIT09IHByZXZpb3VzU3ViU3RlcHMpIHJldHVybiB0cnVlOyAvLyBSZWZlcmVuY2UgY2hlY2tcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBuZXN0ZWRTdGVwcyBhcnJheSB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBjb25kaXRpb24gc3RlcHMgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBicmFuY2hlc1xuICAgKi9cbiAgcHJpdmF0ZSBoYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudDogYW55W10sIHByZXZpb3VzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY3VycmVudCAmJiAhcHJldmlvdXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7IC8vIFNhbWUgcmVmZXJlbmNlXG5cbiAgICAvLyBDb21wYXJlIGVhY2ggc3RlcCBieSBJRCB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzXG4gICAgLy8gVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIGFycmF5IGxlbmd0aCBpcyBzYW1lIGJ1dCBjb250ZW50IGRpZmZlcnMgKGUuZy4sIHN3aXRjaGluZyBicmFuY2hlcylcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IHByZXZpb3VzW2ldO1xuXG4gICAgICBpZiAoIXByZXZpb3VzU3RlcCkgcmV0dXJuIHRydWU7XG5cbiAgICAgIC8vIENvbXBhcmUgc3RlcCBJRHMgLSBpZiBJRHMgZGlmZmVyLCBjb250ZW50IGhhcyBjaGFuZ2VkXG4gICAgICBjb25zdCBjdXJyZW50U3RlcElkID0gY3VycmVudFN0ZXAuaWQgfHwgY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RlcElkID0gcHJldmlvdXNTdGVwLmlkIHx8IHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkO1xuXG4gICAgICBpZiAoY3VycmVudFN0ZXBJZCAhPT0gcHJldmlvdXNTdGVwSWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIHN0ZXAgdHlwZSBjaGFuZ2VkIChpbXBvcnRhbnQgZm9yIGJyYW5jaCBzd2l0Y2hpbmcpXG4gICAgICBpZiAoY3VycmVudFN0ZXAuZGlzcGxheVR5cGUgIT09IHByZXZpb3VzU3RlcC5kaXNwbGF5VHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGVzdFN0ZXBUeXBlIGNoYW5nZWQgKElGIHZzIEVMU0VfSUYgdnMgRUxTRSlcbiAgICAgIGlmIChjdXJyZW50U3RlcC50ZXN0U3RlcFR5cGUgIT09IHByZXZpb3VzU3RlcC50ZXN0U3RlcFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciB1cGRhdGUgdG9rZW4gaWYgcHJlc2VudCAodXNlZCB0byBmb3JjZSByZS1yZW5kZXIpXG4gICAgICBpZiAoY3VycmVudFN0ZXAuX3VwZGF0ZVRva2VuICYmIGN1cnJlbnRTdGVwLl91cGRhdGVUb2tlbiAhPT0gcHJldmlvdXNTdGVwLl91cGRhdGVUb2tlbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldFN0ZXBLZXkoc3RlcDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXN0ZXApIHJldHVybiAnJztcbiAgICAvLyBDcmVhdGUgYSBrZXkgZnJvbSBpbXBvcnRhbnQgcHJvcGVydGllcyB0aGF0IGNoYW5nZVxuICAgIC8vIEluY2x1ZGUgZXhlY3V0aW9uRGF0YS5zdGVwU3RhdHVzIGZvciBsaXZlIGV4ZWN1dGlvbiBzY2VuYXJpb3NcbiAgICBjb25zdCBleGVjdXRpb25TdGF0dXMgPSBzdGVwLmV4ZWN1dGlvbkRhdGE/LnN0ZXBTdGF0dXMgfHwgc3RlcC5zdGF0dXMgfHwgJyc7XG4gICAgLy8gSW5jbHVkZSBicmFuY2hlcyBsZW5ndGggZm9yIGNvbmRpdGlvbi1zdGVwIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCBicmFuY2hlc0xlbmd0aCA9IChzdGVwLmJyYW5jaGVzIHx8IFtdKS5sZW5ndGg7XG4gICAgLy8gSW5jbHVkZSB0b3RhbCBzdWJTdGVwcyBjb3VudCBhY3Jvc3MgYWxsIGJyYW5jaGVzIGZvciBuZXN0ZWQgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IHRvdGFsU3ViU3RlcHMgPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkucmVkdWNlKChzdW06IG51bWJlciwgYnJhbmNoOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBzdW0gKyAoYnJhbmNoLnN1YlN0ZXBzPy5sZW5ndGggfHwgMCk7XG4gICAgfSwgMCk7XG4gICAgLy8gSW5jbHVkZSBpbml0aWFsQWN0aW9ucyBsZW5ndGggZm9yIGFwaS1zdGVwIGxpdmUgZXhlY3V0aW9uIGxvZ3NcbiAgICBjb25zdCBpbml0aWFsQWN0aW9uc0xlbmd0aCA9IChzdGVwLmluaXRpYWxBY3Rpb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgcmV0dXJuIGAke3N0ZXAuaWQgfHwgJyd9XyR7ZXhlY3V0aW9uU3RhdHVzfV8ke3N0ZXAuc3RhdHVzIHx8ICcnfV8ke3N0ZXAuZHVyYXRpb24gfHwgJyd9XyR7c3RlcC5leHBhbmRlZCB8fCBmYWxzZX1fJHsoc3RlcC5jaGlsZHJlbiB8fCBbXSkubGVuZ3RofV8keyhzdGVwLm5lc3RlZFN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7KHN0ZXAuc3RlcHMgfHwgW10pLmxlbmd0aH1fJHticmFuY2hlc0xlbmd0aH1fJHt0b3RhbFN1YlN0ZXBzfV8ke3N0ZXAuc3RlcE51bWJlciB8fCAnJ31fJHtzdGVwLnN0ZXBEZWxldGVkIHx8IGZhbHNlfV8ke2luaXRpYWxBY3Rpb25zTGVuZ3RofWA7XG4gIH1cblxuICBwcml2YXRlIGxvYWRDb21wb25lbnQoKSB7XG4gICAgXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50U3RlcElkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQgfHwgdGhpcy5zdGVwLmlkO1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUodGhpcy5zdGVwKSB8fCAodGhpcy5zdGVwIGFzIGFueSkuZGlzcGxheVR5cGU7XG5cbiAgICAvLyBPbmx5IGNsZWFyIGFuZCByZWNyZWF0ZSBpZiBzdGVwIElEIG9yIHR5cGUgYWN0dWFsbHkgY2hhbmdlZFxuICAgIGNvbnN0IG5lZWRzUmVjcmVhdGlvbiA9IHRoaXMubGFzdFN0ZXBJZCAhPT0gY3VycmVudFN0ZXBJZCB8fCB0aGlzLmxhc3RTdGVwVHlwZSAhPT0gY3VycmVudFN0ZXBUeXBlO1xuXG4gICAgaWYgKG5lZWRzUmVjcmVhdGlvbikge1xuICAgICAgdGhpcy5jb250YWluZXIuY2xlYXIoKTtcbiAgICAgIC8vIENsZWFyIHN0b3JlZCBpbnN0YW5jZSB3aGVuIHJlY3JlYXRpbmdcbiAgICAgIGNvbnN0IG9sZEluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgaWYgKG9sZEluc3RhbmNlKSB7XG4gICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5kZWxldGUob2xkSW5zdGFuY2UpO1xuICAgICAgfVxuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5kZWxldGUodGhpcy5jb250YWluZXIpO1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbml0aWFsaXplZC5kZWxldGUodGhpcy5jb250YWluZXIpO1xuICAgICAgdGhpcy5sYXN0U3RlcElkID0gY3VycmVudFN0ZXBJZDtcbiAgICAgIHRoaXMubGFzdFN0ZXBUeXBlID0gY3VycmVudFN0ZXBUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBzYW1lIHN0ZXAsIGp1c3QgdXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCBjbGVhcmluZ1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBhbGwgcHJvcGVydGllc1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScpIHtcbiAgICAgICAgICAgIC8vIFVzZSBzZXRJbnB1dCBmb3IgaW5wdXQgcHJvcGVydGllcyB0byB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnZXhwYW5kZWQnICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQoJ2V4cGFuZGVkJywgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBtYW51YWxseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkubmdPbkNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlLCBwcmV2aW91c1ZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHsgLi4uKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLCAuLi50aGlzLnN0ZXAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTeW5jIGZpbGUtZG93bmxvYWQgKGdlbmVyYXRlRG9jdW1lbnQpIHByb3BzIGZyb20gZ2VuZXJhdGVEb2N1bWVudFJlc3VsdFxuICAgICAgICBjb25zdCBlZmZlY3RpdmVUeXBlRm9yVXBkYXRlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZSh0aGlzLnN0ZXApIHx8ICh0aGlzLnN0ZXAgYXMgYW55KS5kaXNwbGF5VHlwZTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZVR5cGVGb3JVcGRhdGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICAgIGNvbnN0IGdkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5nZW5lcmF0ZURvY3VtZW50UmVzdWx0O1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID0gZ2Q/LmZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID8/ICcnO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoID0gZ2Q/LnMzRmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgY29uc3QgdGlkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZU5hbWUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlVHlwZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBzZWxmSGVhbEFuYWx5c2lzIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICAgIGNvbnN0IHNlbGZIZWFsQW5hbHlzaXMgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgZXZlbnQgc3Vic2NyaXB0aW9ucyBhcmUgc3RpbGwgYWN0aXZlIGZvciBzZWxmSGVhbEFjdGlvblxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24gJiYgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikge1xuICAgICAgICAgIC8vIFRyYWNrIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc2VsZkhlYWxBY3Rpb24nKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzZWxmSGVhbEFjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgaGFuZGxlciByZWZlcmVuY2VzXG4gICAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPSB0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI7XG4gICAgICAgIC8vIFN5bmMgaXNEZWJ1ZywgcGFyZW50U2tpcHBlZCBhbmQgZGVidWdQb2ludFNldCBzbyBuZXN0ZWQgc3RlcHMgKGUuZy4gaW5zaWRlIGxvb3ApIGFsd2F5cyBzaG93IGRlYnVnIGljb24gd2hlbiBwYXJlbnQgaGFzIGlzRGVidWcgdHJ1ZVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQgJiYgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyAhPT0gdGhpcy5pc0RlYnVnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyA9IHRoaXMuaXNEZWJ1ZztcbiAgICAgICAgfVxuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5wYXJlbnRTa2lwcGVkID0gISF0aGlzLnBhcmVudFNraXBwZWQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgICAgaWYgKHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBNZW51T3B0aW9ucyA9IHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlTWVudU9wdGlvbnMgPSB0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgICBpZiAodGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgPSB0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyID0gdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyO1xuICAgICAgICAvLyBFbnN1cmUgZGVidWcgcG9pbnQgY2xpY2sgaXMgd2lyZWQgd2hlbiBpc0RlYnVnIGlzIHRydWUgKGUuZy4gYWZ0ZXIgdG9nZ2xpbmcgaW4gU3Rvcnlib29rKVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2UgJiYgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdkZWJ1Z1BvaW50Q2hhbmdlJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI/Lih0aGlzLnN0ZXAsIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2RlYnVnUG9pbnRDaGFuZ2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcCAmJiB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdlZGl0U3RlcCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2VkaXRTdGVwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnYWRkU3RlcE9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI/LihvcHRpb24sIHRoaXMuc3RlcCk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdhZGRTdGVwT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG4gICAgICAgIC8vIENvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcmVhZHksIGVtaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0aXZlVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUodGhpcy5zdGVwKSB8fCAodGhpcy5zdGVwIGFzIGFueSkuZGlzcGxheVR5cGU7XG4gICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuY29tcG9uZW50TWFwLmdldChlZmZlY3RpdmVUeXBlKTtcblxuICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgICAgLy8gU3RvcmUgY29tcG9uZW50IGluc3RhbmNlIGFuZCByZWYgaW4gV2Vha01hcCBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuc2V0KHRoaXMuY29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5zZXQodGhpcy5jb250YWluZXIsIGNvbXBvbmVudFJlZik7XG5cbiAgICAgIC8vIFN0b3JlIGNvbXBvbmVudCByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuXG4gICAgICAvLyBTcHJlYWQgY29uZmlnIHByb3BlcnRpZXMgYXMgaW5kaXZpZHVhbCBpbnB1dHMgZm9yIGNvbXBvbmVudHMgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIC8vIFRoaXMgc3VwcG9ydHMgYm90aCBwYXR0ZXJuczogY29tcG9uZW50cyB0aGF0IGFjY2VwdCBjb25maWcgZGlyZWN0bHkgYW5kIHRob3NlIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBtYXAgY2hpbGRyZW4gdG8gbmVzdGVkU3RlcHMgaWYgbmVzdGVkU3RlcHMgaXMgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgbG9vcFR5cGUgYmFzZWQgb24gYWN0aW9uTmFtZSBvciB0ZXN0U3RlcFR5cGVcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSkge1xuICAgICAgICAvLyBTZXQgbG9vcFR5cGUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUpIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb25OYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbk5hbWU7XG4gICAgICAgICAgY29uc3QgdGVzdFN0ZXBUeXBlID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZTtcbiAgICAgICAgICBpZiAoYWN0aW9uTmFtZSA9PT0gJ0ZPUl9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdGT1JfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ2Zvcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25OYW1lID09PSAnV0hJTEVfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ3doaWxlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHRpdGxlIGlzIHNldCBmcm9tIGFjdGlvbiBpZiB0aXRsZSBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSB8fCAhKGluc3RhbmNlIGFzIGFueSkudGl0bGUudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogaW5pdGlhbGl6ZSBpdGVyYXRpb25zIGlmIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkgJiYgIShpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMpIHtcbiAgICAgICAgLy8gVXNlIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdHJ5IHRvIGluaXRpYWxpemUgZnJvbSBzdGVwLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHRcbiAgICAgICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5zdGVwUmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQpKSB7XG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBpdGVyYXRpb25zIGRpcmVjdGx5IGZyb20gc3RlcFJlc3VsdFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnM6IGFueVtdID0gW107XG4gICAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQuZm9yRWFjaCgoaXRlcmF0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbkluZGV4ID0gaXRlcmF0aW9uLmluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlcmF0aW9uLmluZGV4ICE9PSBudWxsID8gaXRlcmF0aW9uLmluZGV4IDogaXRlcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgc3RhdHVzOiAnc3VjY2VzcycgfCAnZmFpbGVkJyB8ICdwZW5kaW5nJyB8ICdydW5uaW5nJyA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIGlmIChpdGVyYXRpb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0xvd2VyID0gaXRlcmF0aW9uLnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICBpZiAoc3RhdHVzTG93ZXIgPT09ICdzdWNjZXNzJyB8fCBzdGF0dXNMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ3J1bm5pbmcnIHx8IHN0YXR1c0xvd2VyID09PSAnaW5fcHJvZ3Jlc3MnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBpZDogYGl0ZXItJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBsYWJlbDogYGl0ZXIgJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgICAgc3ViU3RlcHM6IFtdLFxuICAgICAgICAgICAgICBpbmRleDogaXRlcmF0aW9uSW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrIChkZWJ1ZyBvbmx5KTogZW5zdXJlIGl0ZXJhdGlvbnMgaXMgYWx3YXlzIGFuIGVtcHR5IGFycmF5IChub3QgdW5kZWZpbmVkKSBzbyB0aGVcbiAgICAgICAgLy8gSXRlcmF0aW9uIGRyb3Bkb3duIHJlbmRlcnMgZXZlbiBmb3IgbmV3bHkgYWRkZWQgc3RlcHMgd2l0aCBubyBleGVjdXRpb24gZGF0YS5cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID09IG51bGwpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgZGVmYXVsdEl0ZXJhdGlvbiBhbmQgc2VsZWN0ZWRJdGVyYXRpb25JZFxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApKSB7XG4gICAgICAgIC8vIFNldCBkZWZhdWx0SXRlcmF0aW9uIHRvICdsYXN0JyBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVmYXVsdEl0ZXJhdGlvbiA9ICdsYXN0JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBzZWxlY3RlZEl0ZXJhdGlvbklkIC0gcHJpb3JpdGl6ZSBpbnB1dCB2YWx1ZSwgdGhlbiBzdGVwIHZhbHVlLCB0aGVuIGxhc3QgaXRlcmF0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSAodGhpcy5zdGVwIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCB0byBsYXN0IGl0ZXJhdGlvbiBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgICBjb25zdCBpdGVyYXRpb25zID0gKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucztcbiAgICAgICAgICBpZiAoaXRlcmF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGl0ZXJhdGlvbnMpICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiAhKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgY29uc3QgbGFzdEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbnNbaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBsYXN0SXRlcmF0aW9uLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzdGVwLWdyb3VwOiBtYXAgY2hpbGRyZW4gdG8gc3RlcHMgKHByZWZlciBjaGlsZHJlbiBvdmVyIGVtcHR5IHN0ZXBzIGFycmF5KVxuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5ncm91cE5hbWUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uIHx8ICcnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdzdGVwLWdyb3VwJyAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLnN0ZXBzPy5sZW5ndGgpIHtcbiAgICAgICAgLy8gTm8gY2hpbGRyZW4geWV0IGJ1dCBlbnN1cmUgZ3JvdXBOYW1lIGlzIHNldFxuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5ncm91cE5hbWUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uIHx8ICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBmaWxlLWRvd25sb2FkIChpbmNsdWRpbmcgZ2VuZXJhdGVEb2N1bWVudCk6IHNldCBwcm9wcyBmcm9tIGdlbmVyYXRlRG9jdW1lbnRSZXN1bHQgYW5kIHdpcmUgaGFuZGxlcnNcbiAgICAgIGlmIChlZmZlY3RpdmVUeXBlID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgY29uc3QgZ2QgPSAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID0gZ2Q/LmZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA9IGdkPy5maWxlVHlwZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA/PyAnJztcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGggPSBnZD8uczNGaWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZCA9IChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkZWQgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRpZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlTmFtZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlVHlwZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlUGF0aCA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5kb3dubG9hZGVkID0gKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZDtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudGl0bGUpIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy50aXRsZSA9IChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZCAmJiB0aGlzLm9uRG93bmxvYWRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWQuc3Vic2NyaWJlKChldjogYW55KSA9PiB0aGlzLm9uRG93bmxvYWRIYW5kbGVyIShldikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aENvcGllZCAmJiB0aGlzLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGhDb3BpZWQuc3Vic2NyaWJlKChldjogYW55KSA9PiB0aGlzLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyIShldikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS50ZXh0Q29waWVkICYmIHRoaXMub25UZXh0Q29waWVkSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRleHRDb3BpZWQuc3Vic2NyaWJlKChldjogYW55KSA9PiB0aGlzLm9uVGV4dENvcGllZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IHNldCBicmFuY2hlcyBhbmQgY29uZGl0aW9uVGV4dFxuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicpIHtcbiAgICAgICAgLy8gU2V0IGJyYW5jaGVzIC0gcHJpb3JpdGl6ZSBzdGVwLmJyYW5jaGVzIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBoYW5kbGVyXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGRlZXAgY29weSB0byBlbnN1cmUgcHJvcGVyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uYnJhbmNoLFxuICAgICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzICYmIHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlckJyYW5jaGVzID0gdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgICAvLyBDcmVhdGUgZGVlcCBjb3B5IHRvIGVuc3VyZSBwcm9wZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gaGFuZGxlckJyYW5jaGVzLm1hcCgoYnJhbmNoOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgY29uZGl0aW9uVGV4dCBmcm9tIGFjdGlvbiBpZiBjb25kaXRpb25UZXh0IGlzIG5vdCBwcmVzZW50XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkuY29uZGl0aW9uVGV4dCAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZGl0aW9uVGV4dCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGlzTG9hZGluZyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzTG9hZGluZyA9IHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXNzIGFjdGl2ZUJyYW5jaFN0ZXBJZCBpZiBwcmVzZW50XG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGFpLWFnZW50LXN0ZXA6IGVuc3VyZSB0aXRsZSBhbmQgcHJvbXB0IGFyZSBzZXQgZnJvbSBhY3Rpb25cbiAgICAgIGlmICh0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gU2V0IHRpdGxlIGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHByb21wdCBmcm9tIGFjdGlvbiBpZiBwcm9tcHQgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucHJvbXB0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYWN0aW9ucyBhcnJheSBpcyBzZXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zICYmIHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBhY3Rpb25Db3VudCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zIHx8IFtdO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50ID0gYWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkVGFiSW5wdXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0KSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRUYWJJbnB1dCA9ICdhY3Rpb24tdHJhY2UnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgY29tbW9uIGV2ZW50IGVtaXR0ZXJzIGZvciBhcGksIGFpLWFnZW50LCBsb29wLCBjb25kaXRpb24sIGFuZCBiYXNpYyBzdGVwc1xuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2FwaScgfHwgdGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnYWktYWdlbnQnIHx8IHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApIHx8IHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgfHwgdGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnYmFzaWMnKSB7XG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjb21tb24gb3V0cHV0IGV2ZW50cyBhbmQgY2FsbCBoYW5kbGVyc1xuICAgICAgICAvLyBFdmVudEVtaXR0ZXJzIGFyZSBTdWJqZWN0cywgc28gd2UgY2FuIHN1YnNjcmliZSB0byB0aGVtXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lICYmIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lICYmIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUgJiYgdGhpcy5vbkFuYWx5emVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzICYmIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcj8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uICYmIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAvLyBUcmFjayBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3NlbGZIZWFsQWN0aW9uJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnc2VsZkhlYWxBY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogb25Kc29uUGF0aENvcGllZEhhbmRsZXIgaXMgc2V0IGFzIGlucHV0IHByb3BlcnR5IChsaW5lIDgyNSksIHNvIHdlIGRvbid0IG5lZWQgdG8gc3Vic2NyaWJlIHRvIGpzb25QYXRoQ29waWVkIGV2ZW50XG4gICAgICAgIC8vIFRoZSBBUEkgc3RlcCBjb21wb25lbnQgY2FsbHMgdGhlIGhhbmRsZXIgZGlyZWN0bHksIGF2b2lkaW5nIGR1cGxpY2F0ZSBjYWxsc1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHdpcmUgdXAgb25WaWV3QWxsSXRlcmF0aW9ucyBldmVudFxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zICYmIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHVwIGFkZFN0ZXBJbnNpZGVMb29wIHNvIG5lc3RlZCBsb29wIFwiQWRkIHN0ZXAgaW5zaWRlIGxvb3BcIiBidWJibGVzIHRvIHBhcmVudCAod29ya3MgYXQgYW55IG5lc3RpbmcgbGV2ZWwpXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwSW5zaWRlTG9vcCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnYWRkU3RlcEluc2lkZUxvb3AnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcEluc2lkZUxvb3Auc3Vic2NyaWJlKChsb29wU3RlcDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcEluc2lkZUxvb3AuZW1pdChsb29wU3RlcCAhPSBudWxsID8gbG9vcFN0ZXAgOiB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnYWRkU3RlcEluc2lkZUxvb3AnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBkZWJ1ZyBwb2ludCB0b2dnbGUgZm9yIGFueSBzdGVwIHRoYXQgc3VwcG9ydHMgaXQgKHdoZW4gaXNEZWJ1ZyBpcyB0cnVlKVxuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50Q2hhbmdlICYmIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcikge1xuICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnZGVidWdQb2ludENoYW5nZScpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI/Lih0aGlzLnN0ZXAsIHZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZGVidWdQb2ludENoYW5nZScpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgZWRpdCBzdGVwOiB3aGVuIHVzZXIgY2xpY2tzIEVkaXQgaWNvbiwgbm90aWZ5IHBhcmVudCB3aXRoIHRoZSBzdGVwIGNvbmZpZ1xuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcCAmJiB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSB7XG4gICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdlZGl0U3RlcCcpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZWRpdFN0ZXAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FZGl0U3RlcEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdlZGl0U3RlcCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgYWRkLXN0ZXAgb3B0aW9uIHNlbGVjdDogd2hlbiB1c2VyIHBpY2tzIGFuIG9wdGlvbiBmcm9tIHRoZSBQbHVzIG1lbnUsIGVtaXQgYW5kIG9wdGlvbmFsbHkgY2FsbCBoYW5kbGVyXG4gICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2FkZFN0ZXBPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI/LihvcHRpb24sIHRoaXMuc3RlcCk7XG4gICAgICAgICAgICB0aGlzLmFkZFN0ZXBPcHRpb25TZWxlY3QuZW1pdCh7IG9wdGlvbiwgc3RlcDogdGhpcy5zdGVwIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdhZGRTdGVwT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBzdGVwIG1vcmUgb3B0aW9uIHNlbGVjdDogd2hlbiB1c2VyIHBpY2tzIGFuIG9wdGlvbiBmcm9tIHRoZSB0aHJlZS1kb3QgbWVudSwgZW1pdCBhbmQgb3B0aW9uYWxseSBjYWxsIGhhbmRsZXJcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU9wdGlvblNlbGVjdC5zdWJzY3JpYmUoKG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IHdpcmUgdXAgb25FeHBhbmQgZXZlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZCAmJiB0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBDYWxsIG9uRXhwYW5kSGFuZGxlciB3aXRoIHRoZSBzdGVwIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgdXAgb25CcmFuY2hDbGlja0V2ZW50IGZvciBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBzXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQgJiYgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uQnJhbmNoQ2xpY2tFdmVudC5zdWJzY3JpYmUoKGJyYW5jaDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyPy4odGhpcy5zdGVwLCBicmFuY2gpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBleHBhbmRlZCBwcm9wZXJ0eSBpcyBwYXNzZWQgY29ycmVjdGx5XG4gICAgICAvLyBVc2UgaXNTdGVwRXhwYW5kZWRIYW5kbGVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBzdGVwLmV4cGFuZGVkIG9yIHN0ZXAuY29uZmlnLmV4cGFuZGVkXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU3RhdGUgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgaGFuZGxlciBmdW5jdGlvbnMgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZEhhbmRsZXIgPSB0aGlzLm9uRXhwYW5kSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkVkaXRTdGVwSGFuZGxlciA9IHRoaXMub25FZGl0U3RlcEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5hZGRTdGVwTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE1lbnVPcHRpb25zID0gdGhpcy5hZGRTdGVwTWVudU9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyID0gdGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU1lbnVPcHRpb25zID0gdGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zO1xuICAgICAgaWYgKHRoaXMub25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyID0gdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgIGlmICh0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgIGlmICh0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyID0gdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwTG9hZGluZ0hhbmRsZXIgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIgPSB0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlciA9IHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIgPSB0aGlzLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEFjdGlvbnNIYW5kbGVyID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQW5hbHl6ZUhhbmRsZXIgPSB0aGlzLm9uQW5hbHl6ZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0Z1bGxMb2dzSGFuZGxlciA9IHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyID0gdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPSB0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIgPSB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblN0ZXBDbGlja0hhbmRsZXIgPSB0aGlzLm9uU3RlcENsaWNrSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkpzb25QYXRoQ29waWVkSGFuZGxlciA9IHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkRvd25sb2FkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Eb3dubG9hZEhhbmRsZXIgPSB0aGlzLm9uRG93bmxvYWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyID0gdGhpcy5vbkZpbGVQYXRoQ29waWVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVGV4dENvcGllZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVGV4dENvcGllZEhhbmRsZXIgPSB0aGlzLm9uVGV4dENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyID0gdGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyID0gdGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIgPSB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBpZiAodGhpcy5pc0xpdmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNMaXZlID0gdGhpcy5pc0xpdmU7XG4gICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5wYXJlbnRTa2lwcGVkID0gISF0aGlzLnBhcmVudFNraXBwZWQ7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gdGhpcy5nZXRFZmZlY3RpdmVEZWJ1Z1BvaW50U2V0KCk7XG4gICAgICAvLyBQYXNzIHN0ZXBOdW1iZXIgaW5wdXQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2Ugc3RlcCdzIHN0ZXBOdW1iZXJcbiAgICAgIGlmICh0aGlzLnN0ZXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFBhc3MgdGhlIHN0ZXAgb2JqZWN0IHNvIHRvZ2dsZUhlYWRlciBjYW4gdXNlIGl0XG4gICAgICBpZiAodGhpcy5zdGVwKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gdGhpcy5zdGVwO1xuXG4gICAgICAvLyBVcGRhdGUgY29uZGl0aW9uLXN0ZXAgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicpIHtcbiAgICAgICAgLy8gVXBkYXRlIGFjdGl2ZUJyYW5jaFN0ZXBJZCBpZiBpdCBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGJyYW5jaGVzIGlmIHRoZXkgY2hhbmdlZFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIG5lc3RlZFN0ZXBzIGlmIHRoZXkgY2hhbmdlZFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcztcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLy8gU2V0IHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBzZWxmSGVhbEFuYWx5c2lzID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIHNldCBjb25maWcgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBjb21wb25lbnRzIHRoYXQgc3RpbGwgdXNlIGNvbmZpZyBpbnB1dFxuICAgICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAgIGlmIChlZmZlY3RpdmVUeXBlID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcgPSB7XG4gICAgICAgICAgICAuLi50aGlzLnN0ZXAsXG4gICAgICAgICAgICB0eXBlOiAnZmlsZS1kb3dubG9hZCcsXG4gICAgICAgICAgICBmaWxlTmFtZTogKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUsXG4gICAgICAgICAgICBmaWxlVHlwZTogKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUsXG4gICAgICAgICAgICBmaWxlUGF0aDogKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGgsXG4gICAgICAgICAgICBkb3dubG9hZGVkOiAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcgPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHNlbGZIZWFsQW5hbHlzaXMgaXMgaW5jbHVkZWQgaW4gY29uZmlnXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICB0aGlzLnByZXZpb3VzU3RlcEtleSA9IHRoaXMuZ2V0U3RlcEtleSh0aGlzLnN0ZXApO1xuXG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYXJrIGNvbXBvbmVudCBhcyBpbml0aWFsaXplZCBhZnRlciB0aGUgbmV4dCBDRCBjeWNsZSBjb21wbGV0ZXMuXG4gICAgICAvLyBCeSB0aGVuLCB0aGUgY2hpbGQncyBuZ09uSW5pdCB3aWxsIGhhdmUgcnVuIGFuZCBjb25maWcgaXMgYnVpbHQuXG4gICAgICAvLyBBZnRlciB0aGlzLCBzYWZlRGV0ZWN0Q2hhbmdlcygpIHdpbGwgdXNlIGRldGVjdENoYW5nZXMoKSBmb3IgaW1tZWRpYXRlIHVwZGF0ZXMuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluaXRpYWxpemVkLnNldCh0aGlzLmNvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkuZW1pdCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVzZSBuZ0RvQ2hlY2sgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gbmVzdGVkIHByb3BlcnRpZXMgdGhhdCBuZ09uQ2hhbmdlcyBtaWdodCBtaXNzXG4gICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAvLyBTeW5jIGlzRGVidWcgYW5kIGRlYnVnUG9pbnRTZXQgZnJvbSBzdGVwLXJlbmRlcmVyIGlucHV0cyBzbyBuZXN0ZWQgc3RlcHMgKGUuZy4gaW5zaWRlIGxvb3Avc3RlcC1ncm91cClcbiAgICAgIC8vIGFsd2F5cyByZWZsZWN0IHBhcmVudCBzdGF0ZSB3aGVuIHRvZ2dsZWQgKGUuZy4gU3Rvcnlib29rIENvbnRyb2xzKVxuICAgICAgY29uc3QgbmV4dERlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ICE9PSBuZXh0RGVidWdQb2ludFNldCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gbmV4dERlYnVnUG9pbnRTZXQ7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQgJiYgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyAhPT0gdGhpcy5pc0RlYnVnKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBuZXN0ZWQgc3RlcC1ncm91cHMgd2hlcmUgcGFyZW50IGV4cGFuc2lvbiBhZmZlY3RzIGNoaWxkIGV4cGFuc2lvblxuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikge1xuICAgICAgICBjdXJyZW50RXhwYW5kZWQgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VFeHBhbmRlZCA9IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkO1xuXG4gICAgICBpZiAoY3VycmVudEV4cGFuZGVkICE9PSB1bmRlZmluZWQgJiYgY3VycmVudEV4cGFuZGVkICE9PSBpbnN0YW5jZUV4cGFuZGVkKSB7XG4gICAgICAgIC8vIEV4cGFuZGVkIHN0YXRlIGNoYW5nZWQsIHVwZGF0ZSBpdCB1c2luZyBzZXRJbnB1dCB0byB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBpbnN0YW5jZUV4cGFuZGVkO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQoJ2V4cGFuZGVkJywgY3VycmVudEV4cGFuZGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogbWFudWFsbHkgdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICAgIGlmICh0eXBlb2YgKGluc3RhbmNlIGFzIGFueSkubmdPbkNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRFeHBhbmRlZCwgcHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkID0gY3VycmVudEV4cGFuZGVkO1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuc2FmZURldGVjdENoYW5nZXMoY29tcG9uZW50UmVmKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgaXRlcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBhbmQgd2UgbmVlZCB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb25cbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbiA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uO1xuXG4gICAgICAgIC8vIElmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXQsIGJ1dCBzZWxlY3RlZEl0ZXJhdGlvbiBpcyBub3Qgc2V0IG9yIGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQmVTZWxlY3RlZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCAmJiBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb24/LmlkICE9PSBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgICAgdGhpcy5zYWZlRGV0ZWN0Q2hhbmdlcyhjb21wb25lbnRSZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50S2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG5cbiAgICAgIC8vIElmIHN0ZXAgcHJvcGVydGllcyBjaGFuZ2VkIChldmVuIGlmIHJlZmVyZW5jZSBkaWRuJ3QpLCB1cGRhdGUgdGhlIGluc3RhbmNlXG4gICAgICBpZiAoY3VycmVudEtleSAhPT0gdGhpcy5wcmV2aW91c1N0ZXBLZXkpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0aGUgcHJldmlvdXMgc3RlcCB0byBjb21wYXJlLCBzbyB3ZSdsbCB1cGRhdGUgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIHByZXZpb3VzIHN0ZXAgZnJvbSB0aGUgaW5zdGFuY2UncyBjdXJyZW50IHN0YXRlXG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RlcDogYW55ID0ge1xuICAgICAgICAgIGlkOiAoaW5zdGFuY2UgYXMgYW55KS5pZCxcbiAgICAgICAgICBkaXNwbGF5VHlwZTogKGluc3RhbmNlIGFzIGFueSkuZGlzcGxheVR5cGUsXG4gICAgICAgICAgc3RhdHVzOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXMsXG4gICAgICAgICAgZHVyYXRpb246IChpbnN0YW5jZSBhcyBhbnkpLmR1cmF0aW9uLFxuICAgICAgICAgIGV4cGFuZGVkOiAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCxcbiAgICAgICAgICBjaGlsZHJlbjogKGluc3RhbmNlIGFzIGFueSkuY2hpbGRyZW4sXG4gICAgICAgICAgbmVzdGVkU3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzLFxuICAgICAgICAgIHN0ZXBzOiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyxcbiAgICAgICAgICBleGVjdXRpb25EYXRhOiAoaW5zdGFuY2UgYXMgYW55KS5leGVjdXRpb25EYXRhLFxuICAgICAgICAgIGFjdGlvbjogKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uLFxuICAgICAgICAgIHRpdGxlOiAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSxcbiAgICAgICAgICByZXN1bHQ6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3VsdCxcbiAgICAgICAgICBtZXRob2Q6IChpbnN0YW5jZSBhcyBhbnkpLm1ldGhvZCxcbiAgICAgICAgICBlbmRwb2ludDogKGluc3RhbmNlIGFzIGFueSkuZW5kcG9pbnQsXG4gICAgICAgICAgc3RhdHVzQ29kZTogKGluc3RhbmNlIGFzIGFueSkuc3RhdHVzQ29kZSxcbiAgICAgICAgICByZXNwb25zZVRpbWU6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3BvbnNlVGltZSxcbiAgICAgICAgICBhY3Rpb25zOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zLFxuICAgICAgICAgIHByb21wdDogKGluc3RhbmNlIGFzIGFueSkucHJvbXB0LFxuICAgICAgICAgIG9wdGltaXplZFJ1bjogKGluc3RhbmNlIGFzIGFueSkub3B0aW1pemVkUnVuLFxuICAgICAgICAgIGFjdGlvbkNvdW50OiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25Db3VudCxcbiAgICAgICAgICBpdGVyYXRpb25zOiAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zLFxuICAgICAgICAgIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQsXG4gICAgICAgICAgYnJhbmNoZXM6IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBOdW1iZXIsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSh0aGlzLnN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gY3VycmVudEtleTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=