@cqa-lib/cqa-ui 1.1.248 → 1.1.250

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/esm2020/lib/execution-screen/ai-action-step/ai-action-step.component.mjs +2 -2
  2. package/esm2020/lib/execution-screen/ai-agent-step/ai-agent-step.component.mjs +2 -2
  3. package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +2 -2
  4. package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +2 -2
  5. package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +2 -2
  6. package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +2 -2
  7. package/esm2020/lib/execution-screen/document-verification-step/document-verification-step.component.mjs +2 -2
  8. package/esm2020/lib/execution-screen/execution-step.models.mjs +1 -1
  9. package/esm2020/lib/execution-screen/failed-step/failed-step.component.mjs +2 -2
  10. package/esm2020/lib/execution-screen/file-download-step/file-download-step.component.mjs +2 -2
  11. package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +2 -2
  12. package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +6 -6
  13. package/esm2020/lib/execution-screen/recording-banner/recording-banner.component.mjs +30 -0
  14. package/esm2020/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.mjs +112 -0
  15. package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +7 -7
  16. package/esm2020/lib/execution-screen/step-renderer/step-renderer.component.mjs +23 -23
  17. package/esm2020/lib/execution-screen/updated-failed-step/updated-failed-step.component.mjs +2 -2
  18. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
  19. package/esm2020/lib/test-case-details/delete-steps/delete-steps.component.mjs +2 -3
  20. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
  21. package/esm2020/lib/ui-kit.module.mjs +11 -1
  22. package/esm2020/public-api.mjs +3 -1
  23. package/fesm2015/cqa-lib-cqa-ui.mjs +189 -52
  24. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  25. package/fesm2020/cqa-lib-cqa-ui.mjs +189 -51
  26. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  27. package/lib/execution-screen/execution-step.models.d.ts +12 -12
  28. package/lib/execution-screen/recording-banner/recording-banner.component.d.ts +13 -0
  29. package/lib/execution-screen/review-recorded-steps-modal/review-recorded-steps-modal.component.d.ts +37 -0
  30. package/lib/ui-kit.module.d.ts +97 -95
  31. package/package.json +1 -1
  32. package/public-api.d.ts +2 -0
  33. package/styles.css +1 -1
