@cqa-lib/cqa-ui 1.1.348 → 1.1.349

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.
@@ -454,6 +454,25 @@ export class TestCaseDetailsEditComponent {
454
454
  }
455
455
  return val != null && val !== '' && String(val).trim() !== '' ? String(val) : '';
456
456
  }
457
+ /** Strip trailing 's' from value (e.g. "10s" -> "10") for display in timeout inputs */
458
+ stripTrailingUnitS(val) {
459
+ if (val == null || val === '')
460
+ return val;
461
+ const s = String(val).trim();
462
+ return s.replace(/\s*s$/i, '');
463
+ }
464
+ /** Allow only digits; used for Retry Failed Steps, Test Case Timeout, Wait Timeout inputs */
465
+ onlyDigits(val) {
466
+ if (val == null || val === '')
467
+ return '';
468
+ return String(val).replace(/\D/g, '');
469
+ }
470
+ /** For update: use "0" when value is empty so API gets a number */
471
+ emptyNumToZero(val) {
472
+ if (val == null || String(val).trim() === '')
473
+ return '0';
474
+ return String(val).trim();
475
+ }
457
476
  getPrerequisiteCasesFromConfig() {
458
477
  const val = this.getConfigItemValue('Execution', 'Prerequisite Case');
459
478
  if (!val)
@@ -482,8 +501,8 @@ export class TestCaseDetailsEditComponent {
482
501
  const autoWaitVal = this.getWaitsRetriesValue('Enable Avoid Auto wait for steps') || this.getConfigItemValue('Waits & Retries', 'Auto Wait');
483
502
  this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '' && String(autoWaitVal) !== 'false');
484
503
  this.retryFailedSteps = this.getWaitsRetriesValue('Retry Failed Steps');
485
- this.testCaseTimeout = this.getWaitsRetriesValue('Test Case Timeout (minutes)');
486
- this.waitTimeoutLocators = this.getWaitsRetriesValue('Wait Timeout for Locators (secs)');
504
+ this.testCaseTimeout = this.stripTrailingUnitS(this.getWaitsRetriesValue('Test Case Timeout (minutes)'));
505
+ this.waitTimeoutLocators = this.stripTrailingUnitS(this.getWaitsRetriesValue('Wait Timeout for Locators (secs)'));
487
506
  this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
488
507
  this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
489
508
  this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
@@ -637,8 +656,8 @@ export class TestCaseDetailsEditComponent {
637
656
  const autoWaitVal = this.getWaitsRetriesValue('Enable Avoid Auto wait for steps') || this.getConfigItemValue('Waits & Retries', 'Auto Wait');
638
657
  this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '' && String(autoWaitVal) !== 'false');
639
658
  this.retryFailedSteps = this.getWaitsRetriesValue('Retry Failed Steps');
640
- this.testCaseTimeout = this.getWaitsRetriesValue('Test Case Timeout (minutes)');
641
- this.waitTimeoutLocators = this.getWaitsRetriesValue('Wait Timeout for Locators (secs)');
659
+ this.testCaseTimeout = this.stripTrailingUnitS(this.getWaitsRetriesValue('Test Case Timeout (minutes)'));
660
+ this.waitTimeoutLocators = this.stripTrailingUnitS(this.getWaitsRetriesValue('Wait Timeout for Locators (secs)'));
642
661
  this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
643
662
  this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
644
663
  this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
@@ -776,11 +795,11 @@ export class TestCaseDetailsEditComponent {
776
795
  if (item.label === 'Enable Avoid Auto wait for steps')
777
796
  return { ...item, value: this.autoWaitEnabled };
778
797
  if (item.label === 'Retry Failed Steps')
779
- return { ...item, value: this.retryFailedSteps };
798
+ return { ...item, value: this.emptyNumToZero(this.retryFailedSteps) };
780
799
  if (item.label === 'Test Case Timeout (minutes)')
781
- return { ...item, value: this.testCaseTimeout };
800
+ return { ...item, value: this.emptyNumToZero(this.testCaseTimeout) };
782
801
  if (item.label === 'Wait Timeout for Locators (secs)')
783
- return { ...item, value: this.waitTimeoutLocators };
802
+ return { ...item, value: this.emptyNumToZero(this.waitTimeoutLocators) };
784
803
  return item;
785
804
  });
786
805
  return { ...section, items };
@@ -862,10 +881,10 @@ export class TestCaseDetailsEditComponent {
862
881
  }
863
882
  }
864
883
  TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
865
- TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", isSaving: "isSaving", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
884
+ TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", isSaving: "isSaving", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($event)\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($event)\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
866
885
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, decorators: [{
867
886
  type: Component,
868
- args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n" }]
887
+ args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- <div *ngIf=\"hasPrerequisiteCaseConfig\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\"> \n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div> -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($event)\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($event)\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <!-- Web only: mobile Device Settings hidden temporarily -->\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n" }]
869
888
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { descriptionTitle: [{
870
889
  type: Input
871
890
  }], descriptionContent: [{
@@ -907,4 +926,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
907
926
  }], labelAdded: [{
908
927
  type: Output
909
928
  }] } });