@@ -29,7 +29,7 @@ export class StepRendererComponent {
29
29
  if (!step)
30
30
  return '';
31
31
  const t = step.testStepType;
32
- const type = step.type || t || '';
32
+ const type = step.displayType || t || '';
33
33
  if (t === 'generateDocument')
34
34
  return 'file-download';
35
35
  if (type === 'FOR_LOOP' || type === 'WHILE_LOOP')
@@ -40,7 +40,7 @@ export class StepRendererComponent {
40
40
  isLoopStep(step) {
41
41
  if (!step)
42
42
  return false;
43
- const type = step.type || step.testStepType || '';
43
+ const type = step.displayType || step.testStepType || '';
44
44
  return type === 'loop' || type === 'FOR_LOOP' || type === 'WHILE_LOOP';
45
45
  }
46
46
  /** Resolve effective debugPointSet so it propagates when toggled (e.g. Storybook Controls). */
@@ -58,7 +58,7 @@ export class StepRendererComponent {
58
58
  const previousStep = changes['step']?.previousValue;
59
59
  // Check if selectedIterationId input changed (for loop steps)
60
60
  // &&
61
- // currentStep.type === 'loop' &&
61
+ // currentstep.displayType === 'loop' &&
62
62
  // this.container.length > 0;
63
63
  // If selectedIterationId changed for a loop step, update it directly
64
64
  if (changes['selectedIterationId'] && changes['selectedIterationId'].currentValue !== changes['selectedIterationId'].previousValue) {
@@ -242,11 +242,11 @@ export class StepRendererComponent {
242
242
  }
243
243
  // Get step identifiers (use effective type: generateDocument -> file-download)
244
244
  const currentStepId = currentStep.testStepResultId || currentStep.id;
245
- const currentStepType = this.getEffectiveStepType(currentStep) || currentStep.type;
245
+ const currentStepType = this.getEffectiveStepType(currentStep) || currentStep.displayType;
246
246
  // Use stored lastStepId and lastStepType to properly detect changes
247
247
  // This handles the case when step object reference doesn't change but properties do
248
248
  // Only check for actual ID/type changes, not just reference changes
249
- // const stepTypeChanged = !previousStep || currentStepType !== (previousStep.type || this.lastStepType);
249
+ // const stepTypeChanged = !previousStep || currentStepType !== (previousStep.displayType || this.lastStepType);
250
250
  // const stepIdChanged = !previousStep || currentStepId !== (previousStep.testStepResultId || previousStep.id || this.lastStepId);
251
251
  const stepTypeChanged = currentStepType !== this.lastStepType;
252
252
  const stepIdChanged = currentStepId !== this.lastStepId;
@@ -301,7 +301,7 @@ export class StepRendererComponent {
301
301
  const instance = StepRendererComponent.componentInstances.get(this.container);
302
302
  const componentRef = StepRendererComponent.componentRefs.get(this.container);
303
303
  if (instance && previousStep && currentStep &&
304
- previousStep.type === currentStep.type &&
304
+ previousStep.displayType === currentStep.displayType &&
305
305
  (previousStep.testStepResultId || previousStep.id) === (currentStep.testStepResultId || currentStep.id)) {
306
306
  // Update existing component instance with new step properties
307
307
  this.updateComponentInstance(currentStep, previousStep);
@@ -386,7 +386,7 @@ export class StepRendererComponent {
386
386
  hasChanges = true;
387
387
  }
388
388
  }
389
- else if (key === 'action' && currentStep.type === 'ai-agent') {
389
+ else if (key === 'action' && currentStep.displayType === 'ai-agent') {
390
390
  // For ai-agent steps, ensure title and prompt are set from action
391
391
  const currentValue = currentStep[key];
392
392
  const previousValue = previousStep[key];
@@ -454,7 +454,7 @@ export class StepRendererComponent {
454
454
  hasChanges = true;
455
455
  }
456
456
  }
457
- if (currentStep.type === 'step-group' && currentStep.children && !currentStep.steps) {
457
+ if (currentStep.displayType === 'step-group' && currentStep.children && !currentStep.steps) {
458
458
  if (instance.steps !== currentStep.children) {
459
459
  instance.steps = currentStep.children;
460
460
  if (instance.config) {
@@ -465,7 +465,7 @@ export class StepRendererComponent {
465
465
  }
466
466
  // Special handling for condition-step: ensure branches is properly updated
467
467
  // Use deep comparison to detect changes in nested subSteps
468
- if (currentStep.type === 'condition' && currentStep.branches !== undefined) {
468
+ if (currentStep.displayType === 'condition' && currentStep.branches !== undefined) {
469
469
  const currentBranches = currentStep.branches || [];
470
470
  const previousBranches = previousStep.branches || [];
471
471
  // Use deep comparison to detect nested subSteps changes
@@ -483,7 +483,7 @@ export class StepRendererComponent {
483
483
  }
484
484
  // Special handling for condition-step: ensure nestedSteps is properly updated
485
485
  // This is important when children are loaded from the API or when switching branches
486
- if (currentStep.type === 'condition' && currentStep.nestedSteps !== undefined) {
486
+ if (currentStep.displayType === 'condition' && currentStep.nestedSteps !== undefined) {
487
487
  const currentNestedSteps = currentStep.nestedSteps || [];
488
488
  const previousNestedSteps = previousStep.nestedSteps || [];
489
489
  console.log('🔄 step-renderer: currentNestedSteps', currentNestedSteps);
@@ -601,7 +601,7 @@ export class StepRendererComponent {
601
601
  instance.config = { ...instance.config, ...currentStep };
602
602
  // Explicitly ensure branches is updated for condition-step (in case it was nested)
603
603
  // Use the already updated branches from instance to maintain reference consistency
604
- if (currentStep.type === 'condition' && instance.branches !== undefined) {
604
+ if (currentStep.displayType === 'condition' && instance.branches !== undefined) {
605
605
  instance.config.branches = instance.branches;
606
606
  }
607
607
  }
@@ -760,7 +760,7 @@ export class StepRendererComponent {
760
760
  return true;
761
761
  }
762
762
  // Also check if the step type changed (important for branch switching)
763
- if (currentStep.type !== previousStep.type) {
763
+ if (currentStep.displayType !== previousStep.displayType) {
764
764
  return true;
765
765
  }
766
766
  // Check if testStepType changed (IF vs ELSE_IF vs ELSE)
@@ -794,7 +794,7 @@ export class StepRendererComponent {
794
794
  if (!this.container || !this.step)
795
795
  return;
796
796
  const currentStepId = this.step.testStepResultId || this.step.id;
797
- const currentStepType = this.getEffectiveStepType(this.step) || this.step.type;
797
+ const currentStepType = this.getEffectiveStepType(this.step) || this.step.displayType;
798
798
  // Only clear and recreate if step ID or type actually changed
799
799
  const needsRecreation = this.lastStepId !== currentStepId || this.lastStepType !== currentStepType;
800
800
  if (needsRecreation) {
@@ -844,7 +844,7 @@ export class StepRendererComponent {
844
844
  instance.config = { ...instance.config, ...this.step };
845
845
  }
846
846
  // Sync file-download (generateDocument) props from generateDocumentResult
847
- const effectiveTypeForUpdate = this.getEffectiveStepType(this.step) || this.step.type;
847
+ const effectiveTypeForUpdate = this.getEffectiveStepType(this.step) || this.step.displayType;
848
848
  if (effectiveTypeForUpdate === 'file-download') {
849
849
  const gd = this.step.executedResult?.generateDocumentResult;
850
850
  instance.fileName = gd?.fileName ?? instance.fileName ?? '';
@@ -967,7 +967,7 @@ export class StepRendererComponent {
967
967
  return;
968
968
  }
969
969
  }
970
- const effectiveType = this.getEffectiveStepType(this.step) || this.step.type;
970
+ const effectiveType = this.getEffectiveStepType(this.step) || this.step.displayType;
971
971
  const componentType = this.componentMap.get(effectiveType);
972
972
  if (componentType) {
973
973
  const componentRef = this.container.createComponent(componentType);
@@ -1066,7 +1066,7 @@ export class StepRendererComponent {
1066
1066
  }
1067
1067
  }
1068
1068
  // Special handling for step-group: map children to steps if steps is not present
1069
- if (this.step.type === 'step-group' && this.step.children && !this.step.steps) {
1069
+ if (this.step.displayType === 'step-group' && this.step.children && !this.step.steps) {
1070
1070
  instance.steps = this.step.children;
1071
1071
  instance.groupName = this.step.action;
1072
1072
  }
@@ -1101,7 +1101,7 @@ export class StepRendererComponent {
1101
1101
  }
1102
1102
  }
1103
1103
  // Special handling for condition-step: set branches and conditionText
1104
- if (this.step.type === 'condition') {
1104
+ if (this.step.displayType === 'condition') {
1105
1105
  // Set branches - prioritize step.branches if available, otherwise use handler
1106
1106
  if (this.step.branches && Array.isArray(this.step.branches)) {
1107
1107
  // Create deep copy to ensure proper change detection
@@ -1132,7 +1132,7 @@ export class StepRendererComponent {
1132
1132
  }
1133
1133
  }
1134
1134
  // Special handling for ai-agent-step: ensure title and prompt are set from action
1135
- if (this.step.type === 'ai-agent') {
1135
+ if (this.step.displayType === 'ai-agent') {
1136
1136
  // Set title from action if title is not present or empty
1137
1137
  if ((!instance.title || !instance.title.trim()) && this.step.action) {
1138
1138
  instance.title = this.step.action;
@@ -1156,7 +1156,7 @@ export class StepRendererComponent {
1156
1156
  }
1157
1157
  }
1158
1158
  // Wire up common event emitters for api, ai-agent, loop, condition, and basic steps
1159
- if (this.step.type === 'api' || this.step.type === 'ai-agent' || this.isLoopStep(this.step) || this.step.type === 'condition' || this.step.type === 'basic') {
1159
+ if (this.step.displayType === 'api' || this.step.displayType === 'ai-agent' || this.isLoopStep(this.step) || this.step.displayType === 'condition' || this.step.displayType === 'basic') {
1160
1160
  // Subscribe to common output events and call handlers
1161
1161
  // EventEmitters are Subjects, so we can subscribe to them
1162
1162
  if (instance.makeCurrentBaseline && this.onMakeCurrentBaselineHandler) {
@@ -1263,7 +1263,7 @@ export class StepRendererComponent {
1263
1263
  }
1264
1264
  }
1265
1265
  // Special handling for condition-step: wire up onExpand event
1266
- if (this.step.type === 'condition') {
1266
+ if (this.step.displayType === 'condition') {
1267
1267
  if (instance.onExpand && this.onExpandHandler) {
1268
1268
  instance.onExpand.subscribe(() => {
1269
1269
  // Call onExpandHandler with the step config
@@ -1381,7 +1381,7 @@ export class StepRendererComponent {
1381
1381
  if (this.step)
1382
1382
  instance.step = this.step;
1383
1383
  // Update condition-step specific properties for change detection
1384
- if (this.step.type === 'condition') {
1384
+ if (this.step.displayType === 'condition') {
1385
1385
  // Update activeBranchStepId if it changed
1386
1386
  if (this.step.activeBranchStepId !== undefined) {
1387
1387
  instance.activeBranchStepId = this.step.activeBranchStepId;
@@ -1604,7 +1604,7 @@ export class StepRendererComponent {
1604
1604
  // Create a minimal previous step from the instance's current state
1605
1605
  const previousStep = {
1606
1606
  id: instance.id,
1607
- type: instance.type,
1607
+ displayType: instance.displayType,
1608
1608
  status: instance.status,
1609
1609
  duration: instance.duration,
1610
1610
  expanded: instance.expanded,
@@ -1743,4 +1743,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
1743
1743
  }], componentReady: [{
1744
1744
  type: Output
1745
1745
  }] } });
1746
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbk4sT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBOEZoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQW5FdkIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUV4QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFlBQU8sR0FBYSxLQUFLLENBQUM7UUFvQm5DLG1HQUFtRztRQUN6Rix3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBNkQsQ0FBQztRQUM5RyxpSEFBaUg7UUFDdkcseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQThELENBQUM7UUFDdEcsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsMENBQTBDO1FBOEJ2RixlQUFVLEdBQTJCLElBQUksQ0FBQztRQUMxQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsb0JBQWUsR0FBVyxFQUFFLENBQUM7UUFHckMsNkdBQTZHO1FBQ3JHLHlCQUFvQixHQUFrQyxJQUFJLENBQUM7SUFLL0QsQ0FBQztJQXZDTCxxSUFBcUk7SUFDN0gsb0JBQW9CLENBQUMsSUFBNEM7UUFDdkUsSUFBSSxD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QXdCO3NCQUFoQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQzhDLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUN6QyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUVHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRywrQkFBK0I7c0JBQXZDLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFR5cGUsIEFmdGVyVmlld0luaXQsIERvQ2hlY2ssIEluamVjdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudFJlZiwgU2ltcGxlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFeGVjdXRpb25TdGVwQ29uZmlnLCBBZGRTdGVwTWVudU9wdGlvbiwgU3RlcE1vcmVNZW51T3B0aW9uIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfQ09NUE9ORU5UX01BUCB9IGZyb20gJy4uL3N0ZXAtcmVnaXN0cnkudG9rZW4nO1xuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIGFwcHJvcHJpYXRlIHN0ZXAgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBzdGVwIHR5cGUuXG4gKiBVc2VzIGR5bmFtaWMgY29tcG9uZW50IGxvYWRpbmcgYW5kIGFuIGluamVjdGlvbiB0b2tlbiB0byBicmVhayBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqIGJldHdlZW4gc3RlcCBjb21wb25lbnRzIGluIEFuZ3VsYXIgSXZ5IHBhcnRpYWwgY29tcGlsYXRpb24gbW9kZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250YWluZXIgI2NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj4nXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBSZW5kZXJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIHN0ZXAhOiBFeGVjdXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBvbkV4cGFuZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgaXNTdGVwTG9hZGluZ0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI/OiAoZHVyYXRpb246IG51bWJlcikgPT4gbnVtYmVyO1xuICBASW5wdXQoKSBmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIG9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25VcGxvYWRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVmlld0Z1bGxMb2dzSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI/OiAoKSA9PiB7IGlzTG9hZGluZ0FjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH07IGlzTG9hZGluZ01vZGlmeUFjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfTtcbiAgQElucHV0KCkgaXNVcGxvYWRpbmdCYXNlbGluZT86IGFueTtcbiAgQElucHV0KCkgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU/OiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlcmF0aW9uSWQ/OiBhbnk7XG4gIEBJbnB1dCgpIGdldExvb3BJdGVyYXRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGZvcm1hdEFjdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBvblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj86IChzdGVwOiBhbnksIGJyYW5jaDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN0ZXBDbGlja0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgZXZlbnQ/OiBFdmVudCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Kc29uUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgcGF0aDogc3RyaW5nOyBzb3VyY2U6ICdyZXF1ZXN0Qm9keScgfCAncmVzcG9uc2VCb2R5JyB8ICdyZXF1ZXN0SGVhZGVycycgfCAncmVzcG9uc2VIZWFkZXJzJyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkRvd25sb2FkSGFuZGxlcj86IChldmVudDogeyBmaWxlTmFtZTogc3RyaW5nOyBmaWxlUGF0aD86IHN0cmluZzsgZmlsZVR5cGU6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblRleHRDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHRleHQ6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGp1bXBUb1RpbWVzdGFtcEhhbmRsZXI/OiAodGltZXN0YW1wOiBudW1iZXIsIHRlc3RTdGVwSWQ/OiBudW1iZXIgfCBzdHJpbmcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGRvd25sb2FkaW5nU3RlcElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnPzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogV2hlbiBzZXQsIHVzZWQgZGlyZWN0bHkgZm9yIHRoZSByZW5kZXJlZCBzdGVwJ3MgZGVidWdQb2ludFNldCBzbyB0aGUgaWNvbiBzdGF0ZSBwcm9wYWdhdGVzIHdoZW4gdG9nZ2xlZCAoZS5nLiBpbiBTdG9yeWJvb2spLiAqL1xuICBASW5wdXQoKSBkZWJ1Z1BvaW50U2V0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgZ2V0RGVidWdQb2ludFNldEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCB2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgRWRpdCBpY29uIG9uIGEgc3RlcCAod2hlbiBpc0RlYnVnIGlzIHRydWUpLiBSZWNlaXZlcyB0aGUgc3RlcCBjb25maWcgc28gdGhlIHBhcmVudCBjYW4gb3BlbiBhbiBlZGl0b3IuICovXG4gIEBJbnB1dCgpIG9uRWRpdFN0ZXBIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIC8qKiBBZGQtc3RlcCBtZW51IG9wdGlvbnMgKGUuZy4gXCJBZGQgYmVmb3JlXCIsIFwiQWRkIGFmdGVyXCIpLiBXaGVuIHNldCwgcGFzc2VkIHRvIGFsbCByZW5kZXJlZCBzdGVwczsgd2hlbiB1bnNldCwgc3RlcHMgdXNlIHRoZWlyIGRlZmF1bHQuIE1hbmFnZWQgbGlrZSBodHRwTWV0aG9kT3B0aW9ucyBpbiB0aGUgQVBJIGVkaXQgc2VjdGlvbi4gKi9cbiAgQElucHV0KCkgYWRkU3RlcE1lbnVPcHRpb25zPzogQWRkU3RlcE1lbnVPcHRpb25bXTtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIFBsdXMgbWVudS4gUmVjZWl2ZXMgdGhlIG9wdGlvbiBhbmQgdGhlIHN0ZXAgY29uZmlnLiAqL1xuICBASW5wdXQoKSBvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPzogKG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24sIHN0ZXA/OiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogTW9yZSBvcHRpb25zICh0aHJlZS1kb3QpIG1lbnUgb3B0aW9ucy4gV2hlbiBzZXQsIHBhc3NlZCB0byBhbGwgcmVuZGVyZWQgc3RlcHMuICovXG4gIEBJbnB1dCgpIHN0ZXBNb3JlTWVudU9wdGlvbnM/OiBTdGVwTW9yZU1lbnVPcHRpb25bXTtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIE1vcmUgb3B0aW9ucyAodGhyZWUtZG90KSBtZW51LiBSZWNlaXZlcyB0aGUgb3B0aW9uIGFuZCB0aGUgc3RlcCBjb25maWcuICovXG4gIEBJbnB1dCgpIG9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPzogKG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHBhc3NlZCB0byBsb29wL2NvbmRpdGlvbiBzdGVwcyBzbyB0aGV5IGNhbiBzdXBwbHkgcGVyLXN0ZXAgbWVudSBvcHRpb25zIHRvIHRoZWlyIG5lc3RlZCBzdGVwLXJlbmRlcmVycyAoc3VwcG9ydHMgYXJiaXRyYXJ5IG5lc3RpbmcpLiAqL1xuICBASW5wdXQoKSBnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQ/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gQWRkU3RlcE1lbnVPcHRpb25bXTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHBhc3NlZCB0byBsb29wL2NvbmRpdGlvbiBzdGVwcyBzbyB0aGV5IGNhbiBzdXBwbHkgcGVyLXN0ZXAgbWVudSBvcHRpb25zIHRvIHRoZWlyIG5lc3RlZCBzdGVwLXJlbmRlcmVycyAoc3VwcG9ydHMgYXJiaXRyYXJ5IG5lc3RpbmcpLiAqL1xuICBASW5wdXQoKSBnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IFN0ZXBNb3JlTWVudU9wdGlvbltdO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyPzogc3RyaW5nO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIEFkZCAocGx1cykgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHsgb3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbjsgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBNb3JlIG9wdGlvbnMgKHRocmVlLWRvdCkgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIHN0ZXBNb3JlT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uOyBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgY29tcG9uZW50UmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBjb21wb25lbnQgaXMgbG9hZGVkIGFuZCByZWFkeVxuXG4gIC8qKiBFZmZlY3RpdmUgdHlwZSBmb3IgY29tcG9uZW50IGxvb2t1cDogJ2ZpbGUtZG93bmxvYWQnIHdoZW4gdGVzdFN0ZXBUeXBlID09PSAnZ2VuZXJhdGVEb2N1bWVudCcsICdsb29wJyBmb3IgRk9SX0xPT1AvV0hJTEVfTE9PUC4gKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVTdGVwVHlwZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdCA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgIGNvbnN0IHR5cGUgPSAoc3RlcCBhcyBhbnkpLnR5cGUgfHwgdCB8fCAnJztcbiAgICBpZiAodCA9PT0gJ2dlbmVyYXRlRG9jdW1lbnQnKSByZXR1cm4gJ2ZpbGUtZG93bmxvYWQnO1xuICAgIGlmICh0eXBlID09PSAnRk9SX0xPT1AnIHx8IHR5cGUgPT09ICdXSElMRV9MT09QJykgcmV0dXJuICdsb29wJztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzdGVwIGlzIGEgbG9vcCBzdGVwIChmb3IsIHdoaWxlLCBvciBnZW5lcmljIGxvb3ApLiAqL1xuICBwcml2YXRlIGlzTG9vcFN0ZXAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAoIXN0ZXApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0eXBlID0gKHN0ZXAgYXMgYW55KS50eXBlIHx8IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8ICcnO1xuICAgIHJldHVybiB0eXBlID09PSAnbG9vcCcgfHwgdHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCB0eXBlID09PSAnV0hJTEVfTE9PUCc7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBlZmZlY3RpdmUgZGVidWdQb2ludFNldCBzbyBpdCBwcm9wYWdhdGVzIHdoZW4gdG9nZ2xlZCAoZS5nLiBTdG9yeWJvb2sgQ29udHJvbHMpLiAqL1xuICBwcml2YXRlIGdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVidWdQb2ludFNldCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5kZWJ1Z1BvaW50U2V0O1xuICAgIGlmICh0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyICYmIHRoaXMuc3RlcCkgcmV0dXJuIHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBVc2UgV2Vha01hcCB0byB0cmFjayBjb21wb25lbnQgaW5zdGFuY2VzIHdpdGhvdXQgc3RvcmluZyB0aGVtIGFzIGNsYXNzIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBzdGF0aWMgY29tcG9uZW50SW5zdGFuY2VzID0gbmV3IFdlYWtNYXA8Vmlld0NvbnRhaW5lclJlZiwgYW55PigpO1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRSZWZzID0gbmV3IFdlYWtNYXA8Vmlld0NvbnRhaW5lclJlZiwgQ29tcG9uZW50UmVmPGFueT4+KCk7XG4gIHByaXZhdGUgc3RhdGljIHN1YnNjcmliZWRFdmVudEVtaXR0ZXJzID0gbmV3IFdlYWtNYXA8YW55LCBTZXQ8c3RyaW5nPj4oKTsgLy8gVHJhY2sgd2hpY2ggRXZlbnRFbWl0dGVycyBoYXZlIGJlZW4gc3Vic2NyaWJlZCB0b1xuICBwcml2YXRlIGxhc3RTdGVwSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTdGVwVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJldmlvdXNTdGVwS2V5OiBzdHJpbmcgPSAnJztcbiAgLyoqIFRyYWNrcyB0aGUgbGFzdCBzdGF0dXMgc2VlbiBkdXJpbmcgbGl2ZSBleGVjdXRpb24gc28gaW4tcGxhY2UgbXV0YXRpb25zIGFyZSBkZXRlY3RlZCBpbiBuZ0RvQ2hlY2suICovXG4gIHByaXZhdGUgbGFzdFRyYWNrZWRTdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRyYWNrcyBlZGl0YWJsZSBwcm9wZXJ0eSB2YWx1ZXMgaW4gZGVidWcgbW9kZSBzbyBpbi1wbGFjZSBtdXRhdGlvbnMgYWZ0ZXIgZGlhbG9nIHNhdmVzIGFyZSBwcm9wYWdhdGVkLiAqL1xuICBwcml2YXRlIGxhc3RUcmFja2VkRWRpdFByb3BzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChTVEVQX0NPTVBPTkVOVF9NQVApIHByaXZhdGUgY29tcG9uZW50TWFwOiBNYXA8c3RyaW5nLCBUeXBlPGFueT4+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gY2hhbmdlc1snc3RlcCddPy5jdXJyZW50VmFsdWUgfHwgdGhpcy5zdGVwO1xuICAgIGNvbnN0IHByZXZpb3VzU3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXT8ucHJldmlvdXNWYWx1ZTtcblxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQgY2hhbmdlZCAoZm9yIGxvb3Agc3RlcHMpXG4gICAgLy8gJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcC50eXBlID09PSAnbG9vcCcgJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwO1xuXG4gICAgLy8gSWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VkIGZvciBhIGxvb3Agc3RlcCwgdXBkYXRlIGl0IGRpcmVjdGx5XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSAmJiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uSWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBsb29wLXN0ZXAgY29tcG9uZW50XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHN0ZXBOdW1iZXIgaW5wdXQgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBOdW1iZXInXSAmJiBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3N0ZXBOdW1iZXInXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHN0ZXBOdW1iZXIgd2hlbiBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTnVtYmVyID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zdGVwTnVtYmVyID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzVXBsb2FkaW5nQmFzZWxpbmUgb3IgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSB8fCBjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgLy8gVXBkYXRlIGlzVXBsb2FkaW5nQmFzZWxpbmUgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoY2hhbmdlc1snaXNVcGxvYWRpbmdCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBpbiBjb25maWcgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJ10pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBkb3dubG9hZGluZ1N0ZXBJZCBjaGFuZ2VkLCB1cGRhdGUgZmlsZS1kb3dubG9hZCBpbnN0YW5jZSBpc0Rvd25sb2FkaW5nXG4gICAgaWYgKGNoYW5nZXNbJ2Rvd25sb2FkaW5nU3RlcElkJ10pIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYgJiYgdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZShjdXJyZW50U3RlcCkgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICBjb25zdCB0aWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzRGVidWcsIGRlYnVnUG9pbnRTZXQgb3IgZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgY2hhbmdlZCAoZS5nLiB1c2VyIHRvZ2dsZWQgZGVidWcgaW4gcG9ydGFsL1N0b3J5Ym9vayksIHVwZGF0ZSBuZXN0ZWQgaW5zdGFuY2VcbiAgICBpZiAoY2hhbmdlc1snaXNEZWJ1ZyddIHx8IGNoYW5nZXNbJ2RlYnVnUG9pbnRTZXQnXSB8fCBjaGFuZ2VzWydnZXREZWJ1Z1BvaW50U2V0SGFuZGxlciddIHx8IGNoYW5nZXNbJ29uRGVidWdQb2ludENoYW5nZUhhbmRsZXInXSB8fCBjaGFuZ2VzWydvbkVkaXRTdGVwSGFuZGxlciddIHx8IGNoYW5nZXNbJ2FkZFN0ZXBNZW51T3B0aW9ucyddIHx8IGNoYW5nZXNbJ29uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXInXSB8fCBjaGFuZ2VzWydzdGVwTW9yZU1lbnVPcHRpb25zJ10gfHwgY2hhbmdlc1snb25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXInXSB8fCBjaGFuZ2VzWydnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQnXSB8fCBjaGFuZ2VzWydnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkJ10pIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgICAgaWYgKHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBNZW51T3B0aW9ucyA9IHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlTWVudU9wdGlvbnMgPSB0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgICAvLyBFbnN1cmUgZGVidWcgcG9pbnQgY2xpY2sgaXMgd2lyZWQgd2hlbiBpc0RlYnVnIGJlY29tZXMgdHJ1ZSAoZS5nLiB0b2dnbGVkIGluIFN0b3J5Ym9vayBDb250cm9scylcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50Q2hhbmdlICYmIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcikge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnZGVidWdQb2ludENoYW5nZScpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50Q2hhbmdlLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyPy4odGhpcy5zdGVwLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdkZWJ1Z1BvaW50Q2hhbmdlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgZWRpdCBzdGVwIHdoZW4gaXNEZWJ1ZyBhbmQgaGFuZGxlciBhcmUgcHJlc2VudFxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwICYmIHRoaXMub25FZGl0U3RlcEhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2VkaXRTdGVwJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25FZGl0U3RlcEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZWRpdFN0ZXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2lyZSBhZGQtc3RlcCBvcHRpb24gc2VsZWN0IHdoZW4gaXNEZWJ1ZyAoZW1pdCBhbmQgb3B0aW9uYWxseSBjYWxsIGhhbmRsZXIpXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnYWRkU3RlcE9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI/LihvcHRpb24sIHRoaXMuc3RlcCk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdhZGRTdGVwT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgc3RlcCBtb3JlIG9wdGlvbiBzZWxlY3Qgd2hlbiBpc0RlYnVnIChlbWl0IGFuZCBvcHRpb25hbGx5IGNhbGwgaGFuZGxlcilcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc3RlcE1vcmVPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgICB0aGlzLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHN0ZXAgaWRlbnRpZmllcnMgKHVzZSBlZmZlY3RpdmUgdHlwZTogZ2VuZXJhdGVEb2N1bWVudCAtPiBmaWxlLWRvd25sb2FkKVxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSBjdXJyZW50U3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IGN1cnJlbnRTdGVwLmlkO1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApIHx8IChjdXJyZW50U3RlcCBhcyBhbnkpLnR5cGU7XG5cbiAgICAvLyBVc2Ugc3RvcmVkIGxhc3RTdGVwSWQgYW5kIGxhc3RTdGVwVHlwZSB0byBwcm9wZXJseSBkZXRlY3QgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHN0ZXAgb2JqZWN0IHJlZmVyZW5jZSBkb2Vzbid0IGNoYW5nZSBidXQgcHJvcGVydGllcyBkb1xuICAgIC8vIE9ubHkgY2hlY2sgZm9yIGFjdHVhbCBJRC90eXBlIGNoYW5nZXMsIG5vdCBqdXN0IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAgLy8gY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcFR5cGUgIT09IChwcmV2aW91c1N0ZXAudHlwZSB8fCB0aGlzLmxhc3RTdGVwVHlwZSk7XG4gICAgLy8gY29uc3Qgc3RlcElkQ2hhbmdlZCA9ICFwcmV2aW91c1N0ZXAgfHwgY3VycmVudFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHByZXZpb3VzU3RlcC5pZCB8fCB0aGlzLmxhc3RTdGVwSWQpO1xuICAgIGNvbnN0IHN0ZXBUeXBlQ2hhbmdlZCA9IGN1cnJlbnRTdGVwVHlwZSAhPT0gdGhpcy5sYXN0U3RlcFR5cGU7XG4gICAgY29uc3Qgc3RlcElkQ2hhbmdlZCA9IGN1cnJlbnRTdGVwSWQgIT09IHRoaXMubGFzdFN0ZXBJZDtcbiAgICBcbiAgICAvLyBPbmx5IGxvYWQgY29tcG9uZW50IGlmIHN0ZXAgSUQgb3IgdHlwZSBhY3R1YWxseSBjaGFuZ2VkXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzIHdoZW4gb25seSBuZXN0ZWQgcHJvcGVydGllcyBjaGFuZ2VcbiAgICBpZiAoc3RlcFR5cGVDaGFuZ2VkIHx8IHN0ZXBJZENoYW5nZWQpIHtcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBleHBhbmRlZCBzdGF0ZSBjaGFuZ2VkICh1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgYXMgaXQgbWF5IGRlcGVuZCBvbiBwYXJlbnQgc3RhdGUpXG4gICAgbGV0IGV4cGFuZGVkQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmIChwcmV2aW91c1N0ZXAgJiYgY3VycmVudFN0ZXApIHtcbiAgICAgIGxldCBjdXJyZW50RXhwYW5kZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcHJldmlvdXNFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKGN1cnJlbnRTdGVwKTtcbiAgICAgICAgcHJldmlvdXNFeHBhbmRlZCA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKHByZXZpb3VzU3RlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50RXhwYW5kZWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgcHJldmlvdXNFeHBhbmRlZCA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZXhwYW5kZWRDaGFuZ2VkID0gY3VycmVudEV4cGFuZGVkICE9PSBwcmV2aW91c0V4cGFuZGVkO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBvbmx5IG5lc3RlZCBkYXRhIGNoYW5nZWQgKGNoaWxkcmVuLCBuZXN0ZWRTdGVwcywgc3RlcHMsIGV4cGFuZGVkKSwgXG4gICAgLy8gdXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJlbnQgc3RlcHMgZnJvbSBibGlua2luZyB3aGVuIG5lc3RlZCBzdGVwcyBleHBhbmRcbiAgICBjb25zdCBvbmx5TmVzdGVkRGF0YUNoYW5nZWQgPSBwcmV2aW91c1N0ZXAgJiYgKFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuc3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5zdGVwcyB8fFxuICAgICAgZXhwYW5kZWRDaGFuZ2VkIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgfHxcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHxcbiAgICAgICgoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuY29uZmlnPy5leHBhbmRlZClcbiAgICApO1xuXG4gICAgLy8gVXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXG4gICAgaWYgKG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCAmJiB0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBHZXQgdGhlIHN0b3JlZCBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIC8vIFVzZSBjb21wcmVoZW5zaXZlIHVwZGF0ZSBtZXRob2QgZnJvbSBvcmlnaW5hbFxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGN1cnJlbnRTdGVwLCBwcmV2aW91c1N0ZXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBvdGhlciBjaGFuZ2VzLCB1c2UgY29tcHJlaGVuc2l2ZSB1cGRhdGUgaWYgY29tcG9uZW50IGV4aXN0c1xuICAgIGlmICh0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBwcmV2aW91c1N0ZXAgJiYgY3VycmVudFN0ZXAgJiZcbiAgICAgICAgcHJldmlvdXNTdGVwLnR5cGUgPT09IGN1cnJlbnRTdGVwLnR5cGUgJiZcbiAgICAgICAgKHByZXZpb3VzU3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHByZXZpb3VzU3RlcC5pZCkgPT09IChjdXJyZW50U3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IGN1cnJlbnRTdGVwLmlkKSkge1xuICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgY29tcG9uZW50IGluc3RhbmNlIHdpdGggbmV3IHN0ZXAgcHJvcGVydGllc1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGN1cnJlbnRTdGVwLCBwcmV2aW91c1N0ZXApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBsb2FkIGNvbXBvbmVudCBpZiBjb250YWluZXIgaXMgZW1wdHkgKGNvbXBvbmVudCBkb2Vzbid0IGV4aXN0IHlldClcbiAgICAvLyBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IHJlbG9hZHNcbiAgICBpZiAodGhpcy5jb250YWluZXIgJiYgdGhpcy5jb250YWluZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGN1cnJlbnRTdGVwOiBhbnksIHByZXZpb3VzU3RlcDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgIGlmICghaW5zdGFuY2UgfHwgIWNvbXBvbmVudFJlZiB8fCAhdGhpcy5jb250YWluZXIpIHJldHVybjtcblxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAvLyBMaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBjb21tb25seSBjaGFuZ2UgYW5kIG5lZWQgdG8gYmUgdXBkYXRlZFxuICAgIGNvbnN0IGltcG9ydGFudFByb3BlcnRpZXMgPSBbJ3N0YXR1cycsICdkdXJhdGlvbicsICdleHBhbmRlZCcsICdzdWJTdGVwcycsICdjaGlsZHJlbicsICduZXN0ZWRTdGVwcycsICdzdGVwcycsXG4gICAgICAnZXhlY3V0aW9uRGF0YScsICdhY3Rpb24nLCAndGl0bGUnLCAncmVzdWx0JywgJ21ldGhvZCcsICdlbmRwb2ludCcsICdzdGF0dXNDb2RlJywgJ2JyYW5jaGVzJyxcbiAgICAgICdyZXNwb25zZVRpbWUnLCAnYWN0aW9ucycsICdpbml0aWFsQWN0aW9ucycsICdwcm9tcHQnLCAnb3B0aW1pemVkUnVuJywgJ2FjdGlvbkNvdW50JywgJ2l0ZXJhdGlvbnMnLCAnc2VsZWN0ZWRJdGVyYXRpb25JZCcsICdzdGVwTnVtYmVyJyxcbiAgICAgICdpc1VwbG9hZGluZ0Jhc2VsaW5lJywgJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJywgJ3NlbGVjdGVkVGFiSW5wdXQnLCAnc3RlcERlbGV0ZWQnXTtcblxuICAgIC8vIFVwZGF0ZSBpbXBvcnRhbnQgcHJvcGVydGllc1xuICAgIGltcG9ydGFudFByb3BlcnRpZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgLy8gRm9yIHNlbGVjdGVkSXRlcmF0aW9uSWQgb24gbG9vcCBzdGVwcywgcHJpb3JpdGl6ZSB0aGUgaW5wdXQgdmFsdWUgb3ZlciBzdGVwIHZhbHVlXG4gICAgICBpZiAoa2V5ID09PSAnc2VsZWN0ZWRJdGVyYXRpb25JZCcgJiYgdGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2l0ZXJhdGlvbnMnICYmIHRoaXMuaXNMb29wU3RlcChjdXJyZW50U3RlcCkpIHtcbiAgICAgICAgLy8gV2hlbiBpdGVyYXRpb25zIGFyZSB1cGRhdGVkLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSAoY3VycmVudFN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIEFmdGVyIGl0ZXJhdGlvbnMgYXJlIHVwZGF0ZWQsIHRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXRcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnIHx8IGtleSA9PT0gJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJykge1xuICAgICAgICAvLyBGb3IgbG9hZGluZyBzdGF0ZSBvYmplY3RzLCBhbHdheXMgdXNlIHRoZSBpbnB1dCB2YWx1ZSAodGhleSdyZSBwYXNzZWQgZnJvbSBwYXJlbnQpXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGtleSA9PT0gJ2lzVXBsb2FkaW5nQmFzZWxpbmUnID8gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lIDogdGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSBpZiB0aGUgcmVmZXJlbmNlIGNoYW5nZWQgKG5ldyBvYmplY3QgY3JlYXRlZClcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0ZXBOdW1iZXInICYmIHRoaXMuc3RlcE51bWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEZvciBzdGVwTnVtYmVyLCBwcmlvcml0aXplIHRoZSBpbnB1dCB2YWx1ZSBvdmVyIHN0ZXAgdmFsdWVcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhY3Rpb24nICYmIGN1cnJlbnRTdGVwLnR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gRm9yIGFpLWFnZW50IHN0ZXBzLCBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBhY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGl0bGUgYW5kIHByb21wdCBmcm9tIGFjdGlvbiBpZiB0aGV5J3JlIG5vdCBzZXQgb3IgZW1wdHlcbiAgICAgICAgICBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcudGl0bGUgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnByb21wdCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5wcm9tcHQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIC8vIENvbXBhcmUgYWdhaW5zdCB3aGF0IHRoZSBpbnN0YW5jZSBjdXJyZW50bHkgZGlzcGxheXMsIG5vdCBwcmV2aW91c1N0ZXAuXG4gICAgICAgIC8vIHByZXZpb3VzU3RlcCBtYXkgYmUgdGhlIHNhbWUgbXV0YXRlZCBvYmplY3QgYXMgY3VycmVudFN0ZXAgKGluLXBsYWNlIG11dGF0aW9uKSxcbiAgICAgICAgLy8gc28gcHJldmlvdXNTdGVwW2tleV0gYWxyZWFkeSBlcXVhbHMgY3VycmVudFZhbHVlIGFuZCB0aGUgY29tcGFyaXNvbiBpcyBhbHdheXMgZmFsc2UuXG4gICAgICAgIGNvbnN0IGluc3RhbmNlVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIGluc3RhbmNlVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGlzRGVidWcgYW5kIGRlYnVnUG9pbnRTZXQgZnJvbSBzdGVwLXJlbmRlcmVyIGlucHV0cyAocGFyZW50IG1heSBoYXZlIHVwZGF0ZWQgYWZ0ZXIgdG9nZ2xlKVxuICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnICE9PSB0aGlzLmlzRGVidWcpIHtcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgbmV4dERlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCAhPT0gbmV4dERlYnVnUG9pbnRTZXQpIHtcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSBuZXh0RGVidWdQb2ludFNldDtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFsc28gdXBkYXRlIGFsbCBvdGhlciBwcm9wZXJ0aWVzXG4gICAgT2JqZWN0LmtleXMoY3VycmVudFN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiAhaW1wb3J0YW50UHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcblxuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZUNoYW5nZWQoY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzcGVjaWFsIHByb3BlcnRpZXMgdGhhdCBtaWdodCBuZWVkIHNwZWNpYWwgaGFuZGxpbmdcbiAgICBpZiAodGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIGJyYW5jaGVzIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoZXMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoZXMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG5cbiAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gdG8gZGV0ZWN0IG5lc3RlZCBzdWJTdGVwcyBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5oYXNCcmFuY2hlc0NoYW5nZWQoY3VycmVudEJyYW5jaGVzLCBwcmV2aW91c0JyYW5jaGVzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gWy4uLmN1cnJlbnRCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICB9KSldO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmJyYW5jaGVzID0gKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgY29uZGl0aW9uLXN0ZXA6IGVuc3VyZSBuZXN0ZWRTdGVwcyBpcyBwcm9wZXJseSB1cGRhdGVkXG4gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBjaGlsZHJlbiBhcmUgbG9hZGVkIGZyb20gdGhlIEFQSSBvciB3aGVuIHN3aXRjaGluZyBicmFuY2hlc1xuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50TmVzdGVkU3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzTmVzdGVkU3RlcHMgPSAocHJldmlvdXNTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBjdXJyZW50TmVzdGVkU3RlcHMnLCBjdXJyZW50TmVzdGVkU3RlcHMpO1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogcHJldmlvdXNOZXN0ZWRTdGVwcycsIHByZXZpb3VzTmVzdGVkU3RlcHMpO1xuICAgICAgLy8gVXNlIGRlZXAgY29tcGFyaXNvbiB0byBkZXRlY3QgY29udGVudCBjaGFuZ2VzLCBub3QganVzdCByZWZlcmVuY2UgY2hhbmdlc1xuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIElGIGFuZCBFTFNFX0lGIGJyYW5jaGVzXG4gICAgICBpZiAodGhpcy5oYXNOZXN0ZWRTdGVwc0NoYW5nZWQoY3VycmVudE5lc3RlZFN0ZXBzLCBwcmV2aW91c05lc3RlZFN0ZXBzKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIGVuc3VyZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyaWdnZXJzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gWy4uLmN1cnJlbnROZXN0ZWRTdGVwc107XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ/CflIQgc3RlcC1yZW5kZXJlcjogbmVzdGVkU3RlcHMgdXBkYXRlZCBmb3IgY29uZGl0aW9uLXN0ZXAnLCB7XG4gICAgICAgICAgc3RlcElkOiBjdXJyZW50U3RlcC5pZCxcbiAgICAgICAgICBwcmV2aW91c0NvdW50OiBwcmV2aW91c05lc3RlZFN0ZXBzLmxlbmd0aCxcbiAgICAgICAgICBjdXJyZW50Q291bnQ6IGN1cnJlbnROZXN0ZWRTdGVwcy5sZW5ndGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZmlsZS1kb3dubG9hZCAoaW5jbHVkaW5nIGdlbmVyYXRlRG9jdW1lbnQpOiBzeW5jIGZyb20gZ2VuZXJhdGVEb2N1bWVudFJlc3VsdFxuICAgIGlmICh0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKGN1cnJlbnRTdGVwKSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICBjb25zdCBnZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5nZW5lcmF0ZURvY3VtZW50UmVzdWx0O1xuICAgICAgY29uc3QgcHJldkdkID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5nZW5lcmF0ZURvY3VtZW50UmVzdWx0O1xuICAgICAgaWYgKGdkICE9PSBwcmV2R2QgfHwgZ2Q/LmZpbGVOYW1lICE9PSBwcmV2R2Q/LmZpbGVOYW1lIHx8IGdkPy5maWxlVHlwZSAhPT0gcHJldkdkPy5maWxlVHlwZSB8fCBnZD8uczNGaWxlTmFtZSAhPT0gcHJldkdkPy5zM0ZpbGVOYW1lKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID0gZ2Q/LmZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA9IGdkPy5maWxlVHlwZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA/PyAnJztcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGggPSBnZD8uczNGaWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlTmFtZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlVHlwZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlUGF0aCA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGlkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgIGNvbnN0IG5leHREb3dubG9hZGluZyA9ICEhdGlkICYmIHRoaXMuZG93bmxvYWRpbmdTdGVwSWQgPT09IHRpZDtcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nICE9PSBuZXh0RG93bmxvYWRpbmcpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEb3dubG9hZGluZyA9IG5leHREb3dubG9hZGluZztcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAodGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBjb25zdCBpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdmFsdWVzIHRvIGhhbmRsZSBudWxsL3VuZGVmaW5lZCBjb25zaXN0ZW50bHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbDogYW55KSA9PiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWwpO1xuICAgICAgY29uc3QgY3VycmVudE5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBjb25zdCBpbnN0YW5jZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuXG4gICAgICBpZiAoY3VycmVudE5vcm1hbGl6ZWQgIT09IGluc3RhbmNlTm9ybWFsaXplZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogZW5zdXJlIHNlbGVjdGVkSXRlcmF0aW9uSWQgZnJvbSBpbnB1dCBpcyB1c2VkXG4gICAgaWYgKHRoaXMuaXNMb29wU3RlcChjdXJyZW50U3RlcCkgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgY29uc3QgaW5zdGFuY2VTZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZDtcblxuICAgICAgLy8gTm9ybWFsaXplIHZhbHVlcyB0byBoYW5kbGUgbnVsbC91bmRlZmluZWQgY29uc2lzdGVudGx5XG4gICAgICBjb25zdCBub3JtYWxpemVWYWx1ZSA9ICh2YWw6IGFueSkgPT4gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcodmFsKTtcbiAgICAgIGNvbnN0IGN1cnJlbnROb3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUoY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgY29uc3QgaW5zdGFuY2VOb3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUoaW5zdGFuY2VTZWxlY3RlZEl0ZXJhdGlvbklkKTtcblxuICAgICAgaWYgKGN1cnJlbnROb3JtYWxpemVkICE9PSBpbnN0YW5jZU5vcm1hbGl6ZWQpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgZXhwYW5kZWQgc3RhdGUgLSB1c2Ugc2V0SW5wdXQgdG8gcHJvcGVybHkgdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgIC8vIEFsd2F5cyByZWNhbGN1bGF0ZSBleHBhbmRlZCBzdGF0ZSB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgYXMgaXQgbWF5IGRlcGVuZCBvbiBwYXJlbnQgc3RhdGVcbiAgICBsZXQgZXhwYW5kZWRTdGF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgJiYgY3VycmVudFN0ZXApIHtcbiAgICAgIGV4cGFuZGVkU3RhdGUgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcihjdXJyZW50U3RlcCk7XG4gICAgfSBlbHNlIGlmICgoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHBhbmRlZFN0YXRlID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBpZiBpdCBjaGFuZ2VkXG4gICAgaWYgKGV4cGFuZGVkU3RhdGUgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCAhPT0gZXhwYW5kZWRTdGF0ZSkge1xuICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgLy8gVXNlIHNldElucHV0IHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgQElucHV0KCkgZXhwYW5kZWQgcHJvcGVydHlcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZ09uQ2hhbmdlcyBpcyBjYWxsZWQgaW4gY2hpbGQgY29tcG9uZW50c1xuICAgICAgaWYgKGNvbXBvbmVudFJlZiAmJiB0eXBlb2YgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBleHBhbmRlZFN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBBbmd1bGFyIHZlcnNpb25zOiBtYW51YWxseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgLy8gTWFudWFsbHkgY2FsbCBuZ09uQ2hhbmdlcyBpZiB0aGUgY29tcG9uZW50IGltcGxlbWVudHMgaXRcbiAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgICBleHBhbmRlZDogbmV3IFNpbXBsZUNoYW5nZShwcmV2aW91c1ZhbHVlLCBleHBhbmRlZFN0YXRlLCBwcmV2aW91c1ZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgfTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgfVxuICAgICAgLy8gQWxzbyB1cGRhdGUgdGhlIHN0ZXAgb2JqZWN0J3MgZXhwYW5kZWQgcHJvcGVydHkgdG8ga2VlcCBpdCBpbiBzeW5jXG4gICAgICBpZiAoY3VycmVudFN0ZXApIHtcbiAgICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgfVxuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNvbmZpZyByZWZlcmVuY2UgLSBlbnN1cmUgYWxsIHByb3BlcnRpZXMgaW5jbHVkaW5nIGJyYW5jaGVzIGFyZSBpbmNsdWRlZFxuICAgIGlmICgnY29uZmlnJyBpbiBpbnN0YW5jZSkge1xuICAgICAgLy8gVXBkYXRlIGNvbmZpZyB3aXRoIGN1cnJlbnQgc3RlcCB0byBlbnN1cmUgYWxsIHByb3BlcnRpZXMgaW5jbHVkaW5nIGJyYW5jaGVzIGFyZSBzeW5jZWRcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHsgLi4uKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLCAuLi5jdXJyZW50U3RlcCB9O1xuICAgICAgLy8gRXhwbGljaXRseSBlbnN1cmUgYnJhbmNoZXMgaXMgdXBkYXRlZCBmb3IgY29uZGl0aW9uLXN0ZXAgKGluIGNhc2UgaXQgd2FzIG5lc3RlZClcbiAgICAgIC8vIFVzZSB0aGUgYWxyZWFkeSB1cGRhdGVkIGJyYW5jaGVzIGZyb20gaW5zdGFuY2UgdG8gbWFpbnRhaW4gcmVmZXJlbmNlIGNvbnNpc3RlbmN5XG4gICAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3RlcCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgb24gdGhlIGluc3RhbmNlXG4gICAgaWYgKCdzdGVwJyBpbiBpbnN0YW5jZSkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IGN1cnJlbnRTdGVwO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgY29uc3QgcHJldmlvdXNTZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHNlbGZIZWFsQW5hbHlzaXMsIHByZXZpb3VzU2VsZkhlYWxBbmFseXNpcykpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzXG4gICAgLy8gVGhpcyBlbnN1cmVzIG9ubHkgdGhlIG5lc3RlZCBzdGVwIHVwZGF0ZXMgd2l0aG91dCBhZmZlY3RpbmcgcGFyZW50IHN0ZXBzXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNkcikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBjYWxsIG1hcmtGb3JDaGVjayBvbiB0aGlzIGNvbXBvbmVudCB0byBhdm9pZCB0cmlnZ2VyaW5nIHBhcmVudCByZS1yZW5kZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIGxvb3Atc3RlcCBzZWxlY3RlZEl0ZXJhdGlvbiB3aGVuIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlc1xuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXRlcmF0aW9ucyBtaWdodCBub3QgYmUgbG9hZGVkIHlldFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlOiBhbnksIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zIHx8IChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZz8uaXRlcmF0aW9ucyB8fCBbXTtcblxuICAgIGlmIChpdGVyYXRpb25zICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpdGVyYXRpb25zLmZpbmQoKGl0ZXI6IGFueSkgPT4gaXRlci5pZCA9PT0gc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgLy8gU3luYyB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgc2VsZWN0IGRlZmF1bHRcbiAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgaXRlcmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHRoZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIGFscmVhZHkgc2V0XG4gICAgLy8gYW5kIHdpbGwgYmUgdXNlZCB3aGVuIGl0ZXJhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSAoaGFuZGxlZCBpbiB1cGRhdGVDb21wb25lbnRJbnN0YW5jZSBhbmQgbmdEb0NoZWNrKVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWx1ZUNoYW5nZWQoY3VycmVudDogYW55LCBwcmV2aW91czogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gU2hhbGxvdyBjb21wYXJpc29uIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IHByZXZpb3VzID09IG51bGwpIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcblxuICAgIC8vIEZvciBhcnJheXMsIGNoZWNrIGxlbmd0aCBhbmQgcmVmZXJlbmNlXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICE9PSBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7IC8vIFJlZmVyZW5jZSBjaGVja1xuICAgIH1cblxuICAgIC8vIEZvciBvYmplY3RzLCBkbyBzaGFsbG93IGNvbXBhcmlzb24gKGNoZWNrIHJlZmVyZW5jZSlcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcmV2aW91cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIHByaW1pdGl2ZXNcbiAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBicmFuY2hlcyBhcnJheSB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgc3ViU3RlcHNcbiAgICovXG4gIHByaXZhdGUgaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIGJyYW5jaCBhbmQgaXRzIHN1YlN0ZXBzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoID0gcHJldmlvdXNbaV07XG5cbiAgICAgIGlmICghcHJldmlvdXNCcmFuY2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDaGVjayBpZiBicmFuY2ggcHJvcGVydGllcyBjaGFuZ2VkXG4gICAgICBpZiAoY3VycmVudEJyYW5jaC50eXBlICE9PSBwcmV2aW91c0JyYW5jaC50eXBlIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2gubGFiZWwgIT09IHByZXZpb3VzQnJhbmNoLmxhYmVsIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guZXhlY3V0ZWQgIT09IHByZXZpb3VzQnJhbmNoLmV4ZWN1dGVkIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guY29uZGl0aW9uVHlwZSAhPT0gcHJldmlvdXNCcmFuY2guY29uZGl0aW9uVHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3ViU3RlcHMgYXJyYXkgY2hhbmdlZCAobGVuZ3RoIG9yIHJlZmVyZW5jZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRTdWJTdGVwcyA9IGN1cnJlbnRCcmFuY2guc3ViU3RlcHMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c1N1YlN0ZXBzID0gcHJldmlvdXNCcmFuY2guc3ViU3RlcHMgfHwgW107XG5cbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMubGVuZ3RoICE9PSBwcmV2aW91c1N1YlN0ZXBzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudFN1YlN0ZXBzICE9PSBwcmV2aW91c1N1YlN0ZXBzKSByZXR1cm4gdHJ1ZTsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgY29tcGFyaXNvbiBmb3IgbmVzdGVkU3RlcHMgYXJyYXkgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgY29uZGl0aW9uIHN0ZXBzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYnJhbmNoZXNcbiAgICovXG4gIHByaXZhdGUgaGFzTmVzdGVkU3RlcHNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIHN0ZXAgYnkgSUQgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBhcnJheSBsZW5ndGggaXMgc2FtZSBidXQgY29udGVudCBkaWZmZXJzIChlLmcuLCBzd2l0Y2hpbmcgYnJhbmNoZXMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RlcCA9IGN1cnJlbnRbaV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c1N0ZXApIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDb21wYXJlIHN0ZXAgSURzIC0gaWYgSURzIGRpZmZlciwgY29udGVudCBoYXMgY2hhbmdlZFxuICAgICAgY29uc3QgY3VycmVudFN0ZXBJZCA9IGN1cnJlbnRTdGVwLmlkIHx8IGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXBJZCA9IHByZXZpb3VzU3RlcC5pZCB8fCBwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcblxuICAgICAgaWYgKGN1cnJlbnRTdGVwSWQgIT09IHByZXZpb3VzU3RlcElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGNoZWNrIGlmIHRoZSBzdGVwIHR5cGUgY2hhbmdlZCAoaW1wb3J0YW50IGZvciBicmFuY2ggc3dpdGNoaW5nKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgIT09IHByZXZpb3VzU3RlcC50eXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0ZXN0U3RlcFR5cGUgY2hhbmdlZCAoSUYgdnMgRUxTRV9JRiB2cyBFTFNFKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLnRlc3RTdGVwVHlwZSAhPT0gcHJldmlvdXNTdGVwLnRlc3RTdGVwVHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHVwZGF0ZSB0b2tlbiBpZiBwcmVzZW50ICh1c2VkIHRvIGZvcmNlIHJlLXJlbmRlcilcbiAgICAgIGlmIChjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gJiYgY3VycmVudFN0ZXAuX3VwZGF0ZVRva2VuICE9PSBwcmV2aW91c1N0ZXAuX3VwZGF0ZVRva2VuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RlcEtleShzdGVwOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghc3RlcCkgcmV0dXJuICcnO1xuICAgIC8vIENyZWF0ZSBhIGtleSBmcm9tIGltcG9ydGFudCBwcm9wZXJ0aWVzIHRoYXQgY2hhbmdlXG4gICAgLy8gSW5jbHVkZSBleGVjdXRpb25EYXRhLnN0ZXBTdGF0dXMgZm9yIGxpdmUgZXhlY3V0aW9uIHNjZW5hcmlvc1xuICAgIGNvbnN0IGV4ZWN1dGlvblN0YXR1cyA9IHN0ZXAuZXhlY3V0aW9uRGF0YT8uc3RlcFN0YXR1cyB8fCBzdGVwLnN0YXR1cyB8fCAnJztcbiAgICAvLyBJbmNsdWRlIGJyYW5jaGVzIGxlbmd0aCBmb3IgY29uZGl0aW9uLXN0ZXAgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGJyYW5jaGVzTGVuZ3RoID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLmxlbmd0aDtcbiAgICAvLyBJbmNsdWRlIHRvdGFsIHN1YlN0ZXBzIGNvdW50IGFjcm9zcyBhbGwgYnJhbmNoZXMgZm9yIG5lc3RlZCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgdG90YWxTdWJTdGVwcyA9IChzdGVwLmJyYW5jaGVzIHx8IFtdKS5yZWR1Y2UoKHN1bTogbnVtYmVyLCBicmFuY2g6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHN1bSArIChicmFuY2guc3ViU3RlcHM/Lmxlbmd0aCB8fCAwKTtcbiAgICB9LCAwKTtcbiAgICAvLyBJbmNsdWRlIGluaXRpYWxBY3Rpb25zIGxlbmd0aCBmb3IgYXBpLXN0ZXAgbGl2ZSBleGVjdXRpb24gbG9nc1xuICAgIGNvbnN0IGluaXRpYWxBY3Rpb25zTGVuZ3RoID0gKHN0ZXAuaW5pdGlhbEFjdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgICByZXR1cm4gYCR7c3RlcC5pZCB8fCAnJ31fJHtleGVjdXRpb25TdGF0dXN9XyR7c3RlcC5zdGF0dXMgfHwgJyd9XyR7c3RlcC5kdXJhdGlvbiB8fCAnJ31fJHtzdGVwLmV4cGFuZGVkIHx8IGZhbHNlfV8keyhzdGVwLmNoaWxkcmVuIHx8IFtdKS5sZW5ndGh9XyR7KHN0ZXAubmVzdGVkU3RlcHMgfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5zdGVwcyB8fCBbXSkubGVuZ3RofV8ke2JyYW5jaGVzTGVuZ3RofV8ke3RvdGFsU3ViU3RlcHN9XyR7c3RlcC5zdGVwTnVtYmVyIHx8ICcnfV8ke3N0ZXAuc3RlcERlbGV0ZWQgfHwgZmFsc2V9XyR7aW5pdGlhbEFjdGlvbnNMZW5ndGh9YDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudCgpIHtcbiAgICBcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZCB8fCB0aGlzLnN0ZXAuaWQ7XG4gICAgY29uc3QgY3VycmVudFN0ZXBUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZSh0aGlzLnN0ZXApIHx8ICh0aGlzLnN0ZXAgYXMgYW55KS50eXBlO1xuXG4gICAgLy8gT25seSBjbGVhciBhbmQgcmVjcmVhdGUgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBjb25zdCBuZWVkc1JlY3JlYXRpb24gPSB0aGlzLmxhc3RTdGVwSWQgIT09IGN1cnJlbnRTdGVwSWQgfHwgdGhpcy5sYXN0U3RlcFR5cGUgIT09IGN1cnJlbnRTdGVwVHlwZTtcblxuICAgIGlmIChuZWVkc1JlY3JlYXRpb24pIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAvLyBDbGVhciBzdG9yZWQgaW5zdGFuY2Ugd2hlbiByZWNyZWF0aW5nXG4gICAgICBjb25zdCBvbGRJbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChvbGRJbnN0YW5jZSkge1xuICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZGVsZXRlKG9sZEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmRlbGV0ZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgICB0aGlzLmxhc3RTdGVwSWQgPSBjdXJyZW50U3RlcElkO1xuICAgICAgdGhpcy5sYXN0U3RlcFR5cGUgPSBjdXJyZW50U3RlcFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHNhbWUgc3RlcCwganVzdCB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IGNsZWFyaW5nXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXBkYXRlIGFsbCBwcm9wZXJ0aWVzXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgICAgLy8gVXNlIHNldElucHV0IGZvciBpbnB1dCBwcm9wZXJ0aWVzIHRvIHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdleHBhbmRlZCcgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgbmV3VmFsdWUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLnRoaXMuc3RlcCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFN5bmMgZmlsZS1kb3dubG9hZCAoZ2VuZXJhdGVEb2N1bWVudCkgcHJvcHMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVR5cGVGb3JVcGRhdGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLnR5cGU7XG4gICAgICAgIGlmIChlZmZlY3RpdmVUeXBlRm9yVXBkYXRlID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgICAgICBjb25zdCBnZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA9IGdkPy5maWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSA/PyAnJztcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA9IGdkPy5maWxlVHlwZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSA/PyAnJztcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAgIGNvbnN0IHRpZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVR5cGUgPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZTtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlUGF0aCA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgc2VsZkhlYWxBbmFseXNpcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiB0aGlzLnN0ZXApIHtcbiAgICAgICAgICBjb25zdCBzZWxmSGVhbEFuYWx5c2lzID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIGV2ZW50IHN1YnNjcmlwdGlvbnMgYXJlIHN0aWxsIGFjdGl2ZSBmb3Igc2VsZkhlYWxBY3Rpb25cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uICYmIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAvLyBUcmFjayBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3NlbGZIZWFsQWN0aW9uJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPy4oZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnc2VsZkhlYWxBY3Rpb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIGhhbmRsZXIgcmVmZXJlbmNlc1xuICAgICAgICBpZiAodGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIgPSB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyO1xuICAgICAgICAvLyBTeW5jIGlzRGVidWcgYW5kIGRlYnVnUG9pbnRTZXQgc28gbmVzdGVkIHN0ZXBzIChlLmcuIGluc2lkZSBsb29wKSBhbHdheXMgc2hvdyBkZWJ1ZyBpY29uIHdoZW4gcGFyZW50IGhhcyBpc0RlYnVnIHRydWVcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgIT09IHRoaXMuaXNEZWJ1Zykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAgIH1cbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCA9IHRoaXMuZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpO1xuICAgICAgICBpZiAodGhpcy5hZGRTdGVwTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE1lbnVPcHRpb25zID0gdGhpcy5hZGRTdGVwTWVudU9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVNZW51T3B0aW9ucyA9IHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgICBpZiAodGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQ7XG4gICAgICAgIGlmICh0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlciA9IHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXI7XG4gICAgICAgIGlmICh0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIgPSB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI7XG4gICAgICAgIC8vIEVuc3VyZSBkZWJ1ZyBwb2ludCBjbGljayBpcyB3aXJlZCB3aGVuIGlzRGVidWcgaXMgdHJ1ZSAoZS5nLiBhZnRlciB0b2dnbGluZyBpbiBTdG9yeWJvb2spXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZS5zdWJzY3JpYmUoKHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj8uKHRoaXMuc3RlcCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZGVidWdQb2ludENoYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwICYmIHRoaXMub25FZGl0U3RlcEhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2VkaXRTdGVwJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25FZGl0U3RlcEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZWRpdFN0ZXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0KSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdhZGRTdGVwT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRTdGVwT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2FkZFN0ZXBPcHRpb25TZWxlY3QnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc3RlcE1vcmVPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgICB0aGlzLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcbiAgICAgICAgLy8gQ29tcG9uZW50IGFscmVhZHkgZXhpc3RzIGFuZCBpcyByZWFkeSwgZW1pdCBpbW1lZGlhdGVseVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5LmVtaXQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZmZlY3RpdmVUeXBlID0gdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZSh0aGlzLnN0ZXApIHx8ICh0aGlzLnN0ZXAgYXMgYW55KS50eXBlO1xuICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudE1hcC5nZXQoZWZmZWN0aXZlVHlwZSk7XG5cbiAgICBpZiAoY29tcG9uZW50VHlwZSkge1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cbiAgICAgIC8vIFN0b3JlIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmVmIGluIFdlYWtNYXAgZm9yIGZ1dHVyZSB1cGRhdGVzXG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLnNldCh0aGlzLmNvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuc2V0KHRoaXMuY29udGFpbmVyLCBjb21wb25lbnRSZWYpO1xuXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgcmVmZXJlbmNlIGZvciBjbGVhbnVwXG4gICAgICAoY29tcG9uZW50UmVmIGFzIGFueSkuX2NvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcblxuICAgICAgLy8gU3ByZWFkIGNvbmZpZyBwcm9wZXJ0aWVzIGFzIGluZGl2aWR1YWwgaW5wdXRzIGZvciBjb21wb25lbnRzIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICAvLyBUaGlzIHN1cHBvcnRzIGJvdGggcGF0dGVybnM6IGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY29uZmlnIGRpcmVjdGx5IGFuZCB0aG9zZSB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zdGVwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogbWFwIGNoaWxkcmVuIHRvIG5lc3RlZFN0ZXBzIGlmIG5lc3RlZFN0ZXBzIGlzIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGxvb3BUeXBlIGJhc2VkIG9uIGFjdGlvbk5hbWUgb3IgdGVzdFN0ZXBUeXBlXG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkpIHtcbiAgICAgICAgLy8gU2V0IGxvb3BUeXBlIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9uTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb25OYW1lO1xuICAgICAgICAgIGNvbnN0IHRlc3RTdGVwVHlwZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGU7XG4gICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICdGT1JfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnRk9SX0xPT1AnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSA9ICdmb3InO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTmFtZSA9PT0gJ1dISUxFX0xPT1AnIHx8IHRlc3RTdGVwVHlwZSA9PT0gJ1dISUxFX0xPT1AnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSA9ICd3aGlsZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aXRsZSBpcyBzZXQgZnJvbSBhY3Rpb24gaWYgdGl0bGUgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGluaXRpYWxpemUgaXRlcmF0aW9ucyBpZiBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApICYmICEoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSBzdGVwXCIsIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCwgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucylcbiAgICAgICAgLy8gVXNlIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdHJ5IHRvIGluaXRpYWxpemUgZnJvbSBzdGVwLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHRcbiAgICAgICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0Py5zdGVwUmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQpKSB7XG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBpdGVyYXRpb25zIGRpcmVjdGx5IGZyb20gc3RlcFJlc3VsdFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnM6IGFueVtdID0gW107XG4gICAgICAgICAgKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGVkUmVzdWx0LnN0ZXBSZXN1bHQuZm9yRWFjaCgoaXRlcmF0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbkluZGV4ID0gaXRlcmF0aW9uLmluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlcmF0aW9uLmluZGV4ICE9PSBudWxsID8gaXRlcmF0aW9uLmluZGV4IDogaXRlcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgc3RhdHVzOiAnc3VjY2VzcycgfCAnZmFpbGVkJyB8ICdwZW5kaW5nJyB8ICdydW5uaW5nJyA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIGlmIChpdGVyYXRpb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0xvd2VyID0gaXRlcmF0aW9uLnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICBpZiAoc3RhdHVzTG93ZXIgPT09ICdzdWNjZXNzJyB8fCBzdGF0dXNMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ3J1bm5pbmcnIHx8IHN0YXR1c0xvd2VyID09PSAnaW5fcHJvZ3Jlc3MnKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBpZDogYGl0ZXItJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBsYWJlbDogYGl0ZXIgJHtpdGVyYXRpb25JbmRleH1gLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgICAgc3ViU3RlcHM6IFtdLFxuICAgICAgICAgICAgICBpbmRleDogaXRlcmF0aW9uSW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgPSBpdGVyYXRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGRlZmF1bHRJdGVyYXRpb24gYW5kIHNlbGVjdGVkSXRlcmF0aW9uSWRcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gc3RlcCAyXCIsIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCwgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucylcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRJdGVyYXRpb24gdG8gJ2xhc3QnIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uID0gJ2xhc3QnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkSXRlcmF0aW9uSWQgLSBwcmlvcml0aXplIGlucHV0IHZhbHVlLCB0aGVuIHN0ZXAgdmFsdWUsIHRoZW4gbGFzdCBpdGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNldCBzZWxlY3RlZEl0ZXJhdGlvbklkIHRvIGxhc3QgaXRlcmF0aW9uIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zO1xuICAgICAgICAgIGlmIChpdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoaXRlcmF0aW9ucykgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmICEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uID0gaXRlcmF0aW9uc1tpdGVyYXRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGxhc3RJdGVyYXRpb24uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHN0ZXAtZ3JvdXA6IG1hcCBjaGlsZHJlbiB0byBzdGVwcyBpZiBzdGVwcyBpcyBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkuc3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmdyb3VwTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGUtZG93bmxvYWQgKGluY2x1ZGluZyBnZW5lcmF0ZURvY3VtZW50KTogc2V0IHByb3BzIGZyb20gZ2VuZXJhdGVEb2N1bWVudFJlc3VsdCBhbmQgd2lyZSBoYW5kbGVyc1xuICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICBjb25zdCBnZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkID0gKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgdGlkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmRvd25sb2FkZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS50aXRsZSkgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnRpdGxlID0gKGluc3RhbmNlIGFzIGFueSkudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkICYmIHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25Eb3dubG9hZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoQ29waWVkICYmIHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnRleHRDb3BpZWQgJiYgdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGV4dENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25UZXh0Q29waWVkSGFuZGxlciEoZXYpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogc2V0IGJyYW5jaGVzIGFuZCBjb25kaXRpb25UZXh0XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFNldCBicmFuY2hlcyAtIHByaW9yaXRpemUgc3RlcC5icmFuY2hlcyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgaGFuZGxlclxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBkZWVwIGNvcHkgdG8gZW5zdXJlIHByb3BlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAmJiB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXJCcmFuY2hlcyA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgICAgLy8gQ3JlYXRlIGRlZXAgY29weSB0byBlbnN1cmUgcHJvcGVyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IGhhbmRsZXJCcmFuY2hlcy5tYXAoKGJyYW5jaDogYW55KSA9PiAoe1xuICAgICAgICAgICAgLi4uYnJhbmNoLFxuICAgICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGNvbmRpdGlvblRleHQgZnJvbSBhY3Rpb24gaWYgY29uZGl0aW9uVGV4dCBpcyBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBpc0xvYWRpbmcgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0xvYWRpbmcgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFzcyBhY3RpdmVCcmFuY2hTdGVwSWQgaWYgcHJlc2VudFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBhaS1hZ2VudC1zdGVwOiBlbnN1cmUgdGl0bGUgYW5kIHByb21wdCBhcmUgc2V0IGZyb20gYWN0aW9uXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhaS1hZ2VudCcpIHtcbiAgICAgICAgLy8gU2V0IHRpdGxlIGZyb20gYWN0aW9uIGlmIHRpdGxlIGlzIG5vdCBwcmVzZW50IG9yIGVtcHR5XG4gICAgICAgIGlmICgoIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlIHx8ICEoaW5zdGFuY2UgYXMgYW55KS50aXRsZS50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHByb21wdCBmcm9tIGFjdGlvbiBpZiBwcm9tcHQgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkucHJvbXB0IHx8ICEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucHJvbXB0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgYWN0aW9ucyBhcnJheSBpcyBzZXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zICYmIHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBhY3Rpb25Db3VudCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zIHx8IFtdO1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50ID0gYWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHNlbGVjdGVkVGFiSW5wdXQgaWYgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0KSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRUYWJJbnB1dCA9ICdhY3Rpb24tdHJhY2UnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgY29tbW9uIGV2ZW50IGVtaXR0ZXJzIGZvciBhcGksIGFpLWFnZW50LCBsb29wLCBjb25kaXRpb24sIGFuZCBiYXNpYyBzdGVwc1xuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnYXBpJyB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2FpLWFnZW50JyB8fCB0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSB8fCB0aGlzLnN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicgfHwgdGhpcy5zdGVwLnR5cGUgPT09ICdiYXNpYycpIHtcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNvbW1vbiBvdXRwdXQgZXZlbnRzIGFuZCBjYWxsIGhhbmRsZXJzXG4gICAgICAgIC8vIEV2ZW50RW1pdHRlcnMgYXJlIFN1YmplY3RzLCBzbyB3ZSBjYW4gc3Vic2NyaWJlIHRvIHRoZW1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUgJiYgdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubWFrZUN1cnJlbnRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudXBsb2FkQmFzZWxpbmUgJiYgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZSAmJiB0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hbmFseXplLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQW5hbHl6ZUhhbmRsZXI/LigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3MgJiYgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3Muc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24gJiYgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikge1xuICAgICAgICAgIC8vIFRyYWNrIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc2VsZkhlYWxBY3Rpb24nKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzZWxmSGVhbEFjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBvbkpzb25QYXRoQ29waWVkSGFuZGxlciBpcyBzZXQgYXMgaW5wdXQgcHJvcGVydHkgKGxpbmUgODI1KSwgc28gd2UgZG9uJ3QgbmVlZCB0byBzdWJzY3JpYmUgdG8ganNvblBhdGhDb3BpZWQgZXZlbnRcbiAgICAgICAgLy8gVGhlIEFQSSBzdGVwIGNvbXBvbmVudCBjYWxscyB0aGUgaGFuZGxlciBkaXJlY3RseSwgYXZvaWRpbmcgZHVwbGljYXRlIGNhbGxzXG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogd2lyZSB1cCBvblZpZXdBbGxJdGVyYXRpb25zIGV2ZW50XG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkpIHtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMgJiYgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgZGVidWcgcG9pbnQgdG9nZ2xlIGZvciBhbnkgc3RlcCB0aGF0IHN1cHBvcnRzIGl0ICh3aGVuIGlzRGVidWcgaXMgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyPy4odGhpcy5zdGVwLCB2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2RlYnVnUG9pbnRDaGFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIGVkaXQgc3RlcDogd2hlbiB1c2VyIGNsaWNrcyBFZGl0IGljb24sIG5vdGlmeSBwYXJlbnQgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZWRpdFN0ZXAgJiYgdGhpcy5vbkVkaXRTdGVwSGFuZGxlcikge1xuICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnZWRpdFN0ZXAnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZWRpdFN0ZXAnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIGFkZC1zdGVwIG9wdGlvbiBzZWxlY3Q6IHdoZW4gdXNlciBwaWNrcyBhbiBvcHRpb24gZnJvbSB0aGUgUGx1cyBtZW51LCBlbWl0IGFuZCBvcHRpb25hbGx5IGNhbGwgaGFuZGxlclxuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0KSB7XG4gICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdhZGRTdGVwT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgdGhpcy5hZGRTdGVwT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnYWRkU3RlcE9wdGlvblNlbGVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgc3RlcCBtb3JlIG9wdGlvbiBzZWxlY3Q6IHdoZW4gdXNlciBwaWNrcyBhbiBvcHRpb24gZnJvbSB0aGUgdGhyZWUtZG90IG1lbnUsIGVtaXQgYW5kIG9wdGlvbmFsbHkgY2FsbCBoYW5kbGVyXG4gICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0KSB7XG4gICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcE1vcmVPcHRpb25TZWxlY3QuZW1pdCh7IG9wdGlvbiwgc3RlcDogdGhpcy5zdGVwIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiB3aXJlIHVwIG9uRXhwYW5kIGV2ZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZCAmJiB0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBDYWxsIG9uRXhwYW5kSGFuZGxlciB3aXRoIHRoZSBzdGVwIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgdXAgb25CcmFuY2hDbGlja0V2ZW50IGZvciBuZXN0ZWQgY29uZGl0aW9uIHN0ZXBzXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQgJiYgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uQnJhbmNoQ2xpY2tFdmVudC5zdWJzY3JpYmUoKGJyYW5jaDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyPy4odGhpcy5zdGVwLCBicmFuY2gpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSBleHBhbmRlZCBwcm9wZXJ0eSBpcyBwYXNzZWQgY29ycmVjdGx5XG4gICAgICAvLyBVc2UgaXNTdGVwRXhwYW5kZWRIYW5kbGVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBzdGVwLmV4cGFuZGVkIG9yIHN0ZXAuY29uZmlnLmV4cGFuZGVkXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU3RhdGUgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgaGFuZGxlciBmdW5jdGlvbnMgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZEhhbmRsZXIgPSB0aGlzLm9uRXhwYW5kSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkVkaXRTdGVwSGFuZGxlciA9IHRoaXMub25FZGl0U3RlcEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5hZGRTdGVwTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE1lbnVPcHRpb25zID0gdGhpcy5hZGRTdGVwTWVudU9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyID0gdGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU1lbnVPcHRpb25zID0gdGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zO1xuICAgICAgaWYgKHRoaXMub25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyID0gdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgIGlmICh0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCA9IHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgIGlmICh0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyID0gdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwTG9hZGluZ0hhbmRsZXIgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXIgPSB0aGlzLmNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlciA9IHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIgPSB0aGlzLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEFjdGlvbnNIYW5kbGVyID0gdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQW5hbHl6ZUhhbmRsZXIgPSB0aGlzLm9uQW5hbHl6ZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0Z1bGxMb2dzSGFuZGxlciA9IHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyID0gdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPSB0aGlzLmdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIgPSB0aGlzLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblN0ZXBDbGlja0hhbmRsZXIgPSB0aGlzLm9uU3RlcENsaWNrSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkpzb25QYXRoQ29waWVkSGFuZGxlciA9IHRoaXMub25Kc29uUGF0aENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkRvd25sb2FkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Eb3dubG9hZEhhbmRsZXIgPSB0aGlzLm9uRG93bmxvYWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyID0gdGhpcy5vbkZpbGVQYXRoQ29waWVkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVGV4dENvcGllZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVGV4dENvcGllZEhhbmRsZXIgPSB0aGlzLm9uVGV4dENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyID0gdGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyID0gdGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIgPSB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBpZiAodGhpcy5pc0xpdmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNMaXZlID0gdGhpcy5pc0xpdmU7XG4gICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ID0gdGhpcy5nZXRFZmZlY3RpdmVEZWJ1Z1BvaW50U2V0KCk7XG4gICAgICAvLyBQYXNzIHN0ZXBOdW1iZXIgaW5wdXQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2Ugc3RlcCdzIHN0ZXBOdW1iZXJcbiAgICAgIGlmICh0aGlzLnN0ZXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFBhc3MgdGhlIHN0ZXAgb2JqZWN0IHNvIHRvZ2dsZUhlYWRlciBjYW4gdXNlIGl0XG4gICAgICBpZiAodGhpcy5zdGVwKSAoaW5zdGFuY2UgYXMgYW55KS5zdGVwID0gdGhpcy5zdGVwO1xuXG4gICAgICAvLyBVcGRhdGUgY29uZGl0aW9uLXN0ZXAgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBVcGRhdGUgYWN0aXZlQnJhbmNoU3RlcElkIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgYnJhbmNoZXMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbmVzdGVkU3RlcHMgaWYgdGhleSBjaGFuZ2VkXG4gICAgICAgIGlmICgodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvLyBTZXQgc2VsZkhlYWxBbmFseXNpcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgIGNvbnN0IHNlbGZIZWFsQW5hbHlzaXMgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSBzZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XG4gICAgICBpZiAoJ2NvbmZpZycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RlcCxcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlLWRvd25sb2FkJyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlTmFtZSxcbiAgICAgICAgICAgIGZpbGVUeXBlOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlVHlwZSxcbiAgICAgICAgICAgIGZpbGVQYXRoOiAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCxcbiAgICAgICAgICAgIGRvd25sb2FkZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkZWRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgc2VsZkhlYWxBbmFseXNpcyBpcyBpbmNsdWRlZCBpbiBjb25maWdcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQW5hbHlzaXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBrZXkgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVtaXQgcmVhZHkgZXZlbnQgYWZ0ZXIgY29tcG9uZW50IGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkXG4gICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyBmdWxseSByZW5kZXJlZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVhZHkuZW1pdCgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIC8vIFVzZSBuZ0RvQ2hlY2sgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gbmVzdGVkIHByb3BlcnRpZXMgdGhhdCBuZ09uQ2hhbmdlcyBtaWdodCBtaXNzXG4gICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAvLyBCdWcgMiBmaXg6IGRldGVjdCBpbi1wbGFjZSBzdGVwLnN0YXR1cyBtdXRhdGlvbnMgZHVyaW5nIGxpdmUgZXhlY3V0aW9uLlxuICAgICAgLy8gbmdPbkNoYW5nZXMgbmV2ZXIgZmlyZXMgd2hlbiB0aGUgc3RlcCBvYmplY3QgcmVmZXJlbmNlIGlzIHVuY2hhbmdlZCwgc28gd2VcbiAgICAgIC8vIHRyYWNrIHN0YXR1cyBoZXJlIGFuZCBwdXNoIGNoYW5nZXMgZGlyZWN0bHkgdG8gdGhlIGR5bmFtaWNhbGx5LWxvYWRlZCBpbnN0YW5jZS5cbiAgICAgIGlmICh0aGlzLmlzTGl2ZSkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLnN0YXR1cztcbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgIT09IHRoaXMubGFzdFRyYWNrZWRTdGF0dXMpIHtcbiAgICAgICAgICB0aGlzLmxhc3RUcmFja2VkU3RhdHVzID0gY3VycmVudFN0YXR1cztcblxuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXMgIT09IGN1cnJlbnRTdGF0dXMpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1cyA9IGN1cnJlbnRTdGF0dXM7XG4gICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zdGF0dXMgPSBjdXJyZW50U3RhdHVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBbHNvIHN5bmMgZXhlY3V0aW9uRGF0YS5zdGVwU3RhdHVzIHNvIHN0YXR1cyBpY29ucyByZW5kZXIgY29ycmVjdGx5LlxuICAgICAgICAgICAgY29uc3Qgc3RlcFN0YXR1cyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRpb25EYXRhPy5zdGVwU3RhdHVzID8/IGN1cnJlbnRTdGF0dXM7XG4gICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZXhlY3V0aW9uRGF0YSkge1xuICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leGVjdXRpb25EYXRhID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5leGVjdXRpb25EYXRhLCBzdGVwU3RhdHVzIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5leGVjdXRpb25EYXRhKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leGVjdXRpb25EYXRhID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhlY3V0aW9uRGF0YSwgc3RlcFN0YXR1cyB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCdWcgNSBmaXg6IGRldGVjdCBpbi1wbGFjZSBtdXRhdGlvbnMgb2YgZWRpdGFibGUgc3RlcCBwcm9wZXJ0aWVzIGluIGRlYnVnIG1vZGUuXG4gICAgICAvLyBXaGVuIGEgdXNlciBzYXZlcyBhIHN0ZXAgdmlhIHRoZSBlZGl0IGRpYWxvZyB0aGUgcG9ydGFsIG11dGF0ZXMgYWN0aW9uL3RpdGxlL2V0Yy5cbiAgICAgIC8vIGluLXBsYWNlIGJlZm9yZSAob3Igd2l0aG91dCkgY3JlYXRpbmcgYSBuZXcgc3RlcCByZWZlcmVuY2UsIHNvIG5nT25DaGFuZ2VzIG5ldmVyIGZpcmVzLlxuICAgICAgaWYgKHRoaXMuaXNEZWJ1Zykge1xuICAgICAgICBjb25zdCBlZGl0UHJvcHMgPSBbJ2FjdGlvbicsICd0ZXN0RGF0YVZhbCcsICd0ZXN0RGF0YScsICd0aXRsZScsICdwcmVSZXF1aXNpdGUnLCAncHJpb3JpdHknLCAnZGlzYWJsZWQnXTtcbiAgICAgICAgaWYgKCF0aGlzLmxhc3RUcmFja2VkRWRpdFByb3BzKSB7XG4gICAgICAgICAgLy8gSW5pdGlhbGlzZSBzbmFwc2hvdCBvbiBmaXJzdCBkZWJ1ZyBjeWNsZS5cbiAgICAgICAgICB0aGlzLmxhc3RUcmFja2VkRWRpdFByb3BzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZWRpdFByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RUcmFja2VkRWRpdFByb3BzW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGhhc0VkaXRDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBlZGl0UHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWwgPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsICE9PSB0aGlzLmxhc3RUcmFja2VkRWRpdFByb3BzW2tleV0pIHtcbiAgICAgICAgICAgICAgdGhpcy5sYXN0VHJhY2tlZEVkaXRQcm9wc1trZXldID0gY3VycmVudFZhbDtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpW2tleV0gIT09IGN1cnJlbnRWYWwpIHtcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbDtcbiAgICAgICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnICYmIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzRWRpdENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0VkaXRDaGFuZ2UgJiYgY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN5bmMgaXNEZWJ1ZyBhbmQgZGVidWdQb2ludFNldCBmcm9tIHN0ZXAtcmVuZGVyZXIgaW5wdXRzIHNvIG5lc3RlZCBzdGVwcyAoZS5nLiBpbnNpZGUgbG9vcC9zdGVwLWdyb3VwKVxuICAgICAgLy8gYWx3YXlzIHJlZmxlY3QgcGFyZW50IHN0YXRlIHdoZW4gdG9nZ2xlZCAoZS5nLiBTdG9yeWJvb2sgQ29udHJvbHMpXG4gICAgICBjb25zdCBuZXh0RGVidWdQb2ludFNldCA9IHRoaXMuZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgIT09IG5leHREZWJ1Z1BvaW50U2V0KSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSBuZXh0RGVidWdQb2ludFNldDtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnICE9PSB0aGlzLmlzRGVidWcpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyA9IHRoaXMuaXNEZWJ1ZztcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgZXhwYW5kZWQgc3RhdGUgY2hhbmdlZCAodXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGUsIGFzIGl0IG1heSBkZXBlbmQgb24gcGFyZW50IHN0YXRlKVxuICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIG5lc3RlZCBzdGVwLWdyb3VwcyB3aGVyZSBwYXJlbnQgZXhwYW5zaW9uIGFmZmVjdHMgY2hpbGQgZXhwYW5zaW9uXG4gICAgICBsZXQgY3VycmVudEV4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50RXhwYW5kZWQgPSAodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YW5jZUV4cGFuZGVkID0gKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQ7XG5cbiAgICAgIGlmIChjdXJyZW50RXhwYW5kZWQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50RXhwYW5kZWQgIT09IGluc3RhbmNlRXhwYW5kZWQpIHtcbiAgICAgICAgLy8gRXhwYW5kZWQgc3RhdGUgY2hhbmdlZCwgdXBkYXRlIGl0IHVzaW5nIHNldElucHV0IHRvIHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGluc3RhbmNlRXhwYW5kZWQ7XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYgJiYgdHlwZW9mIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBjdXJyZW50RXhwYW5kZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrOiBtYW51YWxseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBjdXJyZW50RXhwYW5kZWQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgICAgZXhwYW5kZWQ6IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgY3VycmVudEV4cGFuZGVkLCBwcmV2aW91c1ZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBjdXJyZW50RXhwYW5kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGVwIG9iamVjdCdzIGV4cGFuZGVkIHByb3BlcnR5IHRvIGtlZXAgaXQgaW4gc3luY1xuICAgICAgICAodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgPSBjdXJyZW50RXhwYW5kZWQ7XG4gICAgICAgIFxuICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgaXRlcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBhbmQgd2UgbmVlZCB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb25cbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMgfHwgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnPy5pdGVyYXRpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZXJhdGlvbklkID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbiA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uO1xuXG4gICAgICAgIC8vIElmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCBpcyBzZXQsIGJ1dCBzZWxlY3RlZEl0ZXJhdGlvbiBpcyBub3Qgc2V0IG9yIGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQmVTZWxlY3RlZCA9IGl0ZXJhdGlvbnMuZmluZCgoaXRlcjogYW55KSA9PiBpdGVyLmlkID09PSBzZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICBpZiAoc2hvdWxkQmVTZWxlY3RlZCAmJiBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb24/LmlkICE9PSBzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuZ2V0U3RlcEtleSh0aGlzLnN0ZXApO1xuXG4gICAgICAvLyBJZiBzdGVwIHByb3BlcnRpZXMgY2hhbmdlZCAoZXZlbiBpZiByZWZlcmVuY2UgZGlkbid0KSwgdXBkYXRlIHRoZSBpbnN0YW5jZVxuICAgICAgaWYgKGN1cnJlbnRLZXkgIT09IHRoaXMucHJldmlvdXNTdGVwS2V5KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdGhlIHByZXZpb3VzIHN0ZXAgdG8gY29tcGFyZSwgc28gd2UnbGwgdXBkYXRlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgLy8gQ3JlYXRlIGEgbWluaW1hbCBwcmV2aW91cyBzdGVwIGZyb20gdGhlIGluc3RhbmNlJ3MgY3VycmVudCBzdGF0ZVxuICAgICAgICBjb25zdCBwcmV2aW91c1N0ZXA6IGFueSA9IHtcbiAgICAgICAgICBpZDogKGluc3RhbmNlIGFzIGFueSkuaWQsXG4gICAgICAgICAgdHlwZTogKGluc3RhbmNlIGFzIGFueSkudHlwZSxcbiAgICAgICAgICBzdGF0dXM6IChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1cyxcbiAgICAgICAgICBkdXJhdGlvbjogKGluc3RhbmNlIGFzIGFueSkuZHVyYXRpb24sXG4gICAgICAgICAgZXhwYW5kZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkLFxuICAgICAgICAgIGNoaWxkcmVuOiAoaW5zdGFuY2UgYXMgYW55KS5jaGlsZHJlbixcbiAgICAgICAgICBuZXN0ZWRTdGVwczogKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMsXG4gICAgICAgICAgc3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzLFxuICAgICAgICAgIGV4ZWN1dGlvbkRhdGE6IChpbnN0YW5jZSBhcyBhbnkpLmV4ZWN1dGlvbkRhdGEsXG4gICAgICAgICAgYWN0aW9uOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb24sXG4gICAgICAgICAgdGl0bGU6IChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLFxuICAgICAgICAgIHJlc3VsdDogKGluc3RhbmNlIGFzIGFueSkucmVzdWx0LFxuICAgICAgICAgIG1ldGhvZDogKGluc3RhbmNlIGFzIGFueSkubWV0aG9kLFxuICAgICAgICAgIGVuZHBvaW50OiAoaW5zdGFuY2UgYXMgYW55KS5lbmRwb2ludCxcbiAgICAgICAgICBzdGF0dXNDb2RlOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXNDb2RlLFxuICAgICAgICAgIHJlc3BvbnNlVGltZTogKGluc3RhbmNlIGFzIGFueSkucmVzcG9uc2VUaW1lLFxuICAgICAgICAgIGFjdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMsXG4gICAgICAgICAgcHJvbXB0OiAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQsXG4gICAgICAgICAgb3B0aW1pemVkUnVuOiAoaW5zdGFuY2UgYXMgYW55KS5vcHRpbWl6ZWRSdW4sXG4gICAgICAgICAgYWN0aW9uQ291bnQ6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50LFxuICAgICAgICAgIGl0ZXJhdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMsXG4gICAgICAgICAgc2VsZWN0ZWRJdGVyYXRpb25JZDogKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCxcbiAgICAgICAgICBicmFuY2hlczogKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMsXG4gICAgICAgICAgc3RlcE51bWJlcjogKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlcixcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMuc3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSBjdXJyZW50S2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==
1746
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMEQsTUFBTSxFQUFFLGlCQUFpQixFQUFnQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbk4sT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBOEZoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQW5FdkIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUV4QyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFlBQU8sR0FBYSxLQUFLLENBQUM7UUFvQm5DLG1HQUFtRztRQUN6Rix3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBNkQsQ0FBQztRQUM5RyxpSEFBaUg7UUFDdkcseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQThELENBQUM7UUFDdEcsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDLENBQUMsMENBQTBDO1FBOEJ2RixlQUFVLEdBQTJCLElBQUksQ0FBQztRQUMxQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsb0JBQWUsR0FBVyxFQUFFLENBQUM7UUFHckMsNkdBQTZHO1FBQ3JHLHlCQUFvQixHQUFrQyxJQUFJLENBQUM7SUFLL0QsQ0FBQztJQXZDTCxxSUFBcUk7SUFDN0gsb0JBQW9CLENBQUMsSUFBNEM7UUFDdkUsSUFBSSxD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QXdCO3NCQUFoQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQzhDLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUN6QyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUVHLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRywrQkFBK0I7c0JBQXZDLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFR5cGUsIEFmdGVyVmlld0luaXQsIERvQ2hlY2ssIEluamVjdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudFJlZiwgU2ltcGxlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFeGVjdXRpb25TdGVwQ29uZmlnLCBBZGRTdGVwTWVudU9wdGlvbiwgU3RlcE1vcmVNZW51T3B0aW9uIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFNURVBfQ09NUE9ORU5UX01BUCB9IGZyb20gJy4uL3N0ZXAtcmVnaXN0cnkudG9rZW4nO1xuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIGFwcHJvcHJpYXRlIHN0ZXAgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBzdGVwIHR5cGUuXG4gKiBVc2VzIGR5bmFtaWMgY29tcG9uZW50IGxvYWRpbmcgYW5kIGFuIGluamVjdGlvbiB0b2tlbiB0byBicmVhayBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAqIGJldHdlZW4gc3RlcCBjb21wb25lbnRzIGluIEFuZ3VsYXIgSXZ5IHBhcnRpYWwgY29tcGlsYXRpb24gbW9kZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250YWluZXIgI2NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj4nXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBSZW5kZXJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIHN0ZXAhOiBFeGVjdXRpb25TdGVwQ29uZmlnO1xuICBASW5wdXQoKSBvbkV4cGFuZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgaXNTdGVwTG9hZGluZ0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI/OiAoZHVyYXRpb246IG51bWJlcikgPT4gbnVtYmVyO1xuICBASW5wdXQoKSBmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIG9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25VcGxvYWRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVmlld0Z1bGxMb2dzSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI/OiAoKSA9PiB7IGlzTG9hZGluZ0FjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH07IGlzTG9hZGluZ01vZGlmeUFjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfTtcbiAgQElucHV0KCkgaXNVcGxvYWRpbmdCYXNlbGluZT86IGFueTtcbiAgQElucHV0KCkgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU/OiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlcmF0aW9uSWQ/OiBhbnk7XG4gIEBJbnB1dCgpIGdldExvb3BJdGVyYXRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGZvcm1hdEFjdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBvblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj86IChzdGVwOiBhbnksIGJyYW5jaDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN0ZXBDbGlja0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgZXZlbnQ/OiBFdmVudCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Kc29uUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgcGF0aDogc3RyaW5nOyBzb3VyY2U6ICdyZXF1ZXN0Qm9keScgfCAncmVzcG9uc2VCb2R5JyB8ICdyZXF1ZXN0SGVhZGVycycgfCAncmVzcG9uc2VIZWFkZXJzJyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkRvd25sb2FkSGFuZGxlcj86IChldmVudDogeyBmaWxlTmFtZTogc3RyaW5nOyBmaWxlUGF0aD86IHN0cmluZzsgZmlsZVR5cGU6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblRleHRDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHRleHQ6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGp1bXBUb1RpbWVzdGFtcEhhbmRsZXI/OiAodGltZXN0YW1wOiBudW1iZXIsIHRlc3RTdGVwSWQ/OiBudW1iZXIgfCBzdHJpbmcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGRvd25sb2FkaW5nU3RlcElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0RlYnVnPzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogV2hlbiBzZXQsIHVzZWQgZGlyZWN0bHkgZm9yIHRoZSByZW5kZXJlZCBzdGVwJ3MgZGVidWdQb2ludFNldCBzbyB0aGUgaWNvbiBzdGF0ZSBwcm9wYWdhdGVzIHdoZW4gdG9nZ2xlZCAoZS5nLiBpbiBTdG9yeWJvb2spLiAqL1xuICBASW5wdXQoKSBkZWJ1Z1BvaW50U2V0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgZ2V0RGVidWdQb2ludFNldEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCB2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgRWRpdCBpY29uIG9uIGEgc3RlcCAod2hlbiBpc0RlYnVnIGlzIHRydWUpLiBSZWNlaXZlcyB0aGUgc3RlcCBjb25maWcgc28gdGhlIHBhcmVudCBjYW4gb3BlbiBhbiBlZGl0b3IuICovXG4gIEBJbnB1dCgpIG9uRWRpdFN0ZXBIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIC8qKiBBZGQtc3RlcCBtZW51IG9wdGlvbnMgKGUuZy4gXCJBZGQgYmVmb3JlXCIsIFwiQWRkIGFmdGVyXCIpLiBXaGVuIHNldCwgcGFzc2VkIHRvIGFsbCByZW5kZXJlZCBzdGVwczsgd2hlbiB1bnNldCwgc3RlcHMgdXNlIHRoZWlyIGRlZmF1bHQuIE1hbmFnZWQgbGlrZSBodHRwTWV0aG9kT3B0aW9ucyBpbiB0aGUgQVBJIGVkaXQgc2VjdGlvbi4gKi9cbiAgQElucHV0KCkgYWRkU3RlcE1lbnVPcHRpb25zPzogQWRkU3RlcE1lbnVPcHRpb25bXTtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIFBsdXMgbWVudS4gUmVjZWl2ZXMgdGhlIG9wdGlvbiBhbmQgdGhlIHN0ZXAgY29uZmlnLiAqL1xuICBASW5wdXQoKSBvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPzogKG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24sIHN0ZXA/OiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogTW9yZSBvcHRpb25zICh0aHJlZS1kb3QpIG1lbnUgb3B0aW9ucy4gV2hlbiBzZXQsIHBhc3NlZCB0byBhbGwgcmVuZGVyZWQgc3RlcHMuICovXG4gIEBJbnB1dCgpIHN0ZXBNb3JlTWVudU9wdGlvbnM/OiBTdGVwTW9yZU1lbnVPcHRpb25bXTtcbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIE1vcmUgb3B0aW9ucyAodGhyZWUtZG90KSBtZW51LiBSZWNlaXZlcyB0aGUgb3B0aW9uIGFuZCB0aGUgc3RlcCBjb25maWcuICovXG4gIEBJbnB1dCgpIG9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPzogKG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHBhc3NlZCB0byBsb29wL2NvbmRpdGlvbiBzdGVwcyBzbyB0aGV5IGNhbiBzdXBwbHkgcGVyLXN0ZXAgbWVudSBvcHRpb25zIHRvIHRoZWlyIG5lc3RlZCBzdGVwLXJlbmRlcmVycyAoc3VwcG9ydHMgYXJiaXRyYXJ5IG5lc3RpbmcpLiAqL1xuICBASW5wdXQoKSBnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQ/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gQWRkU3RlcE1lbnVPcHRpb25bXTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHBhc3NlZCB0byBsb29wL2NvbmRpdGlvbiBzdGVwcyBzbyB0aGV5IGNhbiBzdXBwbHkgcGVyLXN0ZXAgbWVudSBvcHRpb25zIHRvIHRoZWlyIG5lc3RlZCBzdGVwLXJlbmRlcmVycyAoc3VwcG9ydHMgYXJiaXRyYXJ5IG5lc3RpbmcpLiAqL1xuICBASW5wdXQoKSBnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IFN0ZXBNb3JlTWVudU9wdGlvbltdO1xuICBASW5wdXQoKSBzdGVwTnVtYmVyPzogc3RyaW5nO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIGZyb20gdGhlIEFkZCAocGx1cykgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHsgb3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbjsgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBNb3JlIG9wdGlvbnMgKHRocmVlLWRvdCkgbWVudS4gUGF5bG9hZDogeyBvcHRpb24sIHN0ZXAgfS4gKi9cbiAgQE91dHB1dCgpIHN0ZXBNb3JlT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uOyBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZyB9PigpO1xuICBAT3V0cHV0KCkgY29tcG9uZW50UmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiBjb21wb25lbnQgaXMgbG9hZGVkIGFuZCByZWFkeVxuXG4gIC8qKiBFZmZlY3RpdmUgdHlwZSBmb3IgY29tcG9uZW50IGxvb2t1cDogJ2ZpbGUtZG93bmxvYWQnIHdoZW4gdGVzdFN0ZXBUeXBlID09PSAnZ2VuZXJhdGVEb2N1bWVudCcsICdsb29wJyBmb3IgRk9SX0xPT1AvV0hJTEVfTE9PUC4gKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVTdGVwVHlwZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdCA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xuICAgIGNvbnN0IHR5cGUgPSAoc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlIHx8IHQgfHwgJyc7XG4gICAgaWYgKHQgPT09ICdnZW5lcmF0ZURvY3VtZW50JykgcmV0dXJuICdmaWxlLWRvd25sb2FkJztcbiAgICBpZiAodHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCB0eXBlID09PSAnV0hJTEVfTE9PUCcpIHJldHVybiAnbG9vcCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgc3RlcCBpcyBhIGxvb3Agc3RlcCAoZm9yLCB3aGlsZSwgb3IgZ2VuZXJpYyBsb29wKS4gKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IChzdGVwIGFzIGFueSkuZGlzcGxheVR5cGUgfHwgKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgJyc7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdsb29wJyB8fCB0eXBlID09PSAnRk9SX0xPT1AnIHx8IHR5cGUgPT09ICdXSElMRV9MT09QJztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGVmZmVjdGl2ZSBkZWJ1Z1BvaW50U2V0IHNvIGl0IHByb3BhZ2F0ZXMgd2hlbiB0b2dnbGVkIChlLmcuIFN0b3J5Ym9vayBDb250cm9scykuICovXG4gIHByaXZhdGUgZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWJ1Z1BvaW50U2V0ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmRlYnVnUG9pbnRTZXQ7XG4gICAgaWYgKHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgJiYgdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcih0aGlzLnN0ZXApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRJbnN0YW5jZXMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBhbnk+KCk7XG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFJlZnMgPSBuZXcgV2Vha01hcDxWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMgPSBuZXcgV2Vha01hcDxhbnksIFNldDxzdHJpbmc+PigpOyAvLyBUcmFjayB3aGljaCBFdmVudEVtaXR0ZXJzIGhhdmUgYmVlbiBzdWJzY3JpYmVkIHRvXG4gIHByaXZhdGUgbGFzdFN0ZXBJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFN0ZXBUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2aW91c1N0ZXBLZXk6IHN0cmluZyA9ICcnO1xuICAvKiogVHJhY2tzIHRoZSBsYXN0IHN0YXR1cyBzZWVuIGR1cmluZyBsaXZlIGV4ZWN1dGlvbiBzbyBpbi1wbGFjZSBtdXRhdGlvbnMgYXJlIGRldGVjdGVkIGluIG5nRG9DaGVjay4gKi9cbiAgcHJpdmF0ZSBsYXN0VHJhY2tlZFN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVHJhY2tzIGVkaXRhYmxlIHByb3BlcnR5IHZhbHVlcyBpbiBkZWJ1ZyBtb2RlIHNvIGluLXBsYWNlIG11dGF0aW9ucyBhZnRlciBkaWFsb2cgc2F2ZXMgYXJlIHByb3BhZ2F0ZWQuICovXG4gIHByaXZhdGUgbGFzdFRyYWNrZWRFZGl0UHJvcHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFNURVBfQ09NUE9ORU5UX01BUCkgcHJpdmF0ZSBjb21wb25lbnRNYXA6IE1hcDxzdHJpbmcsIFR5cGU8YW55Pj4sXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuc3RlcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFN0ZXAgPSBjaGFuZ2VzWydzdGVwJ10/LmN1cnJlbnRWYWx1ZSB8fCB0aGlzLnN0ZXA7XG4gICAgY29uc3QgcHJldmlvdXNTdGVwID0gY2hhbmdlc1snc3RlcCddPy5wcmV2aW91c1ZhbHVlO1xuXG4gICAgLy8gQ2hlY2sgaWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBpbnB1dCBjaGFuZ2VkIChmb3IgbG9vcCBzdGVwcylcbiAgICAvLyAmJiBcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRzdGVwLmRpc3BsYXlUeXBlID09PSAnbG9vcCcgJiYgXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5sZW5ndGggPiAwO1xuXG4gICAgLy8gSWYgc2VsZWN0ZWRJdGVyYXRpb25JZCBjaGFuZ2VkIGZvciBhIGxvb3Agc3RlcCwgdXBkYXRlIGl0IGRpcmVjdGx5XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSAmJiBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uSWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyeSB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb24gaWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy51cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBsb29wLXN0ZXAgY29tcG9uZW50XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHN0ZXBOdW1iZXIgaW5wdXQgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXBOdW1iZXInXSAmJiBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3N0ZXBOdW1iZXInXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHN0ZXBOdW1iZXIgd2hlbiBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTnVtYmVyID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zdGVwTnVtYmVyID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzVXBsb2FkaW5nQmFzZWxpbmUgb3IgaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgY2hhbmdlZCwgdXBkYXRlIG5lc3RlZCBjb21wb25lbnQgaW5zdGFuY2VzXG4gICAgaWYgKGNoYW5nZXNbJ2lzVXBsb2FkaW5nQmFzZWxpbmUnXSB8fCBjaGFuZ2VzWydpc01ha2luZ0N1cnJlbnRCYXNlbGluZSddKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYpIHtcbiAgICAgICAgLy8gVXBkYXRlIGlzVXBsb2FkaW5nQmFzZWxpbmUgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoY2hhbmdlc1snaXNVcGxvYWRpbmdCYXNlbGluZSddKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNVcGxvYWRpbmdCYXNlbGluZSA9IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZTtcbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSBpbiBjb25maWcgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lIGlmIGl0IGNoYW5nZWRcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2lzTWFraW5nQ3VycmVudEJhc2VsaW5lJ10pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgaW4gY29uZmlnIGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5pc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZi5pbmplY3Rvcikge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBkb3dubG9hZGluZ1N0ZXBJZCBjaGFuZ2VkLCB1cGRhdGUgZmlsZS1kb3dubG9hZCBpbnN0YW5jZSBpc0Rvd25sb2FkaW5nXG4gICAgaWYgKGNoYW5nZXNbJ2Rvd25sb2FkaW5nU3RlcElkJ10pIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjb21wb25lbnRSZWYgJiYgdGhpcy5nZXRFZmZlY3RpdmVTdGVwVHlwZShjdXJyZW50U3RlcCkgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICBjb25zdCB0aWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzRGVidWcsIGRlYnVnUG9pbnRTZXQgb3IgZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgY2hhbmdlZCAoZS5nLiB1c2VyIHRvZ2dsZWQgZGVidWcgaW4gcG9ydGFsL1N0b3J5Ym9vayksIHVwZGF0ZSBuZXN0ZWQgaW5zdGFuY2VcbiAgICBpZiAoY2hhbmdlc1snaXNEZWJ1ZyddIHx8IGNoYW5nZXNbJ2RlYnVnUG9pbnRTZXQnXSB8fCBjaGFuZ2VzWydnZXREZWJ1Z1BvaW50U2V0SGFuZGxlciddIHx8IGNoYW5nZXNbJ29uRGVidWdQb2ludENoYW5nZUhhbmRsZXInXSB8fCBjaGFuZ2VzWydvbkVkaXRTdGVwSGFuZGxlciddIHx8IGNoYW5nZXNbJ2FkZFN0ZXBNZW51T3B0aW9ucyddIHx8IGNoYW5nZXNbJ29uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXInXSB8fCBjaGFuZ2VzWydzdGVwTW9yZU1lbnVPcHRpb25zJ10gfHwgY2hhbmdlc1snb25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXInXSB8fCBjaGFuZ2VzWydnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQnXSB8fCBjaGFuZ2VzWydnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkJ10pIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZikge1xuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgPSB0aGlzLmlzRGVidWc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgICAgaWYgKHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBNZW51T3B0aW9ucyA9IHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlTWVudU9wdGlvbnMgPSB0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgICAvLyBFbnN1cmUgZGVidWcgcG9pbnQgY2xpY2sgaXMgd2lyZWQgd2hlbiBpc0RlYnVnIGJlY29tZXMgdHJ1ZSAoZS5nLiB0b2dnbGVkIGluIFN0b3J5Ym9vayBDb250cm9scylcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50Q2hhbmdlICYmIHRoaXMub25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcikge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnZGVidWdQb2ludENoYW5nZScpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50Q2hhbmdlLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyPy4odGhpcy5zdGVwLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdkZWJ1Z1BvaW50Q2hhbmdlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgZWRpdCBzdGVwIHdoZW4gaXNEZWJ1ZyBhbmQgaGFuZGxlciBhcmUgcHJlc2VudFxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwICYmIHRoaXMub25FZGl0U3RlcEhhbmRsZXIpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2VkaXRTdGVwJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25FZGl0U3RlcEhhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZWRpdFN0ZXAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2lyZSBhZGQtc3RlcCBvcHRpb24gc2VsZWN0IHdoZW4gaXNEZWJ1ZyAoZW1pdCBhbmQgb3B0aW9uYWxseSBjYWxsIGhhbmRsZXIpXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnYWRkU3RlcE9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI/LihvcHRpb24sIHRoaXMuc3RlcCk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdhZGRTdGVwT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdpcmUgc3RlcCBtb3JlIG9wdGlvbiBzZWxlY3Qgd2hlbiBpc0RlYnVnIChlbWl0IGFuZCBvcHRpb25hbGx5IGNhbGwgaGFuZGxlcilcbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwTW9yZU9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc3RlcE1vcmVPcHRpb25TZWxlY3QnKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgICB0aGlzLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNkciA9IGNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYsIG51bGwpO1xuICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICBpbnN0YW5jZUNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHN0ZXAgaWRlbnRpZmllcnMgKHVzZSBlZmZlY3RpdmUgdHlwZTogZ2VuZXJhdGVEb2N1bWVudCAtPiBmaWxlLWRvd25sb2FkKVxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSBjdXJyZW50U3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IGN1cnJlbnRTdGVwLmlkO1xuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApIHx8IChjdXJyZW50U3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlO1xuXG4gICAgLy8gVXNlIHN0b3JlZCBsYXN0U3RlcElkIGFuZCBsYXN0U3RlcFR5cGUgdG8gcHJvcGVybHkgZGV0ZWN0IGNoYW5nZXNcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBzdGVwIG9iamVjdCByZWZlcmVuY2UgZG9lc24ndCBjaGFuZ2UgYnV0IHByb3BlcnRpZXMgZG9cbiAgICAvLyBPbmx5IGNoZWNrIGZvciBhY3R1YWwgSUQvdHlwZSBjaGFuZ2VzLCBub3QganVzdCByZWZlcmVuY2UgY2hhbmdlc1xuICAgIC8vIGNvbnN0IHN0ZXBUeXBlQ2hhbmdlZCA9ICFwcmV2aW91c1N0ZXAgfHwgY3VycmVudFN0ZXBUeXBlICE9PSAocHJldmlvdXNTdGVwLmRpc3BsYXlUeXBlIHx8IHRoaXMubGFzdFN0ZXBUeXBlKTtcbiAgICAvLyBjb25zdCBzdGVwSWRDaGFuZ2VkID0gIXByZXZpb3VzU3RlcCB8fCBjdXJyZW50U3RlcElkICE9PSAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkIHx8IHRoaXMubGFzdFN0ZXBJZCk7XG4gICAgY29uc3Qgc3RlcFR5cGVDaGFuZ2VkID0gY3VycmVudFN0ZXBUeXBlICE9PSB0aGlzLmxhc3RTdGVwVHlwZTtcbiAgICBjb25zdCBzdGVwSWRDaGFuZ2VkID0gY3VycmVudFN0ZXBJZCAhPT0gdGhpcy5sYXN0U3RlcElkO1xuICAgIFxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAvLyBUaGlzIHByZXZlbnRzIHVubmVjZXNzYXJ5IHJlbG9hZHMgd2hlbiBvbmx5IG5lc3RlZCBwcm9wZXJ0aWVzIGNoYW5nZVxuICAgIGlmIChzdGVwVHlwZUNoYW5nZWQgfHwgc3RlcElkQ2hhbmdlZCkge1xuICAgICAgdGhpcy5sYXN0U3RlcElkID0gY3VycmVudFN0ZXBJZDtcbiAgICAgIHRoaXMubGFzdFN0ZXBUeXBlID0gY3VycmVudFN0ZXBUeXBlO1xuICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGV4cGFuZGVkIHN0YXRlIGNoYW5nZWQgKHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZSlcbiAgICBsZXQgZXhwYW5kZWRDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgbGV0IGN1cnJlbnRFeHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBwcmV2aW91c0V4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIocHJldmlvdXNTdGVwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgICBwcmV2aW91c0V4cGFuZGVkID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xuICAgICAgfVxuICAgICAgXG4gICAgICBleHBhbmRlZENoYW5nZWQgPSBjdXJyZW50RXhwYW5kZWQgIT09IHByZXZpb3VzRXhwYW5kZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIG9ubHkgbmVzdGVkIGRhdGEgY2hhbmdlZCAoY2hpbGRyZW4sIG5lc3RlZFN0ZXBzLCBzdGVwcywgZXhwYW5kZWQpLCBcbiAgICAvLyB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICAvLyBUaGlzIHByZXZlbnRzIHBhcmVudCBzdGVwcyBmcm9tIGJsaW5raW5nIHdoZW4gbmVzdGVkIHN0ZXBzIGV4cGFuZFxuICAgIGNvbnN0IG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCA9IHByZXZpb3VzU3RlcCAmJiAoXG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8XG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLnN0ZXBzIHx8XG4gICAgICBleHBhbmRlZENoYW5nZWQgfHxcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCB8fFxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5icmFuY2hlcyB8fFxuICAgICAgKChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jb25maWc/LmV4cGFuZGVkKVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgcHJvcGVydGllcyB3aXRob3V0IHJlY3JlYXRpbmcgY29tcG9uZW50IHRvIHByZXZlbnQgYmxpbmtpbmdcbiAgICBpZiAob25seU5lc3RlZERhdGFDaGFuZ2VkICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB0aGUgc3RvcmVkIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIG1ldGhvZCBmcm9tIG9yaWdpbmFsXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50SW5zdGFuY2UoY3VycmVudFN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIG90aGVyIGNoYW5nZXMsIHVzZSBjb21wcmVoZW5zaXZlIHVwZGF0ZSBpZiBjb21wb25lbnQgZXhpc3RzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudFJlZnMuZ2V0KHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgaWYgKGluc3RhbmNlICYmIHByZXZpb3VzU3RlcCAmJiBjdXJyZW50U3RlcCAmJlxuICAgICAgICBwcmV2aW91c1N0ZXAuZGlzcGxheVR5cGUgPT09IGN1cnJlbnRTdGVwLmRpc3BsYXlUeXBlICYmXG4gICAgICAgIChwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBwcmV2aW91c1N0ZXAuaWQpID09PSAoY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBjdXJyZW50U3RlcC5pZCkpIHtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG5ldyBzdGVwIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgbG9hZCBjb21wb25lbnQgaWYgY29udGFpbmVyIGlzIGVtcHR5IChjb21wb25lbnQgZG9lc24ndCBleGlzdCB5ZXQpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSByZWxvYWRzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcDogYW55LCBwcmV2aW91c1N0ZXA6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG5cbiAgICBpZiAoIWluc3RhbmNlIHx8ICFjb21wb25lbnRSZWYgfHwgIXRoaXMuY29udGFpbmVyKSByZXR1cm47XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgY29tbW9ubHkgY2hhbmdlIGFuZCBuZWVkIHRvIGJlIHVwZGF0ZWRcbiAgICBjb25zdCBpbXBvcnRhbnRQcm9wZXJ0aWVzID0gWydzdGF0dXMnLCAnZHVyYXRpb24nLCAnZXhwYW5kZWQnLCAnc3ViU3RlcHMnLCAnY2hpbGRyZW4nLCAnbmVzdGVkU3RlcHMnLCAnc3RlcHMnLFxuICAgICAgJ2V4ZWN1dGlvbkRhdGEnLCAnYWN0aW9uJywgJ3RpdGxlJywgJ3Jlc3VsdCcsICdtZXRob2QnLCAnZW5kcG9pbnQnLCAnc3RhdHVzQ29kZScsICdicmFuY2hlcycsXG4gICAgICAncmVzcG9uc2VUaW1lJywgJ2FjdGlvbnMnLCAnaW5pdGlhbEFjdGlvbnMnLCAncHJvbXB0JywgJ29wdGltaXplZFJ1bicsICdhY3Rpb25Db3VudCcsICdpdGVyYXRpb25zJywgJ3NlbGVjdGVkSXRlcmF0aW9uSWQnLCAnc3RlcE51bWJlcicsXG4gICAgICAnaXNVcGxvYWRpbmdCYXNlbGluZScsICdpc01ha2luZ0N1cnJlbnRCYXNlbGluZScsICdzZWxlY3RlZFRhYklucHV0JywgJ3N0ZXBEZWxldGVkJ107XG5cbiAgICAvLyBVcGRhdGUgaW1wb3J0YW50IHByb3BlcnRpZXNcbiAgICBpbXBvcnRhbnRQcm9wZXJ0aWVzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIEZvciBzZWxlY3RlZEl0ZXJhdGlvbklkIG9uIGxvb3Agc3RlcHMsIHByaW9yaXRpemUgdGhlIGlucHV0IHZhbHVlIG92ZXIgc3RlcCB2YWx1ZVxuICAgICAgaWYgKGtleSA9PT0gJ3NlbGVjdGVkSXRlcmF0aW9uSWQnICYmIHRoaXMuaXNMb29wU3RlcChjdXJyZW50U3RlcCkgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSlba2V5XTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIGl0ZXJhdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpdGVyYXRpb25zJyAmJiB0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApKSB7XG4gICAgICAgIC8vIFdoZW4gaXRlcmF0aW9ucyBhcmUgdXBkYXRlZCwgY2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgc2VsZWN0ZWRJdGVyYXRpb25cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBZnRlciBpdGVyYXRpb25zIGFyZSB1cGRhdGVkLCB0cnkgdG8gdXBkYXRlIHNlbGVjdGVkSXRlcmF0aW9uIGlmIHNlbGVjdGVkSXRlcmF0aW9uSWQgaXMgc2V0XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgfHwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvb3BTdGVwU2VsZWN0ZWRJdGVyYXRpb24oaW5zdGFuY2UsIHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpc1VwbG9hZGluZ0Jhc2VsaW5lJyB8fCBrZXkgPT09ICdpc01ha2luZ0N1cnJlbnRCYXNlbGluZScpIHtcbiAgICAgICAgLy8gRm9yIGxvYWRpbmcgc3RhdGUgb2JqZWN0cywgYWx3YXlzIHVzZSB0aGUgaW5wdXQgdmFsdWUgKHRoZXkncmUgcGFzc2VkIGZyb20gcGFyZW50KVxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBrZXkgPT09ICdpc1VwbG9hZGluZ0Jhc2VsaW5lJyA/IHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZSA6IHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmU7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgaWYgdGhlIHJlZmVyZW5jZSBjaGFuZ2VkIChuZXcgb2JqZWN0IGNyZWF0ZWQpXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZ1trZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGVwTnVtYmVyJyAmJiB0aGlzLnN0ZXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBGb3Igc3RlcE51bWJlciwgcHJpb3JpdGl6ZSB0aGUgaW5wdXQgdmFsdWUgb3ZlciBzdGVwIHZhbHVlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuc3RlcE51bWJlcjtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWdba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYWN0aW9uJyAmJiBjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2FpLWFnZW50Jykge1xuICAgICAgICAvLyBGb3IgYWktYWdlbnQgc3RlcHMsIGVuc3VyZSB0aXRsZSBhbmQgcHJvbXB0IGFyZSBzZXQgZnJvbSBhY3Rpb25cbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgLy8gVXBkYXRlIGFjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICAvLyBBbHNvIHVwZGF0ZSB0aXRsZSBhbmQgcHJvbXB0IGZyb20gYWN0aW9uIGlmIHRoZXkncmUgbm90IHNldCBvciBlbXB0eVxuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkge1xuICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy50aXRsZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnByb21wdC50cmltKCkpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkucHJvbXB0ID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnByb21wdCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgLy8gQ29tcGFyZSBhZ2FpbnN0IHdoYXQgdGhlIGluc3RhbmNlIGN1cnJlbnRseSBkaXNwbGF5cywgbm90IHByZXZpb3VzU3RlcC5cbiAgICAgICAgLy8gcHJldmlvdXNTdGVwIG1heSBiZSB0aGUgc2FtZSBtdXRhdGVkIG9iamVjdCBhcyBjdXJyZW50U3RlcCAoaW4tcGxhY2UgbXV0YXRpb24pLFxuICAgICAgICAvLyBzbyBwcmV2aW91c1N0ZXBba2V5XSBhbHJlYWR5IGVxdWFscyBjdXJyZW50VmFsdWUgYW5kIHRoZSBjb21wYXJpc29uIGlzIGFsd2F5cyBmYWxzZS5cbiAgICAgICAgY29uc3QgaW5zdGFuY2VWYWx1ZSA9IChpbnN0YW5jZSBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKGN1cnJlbnRWYWx1ZSwgaW5zdGFuY2VWYWx1ZSkpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgaXNEZWJ1ZyBhbmQgZGVidWdQb2ludFNldCBmcm9tIHN0ZXAtcmVuZGVyZXIgaW5wdXRzIChwYXJlbnQgbWF5IGhhdmUgdXBkYXRlZCBhZnRlciB0b2dnbGUpXG4gICAgaWYgKHRoaXMuaXNEZWJ1ZyAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgIT09IHRoaXMuaXNEZWJ1Zykge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNEZWJ1ZyA9IHRoaXMuaXNEZWJ1ZztcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBuZXh0RGVidWdQb2ludFNldCA9IHRoaXMuZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpO1xuICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5kZWJ1Z1BvaW50U2V0ICE9PSBuZXh0RGVidWdQb2ludFNldCkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCA9IG5leHREZWJ1Z1BvaW50U2V0O1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQWxzbyB1cGRhdGUgYWxsIG90aGVyIHByb3BlcnRpZXNcbiAgICBPYmplY3Qua2V5cyhjdXJyZW50U3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnICYmICFpbXBvcnRhbnRQcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnRTdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHNwZWNpYWwgcHJvcGVydGllcyB0aGF0IG1pZ2h0IG5lZWQgc3BlY2lhbCBoYW5kbGluZ1xuICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEoY3VycmVudFN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLm5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRTdGVwLmRpc3BsYXlUeXBlID09PSAnc3RlcC1ncm91cCcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc3RlcHMgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIGJyYW5jaGVzIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBzdWJTdGVwc1xuICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudEJyYW5jaGVzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c0JyYW5jaGVzID0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmJyYW5jaGVzIHx8IFtdO1xuXG4gICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBuZXN0ZWQgc3ViU3RlcHMgY2hhbmdlc1xuICAgICAgaWYgKHRoaXMuaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnRCcmFuY2hlcywgcHJldmlvdXNCcmFuY2hlcykpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byBlbnN1cmUgY2hhbmdlIGRldGVjdGlvbiB0cmlnZ2Vyc1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IFsuLi5jdXJyZW50QnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgc3ViU3RlcHM6IGJyYW5jaC5zdWJTdGVwcyA/IFsuLi5icmFuY2guc3ViU3RlcHNdIDogW11cbiAgICAgICAgfSkpXTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBlbnN1cmUgbmVzdGVkU3RlcHMgaXMgcHJvcGVybHkgdXBkYXRlZFxuICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gY2hpbGRyZW4gYXJlIGxvYWRlZCBmcm9tIHRoZSBBUEkgb3Igd2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXNcbiAgICBpZiAoY3VycmVudFN0ZXAuZGlzcGxheVR5cGUgPT09ICdjb25kaXRpb24nICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnROZXN0ZWRTdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgY29uc3QgcHJldmlvdXNOZXN0ZWRTdGVwcyA9IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIHN0ZXAtcmVuZGVyZXI6IGN1cnJlbnROZXN0ZWRTdGVwcycsIGN1cnJlbnROZXN0ZWRTdGVwcyk7XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBwcmV2aW91c05lc3RlZFN0ZXBzJywgcHJldmlvdXNOZXN0ZWRTdGVwcyk7XG4gICAgICAvLyBVc2UgZGVlcCBjb21wYXJpc29uIHRvIGRldGVjdCBjb250ZW50IGNoYW5nZXMsIG5vdCBqdXN0IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gSUYgYW5kIEVMU0VfSUYgYnJhbmNoZXNcbiAgICAgIGlmICh0aGlzLmhhc05lc3RlZFN0ZXBzQ2hhbmdlZChjdXJyZW50TmVzdGVkU3RlcHMsIHByZXZpb3VzTmVzdGVkU3RlcHMpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gZW5zdXJlIGNoYW5nZSBkZXRlY3Rpb24gdHJpZ2dlcnNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSBbLi4uY3VycmVudE5lc3RlZFN0ZXBzXTtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IFsuLi5jdXJyZW50TmVzdGVkU3RlcHNdO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBzdGVwLXJlbmRlcmVyOiBuZXN0ZWRTdGVwcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCcsIHtcbiAgICAgICAgICBzdGVwSWQ6IGN1cnJlbnRTdGVwLmlkLFxuICAgICAgICAgIHByZXZpb3VzQ291bnQ6IHByZXZpb3VzTmVzdGVkU3RlcHMubGVuZ3RoLFxuICAgICAgICAgIGN1cnJlbnRDb3VudDogY3VycmVudE5lc3RlZFN0ZXBzLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBmaWxlLWRvd25sb2FkIChpbmNsdWRpbmcgZ2VuZXJhdGVEb2N1bWVudCk6IHN5bmMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgaWYgKHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUoY3VycmVudFN0ZXApID09PSAnZmlsZS1kb3dubG9hZCcpIHtcbiAgICAgIGNvbnN0IGdkID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBjb25zdCBwcmV2R2QgPSAocHJldmlvdXNTdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICBpZiAoZ2QgIT09IHByZXZHZCB8fCBnZD8uZmlsZU5hbWUgIT09IHByZXZHZD8uZmlsZU5hbWUgfHwgZ2Q/LmZpbGVUeXBlICE9PSBwcmV2R2Q/LmZpbGVUeXBlIHx8IGdkPy5zM0ZpbGVOYW1lICE9PSBwcmV2R2Q/LnMzRmlsZU5hbWUpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0aWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkO1xuICAgICAgY29uc3QgbmV4dERvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgIT09IG5leHREb3dubG9hZGluZykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gbmV4dERvd25sb2FkaW5nO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGVuc3VyZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGZyb20gaW5wdXQgaXMgdXNlZFxuICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAoY3VycmVudFN0ZXApICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCA9IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZXMgdG8gaGFuZGxlIG51bGwvdW5kZWZpbmVkIGNvbnNpc3RlbnRseVxuICAgICAgY29uc3Qgbm9ybWFsaXplVmFsdWUgPSAodmFsOiBhbnkpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbCk7XG4gICAgICBjb25zdCBjdXJyZW50Tm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlTm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKGluc3RhbmNlU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG5cbiAgICAgIGlmIChjdXJyZW50Tm9ybWFsaXplZCAhPT0gaW5zdGFuY2VOb3JtYWxpemVkKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBlbnN1cmUgc2VsZWN0ZWRJdGVyYXRpb25JZCBmcm9tIGlucHV0IGlzIHVzZWRcbiAgICBpZiAodGhpcy5pc0xvb3BTdGVwKGN1cnJlbnRTdGVwKSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICBjb25zdCBpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdmFsdWVzIHRvIGhhbmRsZSBudWxsL3VuZGVmaW5lZCBjb25zaXN0ZW50bHlcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbDogYW55KSA9PiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyh2YWwpO1xuICAgICAgY29uc3QgY3VycmVudE5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShjdXJyZW50U2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBjb25zdCBpbnN0YW5jZU5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZShpbnN0YW5jZVNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuXG4gICAgICBpZiAoY3VycmVudE5vcm1hbGl6ZWQgIT09IGluc3RhbmNlTm9ybWFsaXplZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBleHBhbmRlZCBzdGF0ZSAtIHVzZSBzZXRJbnB1dCB0byBwcm9wZXJseSB0cmlnZ2VyIG5nT25DaGFuZ2VzXG4gICAgLy8gQWx3YXlzIHJlY2FsY3VsYXRlIGV4cGFuZGVkIHN0YXRlIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHBhcmVudCBzdGF0ZVxuICAgIGxldCBleHBhbmRlZFN0YXRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgZXhwYW5kZWRTdGF0ZSA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKGN1cnJlbnRTdGVwKTtcbiAgICB9IGVsc2UgaWYgKChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4cGFuZGVkU3RhdGUgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGV4cGFuZGVkIGlmIGl0IGNoYW5nZWRcbiAgICBpZiAoZXhwYW5kZWRTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkICE9PSBleHBhbmRlZFN0YXRlKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQ7XG4gICAgICAvLyBVc2Ugc2V0SW5wdXQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBASW5wdXQoKSBleHBhbmRlZCBwcm9wZXJ0eVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIG5nT25DaGFuZ2VzIGlzIGNhbGxlZCBpbiBjaGlsZCBjb21wb25lbnRzXG4gICAgICBpZiAoY29tcG9uZW50UmVmICYmIHR5cGVvZiAoY29tcG9uZW50UmVmIGFzIGFueSkuc2V0SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIGV4cGFuZGVkU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIEFuZ3VsYXIgdmVyc2lvbnM6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICAvLyBNYW51YWxseSBjYWxsIG5nT25DaGFuZ2VzIGlmIHRoZSBjb21wb25lbnQgaW1wbGVtZW50cyBpdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgIGV4cGFuZGVkOiBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGV4cGFuZGVkU3RhdGUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICB9O1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHVwZGF0ZSB0aGUgc3RlcCBvYmplY3QncyBleHBhbmRlZCBwcm9wZXJ0eSB0byBrZWVwIGl0IGluIHN5bmNcbiAgICAgIGlmIChjdXJyZW50U3RlcCkge1xuICAgICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XG4gICAgICB9XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHJlZmVyZW5jZSAtIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIGluY2x1ZGVkXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XG4gICAgICAvLyBVcGRhdGUgY29uZmlnIHdpdGggY3VycmVudCBzdGVwIHRvIGVuc3VyZSBhbGwgcHJvcGVydGllcyBpbmNsdWRpbmcgYnJhbmNoZXMgYXJlIHN5bmNlZFxuICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLmN1cnJlbnRTdGVwIH07XG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxuICAgICAgLy8gVXNlIHRoZSBhbHJlYWR5IHVwZGF0ZWQgYnJhbmNoZXMgZnJvbSBpbnN0YW5jZSB0byBtYWludGFpbiByZWZlcmVuY2UgY29uc2lzdGVuY3lcbiAgICAgIGlmIChjdXJyZW50U3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuYnJhbmNoZXMgPSAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3RlcCBwcm9wZXJ0eSBpZiBpdCBleGlzdHMgb24gdGhlIGluc3RhbmNlXG4gICAgaWYgKCdzdGVwJyBpbiBpbnN0YW5jZSkge1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IGN1cnJlbnRTdGVwO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xuICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoY3VycmVudFN0ZXApO1xuICAgICAgY29uc3QgcHJldmlvdXNTZWxmSGVhbEFuYWx5c2lzID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcztcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKHNlbGZIZWFsQW5hbHlzaXMsIHByZXZpb3VzU2VsZkhlYWxBbmFseXNpcykpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaWYgdGhlcmUgd2VyZSBjaGFuZ2VzXG4gICAgLy8gVGhpcyBlbnN1cmVzIG9ubHkgdGhlIG5lc3RlZCBzdGVwIHVwZGF0ZXMgd2l0aG91dCBhZmZlY3RpbmcgcGFyZW50IHN0ZXBzXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNkcikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSBlbHNlIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBjYWxsIG1hcmtGb3JDaGVjayBvbiB0aGlzIGNvbXBvbmVudCB0byBhdm9pZCB0cmlnZ2VyaW5nIHBhcmVudCByZS1yZW5kZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIGxvb3Atc3RlcCBzZWxlY3RlZEl0ZXJhdGlvbiB3aGVuIHNlbGVjdGVkSXRlcmF0aW9uSWQgY2hhbmdlc1xuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXRlcmF0aW9ucyBtaWdodCBub3QgYmUgbG9hZGVkIHlldFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVMb29wU3RlcFNlbGVjdGVkSXRlcmF0aW9uKGluc3RhbmNlOiBhbnksIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaW5zdGFuY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zIHx8IChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZz8uaXRlcmF0aW9ucyB8fCBbXTtcblxuICAgIGlmIChpdGVyYXRpb25zICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpdGVyYXRpb25zLmZpbmQoKGl0ZXI6IGFueSkgPT4gaXRlci5pZCA9PT0gc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgLy8gU3luYyB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgc2VsZWN0IGRlZmF1bHRcbiAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdERlZmF1bHRJdGVyYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgaXRlcmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHRoZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIGFscmVhZHkgc2V0XG4gICAgLy8gYW5kIHdpbGwgYmUgdXNlZCB3aGVuIGl0ZXJhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSAoaGFuZGxlZCBpbiB1cGRhdGVDb21wb25lbnRJbnN0YW5jZSBhbmQgbmdEb0NoZWNrKVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWx1ZUNoYW5nZWQoY3VycmVudDogYW55LCBwcmV2aW91czogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gU2hhbGxvdyBjb21wYXJpc29uIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IHByZXZpb3VzID09IG51bGwpIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcblxuICAgIC8vIEZvciBhcnJheXMsIGNoZWNrIGxlbmd0aCBhbmQgcmVmZXJlbmNlXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICE9PSBBcnJheS5pc0FycmF5KHByZXZpb3VzKSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IHByZXZpb3VzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7IC8vIFJlZmVyZW5jZSBjaGVja1xuICAgIH1cblxuICAgIC8vIEZvciBvYmplY3RzLCBkbyBzaGFsbG93IGNvbXBhcmlzb24gKGNoZWNrIHJlZmVyZW5jZSlcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcmV2aW91cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91czsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgLy8gRm9yIHByaW1pdGl2ZXNcbiAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7XG4gIH1cblxuICAvKipcbiAgICogRGVlcCBjb21wYXJpc29uIGZvciBicmFuY2hlcyBhcnJheSB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgc3ViU3RlcHNcbiAgICovXG4gIHByaXZhdGUgaGFzQnJhbmNoZXNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIGJyYW5jaCBhbmQgaXRzIHN1YlN0ZXBzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50QnJhbmNoID0gY3VycmVudFtpXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzQnJhbmNoID0gcHJldmlvdXNbaV07XG5cbiAgICAgIGlmICghcHJldmlvdXNCcmFuY2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDaGVjayBpZiBicmFuY2ggcHJvcGVydGllcyBjaGFuZ2VkXG4gICAgICBpZiAoY3VycmVudEJyYW5jaC50eXBlICE9PSBwcmV2aW91c0JyYW5jaC50eXBlIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2gubGFiZWwgIT09IHByZXZpb3VzQnJhbmNoLmxhYmVsIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guZXhlY3V0ZWQgIT09IHByZXZpb3VzQnJhbmNoLmV4ZWN1dGVkIHx8XG4gICAgICAgIGN1cnJlbnRCcmFuY2guY29uZGl0aW9uVHlwZSAhPT0gcHJldmlvdXNCcmFuY2guY29uZGl0aW9uVHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3ViU3RlcHMgYXJyYXkgY2hhbmdlZCAobGVuZ3RoIG9yIHJlZmVyZW5jZSlcbiAgICAgIGNvbnN0IGN1cnJlbnRTdWJTdGVwcyA9IGN1cnJlbnRCcmFuY2guc3ViU3RlcHMgfHwgW107XG4gICAgICBjb25zdCBwcmV2aW91c1N1YlN0ZXBzID0gcHJldmlvdXNCcmFuY2guc3ViU3RlcHMgfHwgW107XG5cbiAgICAgIGlmIChjdXJyZW50U3ViU3RlcHMubGVuZ3RoICE9PSBwcmV2aW91c1N1YlN0ZXBzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY3VycmVudFN1YlN0ZXBzICE9PSBwcmV2aW91c1N1YlN0ZXBzKSByZXR1cm4gdHJ1ZTsgLy8gUmVmZXJlbmNlIGNoZWNrXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgY29tcGFyaXNvbiBmb3IgbmVzdGVkU3RlcHMgYXJyYXkgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgKiBUaGlzIGlzIGltcG9ydGFudCBmb3IgY29uZGl0aW9uIHN0ZXBzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYnJhbmNoZXNcbiAgICovXG4gIHByaXZhdGUgaGFzTmVzdGVkU3RlcHNDaGFuZ2VkKGN1cnJlbnQ6IGFueVtdLCBwcmV2aW91czogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIWN1cnJlbnQgJiYgIXByZXZpb3VzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFwcmV2aW91cykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlOyAvLyBTYW1lIHJlZmVyZW5jZVxuXG4gICAgLy8gQ29tcGFyZSBlYWNoIHN0ZXAgYnkgSUQgdG8gZGV0ZWN0IGNvbnRlbnQgY2hhbmdlc1xuICAgIC8vIFRoaXMgaGFuZGxlcyBjYXNlcyB3aGVyZSBhcnJheSBsZW5ndGggaXMgc2FtZSBidXQgY29udGVudCBkaWZmZXJzIChlLmcuLCBzd2l0Y2hpbmcgYnJhbmNoZXMpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RlcCA9IGN1cnJlbnRbaV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBwcmV2aW91c1tpXTtcblxuICAgICAgaWYgKCFwcmV2aW91c1N0ZXApIHJldHVybiB0cnVlO1xuXG4gICAgICAvLyBDb21wYXJlIHN0ZXAgSURzIC0gaWYgSURzIGRpZmZlciwgY29udGVudCBoYXMgY2hhbmdlZFxuICAgICAgY29uc3QgY3VycmVudFN0ZXBJZCA9IGN1cnJlbnRTdGVwLmlkIHx8IGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXBJZCA9IHByZXZpb3VzU3RlcC5pZCB8fCBwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZDtcblxuICAgICAgaWYgKGN1cnJlbnRTdGVwSWQgIT09IHByZXZpb3VzU3RlcElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGNoZWNrIGlmIHRoZSBzdGVwIHR5cGUgY2hhbmdlZCAoaW1wb3J0YW50IGZvciBicmFuY2ggc3dpdGNoaW5nKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLmRpc3BsYXlUeXBlICE9PSBwcmV2aW91c1N0ZXAuZGlzcGxheVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlc3RTdGVwVHlwZSBjaGFuZ2VkIChJRiB2cyBFTFNFX0lGIHZzIEVMU0UpXG4gICAgICBpZiAoY3VycmVudFN0ZXAudGVzdFN0ZXBUeXBlICE9PSBwcmV2aW91c1N0ZXAudGVzdFN0ZXBUeXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgdXBkYXRlIHRva2VuIGlmIHByZXNlbnQgKHVzZWQgdG8gZm9yY2UgcmUtcmVuZGVyKVxuICAgICAgaWYgKGN1cnJlbnRTdGVwLl91cGRhdGVUb2tlbiAmJiBjdXJyZW50U3RlcC5fdXBkYXRlVG9rZW4gIT09IHByZXZpb3VzU3RlcC5fdXBkYXRlVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGVwS2V5KHN0ZXA6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFzdGVwKSByZXR1cm4gJyc7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZyb20gaW1wb3J0YW50IHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VcbiAgICAvLyBJbmNsdWRlIGV4ZWN1dGlvbkRhdGEuc3RlcFN0YXR1cyBmb3IgbGl2ZSBleGVjdXRpb24gc2NlbmFyaW9zXG4gICAgY29uc3QgZXhlY3V0aW9uU3RhdHVzID0gc3RlcC5leGVjdXRpb25EYXRhPy5zdGVwU3RhdHVzIHx8IHN0ZXAuc3RhdHVzIHx8ICcnO1xuICAgIC8vIEluY2x1ZGUgYnJhbmNoZXMgbGVuZ3RoIGZvciBjb25kaXRpb24tc3RlcCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgY29uc3QgYnJhbmNoZXNMZW5ndGggPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkubGVuZ3RoO1xuICAgIC8vIEluY2x1ZGUgdG90YWwgc3ViU3RlcHMgY291bnQgYWNyb3NzIGFsbCBicmFuY2hlcyBmb3IgbmVzdGVkIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCB0b3RhbFN1YlN0ZXBzID0gKHN0ZXAuYnJhbmNoZXMgfHwgW10pLnJlZHVjZSgoc3VtOiBudW1iZXIsIGJyYW5jaDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgKGJyYW5jaC5zdWJTdGVwcz8ubGVuZ3RoIHx8IDApO1xuICAgIH0sIDApO1xuICAgIC8vIEluY2x1ZGUgaW5pdGlhbEFjdGlvbnMgbGVuZ3RoIGZvciBhcGktc3RlcCBsaXZlIGV4ZWN1dGlvbiBsb2dzXG4gICAgY29uc3QgaW5pdGlhbEFjdGlvbnNMZW5ndGggPSAoc3RlcC5pbml0aWFsQWN0aW9ucyB8fCBbXSkubGVuZ3RoO1xuICAgIHJldHVybiBgJHtzdGVwLmlkIHx8ICcnfV8ke2V4ZWN1dGlvblN0YXR1c31fJHtzdGVwLnN0YXR1cyB8fCAnJ31fJHtzdGVwLmR1cmF0aW9uIHx8ICcnfV8ke3N0ZXAuZXhwYW5kZWQgfHwgZmFsc2V9XyR7KHN0ZXAuY2hpbGRyZW4gfHwgW10pLmxlbmd0aH1fJHsoc3RlcC5uZXN0ZWRTdGVwcyB8fCBbXSkubGVuZ3RofV8keyhzdGVwLnN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7YnJhbmNoZXNMZW5ndGh9XyR7dG90YWxTdWJTdGVwc31fJHtzdGVwLnN0ZXBOdW1iZXIgfHwgJyd9XyR7c3RlcC5zdGVwRGVsZXRlZCB8fCBmYWxzZX1fJHtpbml0aWFsQWN0aW9uc0xlbmd0aH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50KCkge1xuICAgIFxuICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgIXRoaXMuc3RlcCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS50ZXN0U3RlcFJlc3VsdElkIHx8IHRoaXMuc3RlcC5pZDtcbiAgICBjb25zdCBjdXJyZW50U3RlcFR5cGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlO1xuXG4gICAgLy8gT25seSBjbGVhciBhbmQgcmVjcmVhdGUgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBjb25zdCBuZWVkc1JlY3JlYXRpb24gPSB0aGlzLmxhc3RTdGVwSWQgIT09IGN1cnJlbnRTdGVwSWQgfHwgdGhpcy5sYXN0U3RlcFR5cGUgIT09IGN1cnJlbnRTdGVwVHlwZTtcblxuICAgIGlmIChuZWVkc1JlY3JlYXRpb24pIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAvLyBDbGVhciBzdG9yZWQgaW5zdGFuY2Ugd2hlbiByZWNyZWF0aW5nXG4gICAgICBjb25zdCBvbGRJbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGlmIChvbGRJbnN0YW5jZSkge1xuICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZGVsZXRlKG9sZEluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZGVsZXRlKHRoaXMuY29udGFpbmVyKTtcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmRlbGV0ZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgICB0aGlzLmxhc3RTdGVwSWQgPSBjdXJyZW50U3RlcElkO1xuICAgICAgdGhpcy5sYXN0U3RlcFR5cGUgPSBjdXJyZW50U3RlcFR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHNhbWUgc3RlcCwganVzdCB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IGNsZWFyaW5nXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgLy8gVXBkYXRlIGFsbCBwcm9wZXJ0aWVzXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xuICAgICAgICAgICAgLy8gVXNlIHNldElucHV0IGZvciBpbnB1dCBwcm9wZXJ0aWVzIHRvIHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdleHBhbmRlZCcgJiYgY29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAoaW5zdGFuY2UgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5zZXRJbnB1dCgnZXhwYW5kZWQnLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgbmV3VmFsdWUsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSAodGhpcy5zdGVwIGFzIGFueSlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLnRoaXMuc3RlcCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFN5bmMgZmlsZS1kb3dubG9hZCAoZ2VuZXJhdGVEb2N1bWVudCkgcHJvcHMgZnJvbSBnZW5lcmF0ZURvY3VtZW50UmVzdWx0XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVR5cGVGb3JVcGRhdGUgPSB0aGlzLmdldEVmZmVjdGl2ZVN0ZXBUeXBlKHRoaXMuc3RlcCkgfHwgKHRoaXMuc3RlcCBhcyBhbnkpLmRpc3BsYXlUeXBlO1xuICAgICAgICBpZiAoZWZmZWN0aXZlVHlwZUZvclVwZGF0ZSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICAgICAgY29uc3QgZ2QgPSAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LmdlbmVyYXRlRG9jdW1lbnRSZXN1bHQ7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPSBnZD8uZmlsZVR5cGUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGUgPz8gJyc7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGggPSBnZD8uczNGaWxlTmFtZSA/PyAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgICBjb25zdCB0aWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZDtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0Rvd25sb2FkaW5nID0gISF0aWQgJiYgdGhpcy5kb3dubG9hZGluZ1N0ZXBJZCA9PT0gdGlkO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5maWxlTmFtZSA9IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lO1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZmlsZVBhdGggPSAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHNlbGZIZWFsQW5hbHlzaXMgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzID0gc2VsZkhlYWxBbmFseXNpcztcbiAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBldmVudCBzdWJzY3JpcHRpb25zIGFyZSBzdGlsbCBhY3RpdmUgZm9yIHNlbGZIZWFsQWN0aW9uXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbiAmJiB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XG4gICAgICAgICAgLy8gVHJhY2sgc3Vic2NyaXB0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdzZWxmSGVhbEFjdGlvbicpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ3NlbGZIZWFsQWN0aW9uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyID0gdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcjtcbiAgICAgICAgLy8gU3luYyBpc0RlYnVnIGFuZCBkZWJ1Z1BvaW50U2V0IHNvIG5lc3RlZCBzdGVwcyAoZS5nLiBpbnNpZGUgbG9vcCkgYWx3YXlzIHNob3cgZGVidWcgaWNvbiB3aGVuIHBhcmVudCBoYXMgaXNEZWJ1ZyB0cnVlXG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgIT09IHVuZGVmaW5lZCAmJiAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnICE9PSB0aGlzLmlzRGVidWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgICB9XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRTZXQgPSB0aGlzLmdldEVmZmVjdGl2ZURlYnVnUG9pbnRTZXQoKTtcbiAgICAgICAgaWYgKHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBNZW51T3B0aW9ucyA9IHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5zdGVwTW9yZU1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlTWVudU9wdGlvbnMgPSB0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkO1xuICAgICAgICBpZiAodGhpcy5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0RGVidWdQb2ludFNldEhhbmRsZXIgPSB0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyO1xuICAgICAgICBpZiAodGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyID0gdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyO1xuICAgICAgICAvLyBFbnN1cmUgZGVidWcgcG9pbnQgY2xpY2sgaXMgd2lyZWQgd2hlbiBpc0RlYnVnIGlzIHRydWUgKGUuZy4gYWZ0ZXIgdG9nZ2xpbmcgaW4gU3Rvcnlib29rKVxuICAgICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2UgJiYgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdkZWJ1Z1BvaW50Q2hhbmdlJykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXI/Lih0aGlzLnN0ZXAsIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2RlYnVnUG9pbnRDaGFuZ2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcCAmJiB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKSB7XG4gICAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdlZGl0U3RlcCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5lZGl0U3RlcC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2VkaXRTdGVwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuYWRkU3RlcE9wdGlvblNlbGVjdCkge1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnYWRkU3RlcE9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLm9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI/LihvcHRpb24sIHRoaXMuc3RlcCk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdhZGRTdGVwT3B0aW9uU2VsZWN0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3QpIHtcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ3N0ZXBNb3JlT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KHsgb3B0aW9uLCBzdGVwOiB0aGlzLnN0ZXAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG4gICAgICAgIC8vIENvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcmVhZHksIGVtaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWZmZWN0aXZlVHlwZSA9IHRoaXMuZ2V0RWZmZWN0aXZlU3RlcFR5cGUodGhpcy5zdGVwKSB8fCAodGhpcy5zdGVwIGFzIGFueSkuZGlzcGxheVR5cGU7XG4gICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuY29tcG9uZW50TWFwLmdldChlZmZlY3RpdmVUeXBlKTtcblxuICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgICAgLy8gU3RvcmUgY29tcG9uZW50IGluc3RhbmNlIGFuZCByZWYgaW4gV2Vha01hcCBmb3IgZnV0dXJlIHVwZGF0ZXNcbiAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuc2V0KHRoaXMuY29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5zZXQodGhpcy5jb250YWluZXIsIGNvbXBvbmVudFJlZik7XG5cbiAgICAgIC8vIFN0b3JlIGNvbXBvbmVudCByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuXG4gICAgICAvLyBTcHJlYWQgY29uZmlnIHByb3BlcnRpZXMgYXMgaW5kaXZpZHVhbCBpbnB1dHMgZm9yIGNvbXBvbmVudHMgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIC8vIFRoaXMgc3VwcG9ydHMgYm90aCBwYXR0ZXJuczogY29tcG9uZW50cyB0aGF0IGFjY2VwdCBjb25maWcgZGlyZWN0bHkgYW5kIHRob3NlIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0ZXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBtYXAgY2hpbGRyZW4gdG8gbmVzdGVkU3RlcHMgaWYgbmVzdGVkU3RlcHMgaXMgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZXN0ZWRTdGVwcyA9ICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgbG9vcFR5cGUgYmFzZWQgb24gYWN0aW9uTmFtZSBvciB0ZXN0U3RlcFR5cGVcbiAgICAgIGlmICh0aGlzLmlzTG9vcFN0ZXAodGhpcy5zdGVwKSkge1xuICAgICAgICAvLyBTZXQgbG9vcFR5cGUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUpIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb25OYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbk5hbWU7XG4gICAgICAgICAgY29uc3QgdGVzdFN0ZXBUeXBlID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZTtcbiAgICAgICAgICBpZiAoYWN0aW9uTmFtZSA9PT0gJ0ZPUl9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdGT1JfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ2Zvcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25OYW1lID09PSAnV0hJTEVfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ3doaWxlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHRpdGxlIGlzIHNldCBmcm9tIGFjdGlvbiBpZiB0aXRsZSBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSB8fCAhKGluc3RhbmNlIGFzIGFueSkudGl0bGUudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogaW5pdGlhbGl6ZSBpdGVyYXRpb25zIGlmIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkgJiYgIShpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCIgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddIHN0ZXBcIiwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkLCAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKVxuICAgICAgICAvLyBVc2UgaGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB0cnkgdG8gaW5pdGlhbGl6ZSBmcm9tIHN0ZXAuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdFxuICAgICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LnN0ZXBSZXN1bHQgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdCkpIHtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIGl0ZXJhdGlvbnMgZGlyZWN0bHkgZnJvbSBzdGVwUmVzdWx0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdC5mb3JFYWNoKChpdGVyYXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlcmF0aW9uSW5kZXggPSBpdGVyYXRpb24uaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVyYXRpb24uaW5kZXggIT09IG51bGwgPyBpdGVyYXRpb24uaW5kZXggOiBpdGVyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBzdGF0dXM6ICdzdWNjZXNzJyB8ICdmYWlsZWQnIHwgJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzTG93ZXIgPSBpdGVyYXRpb24uc3RhdHVzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXNMb3dlciA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1c0xvd2VyID09PSAncGFzc2VkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ2ZhaWx1cmUnIHx8IHN0YXR1c0xvd2VyID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xvd2VyID09PSAncnVubmluZycgfHwgc3RhdHVzTG93ZXIgPT09ICdpbl9wcm9ncmVzcycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBgaXRlci0ke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIGxhYmVsOiBgaXRlciAke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgICBzdWJTdGVwczogW10sXG4gICAgICAgICAgICAgIGluZGV4OiBpdGVyYXRpb25JbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgZGVmYXVsdEl0ZXJhdGlvbiBhbmQgc2VsZWN0ZWRJdGVyYXRpb25JZFxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiIGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSBzdGVwIDJcIiwgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkLCAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zKVxuICAgICAgICAvLyBTZXQgZGVmYXVsdEl0ZXJhdGlvbiB0byAnbGFzdCcgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkuZGVmYXVsdEl0ZXJhdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24gPSAnbGFzdCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCAtIHByaW9yaXRpemUgaW5wdXQgdmFsdWUsIHRoZW4gc3RlcCB2YWx1ZSwgdGhlbiBsYXN0IGl0ZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0IHNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gbGFzdCBpdGVyYXRpb24gaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnM7XG4gICAgICAgICAgaWYgKGl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShpdGVyYXRpb25zKSAmJiBpdGVyYXRpb25zLmxlbmd0aCA+IDAgJiYgIShpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJdGVyYXRpb24gPSBpdGVyYXRpb25zW2l0ZXJhdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc3RlcC1ncm91cDogbWFwIGNoaWxkcmVuIHRvIHN0ZXBzIGlmIHN0ZXBzIGlzIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnc3RlcC1ncm91cCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkuc3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmdyb3VwTmFtZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGUtZG93bmxvYWQgKGluY2x1ZGluZyBnZW5lcmF0ZURvY3VtZW50KTogc2V0IHByb3BzIGZyb20gZ2VuZXJhdGVEb2N1bWVudFJlc3VsdCBhbmQgd2lyZSBoYW5kbGVyc1xuICAgICAgaWYgKGVmZmVjdGl2ZVR5cGUgPT09ICdmaWxlLWRvd25sb2FkJykge1xuICAgICAgICBjb25zdCBnZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uZ2VuZXJhdGVEb2N1bWVudFJlc3VsdDtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPSBnZD8uZmlsZU5hbWUgPz8gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWUgPz8gJyc7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID0gZ2Q/LmZpbGVUeXBlID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlID8/ICcnO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aCA9IGdkPy5zM0ZpbGVOYW1lID8/IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoO1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkID0gKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgdGlkID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwUmVzdWx0SWQ7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzRG93bmxvYWRpbmcgPSAhIXRpZCAmJiB0aGlzLmRvd25sb2FkaW5nU3RlcElkID09PSB0aWQ7XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVOYW1lID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZU5hbWU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVUeXBlID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVR5cGU7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmZpbGVQYXRoID0gKGluc3RhbmNlIGFzIGFueSkuZmlsZVBhdGg7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmRvd25sb2FkZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZGVkO1xuICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS50aXRsZSkgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnRpdGxlID0gKGluc3RhbmNlIGFzIGFueSkudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmRvd25sb2FkICYmIHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kb3dubG9hZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25Eb3dubG9hZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoQ29waWVkICYmIHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5maWxlUGF0aENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXIhKGV2KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnRleHRDb3BpZWQgJiYgdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGV4dENvcGllZC5zdWJzY3JpYmUoKGV2OiBhbnkpID0+IHRoaXMub25UZXh0Q29waWVkSGFuZGxlciEoZXYpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogc2V0IGJyYW5jaGVzIGFuZCBjb25kaXRpb25UZXh0XG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAvLyBTZXQgYnJhbmNoZXMgLSBwcmlvcml0aXplIHN0ZXAuYnJhbmNoZXMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGhhbmRsZXJcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcyAmJiBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcykpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgZGVlcCBjb3B5IHRvIGVuc3VyZSBwcm9wZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzLm1hcCgoYnJhbmNoOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAuLi5icmFuY2gsXG4gICAgICAgICAgICBzdWJTdGVwczogYnJhbmNoLnN1YlN0ZXBzID8gWy4uLmJyYW5jaC5zdWJTdGVwc10gOiBbXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICghKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgJiYgdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyQnJhbmNoZXMgPSB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICAgIC8vIENyZWF0ZSBkZWVwIGNvcHkgdG8gZW5zdXJlIHByb3BlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSBoYW5kbGVyQnJhbmNoZXMubWFwKChicmFuY2g6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmJyYW5jaCxcbiAgICAgICAgICAgIHN1YlN0ZXBzOiBicmFuY2guc3ViU3RlcHMgPyBbLi4uYnJhbmNoLnN1YlN0ZXBzXSA6IFtdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBjb25kaXRpb25UZXh0IGZyb20gYWN0aW9uIGlmIGNvbmRpdGlvblRleHQgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgaXNMb2FkaW5nIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXNMb2FkaW5nID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcih0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhc3MgYWN0aXZlQnJhbmNoU3RlcElkIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3RpdmVCcmFuY2hTdGVwSWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgYWktYWdlbnQtc3RlcDogZW5zdXJlIHRpdGxlIGFuZCBwcm9tcHQgYXJlIHNldCBmcm9tIGFjdGlvblxuICAgICAgaWYgKHRoaXMuc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ2FpLWFnZW50Jykge1xuICAgICAgICAvLyBTZXQgdGl0bGUgZnJvbSBhY3Rpb24gaWYgdGl0bGUgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcbiAgICAgICAgaWYgKCghKGluc3RhbmNlIGFzIGFueSkudGl0bGUgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLnRyaW0oKSkgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgcHJvbXB0IGZyb20gYWN0aW9uIGlmIHByb21wdCBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgfHwgIShpbnN0YW5jZSBhcyBhbnkpLnByb21wdC50cmltKCkpICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5wcm9tcHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBhY3Rpb25zIGFycmF5IGlzIHNldCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgJiYgdGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgPSB0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGFjdGlvbkNvdW50IGlmIG5vdCBwcmVzZW50XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25Db3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMgfHwgW107XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uQ291bnQgPSBhY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRUYWJJbnB1dCBpZiBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkVGFiSW5wdXQpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZFRhYklucHV0ID0gJ2FjdGlvbi10cmFjZSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBjb21tb24gZXZlbnQgZW1pdHRlcnMgZm9yIGFwaSwgYWktYWdlbnQsIGxvb3AsIGNvbmRpdGlvbiwgYW5kIGJhc2ljIHN0ZXBzXG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnYXBpJyB8fCB0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdhaS1hZ2VudCcgfHwgdGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkgfHwgdGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJyB8fCB0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdiYXNpYycpIHtcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNvbW1vbiBvdXRwdXQgZXZlbnRzIGFuZCBjYWxsIGhhbmRsZXJzXG4gICAgICAgIC8vIEV2ZW50RW1pdHRlcnMgYXJlIFN1YmplY3RzLCBzbyB3ZSBjYW4gc3Vic2NyaWJlIHRvIHRoZW1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUgJiYgdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubWFrZUN1cnJlbnRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudXBsb2FkQmFzZWxpbmUgJiYgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZSAmJiB0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hbmFseXplLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQW5hbHl6ZUhhbmRsZXI/LigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3MgJiYgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3Muc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24gJiYgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikge1xuICAgICAgICAgIC8vIFRyYWNrIHN1YnNjcmlwdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnc2VsZkhlYWxBY3Rpb24nKSkge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBY3Rpb24uc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzZWxmSGVhbEFjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBvbkpzb25QYXRoQ29waWVkSGFuZGxlciBpcyBzZXQgYXMgaW5wdXQgcHJvcGVydHkgKGxpbmUgODI1KSwgc28gd2UgZG9uJ3QgbmVlZCB0byBzdWJzY3JpYmUgdG8ganNvblBhdGhDb3BpZWQgZXZlbnRcbiAgICAgICAgLy8gVGhlIEFQSSBzdGVwIGNvbXBvbmVudCBjYWxscyB0aGUgaGFuZGxlciBkaXJlY3RseSwgYXZvaWRpbmcgZHVwbGljYXRlIGNhbGxzXG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogd2lyZSB1cCBvblZpZXdBbGxJdGVyYXRpb25zIGV2ZW50XG4gICAgICBpZiAodGhpcy5pc0xvb3BTdGVwKHRoaXMuc3RlcCkpIHtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMgJiYgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0FsbEl0ZXJhdGlvbnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/Lih0aGlzLnN0ZXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgZGVidWcgcG9pbnQgdG9nZ2xlIGZvciBhbnkgc3RlcCB0aGF0IHN1cHBvcnRzIGl0ICh3aGVuIGlzRGVidWcgaXMgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludENoYW5nZSAmJiB0aGlzLm9uRGVidWdQb2ludENoYW5nZUhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHN1YnNjcmliZWRFdmVudHMgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuZ2V0KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzKSB7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5zZXQoaW5zdGFuY2UsIHN1YnNjcmliZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cy5oYXMoJ2RlYnVnUG9pbnRDaGFuZ2UnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmRlYnVnUG9pbnRDaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyPy4odGhpcy5zdGVwLCB2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlZEV2ZW50cy5hZGQoJ2RlYnVnUG9pbnRDaGFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIGVkaXQgc3RlcDogd2hlbiB1c2VyIGNsaWNrcyBFZGl0IGljb24sIG5vdGlmeSBwYXJlbnQgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgIGlmICh0aGlzLmlzRGVidWcgJiYgKGluc3RhbmNlIGFzIGFueSkuZWRpdFN0ZXAgJiYgdGhpcy5vbkVkaXRTdGVwSGFuZGxlcikge1xuICAgICAgICBsZXQgc3Vic2NyaWJlZEV2ZW50cyA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5zdWJzY3JpYmVkRXZlbnRFbWl0dGVycy5nZXQoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMpIHtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLnNldChpbnN0YW5jZSwgc3Vic2NyaWJlZEV2ZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJzY3JpYmVkRXZlbnRzLmhhcygnZWRpdFN0ZXAnKSkge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmVkaXRTdGVwLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnZWRpdFN0ZXAnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIGFkZC1zdGVwIG9wdGlvbiBzZWxlY3Q6IHdoZW4gdXNlciBwaWNrcyBhbiBvcHRpb24gZnJvbSB0aGUgUGx1cyBtZW51LCBlbWl0IGFuZCBvcHRpb25hbGx5IGNhbGwgaGFuZGxlclxuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAmJiAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0KSB7XG4gICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdhZGRTdGVwT3B0aW9uU2VsZWN0JykpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5hZGRTdGVwT3B0aW9uU2VsZWN0LnN1YnNjcmliZSgob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyPy4ob3B0aW9uLCB0aGlzLnN0ZXApO1xuICAgICAgICAgICAgdGhpcy5hZGRTdGVwT3B0aW9uU2VsZWN0LmVtaXQoeyBvcHRpb24sIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpYmVkRXZlbnRzLmFkZCgnYWRkU3RlcE9wdGlvblNlbGVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgc3RlcCBtb3JlIG9wdGlvbiBzZWxlY3Q6IHdoZW4gdXNlciBwaWNrcyBhbiBvcHRpb24gZnJvbSB0aGUgdGhyZWUtZG90IG1lbnUsIGVtaXQgYW5kIG9wdGlvbmFsbHkgY2FsbCBoYW5kbGVyXG4gICAgICBpZiAodGhpcy5pc0RlYnVnICYmIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBNb3JlT3B0aW9uU2VsZWN0KSB7XG4gICAgICAgIGxldCBzdWJzY3JpYmVkRXZlbnRzID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LnN1YnNjcmliZWRFdmVudEVtaXR0ZXJzLmdldChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghc3Vic2NyaWJlZEV2ZW50cykge1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuc3Vic2NyaWJlZEV2ZW50RW1pdHRlcnMuc2V0KGluc3RhbmNlLCBzdWJzY3JpYmVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnNjcmliZWRFdmVudHMuaGFzKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVPcHRpb25TZWxlY3Quc3Vic2NyaWJlKChvcHRpb246IFN0ZXBNb3JlTWVudU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlcj8uKG9wdGlvbiwgdGhpcy5zdGVwKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcE1vcmVPcHRpb25TZWxlY3QuZW1pdCh7IG9wdGlvbiwgc3RlcDogdGhpcy5zdGVwIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmliZWRFdmVudHMuYWRkKCdzdGVwTW9yZU9wdGlvblNlbGVjdCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiB3aXJlIHVwIG9uRXhwYW5kIGV2ZW50XG4gICAgICBpZiAodGhpcy5zdGVwLmRpc3BsYXlUeXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmQgJiYgdGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2FsbCBvbkV4cGFuZEhhbmRsZXIgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaXJlIHVwIG9uQnJhbmNoQ2xpY2tFdmVudCBmb3IgbmVzdGVkIGNvbmRpdGlvbiBzdGVwc1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25CcmFuY2hDbGlja0V2ZW50ICYmIHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkJyYW5jaENsaWNrRXZlbnQuc3Vic2NyaWJlKChicmFuY2g6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcj8uKHRoaXMuc3RlcCwgYnJhbmNoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZXhwYW5kZWQgcHJvcGVydHkgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgLy8gVXNlIGlzU3RlcEV4cGFuZGVkSGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RlcC5leHBhbmRlZCBvciBzdGVwLmNvbmZpZy5leHBhbmRlZFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmRIYW5kbGVyID0gdGhpcy5vbkV4cGFuZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkVkaXRTdGVwSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FZGl0U3RlcEhhbmRsZXIgPSB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmFkZFN0ZXBNZW51T3B0aW9ucyA9IHRoaXMuYWRkU3RlcE1lbnVPcHRpb25zO1xuICAgICAgaWYgKHRoaXMub25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlciA9IHRoaXMub25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnMgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuc3RlcE1vcmVNZW51T3B0aW9ucyA9IHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucztcbiAgICAgIGlmICh0aGlzLm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblN0ZXBNb3JlT3B0aW9uU2VsZWN0SGFuZGxlciA9IHRoaXMub25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkID0gdGhpcy5nZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQ7XG4gICAgICBpZiAodGhpcy5nZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgPSB0aGlzLmdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQ7XG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcExvYWRpbmdIYW5kbGVyID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwRXhwYW5kZWRIYW5kbGVyID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyID0gdGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRBY3Rpb25zSGFuZGxlciA9IHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblVwbG9hZEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdGdWxsTG9nc0hhbmRsZXIgPSB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID0gdGhpcy5nZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyID0gdGhpcy5vbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU3RlcENsaWNrSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TdGVwQ2xpY2tIYW5kbGVyID0gdGhpcy5vblN0ZXBDbGlja0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkpzb25QYXRoQ29waWVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25Kc29uUGF0aENvcGllZEhhbmRsZXIgPSB0aGlzLm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25Eb3dubG9hZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRG93bmxvYWRIYW5kbGVyID0gdGhpcy5vbkRvd25sb2FkSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkZpbGVQYXRoQ29waWVkSGFuZGxlciA9IHRoaXMub25GaWxlUGF0aENvcGllZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblRleHRDb3BpZWRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblRleHRDb3BpZWRIYW5kbGVyID0gdGhpcy5vblRleHRDb3BpZWRIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuanVtcFRvVGltZXN0YW1wSGFuZGxlciA9IHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldERlYnVnUG9pbnRTZXRIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXREZWJ1Z1BvaW50U2V0SGFuZGxlciA9IHRoaXMuZ2V0RGVidWdQb2ludFNldEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyID0gdGhpcy5vbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNVcGxvYWRpbmdCYXNlbGluZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc1VwbG9hZGluZ0Jhc2VsaW5lID0gdGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lO1xuICAgICAgaWYgKHRoaXMuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNNYWtpbmdDdXJyZW50QmFzZWxpbmUgPSB0aGlzLmlzTWFraW5nQ3VycmVudEJhc2VsaW5lO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgaWYgKHRoaXMuaXNMaXZlICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzTGl2ZSA9IHRoaXMuaXNMaXZlO1xuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCA9IHRoaXMuZ2V0RWZmZWN0aXZlRGVidWdQb2ludFNldCgpO1xuICAgICAgLy8gUGFzcyBzdGVwTnVtYmVyIGlucHV0IGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIHN0ZXAncyBzdGVwTnVtYmVyXG4gICAgICBpZiAodGhpcy5zdGVwTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcE51bWJlciA9IHRoaXMuc3RlcE51bWJlcjtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQYXNzIHRoZSBzdGVwIG9iamVjdCBzbyB0b2dnbGVIZWFkZXIgY2FuIHVzZSBpdFxuICAgICAgaWYgKHRoaXMuc3RlcCkgKGluc3RhbmNlIGFzIGFueSkuc3RlcCA9IHRoaXMuc3RlcDtcblxuICAgICAgLy8gVXBkYXRlIGNvbmRpdGlvbi1zdGVwIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmICh0aGlzLnN0ZXAuZGlzcGxheVR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBhY3RpdmVCcmFuY2hTdGVwSWQgaWYgaXQgY2hhbmdlZFxuICAgICAgICBpZiAoKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYWN0aXZlQnJhbmNoU3RlcElkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGl2ZUJyYW5jaFN0ZXBJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBicmFuY2hlcyBpZiB0aGV5IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSAodGhpcy5zdGVwIGFzIGFueSkuYnJhbmNoZXM7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmJyYW5jaGVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBuZXN0ZWRTdGVwcyBpZiB0aGV5IGNoYW5nZWRcbiAgICAgICAgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHM7XG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIC8vIFNldCBzZWxmSGVhbEFuYWx5c2lzIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciAmJiB0aGlzLnN0ZXApIHtcbiAgICAgICAgY29uc3Qgc2VsZkhlYWxBbmFseXNpcyA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuc2VsZkhlYWxBbmFseXNpcyA9IHNlbGZIZWFsQW5hbHlzaXM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWxzbyBzZXQgY29uZmlnIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggY29tcG9uZW50cyB0aGF0IHN0aWxsIHVzZSBjb25maWcgaW5wdXRcbiAgICAgIGlmICgnY29uZmlnJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICBpZiAoZWZmZWN0aXZlVHlwZSA9PT0gJ2ZpbGUtZG93bmxvYWQnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0ge1xuICAgICAgICAgICAgLi4udGhpcy5zdGVwLFxuICAgICAgICAgICAgdHlwZTogJ2ZpbGUtZG93bmxvYWQnLFxuICAgICAgICAgICAgZmlsZU5hbWU6IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVOYW1lLFxuICAgICAgICAgICAgZmlsZVR5cGU6IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVUeXBlLFxuICAgICAgICAgICAgZmlsZVBhdGg6IChpbnN0YW5jZSBhcyBhbnkpLmZpbGVQYXRoLFxuICAgICAgICAgICAgZG93bmxvYWRlZDogKGluc3RhbmNlIGFzIGFueSkuZG93bmxvYWRlZFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0gdGhpcy5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSBzZWxmSGVhbEFuYWx5c2lzIGlzIGluY2x1ZGVkIGluIGNvbmZpZ1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuc2VsZkhlYWxBbmFseXNpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnNlbGZIZWFsQW5hbHlzaXMgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFuYWx5c2lzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIGtleSBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcblxuICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW1pdCByZWFkeSBldmVudCBhZnRlciBjb21wb25lbnQgaXMgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWRcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSB0aGUgY29tcG9uZW50IGlzIGZ1bGx5IHJlbmRlcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeS5lbWl0KCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgLy8gVXNlIG5nRG9DaGVjayB0byBkZXRlY3QgY2hhbmdlcyBpbiBuZXN0ZWQgcHJvcGVydGllcyB0aGF0IG5nT25DaGFuZ2VzIG1pZ2h0IG1pc3NcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGNvbXBvbmVudFJlZiAmJiB0aGlzLnN0ZXApIHtcbiAgICAgIC8vIEJ1ZyAyIGZpeDogZGV0ZWN0IGluLXBsYWNlIHN0ZXAuc3RhdHVzIG11dGF0aW9ucyBkdXJpbmcgbGl2ZSBleGVjdXRpb24uXG4gICAgICAvLyBuZ09uQ2hhbmdlcyBuZXZlciBmaXJlcyB3aGVuIHRoZSBzdGVwIG9iamVjdCByZWZlcmVuY2UgaXMgdW5jaGFuZ2VkLCBzbyB3ZVxuICAgICAgLy8gdHJhY2sgc3RhdHVzIGhlcmUgYW5kIHB1c2ggY2hhbmdlcyBkaXJlY3RseSB0byB0aGUgZHluYW1pY2FsbHktbG9hZGVkIGluc3RhbmNlLlxuICAgICAgaWYgKHRoaXMuaXNMaXZlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSAodGhpcy5zdGVwIGFzIGFueSkuc3RhdHVzO1xuICAgICAgICBpZiAoY3VycmVudFN0YXR1cyAhPT0gdGhpcy5sYXN0VHJhY2tlZFN0YXR1cykge1xuICAgICAgICAgIHRoaXMubGFzdFRyYWNrZWRTdGF0dXMgPSBjdXJyZW50U3RhdHVzO1xuXG4gICAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1cyAhPT0gY3VycmVudFN0YXR1cykge1xuICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RhdHVzID0gY3VycmVudFN0YXR1cztcbiAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLnN0YXR1cyA9IGN1cnJlbnRTdGF0dXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFsc28gc3luYyBleGVjdXRpb25EYXRhLnN0ZXBTdGF0dXMgc28gc3RhdHVzIGljb25zIHJlbmRlciBjb3JyZWN0bHkuXG4gICAgICAgICAgICBjb25zdCBzdGVwU3RhdHVzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4ZWN1dGlvbkRhdGE/LnN0ZXBTdGF0dXMgPz8gY3VycmVudFN0YXR1cztcbiAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5leGVjdXRpb25EYXRhKSB7XG4gICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4ZWN1dGlvbkRhdGEgPSB7IC4uLihpbnN0YW5jZSBhcyBhbnkpLmV4ZWN1dGlvbkRhdGEsIHN0ZXBTdGF0dXMgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWc/LmV4ZWN1dGlvbkRhdGEpIHtcbiAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4ZWN1dGlvbkRhdGEgPSB7IC4uLihpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leGVjdXRpb25EYXRhLCBzdGVwU3RhdHVzIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ2RyKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1ZyA1IGZpeDogZGV0ZWN0IGluLXBsYWNlIG11dGF0aW9ucyBvZiBlZGl0YWJsZSBzdGVwIHByb3BlcnRpZXMgaW4gZGVidWcgbW9kZS5cbiAgICAgIC8vIFdoZW4gYSB1c2VyIHNhdmVzIGEgc3RlcCB2aWEgdGhlIGVkaXQgZGlhbG9nIHRoZSBwb3J0YWwgbXV0YXRlcyBhY3Rpb24vdGl0bGUvZXRjLlxuICAgICAgLy8gaW4tcGxhY2UgYmVmb3JlIChvciB3aXRob3V0KSBjcmVhdGluZyBhIG5ldyBzdGVwIHJlZmVyZW5jZSwgc28gbmdPbkNoYW5nZXMgbmV2ZXIgZmlyZXMuXG4gICAgICBpZiAodGhpcy5pc0RlYnVnKSB7XG4gICAgICAgIGNvbnN0IGVkaXRQcm9wcyA9IFsnYWN0aW9uJywgJ3Rlc3REYXRhVmFsJywgJ3Rlc3REYXRhJywgJ3RpdGxlJywgJ3ByZVJlcXVpc2l0ZScsICdwcmlvcml0eScsICdkaXNhYmxlZCddO1xuICAgICAgICBpZiAoIXRoaXMubGFzdFRyYWNrZWRFZGl0UHJvcHMpIHtcbiAgICAgICAgICAvLyBJbml0aWFsaXNlIHNuYXBzaG90IG9uIGZpcnN0IGRlYnVnIGN5Y2xlLlxuICAgICAgICAgIHRoaXMubGFzdFRyYWNrZWRFZGl0UHJvcHMgPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBlZGl0UHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFRyYWNrZWRFZGl0UHJvcHNba2V5XSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaGFzRWRpdENoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGVkaXRQcm9wcykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbCA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWwgIT09IHRoaXMubGFzdFRyYWNrZWRFZGl0UHJvcHNba2V5XSkge1xuICAgICAgICAgICAgICB0aGlzLmxhc3RUcmFja2VkRWRpdFByb3BzW2tleV0gPSBjdXJyZW50VmFsO1xuICAgICAgICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSlba2V5XSAhPT0gY3VycmVudFZhbCkge1xuICAgICAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpW2tleV0gPSBjdXJyZW50VmFsO1xuICAgICAgICAgICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcgJiYgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnW2tleV0gPSBjdXJyZW50VmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNFZGl0Q2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFzRWRpdENoYW5nZSAmJiBjb21wb25lbnRSZWYuaW5qZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VDZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3luYyBpc0RlYnVnIGFuZCBkZWJ1Z1BvaW50U2V0IGZyb20gc3RlcC1yZW5kZXJlciBpbnB1dHMgc28gbmVzdGVkIHN0ZXBzIChlLmcuIGluc2lkZSBsb29wL3N0ZXAtZ3JvdXApXG4gICAgICAvLyBhbHdheXMgcmVmbGVjdCBwYXJlbnQgc3RhdGUgd2hlbiB0b2dnbGVkIChlLmcuIFN0b3J5Ym9vayBDb250cm9scylcbiAgICAgIGNvbnN0IG5leHREZWJ1Z1BvaW50U2V0ID0gdGhpcy5nZXRFZmZlY3RpdmVEZWJ1Z1BvaW50U2V0KCk7XG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCAhPT0gbmV4dERlYnVnUG9pbnRTZXQpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZGVidWdQb2ludFNldCA9IG5leHREZWJ1Z1BvaW50U2V0O1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNEZWJ1ZyAhPT0gdW5kZWZpbmVkICYmIChpbnN0YW5jZSBhcyBhbnkpLmlzRGVidWcgIT09IHRoaXMuaXNEZWJ1Zykge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0RlYnVnID0gdGhpcy5pc0RlYnVnO1xuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBleHBhbmRlZCBzdGF0ZSBjaGFuZ2VkICh1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgYXMgaXQgbWF5IGRlcGVuZCBvbiBwYXJlbnQgc3RhdGUpXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgbmVzdGVkIHN0ZXAtZ3JvdXBzIHdoZXJlIHBhcmVudCBleHBhbnNpb24gYWZmZWN0cyBjaGlsZCBleHBhbnNpb25cbiAgICAgIGxldCBjdXJyZW50RXhwYW5kZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgICAgY3VycmVudEV4cGFuZGVkID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRFeHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc3RhbmNlRXhwYW5kZWQgPSAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZDtcblxuICAgICAgaWYgKGN1cnJlbnRFeHBhbmRlZCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFeHBhbmRlZCAhPT0gaW5zdGFuY2VFeHBhbmRlZCkge1xuICAgICAgICAvLyBFeHBhbmRlZCBzdGF0ZSBjaGFuZ2VkLCB1cGRhdGUgaXQgdXNpbmcgc2V0SW5wdXQgdG8gdHJpZ2dlciBuZ09uQ2hhbmdlc1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gaW5zdGFuY2VFeHBhbmRlZDtcbiAgICAgICAgaWYgKGNvbXBvbmVudFJlZiAmJiB0eXBlb2YgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLnNldElucHV0KCdleHBhbmRlZCcsIGN1cnJlbnRFeHBhbmRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IG1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9IGN1cnJlbnRFeHBhbmRlZDtcbiAgICAgICAgICBpZiAodHlwZW9mIChpbnN0YW5jZSBhcyBhbnkpLm5nT25DaGFuZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICBleHBhbmRlZDogbmV3IFNpbXBsZUNoYW5nZShwcmV2aW91c1ZhbHVlLCBjdXJyZW50RXhwYW5kZWQsIHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9IGN1cnJlbnRFeHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0ZXAgb2JqZWN0J3MgZXhwYW5kZWQgcHJvcGVydHkgdG8ga2VlcCBpdCBpbiBzeW5jXG4gICAgICAgICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZCA9IGN1cnJlbnRFeHBhbmRlZDtcbiAgICAgICAgXG4gICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcbiAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBpdGVyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSBzZWxlY3RlZEl0ZXJhdGlvblxuICAgICAgaWYgKHRoaXMuaXNMb29wU3RlcCh0aGlzLnN0ZXApICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICBjb25zdCBpdGVyYXRpb25zID0gKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyB8fCAoaW5zdGFuY2UgYXMgYW55KS5jb25maWc/Lml0ZXJhdGlvbnMgfHwgW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlcmF0aW9uSWQgPSAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkIHx8IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSXRlcmF0aW9uID0gKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb247XG5cbiAgICAgICAgLy8gSWYgaXRlcmF0aW9ucyBhcmUgYXZhaWxhYmxlLCBzZWxlY3RlZEl0ZXJhdGlvbklkIGlzIHNldCwgYnV0IHNlbGVjdGVkSXRlcmF0aW9uIGlzIG5vdCBzZXQgb3IgZG9lc24ndCBtYXRjaFxuICAgICAgICBpZiAoaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmIHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRCZVNlbGVjdGVkID0gaXRlcmF0aW9ucy5maW5kKChpdGVyOiBhbnkpID0+IGl0ZXIuaWQgPT09IHNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgIGlmIChzaG91bGRCZVNlbGVjdGVkICYmIGN1cnJlbnRTZWxlY3RlZEl0ZXJhdGlvbj8uaWQgIT09IHNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9vcFN0ZXBTZWxlY3RlZEl0ZXJhdGlvbihpbnN0YW5jZSwgc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlQ2RyID0gY29tcG9uZW50UmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG4gICAgICAgICAgICAgIGlmIChpbnN0YW5jZUNkcikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50S2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XG5cbiAgICAgIC8vIElmIHN0ZXAgcHJvcGVydGllcyBjaGFuZ2VkIChldmVuIGlmIHJlZmVyZW5jZSBkaWRuJ3QpLCB1cGRhdGUgdGhlIGluc3RhbmNlXG4gICAgICBpZiAoY3VycmVudEtleSAhPT0gdGhpcy5wcmV2aW91c1N0ZXBLZXkpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0aGUgcHJldmlvdXMgc3RlcCB0byBjb21wYXJlLCBzbyB3ZSdsbCB1cGRhdGUgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuICAgICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIHByZXZpb3VzIHN0ZXAgZnJvbSB0aGUgaW5zdGFuY2UncyBjdXJyZW50IHN0YXRlXG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RlcDogYW55ID0ge1xuICAgICAgICAgIGlkOiAoaW5zdGFuY2UgYXMgYW55KS5pZCxcbiAgICAgICAgICBkaXNwbGF5VHlwZTogKGluc3RhbmNlIGFzIGFueSkuZGlzcGxheVR5cGUsXG4gICAgICAgICAgc3RhdHVzOiAoaW5zdGFuY2UgYXMgYW55KS5zdGF0dXMsXG4gICAgICAgICAgZHVyYXRpb246IChpbnN0YW5jZSBhcyBhbnkpLmR1cmF0aW9uLFxuICAgICAgICAgIGV4cGFuZGVkOiAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCxcbiAgICAgICAgICBjaGlsZHJlbjogKGluc3RhbmNlIGFzIGFueSkuY2hpbGRyZW4sXG4gICAgICAgICAgbmVzdGVkU3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzLFxuICAgICAgICAgIHN0ZXBzOiAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyxcbiAgICAgICAgICBleGVjdXRpb25EYXRhOiAoaW5zdGFuY2UgYXMgYW55KS5leGVjdXRpb25EYXRhLFxuICAgICAgICAgIGFjdGlvbjogKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uLFxuICAgICAgICAgIHRpdGxlOiAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSxcbiAgICAgICAgICByZXN1bHQ6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3VsdCxcbiAgICAgICAgICBtZXRob2Q6IChpbnN0YW5jZSBhcyBhbnkpLm1ldGhvZCxcbiAgICAgICAgICBlbmRwb2ludDogKGluc3RhbmNlIGFzIGFueSkuZW5kcG9pbnQsXG4gICAgICAgICAgc3RhdHVzQ29kZTogKGluc3RhbmNlIGFzIGFueSkuc3RhdHVzQ29kZSxcbiAgICAgICAgICByZXNwb25zZVRpbWU6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3BvbnNlVGltZSxcbiAgICAgICAgICBhY3Rpb25zOiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25zLFxuICAgICAgICAgIHByb21wdDogKGluc3RhbmNlIGFzIGFueSkucHJvbXB0LFxuICAgICAgICAgIG9wdGltaXplZFJ1bjogKGluc3RhbmNlIGFzIGFueSkub3B0aW1pemVkUnVuLFxuICAgICAgICAgIGFjdGlvbkNvdW50OiAoaW5zdGFuY2UgYXMgYW55KS5hY3Rpb25Db3VudCxcbiAgICAgICAgICBpdGVyYXRpb25zOiAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zLFxuICAgICAgICAgIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQsXG4gICAgICAgICAgYnJhbmNoZXM6IChpbnN0YW5jZSBhcyBhbnkpLmJyYW5jaGVzLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBOdW1iZXIsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZSh0aGlzLnN0ZXAsIHByZXZpb3VzU3RlcCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gY3VycmVudEtleTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iXX0=