910
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBaUN4RCxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBY1gsTUFBTSxzQkFBc0IsR0FB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QW5CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQVNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFSSxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUdHLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uLFxuICBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0sXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1kZXRhaWxzLm1vZGVscyc7XG5pbXBvcnQge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuLyoqIE92ZXJyaWRlIGNvbmZpZyBmb3IgYSBzcGVjaWZpYyBzZWxlY3QuIFVzZSBmb3Igc2VydmVyLXNpZGUgc2VhcmNoLCBsb2FkIG1vcmUsIGN1c3RvbSBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RDb25maWdPdmVycmlkZSB7XG4gIC8qKiBSZXBsYWNlIG9wdGlvbnMgKGUuZy4gZnJvbSBBUEkpLiBVcGRhdGUgd2hlbiBBUEkgcmV0dXJucy4gKi9cbiAgb3B0aW9ucz86IFNlbGVjdE9wdGlvbltdO1xuICAvKiogRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaDsgY29tcG9uZW50IGVtaXRzIHNlbGVjdFNlYXJjaCBpbnN0ZWFkIG9mIGxvY2FsIGZpbHRlcmluZy4gKi9cbiAgc2VydmVyU2VhcmNoPzogYm9vbGVhbjtcbiAgLyoqIEluZGljYXRlcyBtb3JlIHJlc3VsdHMgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogTG9hZGluZyBzdGF0ZSAoZS5nLiBkdXJpbmcgQVBJIGNhbGwpLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIHNlYXJjaCBpbnB1dCBpbiB0aGUgc2VsZWN0LiAqL1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgdHJpZ2dlcnMgaW5pdGlhbCBzZWFyY2ggb24gcGFuZWwgb3BlbiAoc2VydmVyU2VhcmNoIG1vZGUpLiAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogQ2FsbGJhY2sgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaC4gQ2FsbCBBUEksIHRoZW4gdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgb25TZWFyY2g/OiAocXVlcnk6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uTG9hZE1vcmU/OiAocXVlcnk/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8qKiBNYXAgb2Ygc2VsZWN0IGtleSAtPiBjb25maWcgb3ZlcnJpZGUuIEVuYWJsZXMgQVBJLWRyaXZlbiBvcHRpb25zLCBpbmZpbml0ZSBzZWFyY2gsIGxvYWQgbW9yZS4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgU2VsZWN0Q29uZmlnT3ZlcnJpZGU+PjtcblxuLyoqIEtleXMgZm9yIGVhY2ggZHluYW1pYyBzZWxlY3QgaW4gdGVzdC1jYXNlLWRldGFpbHMtZWRpdC4gVXNlIHRoZXNlIHdpdGggc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTID0ge1xuICBzdGF0dXM6ICdzdGF0dXMnLFxuICBwcmlvcml0eTogJ3ByaW9yaXR5JyxcbiAgdHlwZTogJ3R5cGUnLFxuICBsYWJlbHM6ICdsYWJlbHMnLFxuICBwcmVyZXF1aXNpdGVDYXNlczogJ3ByZXJlcXVpc2l0ZUNhc2VzJyxcbiAgdGVzdERhdGFQcm9maWxlOiAndGVzdERhdGFQcm9maWxlJyxcbiAgdGVzdERhdGFTZXQ6ICd0ZXN0RGF0YVNldCcsXG4gIHZpZGVvUmVjb3JkaW5nOiAndmlkZW9SZWNvcmRpbmcnLFxuICBlbmFibGVBaVNtYXJ0bmVzczogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgZGVmYXVsdEFpQWN0aW9uOiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZTogJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLFxuICB1c2VBaU1ldGFkYXRhOiAndXNlQWlNZXRhZGF0YScsXG4gIGRlZmF1bHRCcm93c2VyOiAnZGVmYXVsdEJyb3dzZXInLFxuICBkZWZhdWx0Vmlld3BvcnQ6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICBkZXZpY2VUeXBlOiAnZGV2aWNlVHlwZScsXG4gIGRldmljZU9TOiAnZGV2aWNlT1MnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHByaW9yaXR5OiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxhYmVsczogc3RyaW5nW107XG4gIHRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgdGVzdERhdGFTZXRJbmRleD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW107XG4gIGNvbmZpZ1NlY3Rpb25zUm93MjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xufVxuXG5jb25zdCBGUkVRVUVOVExZX1VTRURfTEFCRUxTID0gW1xuICAnQ2FzZScsXG4gICdDcml0aWNhbCcsXG4gICdQTycsXG4gICdVcGxvYWQnLFxuICAnVmFsaWRhdGlvbicsXG4gICdSZXZpZXcnLFxuICAnRWRnZS1jYXNlcycsXG4gICdTZWN1cml0eScsXG4gICdJbnRlZ3JhdGlvbicsXG4gICdTbW9rZScsXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLWRldGFpbHMtZWRpdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXN0LWNhc2UtZGV0YWlscy1lZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRlc3RDYXNlRGV0YWlsc0VkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uVGl0bGUgPSAnRGVzY3JpcHRpb24nO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbkNvbnRlbnQgPSAnJztcbiAgLyoqIFdoZW4gdHJ1ZSwgZGVzY3JpcHRpb24gdXNlcyBUcml4IHJpY2ggdGV4dCBlZGl0b3IgKEJvbGQsIEl0YWxpYywgZXRjLikuIEhvc3QgYXBwIG11c3QgbG9hZCBUcml4LiAqL1xuICBASW5wdXQoKSBlbmFibGVNYXJrZG93biA9IGZhbHNlO1xuICBASW5wdXQoKSBtZXRhZGF0YUl0ZW1zOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW1bXSA9IFtdO1xuICBASW5wdXQoKSBsYWJlbHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGNvbmZpZ1RpdGxlID0gJ0NvbmZpZ3VyYXRpb24nO1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zUm93MjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGlzU2F2aW5nID0gZmFsc2U7XG4gIC8qKiBPcHRpb25hbCBsaXN0IG9mIHByZXJlcXVpc2l0ZSB0ZXN0IGNhc2Ugb3B0aW9ucyBmb3IgdGhlIG11bHRpLXNlbGVjdC4gSWYgbm90IHByb3ZpZGVkLCB1c2VzIGRlZmF1bHQgc2FtcGxlIG9wdGlvbnMuICovXG4gIEBJbnB1dCgpIHByZXJlcXVpc2l0ZUNhc2VPcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gPSBbXTtcbiAgLyoqIFBsYXRmb3JtOiAnd2ViJyBzaG93cyBEZWZhdWx0IEJyb3dzZXIgKyBWaWV3cG9ydDsgJ21vYmlsZScgc2hvd3MgRGV2aWNlIFR5cGUgKyBPUy4gRGVmYXVsdHMgdG8gJ3dlYicuICovXG4gIEBJbnB1dCgpIHBsYXRmb3JtOiAnd2ViJyB8ICdtb2JpbGUnID0gJ3dlYic7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGlkZXMgUHJpb3JpdHksIFR5cGUsIGFuZCBUZXN0IERhdGEgU2V0IGZpZWxkcyAoc3RlcCBncm91cHMgZG9uJ3QgaGF2ZSB0aGVzZSkuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBASW5wdXQoKSBpc1N0ZXBHcm91cCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBjb25maWcgcGVyIHNlbGVjdCBrZXkuIFVzZSBmb3I6XG4gICAqIC0gQVBJLWRyaXZlbiBvcHRpb25zOiBwYXNzIG9wdGlvbnMgYXJyYXkgKHVwZGF0ZSB3aGVuIEFQSSByZXR1cm5zKVxuICAgKiAtIFNlcnZlci1zaWRlIHNlYXJjaDogc2VydmVyU2VhcmNoOiB0cnVlLCBvblNlYXJjaCBpbiBvdmVycmlkZSBvciBsaXN0ZW4gdG8gc2VsZWN0U2VhcmNoXG4gICAqIC0gSW5maW5pdGUgc2Nyb2xsOiBoYXNNb3JlOiB0cnVlLCBvbkxvYWRNb3JlIGluIG92ZXJyaWRlIG9yIGxpc3RlbiB0byBzZWxlY3RMb2FkTW9yZVxuICAgKiAtIEluaXRpYWwgZmV0Y2ggb24gb3BlbjogaW5pdGlhbEZldGNoT25PcGVuOiB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RDb25maWdPdmVycmlkZXM6IFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IHt9O1xuXG4gIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGE+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIHNlYXJjaGVzIGluIGEgc2VsZWN0IChzZXJ2ZXJTZWFyY2ggbW9kZSkuIENhbGwgQVBJIGFuZCB1cGRhdGUgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0U2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlLiBDYWxsIEFQSSwgYXBwZW5kIHRvIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdExvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlbGVjdCBwYW5lbCBpcyBvcGVuZWQuIFVzZSB0byBjYWxsIEFQSSBmb3IgaW5pdGlhbCBsb2FkIChlLmcuIHdoZW4gaW5pdGlhbEZldGNoT25PcGVuKS4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMgaW4gYW55IHNlbGVjdC4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgYWRkcyBhIG5ldyBjdXN0b20gbGFiZWwgdmlhIHRoZSBcIk5ld1wiIG9wdGlvbi4gKi9cbiAgQE91dHB1dCgpIGxhYmVsQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgLyoqIEZvcm0gc3RhdGUgKi9cbiAgZWRpdERlc2NyaXB0aW9uID0gJyc7XG4gIGVkaXRTdGF0dXMgPSAnJztcbiAgZWRpdFByaW9yaXR5ID0gJyc7XG4gIGVkaXRMYWJlbHM6IHN0cmluZ1tdID0gW107XG4gIHRlc3RDYXNlVGltZW91dCA9ICcnO1xuICB3YWl0VGltZW91dExvY2F0b3JzID0gJyc7XG4gIGF1dG9XYWl0RW5hYmxlZCA9IGZhbHNlO1xuICByZXRyeUZhaWxlZFN0ZXBzID0gJyc7XG4gIGNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgZXhlY3V0aW9uRXhwYW5kZWQgPSB0cnVlO1xuICBhaUNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPSB0cnVlO1xuICBkZXZpY2VFeHBhbmRlZCA9IHRydWU7XG4gIGtleUZsYWdzRXhwYW5kZWQgPSB0cnVlO1xuICBtb2JpbGVUZXN0aW5nRW5hYmxlZCA9IGZhbHNlO1xuICBleHRlbnNpb25Vc2VFbmFibGVkID0gZmFsc2U7XG4gIGRhdGFEcml2ZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZnJlcXVlbnRseVVzZWRMYWJlbHMgPSBGUkVRVUVOVExZX1VTRURfTEFCRUxTO1xuXG4gIC8qKiBGb3JtR3JvdXAgZm9yIGNxYS1keW5hbWljLXNlbGVjdCBiaW5kaW5ncyAqL1xuICBlZGl0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBwcmlvcml0eTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB0eXBlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGxhYmVsczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBwcmVyZXF1aXNpdGVDYXNlczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICB0ZXN0RGF0YVByb2ZpbGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdGVzdERhdGFTZXQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEJyb3dzZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdmlkZW9SZWNvcmRpbmc6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdFZpZXdwb3J0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRldmljZVR5cGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGV2aWNlT1M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZW5hYmxlQWlTbWFydG5lc3M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEFpQWN0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdXNlQWlNZXRhZGF0YTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgfSk7XG5cbiAgZ2V0IHN0YXR1c0l0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdTdGF0dXMnKTtcbiAgfVxuXG4gIGdldCBwcmlvcml0eUl0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdQcmlvcml0eScpO1xuICB9XG5cbiAgZ2V0IHR5cGVJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnVHlwZScpO1xuICB9XG5cbiAgZ2V0IHN0YXR1c09wdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ0RyYWZ0JywgJ0luIFJldmlldycsICdBcHByb3ZlZCcsICdBY3RpdmUnLCAnSW5hY3RpdmUnLCAnQmxvY2tlZCddO1xuICB9XG5cbiAgZ2V0IHByaW9yaXR5T3B0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnQ3JpdGljYWwnLCAnTWFqb3InLCAnSGlnaCcsICdNZWRpdW0nLCAnTG93JywgJ01pbm9yJywgJ05vdCBzZXQnXTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgY29uZmlncyB0byBhdm9pZCBuZXcgb2JqZWN0IHJlZnMgZWFjaCBjaGFuZ2UgZGV0ZWN0aW9uIChwcmV2ZW50cyBpbmZpbml0ZSBsb29wcykgKi9cbiAgcmVhZG9ubHkgc3RhdHVzU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnc3RhdHVzJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTdGF0dXMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdEcmFmdCcsIG5hbWU6ICdEcmFmdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdJbiBSZXZpZXcnLCBuYW1lOiAnSW4gUmV2aWV3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FwcHJvdmVkJywgbmFtZTogJ0FwcHJvdmVkJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FjdGl2ZScsIG5hbWU6ICdBY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnSW5hY3RpdmUnLCBuYW1lOiAnSW5hY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnQmxvY2tlZCcsIG5hbWU6ICdCbG9ja2VkJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgdHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1R5cGUnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcmVhZG9ubHkgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICByZWFkb25seSB0ZXN0RGF0YVNldFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3Rlc3REYXRhU2V0JyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgU2V0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFByZXJlcXVpc2l0ZUNhc2VPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDInLCBuYW1lOiAnVEMtMDAyOiBVc2VyIHJlZ2lzdHJhdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDUnLCBuYW1lOiAnVEMtMDA1OiBBUEkgaGVhbHRoIGNoZWNrJyB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHZpZGVvUmVjb3JkaW5nU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmlkZW9SZWNvcmRpbmcnLFxuICAgIGxhYmVsOiAnUmVjb3JkIHRlc3QgZXhlY3V0aW9uIHZpZGVvJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgYWlNZXRhZGF0YUNvbGxlY3Rpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd1c2VBaU1ldGFkYXRhJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIENhY2hlZCBsYWJlbHMgY29uZmlnIHRvIGF2b2lkIG5ldyBvYmplY3Qgb24gZXZlcnkgQ0QgKHByZXZlbnRzIGZyZWV6ZSkgKi9cbiAgcHJpdmF0ZSBfbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG5cbiAgLyoqIExhYmVscyBtdWx0aS1zZWxlY3Q6IG9wdGlvbnMgPSBmcmVxdWVudGx5IHVzZWQgKyBjdXJyZW50ICsgQVBJIG9wdGlvbnMgZnJvbSBzZWxlY3RDb25maWdPdmVycmlkZXMgKi9cbiAgZ2V0IGxhYmVsc1NlbGVjdENvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGlmICghdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgJiYgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGUpIHJldHVybiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzW1RFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVsc107XG4gICAgY29uc3QgYXBpT3B0aW9ucyA9IG92ZXJyaWRlPy5vcHRpb25zID8/IFtdO1xuICAgIGNvbnN0IGFsbExhYmVscyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAuLi50aGlzLmZyZXF1ZW50bHlVc2VkTGFiZWxzLFxuICAgICAgLi4udGhpcy5lZGl0TGFiZWxzLFxuICAgICAgLi4uYXBpT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLm5hbWUgPz8gby52YWx1ZSA/PyAnJykudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgXSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20oYWxsTGFiZWxzKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LCBuYW1lOiB2IH0pKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ2xhYmVscycsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBsYWJlbHMgdG8gYWRkIC4uLi4uLicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBvcHRpb25TdHlsZTogJ2NoZWNrYm94JyxcbiAgICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU7XG4gIH1cblxuICBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJlcmVxdWlzaXRlQ2FzZXMnLFxuICAgIGxhYmVsOiAnUHJlcmVxdWlzaXRlIENhc2UnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgIHNob3dTZWxlY3RBbGw6IHRydWUsXG4gICAgc2VsZWN0QWxsTGFiZWw6ICdBbGwnLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMicsIG5hbWU6ICdUQy0wMDI6IFVzZXIgcmVnaXN0cmF0aW9uJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMycsIG5hbWU6ICdUQy0wMDM6IFBhc3N3b3JkIHJlc2V0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNScsIG5hbWU6ICdUQy0wMDU6IEFQSSBoZWFsdGggY2hlY2snIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0Vmlld3BvcnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICcxMjgweDcyMCcsIG5hbWU6ICcxMjgweDcyMCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZXZpY2VUeXBlJyxcbiAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNCcsIG5hbWU6ICdpUGhvbmUgMTQnIH0sXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE1JywgbmFtZTogJ2lQaG9uZSAxNScgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTcnLCBuYW1lOiAnaVBob25lIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0lwaG9uZSAxNycsIG5hbWU6ICdJcGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnU2Ftc3VuZyBHYWxheHknLCBuYW1lOiAnU2Ftc3VuZyBHYWxheHknIH0sXG4gICAgICB7IHZhbHVlOiAnUGl4ZWwnLCBuYW1lOiAnUGl4ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZXZpY2VPU1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZU9TJyxcbiAgICBsYWJlbDogJ09TJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lwYScsIG5hbWU6ICdpT1MgKGlwYSknIH0sXG4gICAgICB7IHZhbHVlOiAnYXBrJywgbmFtZTogJ0FuZHJvaWQgKGFwayknIH0sXG4gICAgICB7IHZhbHVlOiAnaU9TIDE2JywgbmFtZTogJ2lPUyAxNicgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTcnLCBuYW1lOiAnaU9TIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTMnLCBuYW1lOiAnQW5kcm9pZCAxMycgfSxcbiAgICAgIHsgdmFsdWU6ICdBbmRyb2lkIDE0JywgbmFtZTogJ0FuZHJvaWQgMTQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRCcm93c2VyJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsXG4gICAgcGxhY2Vob2xkZXI6ICdDaHJvbWUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDaHJvbWUnLCBuYW1lOiAnQ2hyb21lJyB9LFxuICAgICAgeyB2YWx1ZTogJ0ZpcmVmb3gnLCBuYW1lOiAnRmlyZWZveCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTYWZhcmknLCBuYW1lOiAnU2FmYXJpJyB9LFxuICAgICAgeyB2YWx1ZTogJ0VkZ2UnLCBuYW1lOiAnRWRnZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHByaW9yaXR5U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJpb3JpdHknLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1ByaW9yaXR5JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQ3JpdGljYWwnLCBuYW1lOiAnQ3JpdGljYWwnIH0sXG4gICAgICB7IHZhbHVlOiAnTWFqb3InLCBuYW1lOiAnTWFqb3InIH0sXG4gICAgICB7IHZhbHVlOiAnSGlnaCcsIG5hbWU6ICdIaWdoJyB9LFxuICAgICAgeyB2YWx1ZTogJ01lZGl1bScsIG5hbWU6ICdNZWRpdW0nIH0sXG4gICAgICB7IHZhbHVlOiAnTG93JywgbmFtZTogJ0xvdycgfSxcbiAgICAgIHsgdmFsdWU6ICdNaW5vcicsIG5hbWU6ICdNaW5vcicgfSxcbiAgICAgIHsgdmFsdWU6ICdOb3Qgc2V0JywgbmFtZTogJ05vdCBzZXQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBlbmFibGVBaVNtYXJ0bmVzc1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBTbWFydG5lc3MnLFxuICAgIHBsYWNlaG9sZGVyOiAnQWR2YW5jZWQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdCYXNpYycsIG5hbWU6ICdCYXNpYycgfSxcbiAgICAgIHsgdmFsdWU6ICdBZHZhbmNlZCcsIG5hbWU6ICdBZHZhbmNlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdPZmYnLCBuYW1lOiAnT2ZmJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQUkgQWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NtYXJ0IHdhaXQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdTbWFydCB3YWl0JywgbmFtZTogJ1NtYXJ0IHdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnU21hcnQgV2FpdCcsIG5hbWU6ICdTbWFydCBXYWl0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1dhaXQgZm9yIGVsZW1lbnQnLCBuYW1lOiAnV2FpdCBmb3IgZWxlbWVudCcgfSxcbiAgICAgIHsgdmFsdWU6ICdSZXRyeScsIG5hbWU6ICdSZXRyeScgfSxcbiAgICAgIHsgdmFsdWU6ICdTa2lwJywgbmFtZTogJ1NraXAnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsXG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnbm9uZScsIG5hbWU6ICdOb25lJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWVyZ2VkIGNvbmZpZyBmb3IgYSBzZWxlY3Q6IGJhc2UgY29uZmlnICsgb3ZlcnJpZGUuXG4gICAqIFdpcmVzIG9uU2VhcmNoLCBvbkxvYWRNb3JlIHRvIGJvdGggb3ZlcnJpZGUgY2FsbGJhY2tzIGFuZCBvdXRwdXQgZXZlbnRzLlxuICAgKi9cbiAgZ2V0Q29uZmlnRm9yU2VsZWN0KGtleTogc3RyaW5nLCBiYXNlQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltrZXldO1xuICAgIGlmICghb3ZlcnJpZGUpIHJldHVybiBiYXNlQ29uZmlnO1xuXG4gICAgY29uc3QgbWVyZ2VkOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgLi4ub3ZlcnJpZGUsXG4gICAgICBvcHRpb25zOiBvdmVycmlkZS5vcHRpb25zID8/IGJhc2VDb25maWcub3B0aW9ucyxcbiAgICAgIGtleTogYmFzZUNvbmZpZy5rZXksXG4gICAgfTtcblxuICAgIGlmIChvdmVycmlkZS5zZXJ2ZXJTZWFyY2ggfHwgb3ZlcnJpZGUub25TZWFyY2gpIHtcbiAgICAgIG1lcmdlZC5vblNlYXJjaCA9IChxdWVyeSkgPT4ge1xuICAgICAgICBvdmVycmlkZS5vblNlYXJjaD8uKHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5zZWxlY3RTZWFyY2guZW1pdCh7IGtleSwgcXVlcnkgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob3ZlcnJpZGUuaGFzTW9yZSB8fCBvdmVycmlkZS5vbkxvYWRNb3JlKSB7XG4gICAgICBtZXJnZWQub25Mb2FkTW9yZSA9IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gJyc7XG4gICAgICAgIG92ZXJyaWRlLm9uTG9hZE1vcmU/LihxKTtcbiAgICAgICAgdGhpcy5zZWxlY3RMb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIG9uU2VsZWN0T3BlbmVkKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RPcGVuZWQuZW1pdCh7IGtleSB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KGV2ZW50KTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bZXZlbnQua2V5XTtcbiAgICBvdmVycmlkZT8ub25TZWFyY2g/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdExvYWRNb3JlKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vbkxvYWRNb3JlPy4oZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGV2ZW50LnZhbHVlO1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbikgOiB2YWwgIT0gbnVsbCA/IFtTdHJpbmcodmFsKV0gOiBbXTtcbiAgICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvLyBNYXJrIFRlc3QgRGF0YSBzZWxlY3RzIGFzIGRpcnR5IHNvIGxhdGVyIGlucHV0IGNoYW5nZXMgKG9wdGlvbnMvY29uZmlnKSBkb24ndCBvdmVyd3JpdGUgdXNlciBjaG9pY2VcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVByb2ZpbGUgfHwgZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVNldCkge1xuICAgICAgY29uc3QgY3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KGV2ZW50LmtleSk7XG4gICAgICBjdHJsPy5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsga2V5OiBldmVudC5rZXksIHZhbHVlOiBldmVudC52YWx1ZSB9KTtcbiAgfVxuXG4gIG9uTGFiZWxzQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXYgfHwgdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKHYpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgdl07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMubGFiZWxBZGRlZC5lbWl0KHYpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWdJdGVtVmFsdWUoc2VjdGlvblRpdGxlOiBzdHJpbmcsIGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMudGl0bGUgPT09IHNlY3Rpb25UaXRsZSB8fFxuICAgICAgICBzLnRpdGxlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlY3Rpb25UaXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbSA9IHNlY3Rpb24/Lml0ZW1zPy5maW5kKFxuICAgICAgKGkpID0+XG4gICAgICAgIGkubGFiZWwgPT09IGl0ZW1MYWJlbCB8fFxuICAgICAgICBpLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGl0ZW1MYWJlbC50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgcmV0dXJuIChpdGVtPy52YWx1ZSBhcyBzdHJpbmcpID8/ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIERldmljZSBzZWN0aW9uIC0gc3VwcG9ydHMgYm90aCAnRGV2aWNlJyBhbmQgJ0RldmljZSBTZXR0aW5nJyB0aXRsZXMgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VDb25maWdWYWx1ZShpdGVtTGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCBpdGVtTGFiZWwpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlIFNldHRpbmcnLCBpdGVtTGFiZWwpO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnICYmIFN0cmluZyh2YWwpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIFdhaXRzIHNlY3Rpb24gLSBzdXBwb3J0cyBib3RoICdXYWl0IGFuZCByZXRyaWVzJyBhbmQgJ1dhaXRzICYgUmV0cmllcycgdGl0bGVzICovXG4gIHByaXZhdGUgZ2V0V2FpdHNSZXRyaWVzVmFsdWUoaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYxID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXQgYW5kIHJldHJpZXMnLCBpdGVtTGFiZWwpO1xuICAgIGNvbnN0IHYyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsIGl0ZW1MYWJlbCk7XG4gICAgbGV0IHZhbCA9ICh2MSAhPT0gJycgJiYgdjEgIT0gbnVsbCkgPyB2MSA6IHYyO1xuXG4gICAgLy8gV2hlbiB2YWx1ZXMgYXJlIGNvbWluZyBmcm9tIG9yZ2FuaXphdGlvbiBzZXR0aW5ncywgdGhlIHBvcnRhbCB3cmFwcyB0aGVtIGFzXG4gICAgLy8gXCJPcmcgTGV2ZWwgKEFDVFVBTCBWQUxVRSlcIi4gRm9yIGVkaXQgaW5wdXRzIChSZXRyeSBGYWlsZWQgU3RlcHMsIFRlc3QgQ2FzZSBUaW1lb3V0LFxuICAgIC8vIFdhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMpLCB3ZSBvbmx5IHdhbnQgdG8gc2hvdyB0aGUgaW5uZXIgdmFsdWUsIG5vdCB0aGUgd3JhcHBlci5cbiAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJhdyA9IFN0cmluZyh2YWwpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGxvd2VyID0gcmF3LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBwcmVmaXggPSAnb3JnIGxldmVsICgnO1xuICAgICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBvcGVuSWR4ID0gcmF3LmluZGV4T2YoJygnKTtcbiAgICAgICAgY29uc3QgY2xvc2VJZHggPSByYXcubGFzdEluZGV4T2YoJyknKTtcbiAgICAgICAgaWYgKG9wZW5JZHggPj0gMCAmJiBjbG9zZUlkeCA+IG9wZW5JZHgpIHtcbiAgICAgICAgICB2YWwgPSByYXcuc3Vic3RyaW5nKG9wZW5JZHggKyAxLCBjbG9zZUlkeCkudHJpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IHJhdy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgJiYgU3RyaW5nKHZhbCkudHJpbSgpICE9PSAnJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdQcmVyZXF1aXNpdGUgQ2FzZScpO1xuICAgIGlmICghdmFsKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHZhbC5pbmNsdWRlcygnLCcpID8gdmFsLnNwbGl0KCcsJykubWFwKChzKSA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW3ZhbF07XG4gIH1cblxuICAvKiogRWRpdCBtb2RlIHNob3VsZCBzaG93IHBsYWNlaG9sZGVyIHdoZW4gZGF0YXNldCBpcyBub3Qgc2VsZWN0ZWQuICovXG4gIHByaXZhdGUgbm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnbm90IHNldCcgPyAnJyA6IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGhhc1ByZXJlcXVpc2l0ZUNhc2VDb25maWcoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IFsuLi50aGlzLmNvbmZpZ1NlY3Rpb25zLCAuLi50aGlzLmNvbmZpZ1NlY3Rpb25zUm93Ml0uZmluZChcbiAgICAgIChzKSA9PiBzLnRpdGxlID09PSAnRXhlY3V0aW9uJ1xuICAgICk7XG4gICAgcmV0dXJuICEhc2VjdGlvbj8uaXRlbXM/LnNvbWUoKGkpID0+IGkubGFiZWwgPT09ICdQcmVyZXF1aXNpdGUgQ2FzZScpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uQ29udGVudDtcbiAgICB0aGlzLmVkaXRTdGF0dXMgPSB0aGlzLnN0YXR1c0l0ZW0/LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuZWRpdFByaW9yaXR5ID0gdGhpcy5wcmlvcml0eUl0ZW0/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHR5cGVSYXcgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFJhdyA9IHRoaXMubm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZShcbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFNldCcpID8/ICcnXG4gICAgKTtcbiAgICBjb25zdCB0eXBlVmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0eXBlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0eXBlJ10/Lm9wdGlvbnMpID8/IHR5cGVSYXc7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlVmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVByb2ZpbGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhUHJvZmlsZSddPy5vcHRpb25zKSA/PyB0ZXN0RGF0YVByb2ZpbGVSYXc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhU2V0UmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVNldCddPy5vcHRpb25zKSA/PyB0ZXN0RGF0YVNldFJhdztcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5sYWJlbHNdO1xuICAgIGNvbnN0IGF1dG9XYWl0VmFsID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnRW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHMnKSB8fCB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgJ0F1dG8gV2FpdCcpO1xuICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICB0aGlzLnJldHJ5RmFpbGVkU3RlcHMgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdSZXRyeSBGYWlsZWQgU3RlcHMnKTtcbiAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpO1xuICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJyk7XG4gICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgIHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdFeHRlbnNpb24gVXNlJyk7XG4gICAgdGhpcy5kYXRhRHJpdmVuRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdEYXRhIERyaXZlbicpO1xuICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgIGNvbnN0IGRlZmF1bHRBaUFjdGlvbiA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyk7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyk7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YSA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHVzZUFpTWV0YWRhdGFSYXcpO1xuICAgIGNvbnN0IHByZXJlcXVpc2l0ZUNhc2VzID0gdGhpcy5nZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTtcbiAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9XG4gICAgICB0aGlzLnBsYXRmb3JtID09PSAnd2ViJ1xuICAgICAgICA/IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgQnJvd3NlcicpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJylcbiAgICAgICAgOiB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdWaWRlbyBSZWNvcmRpbmcnKTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgVmlld3BvcnQnKSB8fCB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdWaWV3cG9ydCcpIHx8ICcnO1xuICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ1R5cGUnKTtcbiAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnT1MnKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHN0YXR1czogdGhpcy5lZGl0U3RhdHVzLFxuICAgICAgcHJpb3JpdHk6IHRoaXMuZWRpdFByaW9yaXR5LFxuICAgICAgdHlwZTogdHlwZVZhbCB8fCAnJyxcbiAgICAgIGxhYmVsczogdGhpcy5lZGl0TGFiZWxzLFxuICAgICAgdGVzdERhdGFQcm9maWxlOiB0ZXN0RGF0YVByb2ZpbGVWYWwgfHwgJycsXG4gICAgICB0ZXN0RGF0YVNldDogdGVzdERhdGFTZXRWYWwgPz8gJycsXG4gICAgICBwcmVyZXF1aXNpdGVDYXNlcyxcbiAgICAgIGRlZmF1bHRCcm93c2VyOiBkZWZhdWx0QnJvd3NlciB8fCAnQ2hyb21lJyxcbiAgICAgIHZpZGVvUmVjb3JkaW5nOiB2aWRlb1JlY29yZGluZyB8fCAnJyxcbiAgICAgIGRlZmF1bHRWaWV3cG9ydDogZGVmYXVsdFZpZXdwb3J0IHx8ICcnLFxuICAgICAgZGV2aWNlVHlwZTogZGV2aWNlVHlwZSB8fCAnJyxcbiAgICAgIGRldmljZU9TOiBkZXZpY2VPUyB8fCAnJyxcbiAgICAgIGVuYWJsZUFpU21hcnRuZXNzOiBlbmFibGVBaVNtYXJ0bmVzcyB8fCAnQWR2YW5jZWQnLFxuICAgICAgZGVmYXVsdEFpQWN0aW9uOiBkZWZhdWx0QWlBY3Rpb24gfHwgJ1NtYXJ0IHdhaXQnLFxuICAgICAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZToga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSB8fCAnbm9uZScsXG4gICAgICB1c2VBaU1ldGFkYXRhOiB1c2VBaU1ldGFkYXRhIHx8ICcnLFxuICAgIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlVG9PcHRpb25WYWx1ZShcbiAgICBjb25maWdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdIHwgdW5kZWZpbmVkXG4gICk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbmZpZ1ZhbHVlID09IG51bGwgfHwgY29uZmlnVmFsdWUgPT09ICcnKSByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgPz8gW107XG4gICAgaWYgKCFvcHRzLmxlbmd0aCkgcmV0dXJuIGNvbmZpZ1ZhbHVlO1xuICAgIGNvbnN0IG51bSA9IHR5cGVvZiBjb25maWdWYWx1ZSA9PT0gJ251bWJlcicgPyBjb25maWdWYWx1ZSA6IE51bWJlcihjb25maWdWYWx1ZSk7XG4gICAgY29uc3QgaXNOdW1lcmljID0gIU51bWJlci5pc05hTihudW0pICYmIFN0cmluZyhjb25maWdWYWx1ZSkudHJpbSgpID09PSBTdHJpbmcobnVtKTtcbiAgICBpZiAoaXNOdW1lcmljKSB7XG4gICAgICAvLyBJZiBvcHRpb25zIHVzZSBudW1lcmljIHZhbHVlcyAoZS5nLiBpbmRpY2VzIGZvciBUZXN0IERhdGEgU2V0KSxcbiAgICAgIC8vIHJldHVybiB0aGUgbnVtZXJpYyBmb3JtIHNvIHRoZSBzZWxlY3QgY2FuIG1hdGNoIGJ5IHN0cmljdCBlcXVhbGl0eS5cbiAgICAgIGNvbnN0IGhhc051bWVyaWNPcHRpb24gPSBvcHRzLnNvbWUoXG4gICAgICAgIChvKSA9PiB0eXBlb2Ygby52YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIChvIGFzIGFueSkuaWQgPT09ICdudW1iZXInXG4gICAgICApO1xuICAgICAgcmV0dXJuIGhhc051bWVyaWNPcHRpb24gPyBudW0gOiBjb25maWdWYWx1ZTtcbiAgICB9XG4gICAgY29uc3Qgc3RyID0gU3RyaW5nKGNvbmZpZ1ZhbHVlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtYXRjaCA9IG9wdHMuZmluZCgobykgPT4ge1xuICAgICAgY29uc3QgbiA9IFN0cmluZyhvLm5hbWUgPz8gby5sYWJlbCA/PyBvLnZhbHVlID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBuID09PSBzdHI7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoICE9IG51bGwgPyAobWF0Y2gudmFsdWUgPz8gKG1hdGNoIGFzIGFueSkuaWQgPz8gbWF0Y2gpIDogY29uZmlnVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh2YWw6IHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSAndHJ1ZScpIHJldHVybiAndHJ1ZSc7XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UgfHwgdmFsID09PSAnZmFsc2UnKSByZXR1cm4gJ2ZhbHNlJztcbiAgICBpZiAoXG4gICAgICB2YWwgPT09ICdPcmcgbGV2ZWwnIHx8XG4gICAgICB2YWwgPT09ICdPcmcgTGV2ZWwnIHx8XG4gICAgICAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ29yZyBsZXZlbCAoJykpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ09yZyBsZXZlbCc7XG4gICAgfVxuICAgIGlmICh2YWwgPT09ICdPbiBXYWl0JyB8fCB2YWwgPT09ICdvbiB3YWl0JykgcmV0dXJuICd0cnVlJztcbiAgICByZXR1cm4gdmFsICYmIFN0cmluZyh2YWwpLnRyaW0oKSA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snc2VsZWN0Q29uZmlnT3ZlcnJpZGVzJ10pIHtcbiAgICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RDb25maWdPdmVycmlkZXMnXSAmJiB0aGlzLmVkaXRGb3JtPy5nZXQoJ3R5cGUnKSkge1xuICAgICAgICBjb25zdCB0eXBlQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk7XG4gICAgICAgIGNvbnN0IHRkcEN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk7XG4gICAgICAgIGNvbnN0IHRkc0N0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFTZXQnKTtcbiAgICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xuICAgICAgICBpZiAodHlwZUN0cmwgJiYgIXR5cGVDdHJsLmRpcnR5KSB7XG4gICAgICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICAgICAgcGF0Y2hbJ3R5cGUnXSA9ICh0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdykgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0LCBhbGxvdyBvbmUtdGltZSByZS1yZXNvbHZlIGZyb20gY29uZmlnIHdoZW4gb3B0aW9ucyBhcnJpdmUsXG4gICAgICAgIC8vIGJ1dCBuZXZlciBvdmVyd3JpdGUgYSB1c2VyLWVkaXRlZCAoZGlydHkpIHZhbHVlLlxuICAgICAgICBpZiAodGRwQ3RybCAmJiAhdGRwQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsndGVzdERhdGFQcm9maWxlJ10gPVxuICAgICAgICAgICAgKHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz9cbiAgICAgICAgICAgICAgdGVzdERhdGFQcm9maWxlUmF3KSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGRzQ3RybCAmJiAhdGRzQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoWyd0ZXN0RGF0YVNldCddID1cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/XG4gICAgICAgICAgICB0ZXN0RGF0YVNldFJhdyA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZShwYXRjaCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkZXNjcmlwdGlvbkNvbnRlbnQnXSB8fCBjaGFuZ2VzWydsYWJlbHMnXSB8fCBjaGFuZ2VzWydtZXRhZGF0YUl0ZW1zJ10pIHtcbiAgICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQ7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5sYWJlbHNdO1xuICAgICAgdGhpcy5lZGl0U3RhdHVzID0gdGhpcy5zdGF0dXNJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIHRoaXMuZWRpdFByaW9yaXR5ID0gdGhpcy5wcmlvcml0eUl0ZW0/LnZhbHVlID8/ICcnO1xuICAgICAgY29uc3QgdHlwZVZhbCA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICBjb25zdCBzdGF0dXNDb250cm9sID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXR1cycpO1xuICAgICAgY29uc3QgcHJpb3JpdHlDb250cm9sID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ByaW9yaXR5Jyk7XG4gICAgICBjb25zdCB0eXBlQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk7XG4gICAgICBjb25zdCBsYWJlbHNDb250cm9sID0gdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKTtcbiAgICAgIGNvbnN0IHByZXNlcnZlU3RhdHVzID0gc3RhdHVzQ29udHJvbD8udG91Y2hlZCB8fCBzdGF0dXNDb250cm9sPy5kaXJ0eTtcbiAgICAgIGNvbnN0IHByZXNlcnZlUHJpb3JpdHkgPSBwcmlvcml0eUNvbnRyb2w/LnRvdWNoZWQgfHwgcHJpb3JpdHlDb250cm9sPy5kaXJ0eTtcbiAgICAgIGNvbnN0IHByZXNlcnZlVHlwZSA9IHR5cGVDb250cm9sPy50b3VjaGVkIHx8IHR5cGVDb250cm9sPy5kaXJ0eTtcbiAgICAgIGNvbnN0IHByZXNlcnZlTGFiZWxzID0gbGFiZWxzQ29udHJvbD8udG91Y2hlZCB8fCBsYWJlbHNDb250cm9sPy5kaXJ0eTtcbiAgICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIC4uLihwcmVzZXJ2ZVN0YXR1cyA/IHt9IDogeyBzdGF0dXM6IHRoaXMuZWRpdFN0YXR1cyB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlUHJpb3JpdHkgPyB7fSA6IHsgcHJpb3JpdHk6IHRoaXMuZWRpdFByaW9yaXR5IH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVUeXBlID8ge30gOiB7IHR5cGU6IHR5cGVWYWwgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZUxhYmVscyA/IHt9IDogeyBsYWJlbHM6IHRoaXMuZWRpdExhYmVscyB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sncHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnMnXSAmJiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLnByZXJlcXVpc2l0ZUNhc2VTZWxlY3RDb25maWcsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMucHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnMsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29uZmlnU2VjdGlvbnMnXSB8fCBjaGFuZ2VzWydjb25maWdTZWN0aW9uc1JvdzInXSkge1xuICAgICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgU21hcnRuZXNzJyk7XG4gICAgICBjb25zdCBkZWZhdWx0QWlBY3Rpb24gPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdEZWZhdWx0IEFJIEFjdGlvbicpO1xuICAgICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyk7XG4gICAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IHRoaXMuZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk7XG4gICAgICBjb25zdCB0eXBlUmF3ID0gKHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVHlwZScpIHx8ICh0aGlzLnR5cGVJdGVtPy52YWx1ZSBhcyBzdHJpbmcpKSA/PyAnJztcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBTZXQnKSA/PyAnJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdztcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFQcm9maWxlUmF3O1xuICAgICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhU2V0UmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVNldCddPy5vcHRpb25zKSA/PyB0ZXN0RGF0YVNldFJhdztcbiAgICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKTtcbiAgICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdWaWRlbyBSZWNvcmRpbmcnKTtcbiAgICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodmlkZW9SZWNvcmRpbmdSYXcgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKTtcbiAgICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnRGVmYXVsdCBWaWV3cG9ydCcpIHx8IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ1ZpZXdwb3J0JykgfHwgJyc7XG4gICAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdUeXBlJyk7XG4gICAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnT1MnKTtcbiAgICAgIGNvbnN0IGF1dG9XYWl0VmFsID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnRW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHMnKSB8fCB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgJ0F1dG8gV2FpdCcpO1xuICAgICAgdGhpcy5hdXRvV2FpdEVuYWJsZWQgPSAhIShhdXRvV2FpdFZhbCAmJiBhdXRvV2FpdFZhbC50cmltKCkgIT09ICcnICYmIFN0cmluZyhhdXRvV2FpdFZhbCkgIT09ICdmYWxzZScpO1xuICAgICAgdGhpcy5yZXRyeUZhaWxlZFN0ZXBzID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnUmV0cnkgRmFpbGVkIFN0ZXBzJyk7XG4gICAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpO1xuICAgICAgdGhpcy53YWl0VGltZW91dExvY2F0b3JzID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyAoc2VjcyknKTtcbiAgICAgIHRoaXMubW9iaWxlVGVzdGluZ0VuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnTW9iaWxlIFRlc3RpbmcnKTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdFeHRlbnNpb24gVXNlJyk7XG4gICAgICB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0RhdGEgRHJpdmVuJyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIGNvbnN0IHBhdGNoOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgaWYgKGVuYWJsZUFpU21hcnRuZXNzKSBwYXRjaFsnZW5hYmxlQWlTbWFydG5lc3MnXSA9IGVuYWJsZUFpU21hcnRuZXNzO1xuICAgICAgaWYgKGRlZmF1bHRBaUFjdGlvbikgcGF0Y2hbJ2RlZmF1bHRBaUFjdGlvbiddID0gZGVmYXVsdEFpQWN0aW9uO1xuICAgICAgaWYgKGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UpIHBhdGNoWydrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJ10gPSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlO1xuICAgICAgaWYgKHVzZUFpTWV0YWRhdGEpIHBhdGNoWyd1c2VBaU1ldGFkYXRhJ10gPSB1c2VBaU1ldGFkYXRhO1xuICAgICAgaWYgKHByZXJlcXVpc2l0ZUNhc2VzLmxlbmd0aCkgcGF0Y2hbJ3ByZXJlcXVpc2l0ZUNhc2VzJ10gPSBwcmVyZXF1aXNpdGVDYXNlcztcbiAgICAgIGlmICh0eXBlVmFsKSBwYXRjaFsndHlwZSddID0gdHlwZVZhbDtcblxuICAgICAgLy8gUmUtc3luYyBUZXN0IERhdGEgUHJvZmlsZSAvIFNldCBmcm9tIGNvbmZpZyBvbmx5IHdoZW4gY29udHJvbHMgYXJlIE5PVCBkaXJ0eVxuICAgICAgY29uc3QgdGRwQ3RybDIgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk7XG4gICAgICBjb25zdCB0ZHNDdHJsMiA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpO1xuICAgICAgY29uc3QgcHJlc2VydmVUZHAyID0gdGRwQ3RybDI/LmRpcnR5O1xuICAgICAgY29uc3QgcHJlc2VydmVUZHMyID0gdGRzQ3RybDI/LmRpcnR5O1xuXG4gICAgICBpZiAodGVzdERhdGFQcm9maWxlVmFsICYmICFwcmVzZXJ2ZVRkcDIpIHBhdGNoWyd0ZXN0RGF0YVByb2ZpbGUnXSA9IHRlc3REYXRhUHJvZmlsZVZhbDtcbiAgICAgIGlmICh0ZXN0RGF0YVNldFZhbCAhPSBudWxsICYmIHRlc3REYXRhU2V0VmFsICE9PSAnJyAmJiAhcHJlc2VydmVUZHMyKSBwYXRjaFsndGVzdERhdGFTZXQnXSA9IHRlc3REYXRhU2V0VmFsO1xuICAgICAgaWYgKGRlZmF1bHRCcm93c2VyKSBwYXRjaFsnZGVmYXVsdEJyb3dzZXInXSA9IGRlZmF1bHRCcm93c2VyO1xuICAgICAgaWYgKHZpZGVvUmVjb3JkaW5nKSBwYXRjaFsndmlkZW9SZWNvcmRpbmcnXSA9IHZpZGVvUmVjb3JkaW5nO1xuICAgICAgaWYgKGRlZmF1bHRWaWV3cG9ydCkgcGF0Y2hbJ2RlZmF1bHRWaWV3cG9ydCddID0gZGVmYXVsdFZpZXdwb3J0O1xuICAgICAgaWYgKGRldmljZVR5cGUpIHBhdGNoWydkZXZpY2VUeXBlJ10gPSBkZXZpY2VUeXBlO1xuICAgICAgaWYgKGRldmljZU9TKSBwYXRjaFsnZGV2aWNlT1MnXSA9IGRldmljZU9TO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZShwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gdGhpcy5lZGl0TGFiZWxzLmZpbHRlcigobCkgPT4gbCAhPT0gbGFiZWwpO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2xlYXJBbGxMYWJlbHMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gW107XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkFkZEZyZXF1ZW50TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKGxhYmVsKSkge1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgbGFiZWxdO1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUodGhpcy5lZGl0TGFiZWxzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXR1cycpPy52YWx1ZSA/PyB0aGlzLmVkaXRTdGF0dXM7XG4gICAgY29uc3QgcHJpb3JpdHkgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJpb3JpdHknKT8udmFsdWUgPz8gdGhpcy5lZGl0UHJpb3JpdHk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFTZXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnMoKTtcbiAgICBjb25zdCBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk7XG4gICAgdGhpcy5zYXZlLmVtaXQoe1xuICAgICAgZGVzY3JpcHRpb25Db250ZW50OiB0aGlzLmVkaXREZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1cyxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgdHlwZTogdHlwZVZhbCxcbiAgICAgIGxhYmVsczogdGhpcy5lZGl0TGFiZWxzLFxuICAgICAgdGVzdERhdGFQcm9maWxlSWQ6IHRlc3REYXRhUHJvZmlsZVZhbCB8fCBudWxsLFxuICAgICAgdGVzdERhdGFTZXRJbmRleDogdGVzdERhdGFTZXRWYWwgPz8gbnVsbCxcbiAgICAgIGNvbmZpZ1NlY3Rpb25zOiBjb25maWdTZWN0aW9uc01lcmdlZCxcbiAgICAgIGNvbmZpZ1NlY3Rpb25zUm93MjogY29uZmlnU2VjdGlvbnNSb3cyTWVyZ2VkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndmlkZW9SZWNvcmRpbmcnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB2aWRlb1JlY29yZGluZ1ZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogdmlkZW9SZWNvcmRpbmdWYWx1ZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdmlkZW9SZWNvcmRpbmdWYWx1ZTtcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndXNlQWlNZXRhZGF0YScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdXNlQWlNZXRhZGF0YVZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogdXNlQWlNZXRhZGF0YVZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB1c2VBaU1ldGFkYXRhVmFsdWU7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXNSYXcgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJlcmVxdWlzaXRlQ2FzZXMnKT8udmFsdWU7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSBBcnJheS5pc0FycmF5KHByZXJlcXVpc2l0ZUNhc2VzUmF3KVxuICAgICAgPyBwcmVyZXF1aXNpdGVDYXNlc1Jhdy5tYXAoKHYpID0+IFN0cmluZyh2KSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICA6IHByZXJlcXVpc2l0ZUNhc2VzUmF3ICE9IG51bGwgJiYgcHJlcmVxdWlzaXRlQ2FzZXNSYXcgIT09ICcnXG4gICAgICAgID8gW1N0cmluZyhwcmVyZXF1aXNpdGVDYXNlc1JhdyldXG4gICAgICAgIDogW107XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZVZhbHVlID0gcHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoID8gcHJlcmVxdWlzaXRlQ2FzZXMuam9pbignLCcpIDogbnVsbDtcbiAgICBjb25zdCB0eXBlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpPy52YWx1ZSA/PyAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWdTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRXhlY3V0aW9uJykge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHNlY3Rpb24uaXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAhKHBsYXRmb3JtID09PSAnd2ViJyAmJiBpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBCcm93c2VyJykpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdWaWRlbyBSZWNvcmRpbmcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdmlkZW9SZWNvcmRpbmcgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogcHJlcmVxdWlzaXRlQ2FzZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1R5cGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdHlwZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1Rlc3QgRGF0YSBQcm9maWxlJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRlc3REYXRhUHJvZmlsZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1Rlc3QgRGF0YSBTZXQnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFTZXRWYWx1ZSB9O1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0FJIENvbmZpZ3VyYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyA/IHsgLi4uaXRlbSwgdmFsdWU6IHVzZUFpTWV0YWRhdGEgfSA6IGl0ZW1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10ge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcbiAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QnJvd3NlcicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdFZpZXdwb3J0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGV2aWNlVHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VPUycpPy52YWx1ZSA/PyAnJztcblxuICAgIGxldCByZXN1bHQgPSB0aGlzLmNvbmZpZ1NlY3Rpb25zUm93Mi5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnV2FpdHMgJiBSZXRyaWVzJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnV2FpdCBhbmQgcmV0cmllcycpIHtcbiAgICAgICAgY29uc3QgYXV0b1dhaXRWYWx1ZSA9IHRoaXMuYXV0b1dhaXRFbmFibGVkID8gJ0VuYWJsZWQnIDogJyc7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0F1dG8gV2FpdCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiBhdXRvV2FpdFZhbHVlIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0aGlzLmF1dG9XYWl0RW5hYmxlZCB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUmV0cnkgRmFpbGVkIFN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMucmV0cnlGYWlsZWRTdGVwcyB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMudGVzdENhc2VUaW1lb3V0IH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0aGlzLndhaXRUaW1lb3V0TG9jYXRvcnMgfTtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0RldmljZScgfHwgc2VjdGlvbi50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJykge1xuICAgICAgICBjb25zdCBpdGVtczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICAgICAgICAuLi4ocGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJywgdmFsdWU6IGRlZmF1bHRCcm93c2VyIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmlld3BvcnQnLCB2YWx1ZTogZGVmYXVsdFZpZXdwb3J0IH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdUeXBlJywgdmFsdWU6IGRldmljZVR5cGUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnT1MnLCB2YWx1ZTogZGV2aWNlT1MgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdEZXZpY2UnIHx8IHMudGl0bGUgPT09ICdEZXZpY2UgU2V0dGluZycpO1xuICAgIGlmICghZXhpc3RpbmdEZXZpY2UpIHtcbiAgICAgIGNvbnN0IGRldmljZVNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24gPSB7XG4gICAgICAgIHRpdGxlOiAnRGV2aWNlJyxcbiAgICAgICAgaWNvbjogJ2RldmljZXMnLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBkZXZpY2VTZWN0aW9uXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlGbGFnc1NlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24gPSB7XG4gICAgICB0aXRsZTogJ0tleSBGbGFncycsXG4gICAgICBpY29uOiAnZmxhZycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7IGxhYmVsOiAnTW9iaWxlIFRlc3RpbmcnLCB2YWx1ZTogdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFeHRlbnNpb24gVXNlJywgdmFsdWU6IHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEYXRhIERyaXZlbicsIHZhbHVlOiB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBjb25zdCBleGlzdGluZ0tleUZsYWdzID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdLZXkgRmxhZ3MnKTtcbiAgICBpZiAoZXhpc3RpbmdLZXlGbGFncykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocykgPT5cbiAgICAgICAgcy50aXRsZSA9PT0gJ0tleSBGbGFncycgPyBrZXlGbGFnc1NlY3Rpb24gOiBzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBrZXlGbGFnc1NlY3Rpb25dO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgdHJhY2tCeUxhYmVsKF9pOiBudW1iZXIsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGxhYmVscyB1c2UgY29uc2lzdGVudCBpbmRpZ28gc3R5bGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9DSElQX1NUWUxFID0ge1xuICAgIGJnOiAnIzYzNjZGMScsXG4gICAgYm9yZGVyOiAnIzYzNjZGMScsXG4gICAgdGV4dDogJyNGRkZGRkYnLFxuICAgIGljb246ICcjRkZGRkZGJyxcbiAgfTtcblxuICBnZXRDdXJyZW50TGFiZWxDaGlwU3R5bGUoX2xhYmVsOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLkxBQkVMX0NISVBfU1RZTEU7XG4gICAgcmV0dXJuIHtcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3JzLmJnLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IGNvbG9ycy5ib3JkZXIsXG4gICAgICAnYm9yZGVyLXdpZHRoJzogJzFweCcsXG4gICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgIGNvbG9yOiBjb2xvcnMudGV4dCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TGFiZWxDbG9zZUljb25Db2xvcihfbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuTEFCRUxfQ0hJUF9TVFlMRS5pY29uO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtcHktNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1yb3VuZGVkLWxnXCI+XG4gIDwhLS0gRGVzY3JpcHRpb24gKEZpZ21hOiBkb2N1bWVudCBpY29uLCB0ZXh0YXJlYSB3aXRoIGxpZ2h0IHB1cnBsZSBiZykgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGRlc2NyaXB0aW9uVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgIFt2YWx1ZV09XCJlZGl0RGVzY3JpcHRpb25cIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImVkaXREZXNjcmlwdGlvbiA9ICRldmVudFwiXG4gICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgW3Jvd3NdPVwiNFwiXG4gICAgICBbZW5hYmxlTWFya2Rvd25dPVwiZW5hYmxlTWFya2Rvd25cIlxuICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBkZXNjcmlwdGlvbi4uLlwiXG4gICAgICB0ZXh0YXJlYUlubGluZVN0eWxlPVwicGFkZGluZzogMTJweDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMTAwJVwiXG4gICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RhdHVzLCBQcmlvcml0eSAmIFR5cGUgKEZpZ21hOiBzaWRlLWJ5LXNpZGUgZHJvcGRvd25zLCBjcWEtZHluYW1pYy1zZWxlY3QpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtNFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+U3RhdHVzPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3N0YXR1cycsIHN0YXR1c1NlbGVjdENvbmZpZylcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdzdGF0dXMnKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+UHJpb3JpdHk8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJpb3JpdHknLCBwcmlvcml0eVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdwcmlvcml0eScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5UeXBlPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3R5cGUnLCB0eXBlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3R5cGUnKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMYWJlbHMgKEZpZ21hOiBDdXJyZW50IExhYmVscyB3aXRoIENsZWFyIEFsbCwgY3FhLWJhZGdlIHdpdGggeCwgRnJlcXVlbnRseSB1c2VkLCBTZWFyY2gpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtWzE1cHhdIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPkN1cnJlbnQgTGFiZWxzICh7eyBlZGl0TGFiZWxzLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImVkaXRMYWJlbHMubGVuZ3RoID4gMFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyNEQzI2MjZdIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWZvbnQtbm9ybWFsXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xlYXJBbGxMYWJlbHMoKVwiPlxuICAgICAgICBDbGVhciBBbGxcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtMlwiICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBlZGl0TGFiZWxzOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIlxuICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC0yLjUgY3FhLXB5LTEgY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRDdXJyZW50TGFiZWxDaGlwU3R5bGUobGFiZWwpXCI+XG4gICAgICAgIDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy0zLjUgY3FhLWgtMy41IGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldExhYmVsQ2xvc2VJY29uQ29sb3IobGFiZWwpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmVMYWJlbChsYWJlbClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSAnICsgbGFiZWxcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLXctMy41IGNxYS1oLTMuNVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+RnJlcXVlbnRseSB1c2VkPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgZnJlcXVlbnRseVVzZWRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJvbkFkZEZyZXF1ZW50TGFiZWwobGFiZWwpXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9XCIjRThFOUZGXCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cIiMzRjQzRUVcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRThFOUZGXCI+XG4gICAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPkFkZCBsYWJlbHM8L2xhYmVsPlxuICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgIFtjb25maWddPVwibGFiZWxzU2VsZWN0Q29uZmlnXCJcbiAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2xhYmVscycpXCJcbiAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoYWRkQ3VzdG9tVmFsdWUpPVwib25MYWJlbHNBZGRDdXN0b21WYWx1ZSgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICA8L2Rpdj5cblxuICA8IS0tIENvbmZpZ3VyYXRpb24gKEZpZ21hOiBjb2xsYXBzaWJsZSwgZ2VhciBpY29uLCBsaWdodCBwdXJwbGUgaW5wdXRzKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsxMnB4XVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdGV4dC1sZWZ0IGNxYS13LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+c2V0dGluZ3M8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNXB4XVwiPnt7IGNvbmZpZ1RpdGxlIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImNvbmZpZ0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTZweF0gY3FhLXB5LTAgY3FhLXB4LTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC01IGNxYS1weC0zIGNxYS10ZXh0LXhzXCI+XG4gICAgICAgIDwhLS0gRXhlY3V0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0aW9uRXhwYW5kZWQgPSAhZXhlY3V0aW9uRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+cGxheV9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4ZWN1dGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBleGVjdXRpb25FeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleGVjdXRpb25FeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaGFzUHJlcmVxdWlzaXRlQ2FzZUNvbmZpZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj4gXG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJlcmVxdWlzaXRlQ2FzZXMnLCBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByZXJlcXVpc2l0ZUNhc2VzJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5UZXN0IERhdGEgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndGVzdERhdGFQcm9maWxlJywgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3Rlc3REYXRhUHJvZmlsZScpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2ODczODldIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBTZXQ8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3Rlc3REYXRhU2V0JywgdGVzdERhdGFTZXRTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFTZXQnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtXCI+VmlkZW8gUmVjb3JkaW5nPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCd2aWRlb1JlY29yZGluZycsIHZpZGVvUmVjb3JkaW5nU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ZpZGVvUmVjb3JkaW5nJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEFJIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLXB5LTAgY3FhLW1pbi13LTAgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWlDb25maWdFeHBhbmRlZCA9ICFhaUNvbmZpZ0V4cGFuZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNtYXJ0X3RveTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkFJIENvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sgYWlDb25maWdFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhaUNvbmZpZ0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1weS0wIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2VuYWJsZUFpU21hcnRuZXNzJywgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZW5hYmxlQWlTbWFydG5lc3MnKVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdkZWZhdWx0QWlBY3Rpb24nLCBkZWZhdWx0QWlBY3Rpb25TZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZGVmYXVsdEFpQWN0aW9uJylcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3VzZUFpTWV0YWRhdGEnLCBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd1c2VBaU1ldGFkYXRhJylcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBXYWl0cyAmIFJldHJpZXMtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ3YWl0c1JldHJpZXNFeHBhbmRlZCA9ICF3YWl0c1JldHJpZXNFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj50aW1lcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPldhaXQgYW5kIFJldHJpZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2FpdHNSZXRyaWVzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImF1dG9XYWl0RW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImF1dG9XYWl0RW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiUmV0cnkgRmFpbGVkIFN0ZXBzXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicmV0cnlGYWlsZWRTdGVwc1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInJldHJ5RmFpbGVkU3RlcHMgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlRlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlc3RDYXNlVGltZW91dFwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlc3RDYXNlVGltZW91dCA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIzMFwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBsYWJlbD1cIldhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwid2FpdFRpbWVvdXRMb2NhdG9yc1wiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIndhaXRUaW1lb3V0TG9jYXRvcnMgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInBsYXRmb3JtICE9PSAnbW9iaWxlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRldmljZUV4cGFuZGVkID0gIWRldmljZUV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRldmljZXM8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5EZXZpY2UgU2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sgZGV2aWNlRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV2aWNlRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPCEtLSBXZWIgb25seTogbW9iaWxlIERldmljZSBTZXR0aW5ncyBoaWRkZW4gdGVtcG9yYXJpbHkgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdkZWZhdWx0QnJvd3NlcicsIGRlZmF1bHRCcm93c2VyU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRCcm93c2VyJylcIlxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2RlZmF1bHRWaWV3cG9ydCcsIGRlZmF1bHRWaWV3cG9ydFNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0Vmlld3BvcnQnKVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBLZXkgRmxhZ3MgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwia2V5RmxhZ3NFeHBhbmRlZCA9ICFrZXlGbGFnc0V4cGFuZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmZsYWc8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5LZXkgRmxhZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sga2V5RmxhZ3NFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJrZXlGbGFnc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwibW9iaWxlVGVzdGluZ0VuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJtb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIk1vYmlsZSBUZXN0aW5nXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+TW9iaWxlIFRlc3Rpbmc8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJleHRlbnNpb25Vc2VFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkV4dGVuc2lvbiBVc2VcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5FeHRlbnNpb24gVXNlPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiZGF0YURyaXZlbkVuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJkYXRhRHJpdmVuRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkRhdGEgRHJpdmVuXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RGF0YSBEcml2ZW48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtcHQtMiBjcWEtdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFpc1NhdmluZ1wiXG4gICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uU2F2ZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNTYXZpbmdcIiBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgIGxhYmVsPVwiU2F2aW5n4oCmXCJcbiAgICAgICAgICBpY29uPVwiYXV0b3JlbmV3XCJcbiAgICAgICAgICBbaXNMb2FkaW5nXT1cInRydWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgdmFyaWFudD1cImluZm9cIlxuICAgICAgICAgIHNpemU9XCJtZWRpdW1cIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
929
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBaUN4RCxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBY1gsTUFBTSxzQkFBc0IsR0FB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c0JBQWhCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFTRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbixcbiAgVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtLFxufSBmcm9tICcuLi90ZXN0LWNhc2UtZGV0YWlscy5tb2RlbHMnO1xuaW1wb3J0IHtcbiAgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLFxuICBTZWxlY3RPcHRpb24sXG59IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5cbi8qKiBPdmVycmlkZSBjb25maWcgZm9yIGEgc3BlY2lmaWMgc2VsZWN0LiBVc2UgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCwgbG9hZCBtb3JlLCBjdXN0b20gb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0Q29uZmlnT3ZlcnJpZGUge1xuICAvKiogUmVwbGFjZSBvcHRpb25zIChlLmcuIGZyb20gQVBJKS4gVXBkYXRlIHdoZW4gQVBJIHJldHVybnMuICovXG4gIG9wdGlvbnM/OiBTZWxlY3RPcHRpb25bXTtcbiAgLyoqIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2g7IGNvbXBvbmVudCBlbWl0cyBzZWxlY3RTZWFyY2ggaW5zdGVhZCBvZiBsb2NhbCBmaWx0ZXJpbmcuICovXG4gIHNlcnZlclNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBJbmRpY2F0ZXMgbW9yZSByZXN1bHRzIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsLiAqL1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgLyoqIExvYWRpbmcgc3RhdGUgKGUuZy4gZHVyaW5nIEFQSSBjYWxsKS4gKi9cbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggaW5wdXQgaW4gdGhlIHNlbGVjdC4gKi9cbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIHRyaWdnZXJzIGluaXRpYWwgc2VhcmNoIG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlKS4gKi9cbiAgaW5pdGlhbEZldGNoT25PcGVuPzogYm9vbGVhbjtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciB0eXBlcyBpbiBzZWFyY2guIENhbGwgQVBJLCB0aGVuIHVwZGF0ZSBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUuIENhbGwgQVBJLCBhcHBlbmQgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBvbkxvYWRNb3JlPzogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKiogTWFwIG9mIHNlbGVjdCBrZXkgLT4gY29uZmlnIG92ZXJyaWRlLiBFbmFibGVzIEFQSS1kcml2ZW4gb3B0aW9ucywgaW5maW5pdGUgc2VhcmNoLCBsb2FkIG1vcmUuICovXG5leHBvcnQgdHlwZSBTZWxlY3RDb25maWdPdmVycmlkZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIFNlbGVjdENvbmZpZ092ZXJyaWRlPj47XG5cbi8qKiBLZXlzIGZvciBlYWNoIGR5bmFtaWMgc2VsZWN0IGluIHRlc3QtY2FzZS1kZXRhaWxzLWVkaXQuIFVzZSB0aGVzZSB3aXRoIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbmV4cG9ydCBjb25zdCBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUyA9IHtcbiAgc3RhdHVzOiAnc3RhdHVzJyxcbiAgcHJpb3JpdHk6ICdwcmlvcml0eScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgbGFiZWxzOiAnbGFiZWxzJyxcbiAgcHJlcmVxdWlzaXRlQ2FzZXM6ICdwcmVyZXF1aXNpdGVDYXNlcycsXG4gIHRlc3REYXRhUHJvZmlsZTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gIHRlc3REYXRhU2V0OiAndGVzdERhdGFTZXQnLFxuICB2aWRlb1JlY29yZGluZzogJ3ZpZGVvUmVjb3JkaW5nJyxcbiAgZW5hYmxlQWlTbWFydG5lc3M6ICdlbmFibGVBaVNtYXJ0bmVzcycsXG4gIGRlZmF1bHRBaUFjdGlvbjogJ2RlZmF1bHRBaUFjdGlvbicsXG4gIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6ICdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyxcbiAgdXNlQWlNZXRhZGF0YTogJ3VzZUFpTWV0YWRhdGEnLFxuICBkZWZhdWx0QnJvd3NlcjogJ2RlZmF1bHRCcm93c2VyJyxcbiAgZGVmYXVsdFZpZXdwb3J0OiAnZGVmYXVsdFZpZXdwb3J0JyxcbiAgZGV2aWNlVHlwZTogJ2RldmljZVR5cGUnLFxuICBkZXZpY2VPUzogJ2RldmljZU9TJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhIHtcbiAgZGVzY3JpcHRpb25Db250ZW50OiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwcmlvcml0eTogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICB0ZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIHRlc3REYXRhU2V0SW5kZXg/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXTtcbn1cblxuY29uc3QgRlJFUVVFTlRMWV9VU0VEX0xBQkVMUyA9IFtcbiAgJ0Nhc2UnLFxuICAnQ3JpdGljYWwnLFxuICAnUE8nLFxuICAnVXBsb2FkJyxcbiAgJ1ZhbGlkYXRpb24nLFxuICAnUmV2aWV3JyxcbiAgJ0VkZ2UtY2FzZXMnLFxuICAnU2VjdXJpdHknLFxuICAnSW50ZWdyYXRpb24nLFxuICAnU21va2UnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZURldGFpbHNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG4gIC8qKiBXaGVuIHRydWUsIGRlc2NyaXB0aW9uIHVzZXMgVHJpeCByaWNoIHRleHQgZWRpdG9yIChCb2xkLCBJdGFsaWMsIGV0Yy4pLiBIb3N0IGFwcCBtdXN0IGxvYWQgVHJpeC4gKi9cbiAgQElucHV0KCkgZW5hYmxlTWFya2Rvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgbWV0YWRhdGFJdGVtczogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdUaXRsZSA9ICdDb25maWd1cmF0aW9uJztcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnM6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBpc1NhdmluZyA9IGZhbHNlO1xuICAvKiogT3B0aW9uYWwgbGlzdCBvZiBwcmVyZXF1aXNpdGUgdGVzdCBjYXNlIG9wdGlvbnMgZm9yIHRoZSBtdWx0aS1zZWxlY3QuIElmIG5vdCBwcm92aWRlZCwgdXNlcyBkZWZhdWx0IHNhbXBsZSBvcHRpb25zLiAqL1xuICBASW5wdXQoKSBwcmVyZXF1aXNpdGVDYXNlT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgc2hvd3MgRGVmYXVsdCBCcm93c2VyICsgVmlld3BvcnQ7ICdtb2JpbGUnIHNob3dzIERldmljZSBUeXBlICsgT1MuIERlZmF1bHRzIHRvICd3ZWInLiAqL1xuICBASW5wdXQoKSBwbGF0Zm9ybTogJ3dlYicgfCAnbW9iaWxlJyA9ICd3ZWInO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhpZGVzIFByaW9yaXR5LCBUeXBlLCBhbmQgVGVzdCBEYXRhIFNldCBmaWVsZHMgKHN0ZXAgZ3JvdXBzIGRvbid0IGhhdmUgdGhlc2UpLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgQElucHV0KCkgaXNTdGVwR3JvdXAgPSBmYWxzZTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3Qga2V5LiBVc2UgZm9yOlxuICAgKiAtIEFQSS1kcml2ZW4gb3B0aW9uczogcGFzcyBvcHRpb25zIGFycmF5ICh1cGRhdGUgd2hlbiBBUEkgcmV0dXJucylcbiAgICogLSBTZXJ2ZXItc2lkZSBzZWFyY2g6IHNlcnZlclNlYXJjaDogdHJ1ZSwgb25TZWFyY2ggaW4gb3ZlcnJpZGUgb3IgbGlzdGVuIHRvIHNlbGVjdFNlYXJjaFxuICAgKiAtIEluZmluaXRlIHNjcm9sbDogaGFzTW9yZTogdHJ1ZSwgb25Mb2FkTW9yZSBpbiBvdmVycmlkZSBvciBsaXN0ZW4gdG8gc2VsZWN0TG9hZE1vcmVcbiAgICogLSBJbml0aWFsIGZldGNoIG9uIG9wZW46IGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzOiBTZWxlY3RDb25maWdPdmVycmlkZXMgPSB7fTtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzZWFyY2hlcyBpbiBhIHNlbGVjdCAoc2VydmVyU2VhcmNoIG1vZGUpLiBDYWxsIEFQSSBhbmQgdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCB0byBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWxlY3QgcGFuZWwgaXMgb3BlbmVkLiBVc2UgdG8gY2FsbCBBUEkgZm9yIGluaXRpYWwgbG9hZCAoZS5nLiB3aGVuIGluaXRpYWxGZXRjaE9uT3BlbikuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIGluIGFueSBzZWxlY3QuICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGFkZHMgYSBuZXcgY3VzdG9tIGxhYmVsIHZpYSB0aGUgXCJOZXdcIiBvcHRpb24uICovXG4gIEBPdXRwdXQoKSBsYWJlbEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKiBGb3JtIHN0YXRlICovXG4gIGVkaXREZXNjcmlwdGlvbiA9ICcnO1xuICBlZGl0U3RhdHVzID0gJyc7XG4gIGVkaXRQcmlvcml0eSA9ICcnO1xuICBlZGl0TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICB0ZXN0Q2FzZVRpbWVvdXQgPSAnJztcbiAgd2FpdFRpbWVvdXRMb2NhdG9ycyA9ICcnO1xuICBhdXRvV2FpdEVuYWJsZWQgPSBmYWxzZTtcbiAgcmV0cnlGYWlsZWRTdGVwcyA9ICcnO1xuICBjb25maWdFeHBhbmRlZCA9IHRydWU7XG4gIGV4ZWN1dGlvbkV4cGFuZGVkID0gdHJ1ZTtcbiAgYWlDb25maWdFeHBhbmRlZCA9IHRydWU7XG4gIHdhaXRzUmV0cmllc0V4cGFuZGVkID0gdHJ1ZTtcbiAgZGV2aWNlRXhwYW5kZWQgPSB0cnVlO1xuICBrZXlGbGFnc0V4cGFuZGVkID0gdHJ1ZTtcbiAgbW9iaWxlVGVzdGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgZXh0ZW5zaW9uVXNlRW5hYmxlZCA9IGZhbHNlO1xuICBkYXRhRHJpdmVuRW5hYmxlZCA9IGZhbHNlO1xuXG4gIHJlYWRvbmx5IGZyZXF1ZW50bHlVc2VkTGFiZWxzID0gRlJFUVVFTlRMWV9VU0VEX0xBQkVMUztcblxuICAvKiogRm9ybUdyb3VwIGZvciBjcWEtZHluYW1pYy1zZWxlY3QgYmluZGluZ3MgKi9cbiAgZWRpdEZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGF0dXM6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgcHJpb3JpdHk6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdHlwZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBsYWJlbHM6IG5ldyBGb3JtQ29udHJvbChbXSBhcyBzdHJpbmdbXSksXG4gICAgcHJlcmVxdWlzaXRlQ2FzZXM6IG5ldyBGb3JtQ29udHJvbChbXSBhcyBzdHJpbmdbXSksXG4gICAgdGVzdERhdGFQcm9maWxlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHRlc3REYXRhU2V0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRlZmF1bHRCcm93c2VyOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHZpZGVvUmVjb3JkaW5nOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRlZmF1bHRWaWV3cG9ydDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZXZpY2VUeXBlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRldmljZU9TOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGVuYWJsZUFpU21hcnRuZXNzOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRlZmF1bHRBaUFjdGlvbjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHVzZUFpTWV0YWRhdGE6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gIH0pO1xuXG4gIGdldCBzdGF0dXNJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnU3RhdHVzJyk7XG4gIH1cblxuICBnZXQgcHJpb3JpdHlJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnUHJpb3JpdHknKTtcbiAgfVxuXG4gIGdldCB0eXBlSXRlbSgpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSXRlbXMuZmluZCgobSkgPT4gbS5sYWJlbCA9PT0gJ1R5cGUnKTtcbiAgfVxuXG4gIGdldCBzdGF0dXNPcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydEcmFmdCcsICdJbiBSZXZpZXcnLCAnQXBwcm92ZWQnLCAnQWN0aXZlJywgJ0luYWN0aXZlJywgJ0Jsb2NrZWQnXTtcbiAgfVxuXG4gIGdldCBwcmlvcml0eU9wdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ0NyaXRpY2FsJywgJ01ham9yJywgJ0hpZ2gnLCAnTWVkaXVtJywgJ0xvdycsICdNaW5vcicsICdOb3Qgc2V0J107XG4gIH1cblxuICAvKiogQ2FjaGVkIGNvbmZpZ3MgdG8gYXZvaWQgbmV3IG9iamVjdCByZWZzIGVhY2ggY2hhbmdlIGRldGVjdGlvbiAocHJldmVudHMgaW5maW5pdGUgbG9vcHMpICovXG4gIHJlYWRvbmx5IHN0YXR1c1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3N0YXR1cycsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnU3RhdHVzJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnRHJhZnQnLCBuYW1lOiAnRHJhZnQnIH0sXG4gICAgICB7IHZhbHVlOiAnSW4gUmV2aWV3JywgbmFtZTogJ0luIFJldmlldycgfSxcbiAgICAgIHsgdmFsdWU6ICdBcHByb3ZlZCcsIG5hbWU6ICdBcHByb3ZlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdBY3RpdmUnLCBuYW1lOiAnQWN0aXZlJyB9LFxuICAgICAgeyB2YWx1ZTogJ0luYWN0aXZlJywgbmFtZTogJ0luYWN0aXZlJyB9LFxuICAgICAgeyB2YWx1ZTogJ0Jsb2NrZWQnLCBuYW1lOiAnQmxvY2tlZCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0eXBlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUeXBlJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHRlc3REYXRhUHJvZmlsZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnVGVzdCBEYXRhIFByb2ZpbGUnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcmVhZG9ubHkgdGVzdERhdGFTZXRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0ZXN0RGF0YVNldCcsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnVGVzdCBEYXRhIFNldCcsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQcmVyZXF1aXNpdGVDYXNlT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnVEMtMDAxJywgbmFtZTogJ1RDLTAwMTogTG9naW4gZmxvdycgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDAyJywgbmFtZTogJ1RDLTAwMjogVXNlciByZWdpc3RyYXRpb24nIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwMycsIG5hbWU6ICdUQy0wMDM6IFBhc3N3b3JkIHJlc2V0JyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDQnLCBuYW1lOiAnVEMtMDA0OiBEYXNoYm9hcmQgbG9hZCcgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDA1JywgbmFtZTogJ1RDLTAwNTogQVBJIGhlYWx0aCBjaGVjaycgfSxcbiAgXTtcblxuICByZWFkb25seSB2aWRlb1JlY29yZGluZ1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZpZGVvUmVjb3JkaW5nJyxcbiAgICBsYWJlbDogJ1JlY29yZCB0ZXN0IGV4ZWN1dGlvbiB2aWRlbycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICd0cnVlJywgbmFtZTogJ1RydWUnIH0sXG4gICAgICB7IHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnRmFsc2UnIH0sXG4gICAgICB7IHZhbHVlOiAnT3JnIGxldmVsJywgbmFtZTogJ09yZyBsZXZlbCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGFpTWV0YWRhdGFDb2xsZWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndXNlQWlNZXRhZGF0YScsXG4gICAgbGFiZWw6ICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICd0cnVlJywgbmFtZTogJ1RydWUnIH0sXG4gICAgICB7IHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnRmFsc2UnIH0sXG4gICAgICB7IHZhbHVlOiAnT3JnIGxldmVsJywgbmFtZTogJ09yZyBsZXZlbCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIC8qKiBDYWNoZWQgbGFiZWxzIGNvbmZpZyB0byBhdm9pZCBuZXcgb2JqZWN0IG9uIGV2ZXJ5IENEIChwcmV2ZW50cyBmcmVlemUpICovXG4gIHByaXZhdGUgX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuXG4gIC8qKiBMYWJlbHMgbXVsdGktc2VsZWN0OiBvcHRpb25zID0gZnJlcXVlbnRseSB1c2VkICsgY3VycmVudCArIEFQSSBvcHRpb25zIGZyb20gc2VsZWN0Q29uZmlnT3ZlcnJpZGVzICovXG4gIGdldCBsYWJlbHNTZWxlY3RDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBpZiAoIXRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ICYmIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlKSByZXR1cm4gdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlc1tURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHNdO1xuICAgIGNvbnN0IGFwaU9wdGlvbnMgPSBvdmVycmlkZT8ub3B0aW9ucyA/PyBbXTtcbiAgICBjb25zdCBhbGxMYWJlbHMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgLi4udGhpcy5mcmVxdWVudGx5VXNlZExhYmVscyxcbiAgICAgIC4uLnRoaXMuZWRpdExhYmVscyxcbiAgICAgIC4uLmFwaU9wdGlvbnMubWFwKChvKSA9PiBTdHJpbmcoby5uYW1lID8/IG8udmFsdWUgPz8gJycpLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgIF0pO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBBcnJheS5mcm9tKGFsbExhYmVscylcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICAubWFwKCh2KSA9PiAoeyB2YWx1ZTogdiwgbmFtZTogdiB9KSk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGUgPSB7XG4gICAgICBrZXk6ICdsYWJlbHMnLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggbGFiZWxzIHRvIGFkZCAuLi4uLi4nLFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgb3B0aW9uU3R5bGU6ICdjaGVja2JveCcsXG4gICAgICBhbGxvd0N1c3RvbVZhbHVlOiB0cnVlLFxuICAgICAgb3B0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlO1xuICB9XG5cbiAgcHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ByZXJlcXVpc2l0ZUNhc2VzJyxcbiAgICBsYWJlbDogJ1ByZXJlcXVpc2l0ZSBDYXNlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBvcHRpb25TdHlsZTogJ2NoZWNrYm94JyxcbiAgICBzaG93U2VsZWN0QWxsOiB0cnVlLFxuICAgIHNlbGVjdEFsbExhYmVsOiAnQWxsJyxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnVEMtMDAxJywgbmFtZTogJ1RDLTAwMTogTG9naW4gZmxvdycgfSxcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDInLCBuYW1lOiAnVEMtMDAyOiBVc2VyIHJlZ2lzdHJhdGlvbicgfSxcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDMnLCBuYW1lOiAnVEMtMDAzOiBQYXNzd29yZCByZXNldCcgfSxcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDQnLCBuYW1lOiAnVEMtMDA0OiBEYXNoYm9hcmQgbG9hZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDUnLCBuYW1lOiAnVEMtMDA1OiBBUEkgaGVhbHRoIGNoZWNrJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFZpZXdwb3J0U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdFZpZXdwb3J0JyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgVmlld3BvcnQnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnMTI4MHg3MjAnLCBuYW1lOiAnMTI4MHg3MjAnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZXZpY2VUeXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGV2aWNlVHlwZScsXG4gICAgbGFiZWw6ICdEZXZpY2UgVHlwZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTQnLCBuYW1lOiAnaVBob25lIDE0JyB9LFxuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNScsIG5hbWU6ICdpUGhvbmUgMTUnIH0sXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE3JywgbmFtZTogJ2lQaG9uZSAxNycgfSxcbiAgICAgIHsgdmFsdWU6ICdJcGhvbmUgMTcnLCBuYW1lOiAnSXBob25lIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ1NhbXN1bmcgR2FsYXh5JywgbmFtZTogJ1NhbXN1bmcgR2FsYXh5JyB9LFxuICAgICAgeyB2YWx1ZTogJ1BpeGVsJywgbmFtZTogJ1BpeGVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGV2aWNlT1NTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZXZpY2VPUycsXG4gICAgbGFiZWw6ICdPUycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdpcGEnLCBuYW1lOiAnaU9TIChpcGEpJyB9LFxuICAgICAgeyB2YWx1ZTogJ2FwaycsIG5hbWU6ICdBbmRyb2lkIChhcGspJyB9LFxuICAgICAgeyB2YWx1ZTogJ2lPUyAxNicsIG5hbWU6ICdpT1MgMTYnIH0sXG4gICAgICB7IHZhbHVlOiAnaU9TIDE3JywgbmFtZTogJ2lPUyAxNycgfSxcbiAgICAgIHsgdmFsdWU6ICdBbmRyb2lkIDEzJywgbmFtZTogJ0FuZHJvaWQgMTMnIH0sXG4gICAgICB7IHZhbHVlOiAnQW5kcm9pZCAxNCcsIG5hbWU6ICdBbmRyb2lkIDE0JyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEJyb3dzZXJTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0QnJvd3NlcicsXG4gICAgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLFxuICAgIHBsYWNlaG9sZGVyOiAnQ2hyb21lJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQ2hyb21lJywgbmFtZTogJ0Nocm9tZScgfSxcbiAgICAgIHsgdmFsdWU6ICdGaXJlZm94JywgbmFtZTogJ0ZpcmVmb3gnIH0sXG4gICAgICB7IHZhbHVlOiAnU2FmYXJpJywgbmFtZTogJ1NhZmFyaScgfSxcbiAgICAgIHsgdmFsdWU6ICdFZGdlJywgbmFtZTogJ0VkZ2UnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBwcmlvcml0eVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ByaW9yaXR5JyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdQcmlvcml0eScsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0NyaXRpY2FsJywgbmFtZTogJ0NyaXRpY2FsJyB9LFxuICAgICAgeyB2YWx1ZTogJ01ham9yJywgbmFtZTogJ01ham9yJyB9LFxuICAgICAgeyB2YWx1ZTogJ0hpZ2gnLCBuYW1lOiAnSGlnaCcgfSxcbiAgICAgIHsgdmFsdWU6ICdNZWRpdW0nLCBuYW1lOiAnTWVkaXVtJyB9LFxuICAgICAgeyB2YWx1ZTogJ0xvdycsIG5hbWU6ICdMb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnTWlub3InLCBuYW1lOiAnTWlub3InIH0sXG4gICAgICB7IHZhbHVlOiAnTm90IHNldCcsIG5hbWU6ICdOb3Qgc2V0JyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdlbmFibGVBaVNtYXJ0bmVzcycsXG4gICAgbGFiZWw6ICdFbmFibGUgQUkgU21hcnRuZXNzJyxcbiAgICBwbGFjZWhvbGRlcjogJ0FkdmFuY2VkJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQmFzaWMnLCBuYW1lOiAnQmFzaWMnIH0sXG4gICAgICB7IHZhbHVlOiAnQWR2YW5jZWQnLCBuYW1lOiAnQWR2YW5jZWQnIH0sXG4gICAgICB7IHZhbHVlOiAnT2ZmJywgbmFtZTogJ09mZicgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRBaUFjdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRBaUFjdGlvbicsXG4gICAgbGFiZWw6ICdEZWZhdWx0IEFJIEFjdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTbWFydCB3YWl0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnU21hcnQgd2FpdCcsIG5hbWU6ICdTbWFydCB3YWl0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1NtYXJ0IFdhaXQnLCBuYW1lOiAnU21hcnQgV2FpdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdXYWl0IGZvciBlbGVtZW50JywgbmFtZTogJ1dhaXQgZm9yIGVsZW1lbnQnIH0sXG4gICAgICB7IHZhbHVlOiAnUmV0cnknLCBuYW1lOiAnUmV0cnknIH0sXG4gICAgICB7IHZhbHVlOiAnU2tpcCcsIG5hbWU6ICdTa2lwJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLFxuICAgIGxhYmVsOiAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnLFxuICAgIHBsYWNlaG9sZGVyOiAnTm9uZScsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ25vbmUnLCBuYW1lOiAnTm9uZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1lcmdlZCBjb25maWcgZm9yIGEgc2VsZWN0OiBiYXNlIGNvbmZpZyArIG92ZXJyaWRlLlxuICAgKiBXaXJlcyBvblNlYXJjaCwgb25Mb2FkTW9yZSB0byBib3RoIG92ZXJyaWRlIGNhbGxiYWNrcyBhbmQgb3V0cHV0IGV2ZW50cy5cbiAgICovXG4gIGdldENvbmZpZ0ZvclNlbGVjdChrZXk6IHN0cmluZywgYmFzZUNvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5ba2V5XTtcbiAgICBpZiAoIW92ZXJyaWRlKSByZXR1cm4gYmFzZUNvbmZpZztcblxuICAgIGNvbnN0IG1lcmdlZDogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgICAgLi4uYmFzZUNvbmZpZyxcbiAgICAgIC4uLm92ZXJyaWRlLFxuICAgICAgb3B0aW9uczogb3ZlcnJpZGUub3B0aW9ucyA/PyBiYXNlQ29uZmlnLm9wdGlvbnMsXG4gICAgICBrZXk6IGJhc2VDb25maWcua2V5LFxuICAgIH07XG5cbiAgICBpZiAob3ZlcnJpZGUuc2VydmVyU2VhcmNoIHx8IG92ZXJyaWRlLm9uU2VhcmNoKSB7XG4gICAgICBtZXJnZWQub25TZWFyY2ggPSAocXVlcnkpID0+IHtcbiAgICAgICAgb3ZlcnJpZGUub25TZWFyY2g/LihxdWVyeSk7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VhcmNoLmVtaXQoeyBrZXksIHF1ZXJ5IH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG92ZXJyaWRlLmhhc01vcmUgfHwgb3ZlcnJpZGUub25Mb2FkTW9yZSkge1xuICAgICAgbWVyZ2VkLm9uTG9hZE1vcmUgPSAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5ID8/ICcnO1xuICAgICAgICBvdmVycmlkZS5vbkxvYWRNb3JlPy4ocSk7XG4gICAgICAgIHRoaXMuc2VsZWN0TG9hZE1vcmUuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICBvblNlbGVjdE9wZW5lZChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0T3BlbmVkLmVtaXQoeyBrZXkgfSk7XG4gIH1cblxuICBvblNlbGVjdFNlYXJjaChldmVudDogeyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RTZWFyY2guZW1pdChldmVudCk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2V2ZW50LmtleV07XG4gICAgb3ZlcnJpZGU/Lm9uU2VhcmNoPy4oZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25TZWxlY3RMb2FkTW9yZShldmVudDogeyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMb2FkTW9yZS5lbWl0KGV2ZW50KTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bZXZlbnQua2V5XTtcbiAgICBvdmVycmlkZT8ub25Mb2FkTW9yZT8uKGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKSB7XG4gICAgICBjb25zdCB2YWwgPSBldmVudC52YWx1ZTtcbiAgICAgIHRoaXMuZWRpdExhYmVscyA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbC5tYXAoKHYpID0+IFN0cmluZyh2KSkuZmlsdGVyKEJvb2xlYW4pIDogdmFsICE9IG51bGwgPyBbU3RyaW5nKHZhbCldIDogW107XG4gICAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLy8gTWFyayBUZXN0IERhdGEgc2VsZWN0cyBhcyBkaXJ0eSBzbyBsYXRlciBpbnB1dCBjaGFuZ2VzIChvcHRpb25zL2NvbmZpZykgZG9uJ3Qgb3ZlcndyaXRlIHVzZXIgY2hvaWNlXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMudGVzdERhdGFQcm9maWxlIHx8IGV2ZW50LmtleSA9PT0gVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMudGVzdERhdGFTZXQpIHtcbiAgICAgIGNvbnN0IGN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldChldmVudC5rZXkpO1xuICAgICAgY3RybD8ubWFya0FzRGlydHkoKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IGtleTogZXZlbnQua2V5LCB2YWx1ZTogZXZlbnQudmFsdWUgfSk7XG4gIH1cblxuICBvbkxhYmVsc0FkZEN1c3RvbVZhbHVlKGV2ZW50OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBjb25zdCB2ID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKCF2IHx8IHRoaXMuZWRpdExhYmVscy5pbmNsdWRlcyh2KSkgcmV0dXJuO1xuICAgIHRoaXMuZWRpdExhYmVscyA9IFsuLi50aGlzLmVkaXRMYWJlbHMsIHZdO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmxhYmVsQWRkZWQuZW1pdCh2KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29uZmlnSXRlbVZhbHVlKHNlY3Rpb25UaXRsZTogc3RyaW5nLCBpdGVtTGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IFsuLi50aGlzLmNvbmZpZ1NlY3Rpb25zLCAuLi50aGlzLmNvbmZpZ1NlY3Rpb25zUm93Ml0uZmluZChcbiAgICAgIChzKSA9PlxuICAgICAgICBzLnRpdGxlID09PSBzZWN0aW9uVGl0bGUgfHxcbiAgICAgICAgcy50aXRsZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWN0aW9uVGl0bGUudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIGNvbnN0IGl0ZW0gPSBzZWN0aW9uPy5pdGVtcz8uZmluZChcbiAgICAgIChpKSA9PlxuICAgICAgICBpLmxhYmVsID09PSBpdGVtTGFiZWwgfHxcbiAgICAgICAgaS5sYWJlbD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhpdGVtTGFiZWwudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIHJldHVybiAoaXRlbT8udmFsdWUgYXMgc3RyaW5nKSA/PyAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdmFsdWUgZnJvbSBEZXZpY2Ugc2VjdGlvbiAtIHN1cHBvcnRzIGJvdGggJ0RldmljZScgYW5kICdEZXZpY2UgU2V0dGluZycgdGl0bGVzICovXG4gIHByaXZhdGUgZ2V0RGV2aWNlQ29uZmlnVmFsdWUoaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbCA9XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgaXRlbUxhYmVsKSB8fFxuICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZSBTZXR0aW5nJywgaXRlbUxhYmVsKTtcbiAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJyAmJiBTdHJpbmcodmFsKS50cmltKCkgIT09ICcnID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdmFsdWUgZnJvbSBXYWl0cyBzZWN0aW9uIC0gc3VwcG9ydHMgYm90aCAnV2FpdCBhbmQgcmV0cmllcycgYW5kICdXYWl0cyAmIFJldHJpZXMnIHRpdGxlcyAqL1xuICBwcml2YXRlIGdldFdhaXRzUmV0cmllc1ZhbHVlKGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB2MSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0IGFuZCByZXRyaWVzJywgaXRlbUxhYmVsKTtcbiAgICBjb25zdCB2MiA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCBpdGVtTGFiZWwpO1xuICAgIGxldCB2YWwgPSAodjEgIT09ICcnICYmIHYxICE9IG51bGwpID8gdjEgOiB2MjtcblxuICAgIC8vIFdoZW4gdmFsdWVzIGFyZSBjb21pbmcgZnJvbSBvcmdhbml6YXRpb24gc2V0dGluZ3MsIHRoZSBwb3J0YWwgd3JhcHMgdGhlbSBhc1xuICAgIC8vIFwiT3JnIExldmVsIChBQ1RVQUwgVkFMVUUpXCIuIEZvciBlZGl0IGlucHV0cyAoUmV0cnkgRmFpbGVkIFN0ZXBzLCBUZXN0IENhc2UgVGltZW91dCxcbiAgICAvLyBXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzKSwgd2Ugb25seSB3YW50IHRvIHNob3cgdGhlIGlubmVyIHZhbHVlLCBub3QgdGhlIHdyYXBwZXIuXG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBjb25zdCByYXcgPSBTdHJpbmcodmFsKS50cmltKCk7XG4gICAgICBjb25zdCBsb3dlciA9IHJhdy50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgcHJlZml4ID0gJ29yZyBsZXZlbCAoJztcbiAgICAgIGlmIChsb3dlci5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgY29uc3Qgb3BlbklkeCA9IHJhdy5pbmRleE9mKCcoJyk7XG4gICAgICAgIGNvbnN0IGNsb3NlSWR4ID0gcmF3Lmxhc3RJbmRleE9mKCcpJyk7XG4gICAgICAgIGlmIChvcGVuSWR4ID49IDAgJiYgY2xvc2VJZHggPiBvcGVuSWR4KSB7XG4gICAgICAgICAgdmFsID0gcmF3LnN1YnN0cmluZyhvcGVuSWR4ICsgMSwgY2xvc2VJZHgpLnRyaW0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSByYXcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnICYmIFN0cmluZyh2YWwpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgLyoqIFN0cmlwIHRyYWlsaW5nICdzJyBmcm9tIHZhbHVlIChlLmcuIFwiMTBzXCIgLT4gXCIxMFwiKSBmb3IgZGlzcGxheSBpbiB0aW1lb3V0IGlucHV0cyAqL1xuICBwcml2YXRlIHN0cmlwVHJhaWxpbmdVbml0Uyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJycpIHJldHVybiB2YWw7XG4gICAgY29uc3QgcyA9IFN0cmluZyh2YWwpLnRyaW0oKTtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9cXHMqcyQvaSwgJycpO1xuICB9XG5cbiAgLyoqIEFsbG93IG9ubHkgZGlnaXRzOyB1c2VkIGZvciBSZXRyeSBGYWlsZWQgU3RlcHMsIFRlc3QgQ2FzZSBUaW1lb3V0LCBXYWl0IFRpbWVvdXQgaW5wdXRzICovXG4gIG9ubHlEaWdpdHModmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gIH1cblxuICAvKiogRm9yIHVwZGF0ZTogdXNlIFwiMFwiIHdoZW4gdmFsdWUgaXMgZW1wdHkgc28gQVBJIGdldHMgYSBudW1iZXIgKi9cbiAgcHJpdmF0ZSBlbXB0eU51bVRvWmVybyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IFN0cmluZyh2YWwpLnRyaW0oKSA9PT0gJycpIHJldHVybiAnMCc7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1ByZXJlcXVpc2l0ZSBDYXNlJyk7XG4gICAgaWYgKCF2YWwpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdmFsLmluY2x1ZGVzKCcsJykgPyB2YWwuc3BsaXQoJywnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbdmFsXTtcbiAgfVxuXG4gIC8qKiBFZGl0IG1vZGUgc2hvdWxkIHNob3cgcGxhY2Vob2xkZXIgd2hlbiBkYXRhc2V0IGlzIG5vdCBzZWxlY3RlZC4gKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZT8udHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICdub3Qgc2V0JyA/ICcnIDogdmFsdWU7XG4gIH1cblxuICBnZXQgaGFzUHJlcmVxdWlzaXRlQ2FzZUNvbmZpZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+IHMudGl0bGUgPT09ICdFeGVjdXRpb24nXG4gICAgKTtcbiAgICByZXR1cm4gISFzZWN0aW9uPy5pdGVtcz8uc29tZSgoaSkgPT4gaS5sYWJlbCA9PT0gJ1ByZXJlcXVpc2l0ZSBDYXNlJyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgdGhpcy5lZGl0UHJpb3JpdHkgPSB0aGlzLnByaW9yaXR5SXRlbT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgUHJvZmlsZScpID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICApO1xuICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/IHRlc3REYXRhUHJvZmlsZVJhdztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/IHRlc3REYXRhU2V0UmF3O1xuICAgIHRoaXMuZWRpdExhYmVscyA9IFsuLi50aGlzLmxhYmVsc107XG4gICAgY29uc3QgYXV0b1dhaXRWYWwgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCAnQXV0byBXYWl0Jyk7XG4gICAgdGhpcy5hdXRvV2FpdEVuYWJsZWQgPSAhIShhdXRvV2FpdFZhbCAmJiBhdXRvV2FpdFZhbC50cmltKCkgIT09ICcnICYmIFN0cmluZyhhdXRvV2FpdFZhbCkgIT09ICdmYWxzZScpO1xuICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgIHRoaXMudGVzdENhc2VUaW1lb3V0ID0gdGhpcy5zdHJpcFRyYWlsaW5nVW5pdFModGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJykpO1xuICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykpO1xuICAgIHRoaXMubW9iaWxlVGVzdGluZ0VuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnTW9iaWxlIFRlc3RpbmcnKTtcbiAgICB0aGlzLmV4dGVuc2lvblVzZUVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRXh0ZW5zaW9uIFVzZScpO1xuICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICBjb25zdCBlbmFibGVBaVNtYXJ0bmVzcyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBTbWFydG5lc3MnKTtcbiAgICBjb25zdCBkZWZhdWx0QWlBY3Rpb24gPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdEZWZhdWx0IEFJIEFjdGlvbicpO1xuICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicpO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3KTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IHRoaXMuZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgZGVmYXVsdEJyb3dzZXIgPVxuICAgICAgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgPyB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IEJyb3dzZXInKSB8fCB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpXG4gICAgICAgIDogdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh2aWRlb1JlY29yZGluZ1JhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IFZpZXdwb3J0JykgfHwgdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnVmlld3BvcnQnKSB8fCAnJztcbiAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdUeXBlJyk7XG4gICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBzdGF0dXM6IHRoaXMuZWRpdFN0YXR1cyxcbiAgICAgIHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSxcbiAgICAgIHR5cGU6IHR5cGVWYWwgfHwgJycsXG4gICAgICBsYWJlbHM6IHRoaXMuZWRpdExhYmVscyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFQcm9maWxlVmFsIHx8ICcnLFxuICAgICAgdGVzdERhdGFTZXQ6IHRlc3REYXRhU2V0VmFsID8/ICcnLFxuICAgICAgcHJlcmVxdWlzaXRlQ2FzZXMsXG4gICAgICBkZWZhdWx0QnJvd3NlcjogZGVmYXVsdEJyb3dzZXIgfHwgJ0Nocm9tZScsXG4gICAgICB2aWRlb1JlY29yZGluZzogdmlkZW9SZWNvcmRpbmcgfHwgJycsXG4gICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCB8fCAnJyxcbiAgICAgIGRldmljZVR5cGU6IGRldmljZVR5cGUgfHwgJycsXG4gICAgICBkZXZpY2VPUzogZGV2aWNlT1MgfHwgJycsXG4gICAgICBlbmFibGVBaVNtYXJ0bmVzczogZW5hYmxlQWlTbWFydG5lc3MgfHwgJ0FkdmFuY2VkJyxcbiAgICAgIGRlZmF1bHRBaUFjdGlvbjogZGVmYXVsdEFpQWN0aW9uIHx8ICdTbWFydCB3YWl0JyxcbiAgICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgfHwgJ25vbmUnLFxuICAgICAgdXNlQWlNZXRhZGF0YTogdXNlQWlNZXRhZGF0YSB8fCAnJyxcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVRvT3B0aW9uVmFsdWUoXG4gICAgY29uZmlnVmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSB8IHVuZGVmaW5lZFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChjb25maWdWYWx1ZSA9PSBudWxsIHx8IGNvbmZpZ1ZhbHVlID09PSAnJykgcmV0dXJuIGNvbmZpZ1ZhbHVlO1xuICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zID8/IFtdO1xuICAgIGlmICghb3B0cy5sZW5ndGgpIHJldHVybiBjb25maWdWYWx1ZTtcbiAgICBjb25zdCBudW0gPSB0eXBlb2YgY29uZmlnVmFsdWUgPT09ICdudW1iZXInID8gY29uZmlnVmFsdWUgOiBOdW1iZXIoY29uZmlnVmFsdWUpO1xuICAgIGNvbnN0IGlzTnVtZXJpYyA9ICFOdW1iZXIuaXNOYU4obnVtKSAmJiBTdHJpbmcoY29uZmlnVmFsdWUpLnRyaW0oKSA9PT0gU3RyaW5nKG51bSk7XG4gICAgaWYgKGlzTnVtZXJpYykge1xuICAgICAgLy8gSWYgb3B0aW9ucyB1c2UgbnVtZXJpYyB2YWx1ZXMgKGUuZy4gaW5kaWNlcyBmb3IgVGVzdCBEYXRhIFNldCksXG4gICAgICAvLyByZXR1cm4gdGhlIG51bWVyaWMgZm9ybSBzbyB0aGUgc2VsZWN0IGNhbiBtYXRjaCBieSBzdHJpY3QgZXF1YWxpdHkuXG4gICAgICBjb25zdCBoYXNOdW1lcmljT3B0aW9uID0gb3B0cy5zb21lKFxuICAgICAgICAobykgPT4gdHlwZW9mIG8udmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiAobyBhcyBhbnkpLmlkID09PSAnbnVtYmVyJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBoYXNOdW1lcmljT3B0aW9uID8gbnVtIDogY29uZmlnVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IFN0cmluZyhjb25maWdWYWx1ZSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbWF0Y2ggPSBvcHRzLmZpbmQoKG8pID0+IHtcbiAgICAgIGNvbnN0IG4gPSBTdHJpbmcoby5uYW1lID8/IG8ubGFiZWwgPz8gby52YWx1ZSA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gbiA9PT0gc3RyO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXRjaCAhPSBudWxsID8gKG1hdGNoLnZhbHVlID8/IChtYXRjaCBhcyBhbnkpLmlkID8/IG1hdGNoKSA6IGNvbmZpZ1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodmFsOiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09PSB0cnVlIHx8IHZhbCA9PT0gJ3RydWUnKSByZXR1cm4gJ3RydWUnO1xuICAgIGlmICh2YWwgPT09IGZhbHNlIHx8IHZhbCA9PT0gJ2ZhbHNlJykgcmV0dXJuICdmYWxzZSc7XG4gICAgaWYgKFxuICAgICAgdmFsID09PSAnT3JnIGxldmVsJyB8fFxuICAgICAgdmFsID09PSAnT3JnIExldmVsJyB8fFxuICAgICAgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdvcmcgbGV2ZWwgKCcpKVxuICAgICkge1xuICAgICAgcmV0dXJuICdPcmcgbGV2ZWwnO1xuICAgIH1cbiAgICBpZiAodmFsID09PSAnT24gV2FpdCcgfHwgdmFsID09PSAnb24gd2FpdCcpIHJldHVybiAndHJ1ZSc7XG4gICAgcmV0dXJuIHZhbCAmJiBTdHJpbmcodmFsKS50cmltKCkgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2xhYmVscyddIHx8IGNoYW5nZXNbJ3NlbGVjdENvbmZpZ092ZXJyaWRlcyddKSB7XG4gICAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgICBpZiAoY2hhbmdlc1snc2VsZWN0Q29uZmlnT3ZlcnJpZGVzJ10gJiYgdGhpcy5lZGl0Rm9ybT8uZ2V0KCd0eXBlJykpIHtcbiAgICAgICAgY29uc3QgdHlwZUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgICBjb25zdCB0ZHBDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpO1xuICAgICAgICBjb25zdCB0ZHNDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk7XG4gICAgICAgIGNvbnN0IHBhdGNoOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPjtcbiAgICAgICAgaWYgKHR5cGVDdHJsICYmICF0eXBlQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHR5cGVSYXcgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgICAgIHBhdGNoWyd0eXBlJ10gPSAodGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0eXBlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0eXBlJ10/Lm9wdGlvbnMpID8/IHR5cGVSYXcpIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBUZXN0IERhdGEgUHJvZmlsZSAvIFNldCwgYWxsb3cgb25lLXRpbWUgcmUtcmVzb2x2ZSBmcm9tIGNvbmZpZyB3aGVuIG9wdGlvbnMgYXJyaXZlLFxuICAgICAgICAvLyBidXQgbmV2ZXIgb3ZlcndyaXRlIGEgdXNlci1lZGl0ZWQgKGRpcnR5KSB2YWx1ZS5cbiAgICAgICAgaWYgKHRkcEN0cmwgJiYgIXRkcEN0cmwuZGlydHkpIHtcbiAgICAgICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgICAgICAgcGF0Y2hbJ3Rlc3REYXRhUHJvZmlsZSddID1cbiAgICAgICAgICAgICh0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/XG4gICAgICAgICAgICAgIHRlc3REYXRhUHJvZmlsZVJhdykgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRkc0N0cmwgJiYgIXRkc0N0cmwuZGlydHkpIHtcbiAgICAgICAgICBjb25zdCB0ZXN0RGF0YVNldFJhdyA9IHRoaXMubm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFNldCcpID8/ICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXRjaFsndGVzdERhdGFTZXQnXSA9XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhU2V0UmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVNldCddPy5vcHRpb25zKSA/P1xuICAgICAgICAgICAgdGVzdERhdGFTZXRSYXcgPz8gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUocGF0Y2gsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10gfHwgY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snbWV0YWRhdGFJdGVtcyddKSB7XG4gICAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICAgIGNvbnN0IHByaW9yaXR5Q29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmlvcml0eScpO1xuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgbGFiZWxzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN0YXR1cyA9IHN0YXR1c0NvbnRyb2w/LnRvdWNoZWQgfHwgc3RhdHVzQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVByaW9yaXR5ID0gcHJpb3JpdHlDb250cm9sPy50b3VjaGVkIHx8IHByaW9yaXR5Q29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVR5cGUgPSB0eXBlQ29udHJvbD8udG91Y2hlZCB8fCB0eXBlQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUxhYmVscyA9IGxhYmVsc0NvbnRyb2w/LnRvdWNoZWQgfHwgbGFiZWxzQ29udHJvbD8uZGlydHk7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi4ocHJlc2VydmVTdGF0dXMgPyB7fSA6IHsgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZVByaW9yaXR5ID8ge30gOiB7IHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlVHlwZSA/IHt9IDogeyB0eXBlOiB0eXBlVmFsIH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVMYWJlbHMgPyB7fSA6IHsgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ByZXJlcXVpc2l0ZUNhc2VPcHRpb25zJ10gJiYgdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnLFxuICAgICAgICBvcHRpb25zOiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZ1NlY3Rpb25zJ10gfHwgY2hhbmdlc1snY29uZmlnU2VjdGlvbnNSb3cyJ10pIHtcbiAgICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVNldFJhdyA9IHRoaXMubm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZShcbiAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICk7XG4gICAgICBjb25zdCB0eXBlVmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0eXBlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0eXBlJ10/Lm9wdGlvbnMpID8/IHR5cGVSYXc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/IHRlc3REYXRhUHJvZmlsZVJhdztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVNldFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFTZXQnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFTZXRSYXc7XG4gICAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgdXNlQWlNZXRhZGF0YVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodXNlQWlNZXRhZGF0YVJhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgVmlld3BvcnQnKSB8fCB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdWaWV3cG9ydCcpIHx8ICcnO1xuICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXQgPSB0aGlzLnN0cmlwVHJhaWxpbmdVbml0Uyh0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSk7XG4gICAgICB0aGlzLndhaXRUaW1lb3V0TG9jYXRvcnMgPSB0aGlzLnN0cmlwVHJhaWxpbmdVbml0Uyh0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKScpKTtcbiAgICAgIHRoaXMubW9iaWxlVGVzdGluZ0VuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnTW9iaWxlIFRlc3RpbmcnKTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdFeHRlbnNpb24gVXNlJyk7XG4gICAgICB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0RhdGEgRHJpdmVuJyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIGNvbnN0IHBhdGNoOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgaWYgKGVuYWJsZUFpU21hcnRuZXNzKSBwYXRjaFsnZW5hYmxlQWlTbWFydG5lc3MnXSA9IGVuYWJsZUFpU21hcnRuZXNzO1xuICAgICAgaWYgKGRlZmF1bHRBaUFjdGlvbikgcGF0Y2hbJ2RlZmF1bHRBaUFjdGlvbiddID0gZGVmYXVsdEFpQWN0aW9uO1xuICAgICAgaWYgKGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UpIHBhdGNoWydrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJ10gPSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlO1xuICAgICAgaWYgKHVzZUFpTWV0YWRhdGEpIHBhdGNoWyd1c2VBaU1ldGFkYXRhJ10gPSB1c2VBaU1ldGFkYXRhO1xuICAgICAgaWYgKHByZXJlcXVpc2l0ZUNhc2VzLmxlbmd0aCkgcGF0Y2hbJ3ByZXJlcXVpc2l0ZUNhc2VzJ10gPSBwcmVyZXF1aXNpdGVDYXNlcztcbiAgICAgIGlmICh0eXBlVmFsKSBwYXRjaFsndHlwZSddID0gdHlwZVZhbDtcblxuICAgICAgLy8gUmUtc3luYyBUZXN0IERhdGEgUHJvZmlsZSAvIFNldCBmcm9tIGNvbmZpZyBvbmx5IHdoZW4gY29udHJvbHMgYXJlIE5PVCBkaXJ0eVxuICAgICAgY29uc3QgdGRwQ3RybDIgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk7XG4gICAgICBjb25zdCB0ZHNDdHJsMiA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpO1xuICAgICAgY29uc3QgcHJlc2VydmVUZHAyID0gdGRwQ3RybDI/LmRpcnR5O1xuICAgICAgY29uc3QgcHJlc2VydmVUZHMyID0gdGRzQ3RybDI/LmRpcnR5O1xuXG4gICAgICBpZiAodGVzdERhdGFQcm9maWxlVmFsICYmICFwcmVzZXJ2ZVRkcDIpIHBhdGNoWyd0ZXN0RGF0YVByb2ZpbGUnXSA9IHRlc3REYXRhUHJvZmlsZVZhbDtcbiAgICAgIGlmICh0ZXN0RGF0YVNldFZhbCAhPSBudWxsICYmIHRlc3REYXRhU2V0VmFsICE9PSAnJyAmJiAhcHJlc2VydmVUZHMyKSBwYXRjaFsndGVzdERhdGFTZXQnXSA9IHRlc3REYXRhU2V0VmFsO1xuICAgICAgaWYgKGRlZmF1bHRCcm93c2VyKSBwYXRjaFsnZGVmYXVsdEJyb3dzZXInXSA9IGRlZmF1bHRCcm93c2VyO1xuICAgICAgaWYgKHZpZGVvUmVjb3JkaW5nKSBwYXRjaFsndmlkZW9SZWNvcmRpbmcnXSA9IHZpZGVvUmVjb3JkaW5nO1xuICAgICAgaWYgKGRlZmF1bHRWaWV3cG9ydCkgcGF0Y2hbJ2RlZmF1bHRWaWV3cG9ydCddID0gZGVmYXVsdFZpZXdwb3J0O1xuICAgICAgaWYgKGRldmljZVR5cGUpIHBhdGNoWydkZXZpY2VUeXBlJ10gPSBkZXZpY2VUeXBlO1xuICAgICAgaWYgKGRldmljZU9TKSBwYXRjaFsnZGV2aWNlT1MnXSA9IGRldmljZU9TO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZShwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gdGhpcy5lZGl0TGFiZWxzLmZpbHRlcigobCkgPT4gbCAhPT0gbGFiZWwpO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2xlYXJBbGxMYWJlbHMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gW107XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkFkZEZyZXF1ZW50TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKGxhYmVsKSkge1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgbGFiZWxdO1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUodGhpcy5lZGl0TGFiZWxzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXR1cycpPy52YWx1ZSA/PyB0aGlzLmVkaXRTdGF0dXM7XG4gICAgY29uc3QgcHJpb3JpdHkgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJpb3JpdHknKT8udmFsdWUgPz8gdGhpcy5lZGl0UHJpb3JpdHk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFTZXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnMoKTtcbiAgICBjb25zdCBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk7XG4gICAgdGhpcy5zYXZlLmVtaXQoe1xuICAgICAgZGVzY3JpcHRpb25Db250ZW50OiB0aGlzLmVkaXREZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1cyxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgdHlwZTogdHlwZVZhbCxcbiAgICAgIGxhYmVsczogdGhpcy5lZGl0TGFiZWxzLFxuICAgICAgdGVzdERhdGFQcm9maWxlSWQ6IHRlc3REYXRhUHJvZmlsZVZhbCB8fCBudWxsLFxuICAgICAgdGVzdERhdGFTZXRJbmRleDogdGVzdERhdGFTZXRWYWwgPz8gbnVsbCxcbiAgICAgIGNvbmZpZ1NlY3Rpb25zOiBjb25maWdTZWN0aW9uc01lcmdlZCxcbiAgICAgIGNvbmZpZ1NlY3Rpb25zUm93MjogY29uZmlnU2VjdGlvbnNSb3cyTWVyZ2VkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndmlkZW9SZWNvcmRpbmcnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB2aWRlb1JlY29yZGluZ1ZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogdmlkZW9SZWNvcmRpbmdWYWx1ZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdmlkZW9SZWNvcmRpbmdWYWx1ZTtcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndXNlQWlNZXRhZGF0YScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdXNlQWlNZXRhZGF0YVZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogdXNlQWlNZXRhZGF0YVZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB1c2VBaU1ldGFkYXRhVmFsdWU7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXNSYXcgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJlcmVxdWlzaXRlQ2FzZXMnKT8udmFsdWU7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSBBcnJheS5pc0FycmF5KHByZXJlcXVpc2l0ZUNhc2VzUmF3KVxuICAgICAgPyBwcmVyZXF1aXNpdGVDYXNlc1Jhdy5tYXAoKHYpID0+IFN0cmluZyh2KSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICA6IHByZXJlcXVpc2l0ZUNhc2VzUmF3ICE9IG51bGwgJiYgcHJlcmVxdWlzaXRlQ2FzZXNSYXcgIT09ICcnXG4gICAgICAgID8gW1N0cmluZyhwcmVyZXF1aXNpdGVDYXNlc1JhdyldXG4gICAgICAgIDogW107XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZVZhbHVlID0gcHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoID8gcHJlcmVxdWlzaXRlQ2FzZXMuam9pbignLCcpIDogbnVsbDtcbiAgICBjb25zdCB0eXBlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpPy52YWx1ZSA/PyAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWdTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRXhlY3V0aW9uJykge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHNlY3Rpb24uaXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAhKHBsYXRmb3JtID09PSAnd2ViJyAmJiBpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBCcm93c2VyJykpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdWaWRlbyBSZWNvcmRpbmcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdmlkZW9SZWNvcmRpbmcgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogcHJlcmVxdWlzaXRlQ2FzZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1R5cGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdHlwZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1Rlc3QgRGF0YSBQcm9maWxlJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRlc3REYXRhUHJvZmlsZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1Rlc3QgRGF0YSBTZXQnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFTZXRWYWx1ZSB9O1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0FJIENvbmZpZ3VyYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyA/IHsgLi4uaXRlbSwgdmFsdWU6IHVzZUFpTWV0YWRhdGEgfSA6IGl0ZW1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10ge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcbiAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QnJvd3NlcicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdFZpZXdwb3J0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGV2aWNlVHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VPUycpPy52YWx1ZSA/PyAnJztcblxuICAgIGxldCByZXN1bHQgPSB0aGlzLmNvbmZpZ1NlY3Rpb25zUm93Mi5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnV2FpdHMgJiBSZXRyaWVzJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnV2FpdCBhbmQgcmV0cmllcycpIHtcbiAgICAgICAgY29uc3QgYXV0b1dhaXRWYWx1ZSA9IHRoaXMuYXV0b1dhaXRFbmFibGVkID8gJ0VuYWJsZWQnIDogJyc7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0F1dG8gV2FpdCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiBhdXRvV2FpdFZhbHVlIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0aGlzLmF1dG9XYWl0RW5hYmxlZCB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUmV0cnkgRmFpbGVkIFN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuZW1wdHlOdW1Ub1plcm8odGhpcy5yZXRyeUZhaWxlZFN0ZXBzKSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuZW1wdHlOdW1Ub1plcm8odGhpcy50ZXN0Q2FzZVRpbWVvdXQpIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0aGlzLmVtcHR5TnVtVG9aZXJvKHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycykgfTtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0RldmljZScgfHwgc2VjdGlvbi50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJykge1xuICAgICAgICBjb25zdCBpdGVtczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICAgICAgICAuLi4ocGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJywgdmFsdWU6IGRlZmF1bHRCcm93c2VyIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmlld3BvcnQnLCB2YWx1ZTogZGVmYXVsdFZpZXdwb3J0IH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdUeXBlJywgdmFsdWU6IGRldmljZVR5cGUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnT1MnLCB2YWx1ZTogZGV2aWNlT1MgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdEZXZpY2UnIHx8IHMudGl0bGUgPT09ICdEZXZpY2UgU2V0dGluZycpO1xuICAgIGlmICghZXhpc3RpbmdEZXZpY2UpIHtcbiAgICAgIGNvbnN0IGRldmljZVNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24gPSB7XG4gICAgICAgIHRpdGxlOiAnRGV2aWNlJyxcbiAgICAgICAgaWNvbjogJ2RldmljZXMnLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBkZXZpY2VTZWN0aW9uXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlGbGFnc1NlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24gPSB7XG4gICAgICB0aXRsZTogJ0tleSBGbGFncycsXG4gICAgICBpY29uOiAnZmxhZycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7IGxhYmVsOiAnTW9iaWxlIFRlc3RpbmcnLCB2YWx1ZTogdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFeHRlbnNpb24gVXNlJywgdmFsdWU6IHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEYXRhIERyaXZlbicsIHZhbHVlOiB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBjb25zdCBleGlzdGluZ0tleUZsYWdzID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdLZXkgRmxhZ3MnKTtcbiAgICBpZiAoZXhpc3RpbmdLZXlGbGFncykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocykgPT5cbiAgICAgICAgcy50aXRsZSA9PT0gJ0tleSBGbGFncycgPyBrZXlGbGFnc1NlY3Rpb24gOiBzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBrZXlGbGFnc1NlY3Rpb25dO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgdHJhY2tCeUxhYmVsKF9pOiBudW1iZXIsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGxhYmVscyB1c2UgY29uc2lzdGVudCBpbmRpZ28gc3R5bGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9DSElQX1NUWUxFID0ge1xuICAgIGJnOiAnIzYzNjZGMScsXG4gICAgYm9yZGVyOiAnIzYzNjZGMScsXG4gICAgdGV4dDogJyNGRkZGRkYnLFxuICAgIGljb246ICcjRkZGRkZGJyxcbiAgfTtcblxuICBnZXRDdXJyZW50TGFiZWxDaGlwU3R5bGUoX2xhYmVsOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLkxBQkVMX0NISVBfU1RZTEU7XG4gICAgcmV0dXJuIHtcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3JzLmJnLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IGNvbG9ycy5ib3JkZXIsXG4gICAgICAnYm9yZGVyLXdpZHRoJzogJzFweCcsXG4gICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgIGNvbG9yOiBjb2xvcnMudGV4dCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TGFiZWxDbG9zZUljb25Db2xvcihfbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuTEFCRUxfQ0hJUF9TVFlMRS5pY29uO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLXB5LTRcIj5cbiAgPCEtLSBCYXNpYyBkZXRhaWxzOiBEZXNjcmlwdGlvbiwgU3RhdHVzL1ByaW9yaXR5L1R5cGUsIExhYmVscyAobGlnaHQgYmFja2dyb3VuZCBjb250YWluZXIpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLWJnLVsjRjhGOUZFXSBjcWEtcC00XCI+XG4gIDwhLS0gRGVzY3JpcHRpb24gKEZpZ21hOiBkb2N1bWVudCBpY29uLCB0ZXh0YXJlYSB3aXRoIGxpZ2h0IHB1cnBsZSBiZykgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGRlc2NyaXB0aW9uVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgIFt2YWx1ZV09XCJlZGl0RGVzY3JpcHRpb25cIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImVkaXREZXNjcmlwdGlvbiA9ICRldmVudFwiXG4gICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgW3Jvd3NdPVwiNFwiXG4gICAgICBbZW5hYmxlTWFya2Rvd25dPVwiZW5hYmxlTWFya2Rvd25cIlxuICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBkZXNjcmlwdGlvbi4uLlwiXG4gICAgICB0ZXh0YXJlYUlubGluZVN0eWxlPVwicGFkZGluZzogMTJweDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMTAwJVwiXG4gICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RhdHVzLCBQcmlvcml0eSAmIFR5cGUgKEZpZ21hOiBzaWRlLWJ5LXNpZGUgZHJvcGRvd25zLCBjcWEtZHluYW1pYy1zZWxlY3QpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtNFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+U3RhdHVzPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3N0YXR1cycsIHN0YXR1c1NlbGVjdENvbmZpZylcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdzdGF0dXMnKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+UHJpb3JpdHk8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJpb3JpdHknLCBwcmlvcml0eVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdwcmlvcml0eScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5UeXBlPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3R5cGUnLCB0eXBlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3R5cGUnKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMYWJlbHMgKEZpZ21hOiBDdXJyZW50IExhYmVscyB3aXRoIENsZWFyIEFsbCwgY3FhLWJhZGdlIHdpdGggeCwgRnJlcXVlbnRseSB1c2VkLCBTZWFyY2gpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtWzE1cHhdIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPkN1cnJlbnQgTGFiZWxzICh7eyBlZGl0TGFiZWxzLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImVkaXRMYWJlbHMubGVuZ3RoID4gMFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyNEQzI2MjZdIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWZvbnQtbm9ybWFsXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xlYXJBbGxMYWJlbHMoKVwiPlxuICAgICAgICBDbGVhciBBbGxcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtMlwiICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBlZGl0TGFiZWxzOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIlxuICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC0yLjUgY3FhLXB5LTEgY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRDdXJyZW50TGFiZWxDaGlwU3R5bGUobGFiZWwpXCI+XG4gICAgICAgIDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy0zLjUgY3FhLWgtMy41IGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldExhYmVsQ2xvc2VJY29uQ29sb3IobGFiZWwpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmVMYWJlbChsYWJlbClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSAnICsgbGFiZWxcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLXctMy41IGNxYS1oLTMuNVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+RnJlcXVlbnRseSB1c2VkPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgZnJlcXVlbnRseVVzZWRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJvbkFkZEZyZXF1ZW50TGFiZWwobGFiZWwpXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9XCIjRThFOUZGXCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cIiMzRjQzRUVcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRThFOUZGXCI+XG4gICAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPkFkZCBsYWJlbHM8L2xhYmVsPlxuICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgIFtjb25maWddPVwibGFiZWxzU2VsZWN0Q29uZmlnXCJcbiAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2xhYmVscycpXCJcbiAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoYWRkQ3VzdG9tVmFsdWUpPVwib25MYWJlbHNBZGRDdXN0b21WYWx1ZSgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDb25maWd1cmF0aW9uIChGaWdtYTogY29sbGFwc2libGUsIGdlYXIgaWNvbiwgbGlnaHQgYmFja2dyb3VuZCBjb250YWluZXIpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTJweF0gY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOEY5RkVdIGNxYS1wLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXRleHQtbGVmdCBjcWEtdy1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzE5LjVweF1cIj57eyBjb25maWdUaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJjb25maWdFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNSBjcWEtdGV4dC14c1wiPlxuICAgICAgPCEtLSBFeGVjdXRpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTQgY3FhLW1iLTQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJleGVjdXRpb25FeHBhbmRlZCA9ICFleGVjdXRpb25FeHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5wbGF5X2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+RXhlY3V0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IGV4ZWN1dGlvbkV4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImV4ZWN1dGlvbkV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJoYXNQcmVyZXF1aXNpdGVDYXNlQ29uZmlnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPiBcbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdwcmVyZXF1aXNpdGVDYXNlcycsIHByZXJlcXVpc2l0ZUNhc2VTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgncHJlcmVxdWlzaXRlQ2FzZXMnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBQcm9maWxlPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCd0ZXN0RGF0YVByb2ZpbGUnLCB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFQcm9maWxlJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzY4NzM4OV0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtXCI+VGVzdCBEYXRhIFNldDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndGVzdERhdGFTZXQnLCB0ZXN0RGF0YVNldFNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd0ZXN0RGF0YVNldCcpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5WaWRlbyBSZWNvcmRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ZpZGVvUmVjb3JkaW5nJywgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndmlkZW9SZWNvcmRpbmcnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEFJIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTQgY3FhLW1iLTQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJhaUNvbmZpZ0V4cGFuZGVkID0gIWFpQ29uZmlnRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+c21hcnRfdG95PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5BSSBDb25maWd1cmF0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IGFpQ29uZmlnRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWlDb25maWdFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtcHktMCBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZW5hYmxlQWlTbWFydG5lc3MnLCBlbmFibGVBaVNtYXJ0bmVzc1NlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdlbmFibGVBaVNtYXJ0bmVzcycpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdkZWZhdWx0QWlBY3Rpb24nLCBkZWZhdWx0QWlBY3Rpb25TZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZGVmYXVsdEFpQWN0aW9uJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndXNlQWlNZXRhZGF0YScsIGFpTWV0YWRhdGFDb2xsZWN0aW9uU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3VzZUFpTWV0YWRhdGEnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFdhaXRzICYgUmV0cmllcy0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwid2FpdHNSZXRyaWVzRXhwYW5kZWQgPSAhd2FpdHNSZXRyaWVzRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+dGltZXI8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPldhaXQgYW5kIFJldHJpZXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAge3sgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwid2FpdHNSZXRyaWVzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiYXV0b1dhaXRFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiYXV0b1dhaXRFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiRW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHNcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJSZXRyeSBGYWlsZWQgU3RlcHNcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwicmV0cnlGYWlsZWRTdGVwc1wiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyZXRyeUZhaWxlZFN0ZXBzID0gb25seURpZ2l0cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcbiAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgbGFiZWxJbmxpbmVTdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlc3RDYXNlVGltZW91dFwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ0ZXN0Q2FzZVRpbWVvdXQgPSBvbmx5RGlnaXRzKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjMwXCJcbiAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgbGFiZWxJbmxpbmVTdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyAoc2VjKVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJ3YWl0VGltZW91dExvY2F0b3JzXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIndhaXRUaW1lb3V0TG9jYXRvcnMgPSBvbmx5RGlnaXRzKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjE1XCJcbiAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgbGFiZWxJbmxpbmVTdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInBsYXRmb3JtICE9PSAnbW9iaWxlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTQgY3FhLW1iLTQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJkZXZpY2VFeHBhbmRlZCA9ICFkZXZpY2VFeHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXZpY2VzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5EZXZpY2UgU2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAge3sgZGV2aWNlRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV2aWNlRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDwhLS0gV2ViIG9ubHk6IG1vYmlsZSBEZXZpY2UgU2V0dGluZ3MgaGlkZGVuIHRlbXBvcmFyaWx5IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2RlZmF1bHRCcm93c2VyJywgZGVmYXVsdEJyb3dzZXJTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZGVmYXVsdEJyb3dzZXInKVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2RlZmF1bHRWaWV3cG9ydCcsIGRlZmF1bHRWaWV3cG9ydFNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0Vmlld3BvcnQnKVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBLZXkgRmxhZ3MgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTQgY3FhLW1iLTAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJrZXlGbGFnc0V4cGFuZGVkID0gIWtleUZsYWdzRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+ZmxhZzwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+S2V5IEZsYWdzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IGtleUZsYWdzRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwia2V5RmxhZ3NFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwibW9iaWxlVGVzdGluZ0VuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJtb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIk1vYmlsZSBUZXN0aW5nXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPk1vYmlsZSBUZXN0aW5nPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiZXh0ZW5zaW9uVXNlRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImV4dGVuc2lvblVzZUVuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJFeHRlbnNpb24gVXNlXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4dGVuc2lvbiBVc2U8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJkYXRhRHJpdmVuRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImRhdGFEcml2ZW5FbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiRGF0YSBEcml2ZW5cIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RGF0YSBEcml2ZW48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTMgY3FhLXB0LTIgY3FhLXctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICBbdGV4dF09XCInQ2FuY2VsJ1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgKm5nSWY9XCIhaXNTYXZpbmdcIlxuICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgW3RleHRdPVwiJ1NhdmUgQ2hhbmdlcydcIlxuICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblNhdmUoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImlzU2F2aW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICBsYWJlbD1cIlNhdmluZ+KAplwiXG4gICAgICAgICAgaWNvbj1cImF1dG9yZW5ld1wiXG4gICAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgICBzaXplPVwibWVkaXVtXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=