@cqa-lib/cqa-ui 1.1.362 → 1.1.364
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/execution-screen/ai-action-step/ai-action-step.component.mjs +3 -1
- package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +3 -2
- package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +5 -2
- package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +5 -2
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +2 -2
- package/esm2020/lib/execution-screen/document-verification-step/document-verification-step.component.mjs +4 -1
- package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +4 -1
- package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +21 -4
- package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +1 -1
- package/esm2020/lib/execution-screen/step-renderer/step-renderer.component.mjs +25 -2
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +29 -4
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +121 -11
- package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +21 -6
- package/esm2020/lib/test-case-details/ai-agent-step/ai-agent-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/ai-verify-step/ai-verify-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/api-step/api-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/custom-code-step/custom-code-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/database-step/database-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/restore-session-step/restore-session-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/screenshot-step/screenshot-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/scroll-step/scroll-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +3 -3
- package/esm2020/lib/test-case-details/upload-step/upload-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/verify-url-step/verify-url-step.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +260 -50
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +255 -50
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/execution-screen/loop-step/loop-step.component.d.ts +4 -1
- package/lib/execution-screen/step-renderer/step-renderer.component.d.ts +3 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +7 -1
- package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +23 -1
- package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +2 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -25,6 +25,8 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
25
25
|
this.editStep = new EventEmitter();
|
|
26
26
|
this.addStepOptionSelect = new EventEmitter();
|
|
27
27
|
this.stepMoreOptionSelect = new EventEmitter();
|
|
28
|
+
/** Emitted when user clicks "+ Add step inside loop" (debug only). Payload is the loop step so parent can open Add Step modal at any nesting level. */
|
|
29
|
+
this.addStepInsideLoop = new EventEmitter();
|
|
28
30
|
this.addStepMenuOptions = DEFAULT_ADD_STEP_MENU_OPTIONS;
|
|
29
31
|
this.stepMoreMenuOptions = DEFAULT_STEP_MORE_MENU_OPTIONS;
|
|
30
32
|
this.downloadingStepId = null;
|
|
@@ -275,6 +277,9 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
275
277
|
if (changes['stepDeleted'] && this.config) {
|
|
276
278
|
this.config.stepDeleted = changes['stepDeleted'].currentValue;
|
|
277
279
|
}
|
|
280
|
+
if (changes['stepNumber'] && this.config) {
|
|
281
|
+
this.config.stepNumber = changes['stepNumber'].currentValue;
|
|
282
|
+
}
|
|
278
283
|
if (changes['expanded'] && this.expanded !== undefined) {
|
|
279
284
|
console.log('expanded changed in loop-step', this.id, changes['expanded']);
|
|
280
285
|
this.isExpanded = this.expanded;
|
|
@@ -551,6 +556,11 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
551
556
|
event.preventDefault();
|
|
552
557
|
this.onViewAllIterations.emit();
|
|
553
558
|
}
|
|
559
|
+
onAddStepInsideLoop(event) {
|
|
560
|
+
event.preventDefault();
|
|
561
|
+
event.stopPropagation();
|
|
562
|
+
this.addStepInsideLoop.emit(this.step ?? this.config);
|
|
563
|
+
}
|
|
554
564
|
onViewMoreFailedStepClick(expanded) {
|
|
555
565
|
this.showFailedStepDetails = expanded;
|
|
556
566
|
}
|
|
@@ -587,7 +597,12 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
587
597
|
onEditStep(event) {
|
|
588
598
|
event.preventDefault();
|
|
589
599
|
event.stopPropagation();
|
|
590
|
-
this.
|
|
600
|
+
if (this.onEditStepHandler && this.step) {
|
|
601
|
+
this.onEditStepHandler(this.step);
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
this.editStep.emit();
|
|
605
|
+
}
|
|
591
606
|
}
|
|
592
607
|
onAddStepOptionSelect(option, event) {
|
|
593
608
|
event.preventDefault();
|
|
@@ -1098,10 +1113,10 @@ export class LoopStepComponent extends BaseStepComponent {
|
|
|
1098
1113
|
}
|
|
1099
1114
|
}
|
|
1100
1115
|
LoopStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LoopStepComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
1101
|
-
LoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LoopStepComponent, selector: "cqa-loop-step", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", duration: "duration", timingBreakdown: "timingBreakdown", expanded: "expanded", loopType: "loopType", iterations: "iterations", selectedIterationId: "selectedIterationId", defaultIteration: "defaultIteration", nestedSteps: "nestedSteps", showViewAllIterations: "showViewAllIterations", hasChild: "hasChild", isLive: "isLive", isLoading: "isLoading", stepDeleted: "stepDeleted", isDebug: "isDebug", debugPointSet: "debugPointSet", parentSkipped: "parentSkipped", getDebugPointSetHandler: "getDebugPointSetHandler", onDebugPointChangeHandler: "onDebugPointChangeHandler", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions", onExpandHandler: "onExpandHandler", onEditStepHandler: "onEditStepHandler", onAddStepOptionSelectHandler: "onAddStepOptionSelectHandler", onStepMoreOptionSelectHandler: "onStepMoreOptionSelectHandler", getAddStepMenuOptionsForNested: "getAddStepMenuOptionsForNested", getStepMoreMenuOptionsForNested: "getStepMoreMenuOptionsForNested", getConditionBranchesHandler: "getConditionBranchesHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", step: "step", failureDetails: "failureDetails", reasoning: "reasoning", confidence: "confidence", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selfHealAnalysis: "selfHealAnalysis", iterationData: "iterationData" }, outputs: { debugPointChange: "debugPointChange", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", makeCurrentBaseline: "makeCurrentBaseline", uploadBaseline: "uploadBaseline", analyze: "analyze", viewFullLogs: "viewFullLogs", selfHealAction: "selfHealAction", onExpand: "onExpand", onViewAllIterations: "onViewAllIterations", onIterationChange: "onIterationChange" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, viewQueries: [{ propertyName: "addStepMenuTrigger", first: true, predicate: ["addStepMenuTrigger"], descendants: true }, { propertyName: "stepMoreMenuTrigger", first: true, predicate: ["stepMoreMenuTrigger"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <!-- <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button> -->\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"stepNumber + '.' + (i + 1)\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n", components: [{ type: i1.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: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i4.AiLogsWithReasoningComponent, selector: "cqa-ai-logs-with-reasoning", inputs: ["status", "text", "description", "reasoning", "duration"] }, { type: i5.StepRendererComponent, selector: "cqa-step-renderer", inputs: ["step", "onExpandHandler", "getConditionBranchesHandler", "isStepLoadingHandler", "isStepExpandedHandler", "convertMsToSecondsHandler", "formatFailureDetailsHandler", "getSelfHealAnalysisHandler", "onMakeCurrentBaselineHandler", "onUploadBaselineHandler", "onAnalyzeHandler", "onViewFullLogsHandler", "onSelfHealActionHandler", "getSelfHealLoadingStatesHandler", "isUploadingBaseline", "isMakingCurrentBaseline", "selectedIterationId", "getLoopIterationsHandler", "getApiAssertionsHandler", "formatActionsHandler", "onViewAllIterationsHandler", "onConditionBranchClickHandler", "onStepClickHandler", "onJsonPathCopiedHandler", "onDownloadHandler", "onFilePathCopiedHandler", "onTextCopiedHandler", "jumpToTimestampHandler", "downloadingStepId", "isLive", "isDebug", "debugPointSet", "getDebugPointSetHandler", "onDebugPointChangeHandler", "onEditStepHandler", "addStepMenuOptions", "onAddStepOptionSelectHandler", "stepMoreMenuOptions", "onStepMoreOptionSelectHandler", "getAddStepMenuOptionsForNested", "getStepMoreMenuOptionsForNested", "stepNumber", "parentSkipped"], outputs: ["addStepOptionSelect", "stepMoreOptionSelect", "componentReady"] }, { type: i6.SelfHealAnalysisComponent, selector: "cqa-self-heal-analysis", inputs: ["id", "originalLocator", "healedLocator", "confidence", "healMethod", "isLoadingAccept", "isLoadingModifyAccept"], outputs: ["action"] }, { type: i7.ViewMoreFailedStepButtonComponent, selector: "cqa-view-more-failed-step-button", inputs: ["timingBreakdown", "subSteps", "failureDetails", "isExpanded"], outputs: ["viewMoreClick"] }, { type: i8.UpdatedFailedStepComponent, selector: "cqa-updated-failed-step", inputs: ["timingBreakdown", "testStepResultId", "expanded", "subSteps", "failureDetails", "reasoning", "confidence", "isUploadingBaseline", "isMakingCurrentBaseline", "isLive"], outputs: ["makeCurrentBaseline", "uploadBaseline", "analyze", "viewFullLogs"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
|
|
1116
|
+
LoopStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LoopStepComponent, selector: "cqa-loop-step", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", duration: "duration", timingBreakdown: "timingBreakdown", expanded: "expanded", loopType: "loopType", iterations: "iterations", selectedIterationId: "selectedIterationId", defaultIteration: "defaultIteration", nestedSteps: "nestedSteps", showViewAllIterations: "showViewAllIterations", hasChild: "hasChild", isLive: "isLive", isLoading: "isLoading", stepDeleted: "stepDeleted", isDebug: "isDebug", debugPointSet: "debugPointSet", parentSkipped: "parentSkipped", getDebugPointSetHandler: "getDebugPointSetHandler", onDebugPointChangeHandler: "onDebugPointChangeHandler", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions", onExpandHandler: "onExpandHandler", onEditStepHandler: "onEditStepHandler", onAddStepOptionSelectHandler: "onAddStepOptionSelectHandler", onStepMoreOptionSelectHandler: "onStepMoreOptionSelectHandler", getAddStepMenuOptionsForNested: "getAddStepMenuOptionsForNested", getStepMoreMenuOptionsForNested: "getStepMoreMenuOptionsForNested", getConditionBranchesHandler: "getConditionBranchesHandler", onConditionBranchClickHandler: "onConditionBranchClickHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", getSelfHealLoadingStatesHandler: "getSelfHealLoadingStatesHandler", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", onStepClickHandler: "onStepClickHandler", onJsonPathCopiedHandler: "onJsonPathCopiedHandler", onDownloadHandler: "onDownloadHandler", onFilePathCopiedHandler: "onFilePathCopiedHandler", onTextCopiedHandler: "onTextCopiedHandler", jumpToTimestampHandler: "jumpToTimestampHandler", downloadingStepId: "downloadingStepId", step: "step", failureDetails: "failureDetails", reasoning: "reasoning", confidence: "confidence", isUploadingBaseline: "isUploadingBaseline", isMakingCurrentBaseline: "isMakingCurrentBaseline", selfHealAnalysis: "selfHealAnalysis", iterationData: "iterationData" }, outputs: { debugPointChange: "debugPointChange", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect", addStepInsideLoop: "addStepInsideLoop", makeCurrentBaseline: "makeCurrentBaseline", uploadBaseline: "uploadBaseline", analyze: "analyze", viewFullLogs: "viewFullLogs", selfHealAction: "selfHealAction", onExpand: "onExpand", onViewAllIterations: "onViewAllIterations", onIterationChange: "onIterationChange" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, viewQueries: [{ propertyName: "addStepMenuTrigger", first: true, predicate: ["addStepMenuTrigger"], descendants: true }, { propertyName: "stepMoreMenuTrigger", first: true, predicate: ["stepMoreMenuTrigger"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"stepNumber + '.' + (i + 1)\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (addStepInsideLoop)=\"addStepInsideLoop.emit($event)\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- + Add step inside loop (debug only) -->\n <div *ngIf=\"isDebug\" class=\"cqa-ml-9 cqa-py-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <button type=\"button\" (click)=\"onAddStepInsideLoop($event)\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-p-0 cqa-no-underline hover:cqa-opacity-90 focus:cqa-outline-none\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 2V12M2 7H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <span>Add step inside loop</span>\n </button>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n", components: [{ type: i1.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: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i4.AiLogsWithReasoningComponent, selector: "cqa-ai-logs-with-reasoning", inputs: ["status", "text", "description", "reasoning", "duration"] }, { type: i5.StepRendererComponent, selector: "cqa-step-renderer", inputs: ["step", "onExpandHandler", "getConditionBranchesHandler", "isStepLoadingHandler", "isStepExpandedHandler", "convertMsToSecondsHandler", "formatFailureDetailsHandler", "getSelfHealAnalysisHandler", "onMakeCurrentBaselineHandler", "onUploadBaselineHandler", "onAnalyzeHandler", "onViewFullLogsHandler", "onSelfHealActionHandler", "getSelfHealLoadingStatesHandler", "isUploadingBaseline", "isMakingCurrentBaseline", "selectedIterationId", "getLoopIterationsHandler", "getApiAssertionsHandler", "formatActionsHandler", "onViewAllIterationsHandler", "onConditionBranchClickHandler", "onStepClickHandler", "onJsonPathCopiedHandler", "onDownloadHandler", "onFilePathCopiedHandler", "onTextCopiedHandler", "jumpToTimestampHandler", "downloadingStepId", "isLive", "isDebug", "debugPointSet", "getDebugPointSetHandler", "onDebugPointChangeHandler", "onEditStepHandler", "addStepMenuOptions", "onAddStepOptionSelectHandler", "stepMoreMenuOptions", "onStepMoreOptionSelectHandler", "getAddStepMenuOptionsForNested", "getStepMoreMenuOptionsForNested", "stepNumber", "parentSkipped"], outputs: ["addStepOptionSelect", "stepMoreOptionSelect", "addStepInsideLoop", "componentReady"] }, { type: i6.SelfHealAnalysisComponent, selector: "cqa-self-heal-analysis", inputs: ["id", "originalLocator", "healedLocator", "confidence", "healMethod", "isLoadingAccept", "isLoadingModifyAccept"], outputs: ["action"] }, { type: i7.ViewMoreFailedStepButtonComponent, selector: "cqa-view-more-failed-step-button", inputs: ["timingBreakdown", "subSteps", "failureDetails", "isExpanded"], outputs: ["viewMoreClick"] }, { type: i8.UpdatedFailedStepComponent, selector: "cqa-updated-failed-step", inputs: ["timingBreakdown", "testStepResultId", "expanded", "subSteps", "failureDetails", "reasoning", "confidence", "isUploadingBaseline", "isMakingCurrentBaseline", "isLive"], outputs: ["makeCurrentBaseline", "uploadBaseline", "analyze", "viewFullLogs"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
|
|
1102
1117
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LoopStepComponent, decorators: [{
|
|
1103
1118
|
type: Component,
|
|
1104
|
-
args: [{ selector: 'cqa-loop-step', host: { class: 'cqa-ui-root cqa-w-full' }, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <!-- <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button> -->\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"stepNumber + '.' + (i + 1)\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n" }]
|
|
1119
|
+
args: [{ selector: 'cqa-loop-step', host: { class: 'cqa-ui-root cqa-w-full' }, template: "<div class=\"cqa-font-inter cqa-w-full\" [class.cqa-opacity-50]=\"isDebug && isSkipped && !parentSkipped\" [style.background-color]=\"!isDebug ? null : status.toLowerCase() === 'paused' ? '#FFF9E9' : status.toLowerCase() === 'failed' ? '#FEF2F2' : null\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggleHeader($event)\">\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\"\n [matTooltip]=\"status.toLowerCase() === 'running' ? 'Breakpoint cannot be set on a running step' : (isStepDeleted ? 'Breakpoint cannot be set on deleted steps' : ((!!parentSkipped && !step?.debugPointDisabled) ? 'Breakpoint cannot be set on a running step' : (!!step?.debugPointDisabled ? 'Breakpoint cannot be set on skipped steps' : '')))\"\n matTooltipPosition=\"right\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-rounded-full cqa-transition-opacity focus:cqa-outline-none\"\n [ngClass]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? 'cqa-cursor-not-allowed cqa-opacity-40 cqa-pointer-events-none' : 'cqa-cursor-pointer hover:cqa-opacity-80'\"\n [disabled]=\"status.toLowerCase() === 'running' || !!step?.debugPointDisabled || !!parentSkipped || isStepDeleted\"\n (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.fill]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" [attr.stroke]=\"!!step?.debugPointDisabled || !!parentSkipped || isStepDeleted ? '#9E9E9E' : '#C63535'\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#3B82F6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n \n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n <div *ngIf=\"status.toLowerCase() === 'paused'\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.5 2H7.5C7.22386 2 7 2.22386 7 2.5V9.5C7 9.77614 7.22386 10 7.5 10H8.5C8.77614 10 9 9.77614 9 9.5V2.5C9 2.22386 8.77614 2 8.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 2H3.5C3.22386 2 3 2.22386 3 2.5V9.5C3 9.77614 3.22386 10 3.5 10H4.5C4.77614 10 5 9.77614 5 9.5V2.5C5 2.22386 4.77614 2 4.5 2Z\" stroke=\"#E17100\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n </div>\n\n <!-- Loop Icon -->\n <div><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#EBECFD\"/><path d=\"M9.66663 4.66666L11 5.99999L9.66663 7.33332\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M5 7.66667V7.33333C5 6.97971 5.14048 6.64057 5.39052 6.39052C5.64057 6.14048 5.97971 6 6.33333 6H11\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6.33333 11.3333L5 9.99999L6.33333 8.66666\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 8.33334V8.66668C11 9.0203 10.8595 9.35944 10.6095 9.60949C10.3594 9.85953 10.0203 10 9.66667 10H5\" stroke=\"#3F43EE\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-flex-1 cqa-flex cqa-items-center cqa-gap-3 cqa-font-inter\">\n <span class=\"cqa-font-semibold cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px]\" style=\"word-break: break-word;\">\n {{ config?.stepNumber }}. <span [innerHTML]=\"config?.title\"></span>\n </span>\n \n <!-- Loop Type Badges -->\n <span *ngFor=\"let badge of getLoopTypeBadges()\" \n class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-primary cqa-bg-[#EBECFD] cqa-text-[10px] cqa-leading-[15px]\">\n {{ badge }}\n </span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <!-- Step Change Badges (debug only) -->\n <ng-container *ngIf=\"isDebug\">\n <ng-container *ngFor=\"let badge of stepBadges\">\n <cqa-badge\n *ngIf=\"badge === 'skipped'\"\n label=\"Skipped\"\n size=\"small\"\n [textColor]=\"'#4A5565'\"\n [borderColor]=\"'#99A1AF'\"\n [backgroundColor]=\"'#FFFFFF'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'edited'\"\n label=\"Edited\"\n size=\"small\"\n [textColor]=\"'#FBBF24'\"\n [borderColor]=\"'#FDDF92'\"\n [backgroundColor]=\"'#FFF9E9'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'added'\"\n label=\"Added\"\n size=\"small\"\n [textColor]=\"'#0DBD7D'\"\n [borderColor]=\"'#5ED3A8'\"\n [backgroundColor]=\"'#CFF2E5'\">\n </cqa-badge>\n <cqa-badge\n *ngIf=\"badge === 'removed'\"\n label=\"Removed\"\n size=\"small\"\n [textColor]=\"'#EE3F3F'\"\n [borderColor]=\"'#F47F7F'\"\n [backgroundColor]=\"'#FCD9D9'\">\n </cqa-badge>\n </ng-container>\n </ng-container>\n <span *ngIf=\"selfHealAnalysis\" class=\"cqa-px-1.5 cqa-rounded-full cqa-font-medium cqa-text-[#097E53] cqa-bg-[#CFF2E5] cqa-text-[10px] cqa-leading-[15px] cqa-min-w-max cqa-flex cqa-items-center cqa-gap-[6px]\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <path d=\"M4.50941 0C4.56489 0.0227384 4.58859 0.0782652 4.61131 0.129846C4.62269 0.1599 4.63314 0.190117 4.64329 0.220575C4.64726 0.232247 4.65123 0.243918 4.65532 0.255943C4.70806 0.413005 4.75504 0.571748 4.80229 0.73038C4.81297 0.76619 4.82369 0.801987 4.83442 0.837783C4.88905 1.02004 4.94327 1.2024 4.99719 1.38484C5.00476 1.41047 5.01234 1.43609 5.01992 1.46171C5.04128 1.53395 5.06262 1.60619 5.08383 1.67847C5.12867 1.8312 5.17473 1.98347 5.22378 2.13501C5.22807 2.14827 5.23236 2.16152 5.23677 2.17518C5.3642 2.565 5.54482 2.91437 5.8409 3.21196C5.84823 3.2197 5.85556 3.22744 5.86312 3.23541C5.9895 3.36437 6.15169 3.46771 6.3138 3.55111C6.32206 3.55542 6.33031 3.55974 6.33882 3.56419C6.81587 3.80925 7.38951 3.91704 7.90619 4.0605C8.1326 4.1234 8.3583 4.18829 8.58317 4.25603C8.59897 4.26079 8.61478 4.26554 8.63058 4.27028C8.67784 4.28445 8.725 4.29887 8.77211 4.31347C8.7831 4.31679 8.79408 4.32011 8.80539 4.32353C8.87029 4.34406 8.93239 4.36829 8.98566 4.41027C9.00191 4.44418 9.00191 4.44418 8.99748 4.4781C8.94564 4.52736 8.8942 4.55046 8.82578 4.573C8.816 4.57632 8.80622 4.57965 8.79614 4.58308C8.68061 4.62183 8.56351 4.65575 8.44626 4.68935C8.4222 4.6963 8.39814 4.70326 8.37408 4.71021C8.22571 4.75301 8.07708 4.7949 7.92829 4.83632C7.73232 4.89088 7.53663 4.94634 7.34113 5.00243C7.3091 5.01162 7.27706 5.02078 7.24501 5.02991C7.07671 5.07786 6.90923 5.12753 6.74314 5.18208C6.72937 5.18659 6.71559 5.1911 6.70139 5.19574C6.14511 5.38082 5.7211 5.72609 5.45571 6.23099C5.31263 6.51475 5.22823 6.82161 5.14214 7.12447C5.11884 7.20619 5.09409 7.28745 5.06905 7.36869C5.0494 7.43261 5.0302 7.49663 5.01149 7.56081C5.00926 7.56844 5.00703 7.57608 5.00473 7.58395C4.99394 7.62094 4.98319 7.65793 4.97252 7.69495C4.94519 7.78879 4.91578 7.88187 4.88555 7.97489C4.83191 8.14021 4.7831 8.30674 4.73459 8.4735C4.66144 8.72457 4.66144 8.72457 4.61997 8.84527C4.61721 8.85337 4.61446 8.86147 4.61163 8.86982C4.59649 8.91278 4.58092 8.95233 4.55226 8.9887C4.50867 8.99788 4.50867 8.99788 4.46951 9C4.42473 8.93759 4.39508 8.87711 4.37133 8.80508C4.36787 8.79487 4.36441 8.78466 4.36085 8.77415C4.31684 8.64248 4.27751 8.50946 4.23817 8.37646C4.22916 8.34604 4.22011 8.31564 4.21105 8.28524C4.1436 8.05863 4.07725 7.83174 4.01101 7.60481C3.73507 6.48224 3.73507 6.48224 3.039 5.57466C3.02784 5.56596 3.01669 5.55726 3.00519 5.5483C2.54913 5.19902 1.94834 5.06969 1.39815 4.91813C1.26207 4.88062 1.12605 4.84293 0.990032 4.80523C0.978138 4.80193 0.978138 4.80193 0.966003 4.79857C0.769811 4.74417 0.573674 4.68963 0.378224 4.63283C0.369956 4.63045 0.361688 4.62806 0.353169 4.62561C0.0528989 4.53883 0.0528989 4.53883 0.000646537 4.4781C-0.000831261 4.45054 -0.000831261 4.45054 0.0124689 4.42157C0.0670835 4.3704 0.120077 4.34848 0.19216 4.32619C0.202597 4.32284 0.213034 4.31948 0.223787 4.31603C0.255753 4.30582 0.287788 4.29584 0.319851 4.28592C0.329001 4.28305 0.338151 4.28017 0.347578 4.27722C0.412285 4.25693 0.477225 4.2374 0.542259 4.21809C0.55824 4.21332 0.55824 4.21332 0.574544 4.20846C0.852269 4.12587 1.13181 4.049 1.41126 3.97196C1.6195 3.91455 1.82738 3.85618 2.0346 3.79548C2.04413 3.79271 2.05365 3.78993 2.06346 3.78707C2.5435 3.64696 3.01278 3.44816 3.32274 3.0537C3.32738 3.04785 3.33202 3.042 3.3368 3.03597C3.68197 2.59815 3.81658 2.06572 3.96695 1.54621C4.01643 1.37534 4.06649 1.20464 4.11673 1.03399C4.13064 0.986733 4.14453 0.939471 4.15836 0.892194C4.21394 0.702289 4.27035 0.512642 4.33 0.323864C4.33558 0.306186 4.34114 0.288501 4.34666 0.270807C4.43017 0.00398761 4.43017 0.00398761 4.50941 0Z\" fill=\"#0DBD7D\"/>\n <path d=\"M7.23597 0.554859C7.29024 0.613599 7.30109 0.682631 7.31799 0.757638C7.37436 0.993269 7.43929 1.20993 7.66467 1.34681C7.80371 1.42035 7.96944 1.45381 8.1235 1.48541C8.18854 1.49902 8.24348 1.51709 8.29924 1.55321C8.31181 1.57229 8.31181 1.57229 8.31107 1.60549C8.29814 1.64588 8.28678 1.6589 8.25269 1.68533C8.21543 1.69726 8.21543 1.69726 8.17068 1.70653C8.15375 1.71025 8.13683 1.714 8.11992 1.71779C8.11086 1.7198 8.10181 1.72181 8.09247 1.72388C7.81696 1.78482 7.81696 1.78482 7.57882 1.92273C7.57108 1.92869 7.56333 1.93466 7.55536 1.9408C7.38516 2.08431 7.34916 2.32303 7.29793 2.52301C7.29499 2.53399 7.29206 2.54497 7.28903 2.55629C7.28649 2.56601 7.28395 2.57573 7.28133 2.58575C7.27028 2.61544 7.25881 2.63479 7.23597 2.65754C7.17234 2.66527 7.17234 2.66527 7.14139 2.65754C7.09216 2.62106 7.08114 2.5795 7.06828 2.52365C7.06613 2.51501 7.06398 2.50636 7.06176 2.49745C7.05489 2.46983 7.04824 2.44217 7.04164 2.41449C6.98979 2.19897 6.93126 1.98751 6.72451 1.86118C6.56293 1.77501 6.36646 1.73426 6.18587 1.70136C6.13637 1.69151 6.10802 1.67911 6.07738 1.64012C6.07073 1.60055 6.07073 1.60055 6.07738 1.56098C6.12447 1.51437 6.17402 1.50299 6.23772 1.48891C6.25778 1.48416 6.27784 1.47938 6.29789 1.47456C6.30825 1.47209 6.31861 1.46962 6.32929 1.46707C6.38212 1.45407 6.43443 1.43949 6.48673 1.42462C6.49623 1.42198 6.50573 1.41935 6.51552 1.41663C6.62182 1.38624 6.71356 1.34737 6.79854 1.27836C6.80647 1.27213 6.81439 1.26589 6.82255 1.25946C6.9548 1.14565 6.99974 0.974674 7.04053 0.815134C7.04364 0.803022 7.04675 0.79091 7.04995 0.778432C7.05614 0.754101 7.06222 0.729743 7.06817 0.705359C7.07243 0.688394 7.07243 0.688394 7.07678 0.671086C7.07927 0.660951 7.08175 0.650816 7.08431 0.640373C7.09521 0.608108 7.10952 0.582772 7.12957 0.554859C7.1681 0.536435 7.19515 0.544764 7.23597 0.554859Z\" fill=\"#075F3F\"/>\n <path d=\"M1.79545 6.2471C1.80951 6.24719 1.80951 6.24719 1.82386 6.24729C1.92477 6.25022 1.99304 6.28115 2.06736 6.34601C2.15384 6.43533 2.19377 6.53611 2.1915 6.6565C2.18178 6.75412 2.12158 6.83935 2.04773 6.90533C1.96081 6.97242 1.87313 6.99459 1.76206 6.99149C1.66841 6.98107 1.5803 6.93852 1.51393 6.87451C1.43138 6.76681 1.40725 6.66803 1.41935 6.53537C1.44433 6.43092 1.51637 6.34613 1.6085 6.28666C1.67251 6.25564 1.72399 6.24652 1.79545 6.2471Z\" fill=\"#0DBD7D\"/>\n </svg>\n Self-healed\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-rounded-[4px] cqa-py-0.5 cqa-px-1 cqa-bg-[#6366F11A] cqa-ml-1 cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity\" \n *ngIf=\"step?.executedResult?.video_start_time\" \n [matTooltip]=\"'Jump to video time'\" \n matTooltipPosition=\"below\"\n (click)=\"onJumpToTimestamp($event)\">\n <mat-icon class=\"cqa-text-[#636363] !cqa-text-[10px] !cqa-w-[10px] !cqa-h-[10px]\">\n play_arrow\n </mat-icon>\n <span class=\"cqa-text-[8px] cqa-leading-[12px] cqa-font-normal cqa-text-[#636363]\">\n {{ formatDurationClock(step?.executedResult?.video_start_time || 0) }}\n </span>\n </div>\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button *ngIf=\"!step?.isStepGroupChildren\" type=\"button\" #addStepMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">\n {{ opt.label }}\n </button>\n </mat-menu>\n <button *ngIf=\"effectiveStepMoreMenuOptions.length\" type=\"button\" #stepMoreMenuTrigger=\"matMenuTrigger\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of effectiveStepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n {{ formatDuration(config.duration) }}\n </span>\n <svg [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded\">\n <!-- Iteration Selector -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-4 cqa-py-2 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373]\" *ngIf=\"!isLive || (isLive && config?.iterations !== undefined)\">\n <label>Iteration</label>\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[156px]\">\n <!-- Status indicator for selected iteration -->\n <div *ngIf=\"selectedIteration && config?.iterations && config?.iterations?.length > 0\" class=\"cqa-absolute cqa-left-[10px] cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none cqa-z-10\">\n <svg *ngIf=\"selectedIteration.status === 'success'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#00A63E\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'failed'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#EF4444\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'pending'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#9CA3AF\"/></svg>\n <svg *ngIf=\"selectedIteration.status === 'running'\" width=\"6\" height=\"6\" viewBox=\"0 0 6 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"3\" cy=\"3\" r=\"3\" fill=\"#3B82F6\"/></svg>\n </div>\n <select\n class=\"cqa-pl-[22px] cqa-pr-6 cqa-py-[5px] cqa-w-full cqa-border cqa-border-[#E5E5E5] cqa-rounded-md cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-bg-[#FAFAFA] cqa-text-black-100 cqa-appearance-none\"\n [(ngModel)]=\"selectedIteration\"\n (ngModelChange)=\"handleIterationChange($event)\"\n [compareWith]=\"compareIteration\"\n [disabled]=\"(isLive && (status === 'running' || status === 'RUNNING'))\">\n <option *ngIf=\"!config?.iterations || config?.iterations?.length === 0\" value=\"\" disabled>\n No iterations available\n </option>\n <option *ngFor=\"let iteration of config.iterations\" [ngValue]=\"iteration\">\n {{ getIterationLabel(iteration) }}\n </option>\n </select>\n <!-- Dropdown arrow -->\n <div class=\"cqa-absolute cqa-right-2 cqa-top-1/2 cqa-transform cqa--translate-y-1/2 cqa-pointer-events-none\">\n <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 1L5 5L9 1\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n <span class=\"cqa-ml-auto\" *ngIf=\"config?.iterations && config?.iterations?.length > 0\">\n Default: {{ config.defaultIteration === 'last' ? 'last iteration' : 'first iteration' }}\n </span>\n </div>\n\n <!-- Selected Iteration Sub-steps -->\n <div *ngIf=\"selectedIteration && selectedIteration.subSteps\" class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-py-1 cqa-ml-9\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of (isLive ? processedSubSteps : processedSubStepsForRunResult)\">\n <!-- AI_AUTO_HEAL_SUCCESS/FAILED: render with ai-agent-step style (both live and run result screens) -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"$any(subStep).isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"$any(subStep).text || subStep?.value\"\n [description]=\"$any(subStep).description || subStep?.text || subStep?.value\"\n [reasoning]=\"$any(subStep).reasoning || subStep?.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps -->\n <div\n *ngIf=\"!$any(subStep).isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'success' || subStep?.status?.toLowerCase() === 'passed'\" >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Failure -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'failure' || subStep?.status?.toLowerCase() === 'failed'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 4.5L4.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 4.5L7.5 7.5\" stroke=\"#DC2626\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Pending -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'pending'\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <!-- Running - Show spinner (also used for active WAIT_FOR_LOCATOR countdown in live mode) -->\n <div *ngIf=\"subStep?.status?.toLowerCase() === 'running'\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex cqa-items-center\" *ngIf=\"subStep?.status?.toLowerCase() === 'skipped'\">\n <span class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Sub-step Description -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"white-space: pre-line; word-break: break-word;\">\n {{ $any(subStep).description || $any(subStep).text }}\n <!-- Countdown for active WAIT_FOR_LOCATOR in live mode -->\n <span *ngIf=\"isLive && $any(subStep).remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\">({{ $any(subStep).remainingSeconds }}s remaining)</span>\n </span>\n\n <!-- Sub-step Duration -->\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-metadata-key\">\n {{ formatDuration(subStep.duration) }}\n </span>\n </div>\n </ng-container>\n </div>\n\n <!-- Nested Steps -->\n <div *ngIf=\"hasChild || (config.nestedSteps && config.nestedSteps.length > 0)\" class=\"cqa-ml-9 cqa-pb-1 cqa-nested-steps-container\" style=\"border-bottom: '1px solid #F3F4F6'\">\n <div class=\"cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#737373] cqa-py-[2px] cqa-px-3\">Nested steps</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <!-- Loading indicator when nested steps are being loaded -->\n <div *ngIf=\"hasChild && (!config.nestedSteps || config.nestedSteps.length === 0) && isStepLoading()\" \n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-py-2 cqa-px-3\">\n <svg class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M7 1A6 6 0 0 1 13 7\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"cqa-text-[11px] cqa-leading-[13px] cqa-text-[#737373]\">Loading nested steps...</span>\n </div>\n <ng-container *ngFor=\"let step of config.nestedSteps; index as i\">\n <!-- Wrapper to show skeleton while step-renderer is loading -->\n <div\n class=\"cqa-step-renderer-wrapper\"\n [attr.id]=\"'exc-' + step.id\"\n [class.loaded]=\"!isNestedStepLoading(step)\">\n <!-- Loading skeleton overlay -->\n <!-- <div *ngIf=\"isNestedStepLoading(step)\" class=\"cqa-step-skeleton-overlay\">\n <div class=\"cqa-step-skeleton cqa-mx-3 cqa-my-1\"></div>\n </div> -->\n <!-- Use step-renderer for all nested steps to avoid circular dependencies -->\n <!-- The step-renderer will dynamically load the appropriate component and pass handlers -->\n <cqa-step-renderer \n [step]=\"step\"\n [stepNumber]=\"stepNumber + '.' + (i + 1)\"\n [onExpandHandler]=\"onExpandHandler\"\n [getConditionBranchesHandler]=\"getConditionBranchesHandler\"\n [onConditionBranchClickHandler]=\"onConditionBranchClickHandler\"\n [isStepLoadingHandler]=\"isStepLoadingHandler\"\n [isStepExpandedHandler]=\"isStepExpandedHandler\"\n [convertMsToSecondsHandler]=\"convertMsToSecondsHandler\"\n [formatFailureDetailsHandler]=\"formatFailureDetailsHandler\"\n [getSelfHealAnalysisHandler]=\"getSelfHealAnalysisHandler\"\n [getLoopIterationsHandler]=\"getLoopIterationsHandler\"\n [getApiAssertionsHandler]=\"getApiAssertionsHandler\"\n [formatActionsHandler]=\"formatActionsHandler\"\n [onViewAllIterationsHandler]=\"onViewAllIterationsHandler\"\n [onMakeCurrentBaselineHandler]=\"onMakeCurrentBaselineHandler\"\n [onUploadBaselineHandler]=\"onUploadBaselineHandler\"\n [getSelfHealLoadingStatesHandler]=\"getSelfHealLoadingStatesHandler\"\n [onAnalyzeHandler]=\"onAnalyzeHandler\"\n [onViewFullLogsHandler]=\"onViewFullLogsHandler\"\n [onSelfHealActionHandler]=\"onSelfHealActionHandler\"\n [onStepClickHandler]=\"onStepClickHandler\"\n [onJsonPathCopiedHandler]=\"onJsonPathCopiedHandler\"\n [onDownloadHandler]=\"onDownloadHandler\"\n [onFilePathCopiedHandler]=\"onFilePathCopiedHandler\"\n [onTextCopiedHandler]=\"onTextCopiedHandler\"\n [jumpToTimestampHandler]=\"jumpToTimestampHandler\"\n [downloadingStepId]=\"downloadingStepId\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [selectedIterationId]=\"step?.selectedIterationId || ''\"\n [isLive]=\"isLive\"\n [isDebug]=\"isDebug\"\n [parentSkipped]=\"selfDebugDisabled\"\n [debugPointSet]=\"getDebugPointSetHandler ? getDebugPointSetHandler(step) : debugPointSet\"\n [getDebugPointSetHandler]=\"getDebugPointSetHandler\"\n [onDebugPointChangeHandler]=\"onDebugPointChangeHandler\"\n [onEditStepHandler]=\"onEditStepHandler\"\n [addStepMenuOptions]=\"getAddStepMenuOptionsForNested ? getAddStepMenuOptionsForNested(step) : addStepMenuOptions\"\n [onAddStepOptionSelectHandler]=\"onAddStepOptionSelectHandler\"\n [stepMoreMenuOptions]=\"getStepMoreMenuOptionsForNested ? getStepMoreMenuOptionsForNested(step) : stepMoreMenuOptions\"\n [onStepMoreOptionSelectHandler]=\"onStepMoreOptionSelectHandler\"\n [getAddStepMenuOptionsForNested]=\"getAddStepMenuOptionsForNested\"\n [getStepMoreMenuOptionsForNested]=\"getStepMoreMenuOptionsForNested\"\n (addStepInsideLoop)=\"addStepInsideLoop.emit($event)\"\n (componentReady)=\"markStepLoaded(step)\">\n </cqa-step-renderer>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- + Add step inside loop (debug only) -->\n <div *ngIf=\"isDebug\" class=\"cqa-ml-9 cqa-py-2 cqa-pl-[18px]\" style=\"border-left: 2px solid #C5C7FA;\">\n <button type=\"button\" (click)=\"onAddStepInsideLoop($event)\" class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[15px] cqa-font-medium cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-p-0 cqa-no-underline hover:cqa-opacity-90 focus:cqa-outline-none\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 2V12M2 7H12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n <span>Add step inside loop</span>\n </button>\n </div>\n\n <!-- View All Iterations Link -->\n <div *ngIf=\"config.showViewAllIterations && !isLive\" class=\"cqa-flex cqa-justify-end cqa-px-3 cqa-py-[10px]\">\n <a href=\"#\" (click)=\"onViewAllIterationsClick($event)\" class=\"cqa-text-[10px] cqa-leading-[15px] cqa-no-underline cqa-text-primary cqa-font-semibold cqa-flex cqa-items-center cqa-gap-1\">\n View all iterations\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.63636 11.267L6.75852 10.3977L9.38778 7.76847H3V6.49858H9.38778L6.75852 3.87358L7.63636 3L11.7699 7.13352L7.63636 11.267Z\" fill=\"#3F43EE\"/></svg>\n </a>\n </div>\n\n <!-- Self Heal Analysis -->\n <cqa-self-heal-analysis \n *ngIf=\"selfHealAnalysis\"\n [id]=\"step?.testStepId\"\n [originalLocator]=\"selfHealAnalysis.originalLocator\"\n [healedLocator]=\"selfHealAnalysis.healedLocator\"\n [confidence]=\"selfHealAnalysis.confidence\"\n [healMethod]=\"selfHealAnalysis.healMethod\"\n [isLoadingAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingAccept?.[step?.testStepId] : false\"\n [isLoadingModifyAccept]=\"getSelfHealLoadingStatesHandler ? getSelfHealLoadingStatesHandler().isLoadingModifyAccept?.[step?.testStepId] : false\"\n (action)=\"onSelfHealAction($event)\">\n </cqa-self-heal-analysis>\n\n <!-- Timing Breakdown -->\n <div *ngIf=\"config.timingBreakdown\" class=\"cqa-flex cqa-items-center cqa-justify-end cqa-gap-5 cqa-pt-1.5 cqa-px-4 cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-text-[#9CA3AF]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></div>\n <span>Timing breakdown</span>\n </div>\n <span class=\"cqa-text-dialog-muted cqa-flex cqa-items-center cqa-gap-3\">\n <div>\n App <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.app) }}</span>\n </div>\n <div><svg width=\"1\" height=\"11\" viewBox=\"0 0 1 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M-3.8147e-06 10.32V-7.15256e-07H0.959996V10.32H-3.8147e-06Z\" fill=\"#E5E7EB\"/></svg></div>\n <div>\n Tool <span class=\"cqa-text-gray-700\">{{ formatDuration(config.timingBreakdown.tool) }}</span>\n </div>\n </span>\n </div>\n </div>\n\n <!-- View More Failed Step Button - shown when expanded and failure details exist -->\n <div *ngIf=\"showViewMoreButton\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-view-more-failed-step-button\n [timingBreakdown]=\"timingBreakdown\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [isExpanded]=\"showFailedStepDetails\"\n (viewMoreClick)=\"onViewMoreFailedStepClick($event)\">\n </cqa-view-more-failed-step-button>\n </div>\n\n <!-- Updated Failed Step Component - shown when button is clicked -->\n <div *ngIf=\"showViewMoreButton &&showFailedStepDetails && failureDetails\" class=\"cqa-mt-2 cqa-px-4\">\n <cqa-updated-failed-step\n [testStepResultId]=\"testStepResultId\"\n [timingBreakdown]=\"timingBreakdown\"\n [expanded]=\"true\"\n [subSteps]=\"getSubStepsForFailedStep()\"\n [failureDetails]=\"failureDetails\"\n [reasoning]=\"reasoning\"\n [confidence]=\"confidence\"\n [isUploadingBaseline]=\"isUploadingBaseline\"\n [isMakingCurrentBaseline]=\"isMakingCurrentBaseline\"\n [isLive]=\"isLive\"\n (makeCurrentBaseline)=\"onMakeCurrentBaseline($event)\"\n (uploadBaseline)=\"onUploadBaseline($event)\"\n (analyze)=\"onAnalyze()\"\n (viewFullLogs)=\"onViewFullLogs()\">\n </cqa-updated-failed-step>\n </div>\n</div>\n" }]
|
|
1105
1120
|
}], propDecorators: { id: [{
|
|
1106
1121
|
type: Input
|
|
1107
1122
|
}], testStepResultId: [{
|
|
@@ -1156,6 +1171,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1156
1171
|
type: Output
|
|
1157
1172
|
}], stepMoreOptionSelect: [{
|
|
1158
1173
|
type: Output
|
|
1174
|
+
}], addStepInsideLoop: [{
|
|
1175
|
+
type: Output
|
|
1159
1176
|
}], addStepMenuOptions: [{
|
|
1160
1177
|
type: Input
|
|
1161
1178
|
}], stepMoreMenuOptions: [{
|
|
@@ -1259,4 +1276,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1259
1276
|
}], onIterationChange: [{
|
|
1260
1277
|
type: Output
|
|
1261
1278
|
}] } });
|
|
1262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXVELFNBQVMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFFM0osT0FBTyxFQUE0Tiw2QkFBNkIsRUFBc0IsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2VixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVEzRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsaUJBQWlCO0lBTHhEOztRQWtCVyxxQkFBZ0IsR0FBc0IsTUFBTSxDQUFDO1FBSTdDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFhLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUcvQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQy9DLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQzVELHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQy9ELHVCQUFrQixHQUF3Qiw2QkFBNkIsQ0FBQztRQUN4RSx3QkFBbUIsR0FBeUIsOEJBQThCLENBQUM7UUFxQzNFLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFtQnhDLHdCQUFtQixHQUFHLEVBQUUsQ0FB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Q0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUkwQixrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNHLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBOEJ0QixRQUFRO3NCQUFqQixNQUFNO2dCQUdHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgRG9DaGVjayB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IExvb3BTdGVwQ29uZmlnLCBMb29wSXRlcmF0aW9uLCBFeGVjdXRpb25TdGVwQ29uZmlnLCBTdGVwU3RhdHVzLCBUaW1pbmdCcmVha2Rvd24sIEZhaWx1cmVEZXRhaWxzLCBTdWJTdGVwLCBTZWxmSGVhbEFuYWx5c2lzRGF0YSwgU2VsZkhlYWxBY3Rpb24sIFN0ZXBHcm91cENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBTZWxmSGVhbEFjdGlvbkV2ZW50LCBBZGRTdGVwTWVudU9wdGlvbiwgREVGQVVMVF9BRERfU1RFUF9NRU5VX09QVElPTlMsIFN0ZXBNb3JlTWVudU9wdGlvbiwgREVGQVVMVF9TVEVQX01PUkVfTUVOVV9PUFRJT05TIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IEJhc2VTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1zdGVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBtYWtlQ3VycmVudEJhc2VsaW5lRXZlbnQsIHVwbG9hZEJhc2VsaW5lRXZlbnQgfSBmcm9tICcuLi92aXN1YWwtY29tcGFyaXNvbi92aXN1YWwtY29tcGFyaXNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCBjcWEtdy1mdWxsJyB9XG59KVxuZXhwb3J0IGNsYXNzIExvb3BTdGVwQ29tcG9uZW50IGV4dGVuZHMgQmFzZVN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBEb0NoZWNrIHtcbiAgLy8gSW5kaXZpZHVhbCBpbnB1dHNcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRlc3RTdGVwUmVzdWx0SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlITogc3RyaW5nO1xuICBASW5wdXQoKSBzdGF0dXMhOiBTdGVwU3RhdHVzO1xuICBASW5wdXQoKSBkdXJhdGlvbiE6IG51bWJlcjtcbiAgQElucHV0KCkgdGltaW5nQnJlYWtkb3duPzogVGltaW5nQnJlYWtkb3duO1xuICBASW5wdXQoKSBleHBhbmRlZD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGxvb3BUeXBlPzogJ2ZvcicgfCAnd2hpbGUnO1xuICBASW5wdXQoKSBpdGVyYXRpb25zITogTG9vcEl0ZXJhdGlvbltdO1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0SXRlcmF0aW9uPzogJ2ZpcnN0JyB8ICdsYXN0JyA9ICdsYXN0JztcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM/OiBFeGVjdXRpb25TdGVwQ29uZmlnW107XG4gIEBJbnB1dCgpIHNob3dWaWV3QWxsSXRlcmF0aW9ucz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGhhc0NoaWxkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN0ZXBEZWxldGVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNEZWJ1Zz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGVidWdQb2ludFNldD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcGFyZW50U2tpcHBlZD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ2V0RGVidWdQb2ludFNldEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCB2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgQE91dHB1dCgpIGRlYnVnUG9pbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBlZGl0U3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFkZFN0ZXBNZW51T3B0aW9uPigpO1xuICBAT3V0cHV0KCkgc3RlcE1vcmVPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNb3JlTWVudU9wdGlvbj4oKTtcbiAgQElucHV0KCkgYWRkU3RlcE1lbnVPcHRpb25zOiBBZGRTdGVwTWVudU9wdGlvbltdID0gREVGQVVMVF9BRERfU1RFUF9NRU5VX09QVElPTlM7XG4gIEBJbnB1dCgpIHN0ZXBNb3JlTWVudU9wdGlvbnM6IFN0ZXBNb3JlTWVudU9wdGlvbltdID0gREVGQVVMVF9TVEVQX01PUkVfTUVOVV9PUFRJT05TO1xuXG4gIC8vIEhhbmRsZXIgZnVuY3Rpb24gdG8gcGFzcyBkb3duIHRvIG5lc3RlZCBjaGlsZCBzdGVwIGdyb3VwcyBmb3IgcmVjdXJzaXZlIGV4cGFuc2lvblxuICBASW5wdXQoKSBvbkV4cGFuZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHBhc3NlZCB0byBuZXN0ZWQgc3RlcC1yZW5kZXJlciBzbyBFZGl0IG9uIG5lc3RlZCBzdGVwcyBpcyBmb3J3YXJkZWQgd2l0aCB0aGUgc3RlcCBjb25maWcuICovXG4gIEBJbnB1dCgpIG9uRWRpdFN0ZXBIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXI/OiAob3B0aW9uOiBBZGRTdGVwTWVudU9wdGlvbiwgc3RlcD86IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyPzogKG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHVzZWQgdG8gZ2V0IGFkZC1zdGVwIG1lbnUgb3B0aW9ucyBwZXIgbmVzdGVkIHN0ZXA7IG90aGVyd2lzZSBhZGRTdGVwTWVudU9wdGlvbnMgaXMgdXNlZCBmb3IgYWxsLiAqL1xuICBASW5wdXQoKSBnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQ/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gQWRkU3RlcE1lbnVPcHRpb25bXTtcbiAgLyoqIFdoZW4gcHJvdmlkZWQsIHVzZWQgdG8gZ2V0IHN0ZXAtbW9yZSBtZW51IG9wdGlvbnMgcGVyIG5lc3RlZCBzdGVwOyBvdGhlcndpc2Ugc3RlcE1vcmVNZW51T3B0aW9ucyBpcyB1c2VkIGZvciBhbGwuICovXG4gIEBJbnB1dCgpIGdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQ/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gU3RlcE1vcmVNZW51T3B0aW9uW107XG5cbiAgLy8gSGFuZGxlciBmdW5jdGlvbnMgZm9yIGNvbmRpdGlvbiBzdGVwc1xuICBASW5wdXQoKSBnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gQ29uZGl0aW9uQnJhbmNoW107XG4gIEBJbnB1dCgpIG9uQ29uZGl0aW9uQnJhbmNoQ2xpY2tIYW5kbGVyPzogKHN0ZXA6IGFueSwgYnJhbmNoOiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzU3RlcExvYWRpbmdIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzU3RlcEV4cGFuZGVkSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyPzogKGR1cmF0aW9uOiBudW1iZXIpID0+IG51bWJlcjtcbiAgQElucHV0KCkgZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQW5hbHl6ZUhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblZpZXdGdWxsTG9nc0hhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblNlbGZIZWFsQWN0aW9uSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyPzogKCkgPT4geyBpc0xvYWRpbmdBY2NlcHQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9OyBpc0xvYWRpbmdNb2RpZnlBY2NlcHQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IH07XG4gIEBJbnB1dCgpIGdldExvb3BJdGVyYXRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGZvcm1hdEFjdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBvblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN0ZXBDbGlja0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgZXZlbnQ/OiBFdmVudCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25Kc29uUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgcGF0aDogc3RyaW5nOyBzb3VyY2U6ICdyZXF1ZXN0Qm9keScgfCAncmVzcG9uc2VCb2R5JyB8ICdyZXF1ZXN0SGVhZGVycycgfCAncmVzcG9uc2VIZWFkZXJzJyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkRvd25sb2FkSGFuZGxlcj86IChldmVudDogeyBmaWxlTmFtZTogc3RyaW5nOyBmaWxlUGF0aD86IHN0cmluZzsgZmlsZVR5cGU6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IHRlc3RTdGVwUmVzdWx0SWQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblRleHRDb3BpZWRIYW5kbGVyPzogKGV2ZW50OiB7IHRleHQ6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGp1bXBUb1RpbWVzdGFtcEhhbmRsZXI/OiAodGltZXN0YW1wOiBudW1iZXIsIHRlc3RTdGVwSWQ/OiBudW1iZXIgfCBzdHJpbmcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGRvd25sb2FkaW5nU3RlcElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgc3RlcD86IGFueTtcbiAgZ2V0IHN0ZXBCYWRnZXMoKTogKCdza2lwcGVkJyB8ICdlZGl0ZWQnIHwgJ2FkZGVkJyB8ICdyZW1vdmVkJylbXSB7XG4gICAgY29uc3QgYmFkZ2UgPSB0aGlzLnN0ZXA/LnN0ZXBCYWRnZTtcbiAgICBpZiAoIWJhZGdlKSByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYmFkZ2UpID8gYmFkZ2UgOiBbYmFkZ2VdO1xuICB9XG5cbiAgZ2V0IGlzU2tpcHBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwQmFkZ2VzLmluY2x1ZGVzKCdza2lwcGVkJyk7XG4gIH1cblxuICBnZXQgaXNTdGVwRGVsZXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwQmFkZ2VzLmluY2x1ZGVzKCdyZW1vdmVkJyk7XG4gIH1cblxuICBASW5wdXQoKSBmYWlsdXJlRGV0YWlscz86IEZhaWx1cmVEZXRhaWxzO1xuICBASW5wdXQoKSByZWFzb25pbmc/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgY29uZmlkZW5jZT86IHN0cmluZztcbiAgQElucHV0KCkgaXNVcGxvYWRpbmdCYXNlbGluZSA9IHt9O1xuICBASW5wdXQoKSBpc01ha2luZ0N1cnJlbnRCYXNlbGluZSA9IHt9O1xuICBASW5wdXQoKSBzZWxmSGVhbEFuYWx5c2lzPzogU2VsZkhlYWxBbmFseXNpc0RhdGE7XG4gIEBJbnB1dCgpIGl0ZXJhdGlvbkRhdGE/OiBhbnk7XG4gIEBPdXRwdXQoKSBtYWtlQ3VycmVudEJhc2VsaW5lID0gbmV3IEV2ZW50RW1pdHRlcjxtYWtlQ3VycmVudEJhc2VsaW5lRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSB1cGxvYWRCYXNlbGluZSA9IG5ldyBFdmVudEVtaXR0ZXI8dXBsb2FkQmFzZWxpbmVFdmVudD4oKTtcbiAgQE91dHB1dCgpIGFuYWx5emUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RnVsbExvZ3MgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWxmSGVhbEFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZkhlYWxBY3Rpb25FdmVudD4oKTtcblxuICBzaG93RmFpbGVkU3RlcERldGFpbHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdhZGRTdGVwTWVudVRyaWdnZXInKSBhZGRTdGVwTWVudVRyaWdnZXI/OiBNYXRNZW51VHJpZ2dlcjtcbiAgQFZpZXdDaGlsZCgnc3RlcE1vcmVNZW51VHJpZ2dlcicpIHN0ZXBNb3JlTWVudVRyaWdnZXI/OiBNYXRNZW51VHJpZ2dlcjtcblxuICAvKiogU2hvdyBkZWJ1ZyBpY29uIHdoZW4gZGVidWcgbW9kZSBpcyBvbiAoc2hvd24gb24gcGFyZW50IGFuZCBhbGwgY2hpbGQgc3RlcHMpLiAqL1xuICBnZXQgc2hvd0RlYnVnSWNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlYnVnID09PSB0cnVlO1xuICB9XG5cbiAgLyoqIFBlci1zdGVwIGZpbHRlcmVkIHRocmVlLWRvdCBtZW51IG9wdGlvbnMgKGUuZy4gaGlkZSBEdXBsaWNhdGUvRGVsZXRlIGZvciBzdGVwLWdyb3VwIGNoaWxkcmVuKS4gKi9cbiAgZ2V0IGVmZmVjdGl2ZVN0ZXBNb3JlTWVudU9wdGlvbnMoKTogU3RlcE1vcmVNZW51T3B0aW9uW10ge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnN0ZXBNb3JlTWVudU9wdGlvbnMgfHwgW107XG4gICAgLy8gQWx3YXlzIGhpZGUgZHVwbGljYXRlIG9wdGlvbiBmb3IgdGhpcyBjb250YWluZXIgc3RlcFxuICAgIGxldCBmaWx0ZXJlZCA9IGJhc2UuZmlsdGVyKG9wdCA9PiBvcHQuaWQgIT09ICdkdXBsaWNhdGUnKTtcbiAgICBcbiAgICBjb25zdCBzdGVwUmVmOiBhbnkgPSB0aGlzLnN0ZXA7XG4gICAgaWYgKCFzdGVwUmVmKSByZXR1cm4gZmlsdGVyZWQ7XG5cbiAgICBjb25zdCBpc0dyb3VwQ2hpbGQgPSAhIXN0ZXBSZWYuaXNTdGVwR3JvdXBDaGlsZHJlbjtcbiAgICAvLyBXaGVuIHN0ZXAuc3RlcE1vcmVNZW51T3B0aW9ucyBpcyB0cnV0aHkgT1Igc3RlcCBpcyBhIHN0ZXAtZ3JvdXAgY2hpbGQsIGhpZGUgbXV0YXRpbmcgaXRlbXNcbiAgICBjb25zdCBzdXBwcmVzc011dGF0aW5nID0gISFzdGVwUmVmLnN0ZXBNb3JlTWVudU9wdGlvbnMgfHwgaXNHcm91cENoaWxkO1xuICAgIGlmICghc3VwcHJlc3NNdXRhdGluZykgcmV0dXJuIGZpbHRlcmVkO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkLmZpbHRlcihvcHQgPT4gb3B0LmlkICE9PSAnZGVsZXRlJyk7XG4gIH1cbiAgXG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBsb29wLXN0ZXAncyBvd24gYnJlYWtwb2ludCBpcyBkaXNhYmxlZCAodXNlZCB0byBwcm9wYWdhdGUgcGFyZW50U2tpcHBlZCB0byBjaGlsZHJlbikuICovXG4gIGdldCBzZWxmRGVidWdEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5zdGVwIGFzIGFueSk/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXRoaXMucGFyZW50U2tpcHBlZCB8fCB0aGlzLmlzU3RlcERlbGV0ZWQ7XG4gIH1cblxuICAvLyBPdXRwdXQgZXZlbnQgZm9yIHdoZW4gdGhlIGxvb3Agc3RlcCBleHBhbmRzXG4gIEBPdXRwdXQoKSBvbkV4cGFuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvLyBPdXRwdXQgZXZlbnQgZm9yIHdoZW4gXCJWaWV3IGFsbCBpdGVyYXRpb25zXCIgaXMgY2xpY2tlZFxuICBAT3V0cHV0KCkgb25WaWV3QWxsSXRlcmF0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvLyBPdXRwdXQgZXZlbnQgZm9yIHdoZW4gaXRlcmF0aW9uIHNlbGVjdGlvbiBjaGFuZ2VzXG4gIEBPdXRwdXQoKSBvbkl0ZXJhdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vIENvbmZpZyBwcm9wZXJ0eSBmb3IgYmFzZSBjbGFzcyAtIGJ1aWx0IGZyb20gaW5kaXZpZHVhbCBpbnB1dHMgaW4gbmdPbkluaXRcbiAgb3ZlcnJpZGUgY29uZmlnITogTG9vcFN0ZXBDb25maWc7XG5cbiAgc2VsZWN0ZWRJdGVyYXRpb246IExvb3BJdGVyYXRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHVzZXIncyBtYW51YWwgc2VsZWN0aW9uXG4gIHByaXZhdGUgcHJldmlvdXNTdGF0dXM/OiBTdGVwU3RhdHVzO1xuICBwcml2YXRlIHVzZXJNYW51YWxseUNsb3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBUcmFjayB3aGljaCBzdGVwcyBhcmUgc3RpbGwgbG9hZGluZyB0byBzaG93IHNrZWxldG9uXG4gIGxvYWRpbmdTdGVwczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gUHJvY2Vzc2VkIHN1Yi1zdGVwcyBmb3IgbGl2ZSBtb2RlIFdBSVRfRk9SX0xPQ0FUT1IgY291bnRkb3duIGdyb3VwaW5nXG4gIHByb2Nlc3NlZFN1YlN0ZXBzOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIGxhc3RQcm9jZXNzZWRJbmRleDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSB3YWl0TG9jYXRvckdyb3VwRW50cnk6IGFueSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvdW50ZG93bkludGVydmFsSWQ6IGFueSA9IG51bGw7XG5cbiAgLy8gQUlfQVVUT19IRUFMIGdyb3VwaW5nOiBzaG93IGxvYWRpbmcgdW50aWwgQUlfQVVUT19IRUFMX1NVQ0NFU1Mgb3IgQUlfQVVUT19IRUFMX0ZBSUxFRFxuICBwcml2YXRlIGFpQXV0b0hlYWxHcm91cEVudHJ5OiBhbnkgfCBudWxsID0gbnVsbDtcblxuICAvLyBQcm9jZXNzZWQgc3ViLXN0ZXBzIGZvciBydW4gcmVzdWx0IHNjcmVlbiAoZmlsdGVyIGFuZCBzcGxpdCBBSV9BVVRPX0hFQUxfU1VDQ0VTUy9GQUlMRUQpXG4gIHByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEJ1aWxkIGNvbmZpZyBmcm9tIGluZGl2aWR1YWwgaW5wdXRzXG4gICAgLy8gVXNlIG5lc3RlZFN0ZXBzIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGVtcHR5IGFycmF5XG4gICAgY29uc3Qgc3RlcHNUb1VzZSA9IHRoaXMubmVzdGVkU3RlcHMgfHwgW107XG5cbiAgICAvLyBVc2UgYWN0aW9uIGFzIGZhbGxiYWNrIGZvciB0aXRsZSBpZiB0aXRsZSBpcyBlbXB0eVxuICAgIC8vIENoZWNrIGJvdGggaW5zdGFuY2UgcHJvcGVydHkgYW5kIGNvbmZpZyBmb3IgYWN0aW9uXG4gICAgY29uc3QgYWN0aW9uVmFsdWUgPSAodGhpcyBhcyBhbnkpLmFjdGlvbiB8fCAnJztcbiAgICBjb25zdCBzdGVwVGl0bGUgPSAodGhpcy50aXRsZSAmJiB0aGlzLnRpdGxlLnRyaW0oKSkgPyB0aGlzLnRpdGxlIDogYWN0aW9uVmFsdWU7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGVzdFN0ZXBJZDogdGhpcy5zdGVwPy50ZXN0U3RlcElkIHx8IHVuZGVmaW5lZCxcbiAgICAgIHRlc3RTdGVwUmVzdWx0SWQ6IHRoaXMudGVzdFN0ZXBSZXN1bHRJZCxcbiAgICAgIHN0ZXBOdW1iZXI6IHRoaXMuc3RlcE51bWJlcixcbiAgICAgIHRpdGxlOiBzdGVwVGl0bGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBkaXNwbGF5VHlwZTogJ2xvb3AnLFxuICAgICAgbG9vcFR5cGU6IHRoaXMubG9vcFR5cGUsXG4gICAgICBpdGVyYXRpb25zOiB0aGlzLml0ZXJhdGlvbnMsXG4gICAgICBzZWxlY3RlZEl0ZXJhdGlvbklkOiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQsXG4gICAgICBkZWZhdWx0SXRlcmF0aW9uOiB0aGlzLmRlZmF1bHRJdGVyYXRpb24sXG4gICAgICBuZXN0ZWRTdGVwczogc3RlcHNUb1VzZSxcbiAgICAgIHN0ZXBEZWxldGVkOiB0aGlzLnN0ZXBEZWxldGVkLFxuICAgICAgc2hvd1ZpZXdBbGxJdGVyYXRpb25zOiB0aGlzLnNob3dWaWV3QWxsSXRlcmF0aW9ucyxcbiAgICAgIHRpbWluZ0JyZWFrZG93bjogdGhpcy50aW1pbmdCcmVha2Rvd24sXG4gICAgICBleHBhbmRlZDogdGhpcy5leHBhbmRlZCxcbiAgICB9IGFzIExvb3BTdGVwQ29uZmlnO1xuXG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIEluaXRpYWxpemUgbGl2ZSBzdWItc3RlcCBwcm9jZXNzaW5nIGZvciBXQUlUX0ZPUl9MT0NBVE9SIGdyb3VwaW5nXG4gICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFByb2Nlc3MgZm9yIHJ1biByZXN1bHQgc2NyZWVuOiBmaWx0ZXIgYW5kIHNwbGl0IEFJX0FVVE9fSEVBTF9TVUNDRVNTL0ZBSUxFRFxuICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbiAtIHByaW9yaXRpemUgc2VsZWN0ZWRJdGVyYXRpb25JZCBpbnB1dCwgdGhlbiBkZWZhdWx0XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCAmJiB0aGlzLml0ZXJhdGlvbnMgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pdGVyYXRpb25zICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgIC8vIElmIGRlZmF1bHRJdGVyYXRpb24gaXMgJ2xhc3QnLCBhbHNvIHNldCB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB0byB0aGUgbGFzdCBpdGVyYXRpb25cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRJdGVyYXRpb24gPT09ICdsYXN0JyAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uKSB7XG4gICAgICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgbG9hZGluZyBzdGF0ZSBpZiBhbHJlYWR5IGV4cGFuZGVkXG4gICAgaWYgKHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgICAgIGlmIChzdGVwSWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5hZGQoU3RyaW5nKHN0ZXBJZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHNlbGVjdGlvbiB3aGVuIHNlbGVjdGVkSXRlcmF0aW9uSWQgaW5wdXQgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10gJiYgdGhpcy5pdGVyYXRpb25zICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZEl0ZXJhdGlvbklkJ10uY3VycmVudFZhbHVlO1xuICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5wcmV2aW91c1ZhbHVlO1xuXG4gICAgICAvLyBBbHdheXMgdXBkYXRlIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBpbnB1dCBjaGFuZ2VzIGZyb20gcGFyZW50XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gY3VycmVudFZhbHVlKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAgIC8vIFN5bmMgdXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgd2l0aCB0aGUgaW5wdXQgdmFsdWVcbiAgICAgICAgICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGNoYW5nZXNcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBzZWxlY3QgZGVmYXVsdFxuICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb24gd2hlbiBpdGVyYXRpb25zIGFycmF5IGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snaXRlcmF0aW9ucyddICYmIHRoaXMuaXRlcmF0aW9ucyAmJiB0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHVzZXIgc2VsZWN0aW9uLCB0cnkgdG8gcHJlc2VydmUgaXRcbiAgICAgIGlmICh0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGNoYW5nZXNcbiAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZXIgc2VsZWN0aW9uIG5vIGxvbmdlciB2YWxpZCwgdXNlIHNlbGVjdGVkSXRlcmF0aW9uSWQgb3IgZGVmYXVsdFxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kQnlJZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICAgIGlmIChmb3VuZEJ5SWQpIHtcbiAgICAgICAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmRCeUlkLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kQnlJZDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uIHx8ICF0aGlzLml0ZXJhdGlvbnMuc29tZShpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24/LmlkKSkge1xuICAgICAgICAvLyBObyB1c2VyIHNlbGVjdGlvbiwgdXNlIHNlbGVjdGVkSXRlcmF0aW9uSWQgb3IgZGVmYXVsdFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmQuaWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVXBkYXRlIHRpdGxlIGlmIGl0IGNoYW5nZXMgLSBhbHNvIGNoZWNrIGZvciBhY3Rpb24gaW4gY29uZmlnIG9yIGluc3RhbmNlXG4gICAgaWYgKGNoYW5nZXNbJ3RpdGxlJ10pIHtcbiAgICAgIGNvbnN0IGFjdGlvblZhbHVlID0gKHRoaXMgYXMgYW55KS5hY3Rpb24gfHwgKHRoaXMuY29uZmlnIGFzIGFueSk/LmFjdGlvbiB8fCAnJztcbiAgICAgIGNvbnN0IHN0ZXBUaXRsZSA9ICh0aGlzLnRpdGxlICYmIHRoaXMudGl0bGUudHJpbSgpKSA/IHRoaXMudGl0bGUgOiBhY3Rpb25WYWx1ZTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy50aXRsZSA9IHN0ZXBUaXRsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKGNoYW5nZXNbJ2R1cmF0aW9uJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLmR1cmF0aW9uID0gY2hhbmdlc1snZHVyYXRpb24nXS5jdXJyZW50VmFsdWUgfHwgMDtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snc3RlcERlbGV0ZWQnXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcuc3RlcERlbGV0ZWQgPSBjaGFuZ2VzWydzdGVwRGVsZXRlZCddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snZXhwYW5kZWQnXSAmJiB0aGlzLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdleHBhbmRlZCBjaGFuZ2VkIGluIGxvb3Atc3RlcCcsIHRoaXMuaWQsIGNoYW5nZXNbJ2V4cGFuZGVkJ10pO1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy5leHBhbmRlZCA9IHRoaXMuZXhwYW5kZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGNvbmZpZyB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICBpZiAoY2hhbmdlc1snaXRlcmF0aW9ucyddIHx8IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSB8fCBjaGFuZ2VzWyduZXN0ZWRTdGVwcyddKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcuaXRlcmF0aW9ucyA9IHRoaXMuaXRlcmF0aW9ucztcbiAgICAgICAgdGhpcy5jb25maWcuc2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgICAgICAgdGhpcy5jb25maWcubmVzdGVkU3RlcHMgPSB0aGlzLm5lc3RlZFN0ZXBzIHx8IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC8vIEluaXRpYWxpemUgbG9hZGluZyBzdGF0ZSB3aGVuIG5lc3RlZCBzdGVwcyBhcmUgYWRkZWQgYW5kIHN0ZXAgaXMgZXhwYW5kZWRcbiAgICAvLyBpZiAoY2hhbmdlc1snbmVzdGVkU3RlcHMnXSAmJiB0aGlzLmlzRXhwYW5kZWQgJiYgdGhpcy5uZXN0ZWRTdGVwcyAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIHRoaXMubG9hZGluZ1N0ZXBzLmNsZWFyKCk7XG4gICAgLy8gICB0aGlzLm5lc3RlZFN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgIC8vICAgICBpZiAoc3RlcElkKSB7XG4gICAgLy8gICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuYWRkKFN0cmluZyhzdGVwSWQpKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIHN0YXRlIGlmIGFscmVhZHkgZXhwYW5kZWQgd2hlbiBjb21wb25lbnQgaW5pdGlhbGl6ZXNcbiAgICBpZiAoY2hhbmdlc1snZXhwYW5kZWQnXSAmJiB0aGlzLmlzRXhwYW5kZWQgJiYgdGhpcy5uZXN0ZWRTdGVwcyAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmNsZWFyKCk7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgICAgICBpZiAoc3RlcElkKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuYWRkKFN0cmluZyhzdGVwSWQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxzbyBoYW5kbGUgd2hlbiBuZXN0ZWRTdGVwcyBpcyBwYXNzZWQgdmlhIGNoaWxkcmVuIHByb3BlcnR5IChmb3Igc3RlcC1yZW5kZXJlciBjb21wYXRpYmlsaXR5KVxuICAgIGlmIChjaGFuZ2VzWyduZXN0ZWRTdGVwcyddICYmIHRoaXMubmVzdGVkU3RlcHMpIHtcbiAgICAgIC8vIEVuc3VyZSBjb25maWcgaXMgdXBkYXRlZCB3aXRoIG5lc3RlZFN0ZXBzXG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcubmVzdGVkU3RlcHMgPSB0aGlzLm5lc3RlZFN0ZXBzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5lc3RlZFN0ZXBzIGlzIG5vdCBwcm92aWRlZCBidXQgY2hpbGRyZW4gaXMgKGZyb20gc3RlcC1yZW5kZXJlciksIHVzZSBjaGlsZHJlblxuICAgIGlmICghdGhpcy5uZXN0ZWRTdGVwcyAmJiAodGhpcy5jb25maWcgYXMgYW55KS5jaGlsZHJlbiAmJiBBcnJheS5pc0FycmF5KCh0aGlzLmNvbmZpZyBhcyBhbnkpLmNoaWxkcmVuKSkge1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9ICh0aGlzLmNvbmZpZyBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzID0gdGhpcy5uZXN0ZWRTdGVwcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0xpdmUpIHtcbiAgICAgIC8vIFVwZGF0ZSBzdWJTdGVwcyBhcnJheSB3aGVuIG5ldyBvbmVzIGFyZSBhZGRlZFxuICAgICAgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10pIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdWJTdGVwc0NvdW50ID0gY2hhbmdlc1snbmVzdGVkU3RlcHMnXS5wcmV2aW91c1ZhbHVlPy5sZW5ndGggfHwgMDtcbiAgICAgICAgY29uc3QgY3VycmVudFN1YlN0ZXBzQ291bnQgPSAodGhpcy5uZXN0ZWRTdGVwcyB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAgIC8vIFN1Yi1zdGVwcyBhcmUgYXBwZW5kZWQgZXh0ZXJuYWxseSwgc28gd2UganVzdCB1cGRhdGUgdGhlIGNvbmZpZ1xuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IHRoaXMubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEF1dG8tZXhwYW5kIGlmIHN0ZXAgaXMgcnVubmluZyBhbmQgbmV3IHN1YlN0ZXBzIGFyZSBhZGRlZCAobG9ncyBjb21pbmcgaW4pXG4gICAgICAgIGlmICghY2hhbmdlc1snbmVzdGVkU3RlcHMnXS5maXJzdENoYW5nZSAmJiBcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID09PSAncnVubmluZycgJiYgXG4gICAgICAgICAgICBjdXJyZW50U3ViU3RlcHNDb3VudCA+IHByZXZpb3VzU3ViU3RlcHNDb3VudCAmJlxuICAgICAgICAgICAgdGhpcy5oYXNTdWJTdGVwcyAmJiBcbiAgICAgICAgICAgICF0aGlzLmlzRXhwYW5kZWQgJiYgXG4gICAgICAgICAgICAhdGhpcy51c2VyTWFudWFsbHlDbG9zZWQpIHtcbiAgICAgICAgICB0aGlzLmF1dG9FeHBhbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3RhdHVzIGNoYW5nZXMgLSBhdXRvLWV4cGFuZCB3aGVuIHN0ZXAgc3RhcnRzIGV4ZWN1dGluZ1xuICAgICAgaWYgKGNoYW5nZXNbJ3N0YXR1cyddICYmICFjaGFuZ2VzWydzdGF0dXMnXS5maXJzdENoYW5nZSkge1xuICAgICAgICBjb25zdCBuZXdTdGF0dXMgPSBjaGFuZ2VzWydzdGF0dXMnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgIGNvbnN0IG9sZFN0YXR1cyA9IGNoYW5nZXNbJ3N0YXR1cyddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgICAgLy8gQXV0by1leHBhbmQgd2hlbiBzdGF0dXMgY2hhbmdlcyB0byAncnVubmluZycgYW5kIGhhcyBzdWJTdGVwcyAob3Igd2lsbCBoYXZlIHNvb24pXG4gICAgICAgIGlmIChuZXdTdGF0dXMgPT09ICdydW5uaW5nJyAmJiBvbGRTdGF0dXMgIT09ICdydW5uaW5nJyAmJiAhdGhpcy51c2VyTWFudWFsbHlDbG9zZWQpIHtcbiAgICAgICAgICAvLyBFeHBhbmQgaW1tZWRpYXRlbHkgaWYgYWxyZWFkeSBoYXMgc3ViU3RlcHMsIG9yIHdhaXQgZm9yIHRoZW1cbiAgICAgICAgICBpZiAodGhpcy5oYXNTdWJTdGVwcykge1xuICAgICAgICAgICAgdGhpcy5hdXRvRXhwYW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcmV2aW91c1N0YXR1cyA9IG5ld1N0YXR1cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF1dG9FeHBhbmQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRXhwYW5kZWQgJiYgdGhpcy5oYXNTdWJTdGVwcykge1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMudXNlck1hbnVhbGx5Q2xvc2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGhhc1N1YlN0ZXBzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5lc3RlZFN0ZXBzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGNvbnN0IHdhc0V4cGFuZGVkID0gdGhpcy5pc0V4cGFuZGVkO1xuICAgIHN1cGVyLnRvZ2dsZSgpO1xuICAgIC8vIEVtaXQgZXZlbnQgd2hlbiBleHBhbmRpbmcgKHRyYW5zaXRpb25pbmcgZnJvbSBjb2xsYXBzZWQgdG8gZXhwYW5kZWQpXG4gICAgaWYgKCF3YXNFeHBhbmRlZCAmJiB0aGlzLmlzRXhwYW5kZWQpIHtcbiAgICAgIHRoaXMub25FeHBhbmQuZW1pdCgpO1xuICAgICAgLy8gSWYgdGhpcyBzdGVwIGhhcyBjaGlsZHJlbiAoaGFzQ2hpbGQgaXMgdHJ1ZSkgYW5kIG9uRXhwYW5kSGFuZGxlciBpcyBwcm92aWRlZCwgY2FsbCBpdCB0byBmZXRjaCBjaGlsZHJlblxuICAgICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyICYmIHRoaXMuY29uZmlnICYmIHRoaXMuaGFzQ2hpbGQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc3RlcCBjb25maWcgb2JqZWN0IGZvciB0aGUgaGFuZGxlciB3aXRoIGhhc0NoaWxkIHByb3BlcnR5XG4gICAgICAgIGNvbnN0IHN0ZXBDb25maWcgPSB7XG4gICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgaGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgZXhwYW5kZWQ6IHRydWUsIC8vIEVuc3VyZSBleHBhbmRlZCBpcyBzZXRcbiAgICAgICAgICB0ZXN0U3RlcFR5cGU6ICh0aGlzLmNvbmZpZyBhcyBhbnkpLnRlc3RTdGVwVHlwZSB8fCAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicgPyAnRk9SX0xPT1AnIDogJ1dISUxFX0xPT1AnKSxcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy5jb25maWcubmVzdGVkU3RlcHMgfHwgW10sXG4gICAgICAgICAgdGVzdFN0ZXBSZXN1bHRJZDogdGhpcy50ZXN0U3RlcFJlc3VsdElkLFxuICAgICAgICAgIGlkOiB0aGlzLmlkXG4gICAgICAgIH0gYXMgRXhlY3V0aW9uU3RlcENvbmZpZyAmIHsgaGFzQ2hpbGQ6IGJvb2xlYW47IHRlc3RTdGVwVHlwZT86IHN0cmluZzsgY2hpbGRyZW4/OiBhbnlbXTsgZXhwYW5kZWQ/OiBib29sZWFuIH07XG4gICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXBDb25maWcpO1xuICAgICAgfVxuICAgICAgLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIHN0YXRlIGZvciBhbGwgbmVzdGVkIHN0ZXBzXG4gICAgICBpZiAodGhpcy5uZXN0ZWRTdGVwcyAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5uZXN0ZWRTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgICAgICAgIGlmIChzdGVwSWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmFkZChTdHJpbmcoc3RlcElkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzRXhwYW5kZWQpIHtcbiAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGUgd2hlbiBjb2xsYXBzaW5nXG4gICAgICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBleHBhbmRlZCBzdGF0ZSBpcyBzeW5jZWQgd2l0aCBjb25maWdcbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLmV4cGFuZGVkID0gdGhpcy5pc0V4cGFuZGVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgc3RlcCBpcyBzdGlsbCBsb2FkaW5nXG4gIGlzTmVzdGVkU3RlcExvYWRpbmcoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgIHJldHVybiBzdGVwSWQgPyB0aGlzLmxvYWRpbmdTdGVwcy5oYXMoU3RyaW5nKHN0ZXBJZCkpIDogZmFsc2U7XG4gIH1cblxuICAvLyBNYXJrIGEgc3RlcCBhcyBsb2FkZWQgKGNhbGxlZCB3aGVuIHN0ZXAtcmVuZGVyZXIgaXMgcmVhZHkpXG4gIG1hcmtTdGVwTG9hZGVkKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICBpZiAoc3RlcElkKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdGVwcy5kZWxldGUoU3RyaW5nKHN0ZXBJZCkpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTogdm9pZCB7XG4gICAgLy8gRmlyc3QsIHRyeSB0byB1c2Ugc2VsZWN0ZWRJdGVyYXRpb25JZCBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoXG4gICAgICAgIGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkXG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGlzIHNlbGVjdGVkXG4gICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdXNlciBoYXMgbWFudWFsbHkgc2VsZWN0ZWQgc29tZXRoaW5nLCBwcmVzZXJ2ZSBpdFxuICAgIGlmICh0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmQuaWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IGJhc2VkIG9uIGRlZmF1bHRJdGVyYXRpb24gc2V0dGluZ1xuICAgIGlmICh0aGlzLmRlZmF1bHRJdGVyYXRpb24gPT09ICdsYXN0JyAmJiB0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFzdEl0ZXJhdGlvbiA9IHRoaXMuaXRlcmF0aW9uc1t0aGlzLml0ZXJhdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gbGFzdEl0ZXJhdGlvbi5pZCkge1xuICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBsYXN0SXRlcmF0aW9uO1xuICAgICAgLy8gU2V0IHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHRvIHRyYWNrIHRoZSBkZWZhdWx0IHNlbGVjdGlvblxuICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IGxhc3RJdGVyYXRpb24uaWQ7XG4gICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGlzIHNlbGVjdGVkXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RJdGVyYXRpb24gPSB0aGlzLml0ZXJhdGlvbnNbMF07XG4gICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZmlyc3RJdGVyYXRpb24uaWQpIHtcbiAgICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZmlyc3RJdGVyYXRpb247XG4gICAgICAvLyBTZXQgdXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gdHJhY2sgdGhlIGRlZmF1bHQgc2VsZWN0aW9uXG4gICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gZmlyc3RJdGVyYXRpb24uaWQ7XG4gICAgICAvLyBQcm9jZXNzIGxpdmUgc3ViLXN0ZXBzIHdoZW4gaXRlcmF0aW9uIGlzIHNlbGVjdGVkXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlSXRlcmF0aW9uQ2hhbmdlKGl0ZXJhdGlvbjogTG9vcEl0ZXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiSVRFUkFUSU9OIENIQU5HRVwiLCB0aGlzLmNvbmZpZyAsaXRlcmF0aW9uKVxuICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgaXRlcmF0aW9uc1xuICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGl0ZXJhdGlvbi5pZCkge1xuICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgfVxuICAgIC8vIFN0b3JlIHRoZSB1c2VyJ3MgbWFudWFsIHNlbGVjdGlvblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBpdGVyYXRpb247XG4gICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IGl0ZXJhdGlvbi5pZDtcblxuICAgIGlmICh0aGlzLmlzTGl2ZSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLml0ZXJhdGlvbnMuZmluZEluZGV4KGl0ZXIgPT4gaXRlci5pZCA9PT0gaXRlcmF0aW9uLmlkKTtcblxuICAgICAgaWYgKGluZGV4ID4gLTEgJiYgdGhpcy5pdGVyYXRpb25EYXRhPy5baW5kZXhdICYmIHRoaXMubmVzdGVkU3RlcHMpIHtcblxuICAgICAgICBjb25zdCB1cGRhdGVkTmVzdGVkU3RlcHM6IEV4ZWN1dGlvblN0ZXBDb25maWdbXSA9XG4gICAgICAgICAgdGhpcy5uZXN0ZWRTdGVwcy5tYXAoc3RlcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkU3ViU3RlcHMgPSB0aGlzLml0ZXJhdGlvbkRhdGFbaW5kZXhdW3N0ZXAuaWRdO1xuICAgICAgICAgICAgc3RlcC5kdXJhdGlvbiA9IHVwZGF0ZWRTdWJTdGVwcy5yZWR1Y2UoKGFjYzogbnVtYmVyLCBzdWJTdGVwOiBhbnkpID0+IGFjYyArIHN1YlN0ZXA/LmR1cmF0aW9uIHx8IDAsIDApO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlZFN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uc3RlcCxcbiAgICAgICAgICAgICAgICBzdWJTdGVwczogWy4uLnVwZGF0ZWRTdWJTdGVwc11cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RlcCB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubmVzdGVkU3RlcHMgPSB1cGRhdGVkTmVzdGVkU3RlcHM7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgICAgICAgIG5lc3RlZFN0ZXBzOiB1cGRhdGVkTmVzdGVkU3RlcHNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gY2hhbmdlc1xuICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBFbWl0IHRoZSBldmVudCB3aXRoIHRoZSBpdGVyYXRpb24gSURcbiAgICB0aGlzLm9uSXRlcmF0aW9uQ2hhbmdlLmVtaXQoaXRlcmF0aW9uLmlkKTtcbiAgfVxuXG4gIGNvbXBhcmVJdGVyYXRpb24oYTogTG9vcEl0ZXJhdGlvbiwgYjogTG9vcEl0ZXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhICYmIGIgPyBhLmlkID09PSBiLmlkIDogYSA9PT0gYjtcbiAgfVxuXG4gIGdldExvb3BUeXBlQmFkZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gWydMT09QJ107XG4gICAgaWYgKHRoaXMubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICBiYWRnZXMucHVzaCgnRk9SJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICBiYWRnZXMucHVzaCgnV0hJTEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhZGdlcztcbiAgfVxuXG4gIGdldEl0ZXJhdGlvbkxhYmVsKGl0ZXJhdGlvbjogTG9vcEl0ZXJhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbi5sYWJlbDtcbiAgfVxuXG4gIG9uVmlld0FsbEl0ZXJhdGlvbnNDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9ucy5lbWl0KCk7XG4gIH1cblxuICBvblZpZXdNb3JlRmFpbGVkU3RlcENsaWNrKGV4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmFpbGVkU3RlcERldGFpbHMgPSBleHBhbmRlZDtcbiAgfVxuXG4gIGdldFN1YlN0ZXBzRm9yRmFpbGVkU3RlcCgpOiBTdWJTdGVwW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uPy5zdWJTdGVwcyB8fCBbXTtcbiAgfVxuXG4gIG9uTWFrZUN1cnJlbnRCYXNlbGluZShldmVudDogbWFrZUN1cnJlbnRCYXNlbGluZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5tYWtlQ3VycmVudEJhc2VsaW5lLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25VcGxvYWRCYXNlbGluZShldmVudDogdXBsb2FkQmFzZWxpbmVFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudXBsb2FkQmFzZWxpbmUuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkFuYWx5emUoKTogdm9pZCB7XG4gICAgdGhpcy5hbmFseXplLmVtaXQoKTtcbiAgfVxuXG4gIG9uVmlld0Z1bGxMb2dzKCk6IHZvaWQge1xuICAgIHRoaXMudmlld0Z1bGxMb2dzLmVtaXQoKTtcbiAgfVxuXG4gIG9uU2VsZkhlYWxBY3Rpb24oZXZlbnQ6IFNlbGZIZWFsQWN0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGZIZWFsQWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgZ2V0IHNob3dWaWV3TW9yZUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0V4cGFuZGVkICYmIEJvb2xlYW4odGhpcy5mYWlsdXJlRGV0YWlscykgJiZcbiAgICAgIChcbiAgICAgICAgKEJvb2xlYW4odGhpcy5mYWlsdXJlRGV0YWlscz8uZXhwZWN0ZWQgfHwgdGhpcy5mYWlsdXJlRGV0YWlscz8uYWN0dWFsKSkgfHxcbiAgICAgICAgKEJvb2xlYW4odGhpcy5mYWlsdXJlRGV0YWlscz8uc2NyZWVuc2hvdHM/LmN1cnJlbnQgfHwgdGhpcy5mYWlsdXJlRGV0YWlscz8uc2NyZWVuc2hvdHM/LmJhc2VsaW5lIHx8IHRoaXMuZmFpbHVyZURldGFpbHM/LnNjcmVlbnNob3RzPy5kaWZmZXJlbmNlKVxuICAgICAgICAgIHx8IEJvb2xlYW4odGhpcy5mYWlsdXJlRGV0YWlscz8ubG9ncz8ubGVuZ3RoKSkgfHwgXG4gICAgICAgIChCb29sZWFuKHRoaXMuZmFpbHVyZURldGFpbHM/LmFpRml4QXBwbGllZCAmJiAodGhpcy5mYWlsdXJlRGV0YWlscz8uYWlGaXhNZXNzYWdlIHx8IHRoaXMuY29uZmlkZW5jZSB8fCB0aGlzLnJlYXNvbmluZz8ubGVuZ3RoKSkpXG4gICAgICApXG4gIH1cblxuICBvbkRlYnVnUG9pbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZGVidWdQb2ludENoYW5nZS5lbWl0KCF0aGlzLmRlYnVnUG9pbnRTZXQpO1xuICB9XG5cbiAgb25FZGl0U3RlcChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZWRpdFN0ZXAuZW1pdCgpO1xuICB9XG5cbiAgb25BZGRTdGVwT3B0aW9uU2VsZWN0KG9wdGlvbjogQWRkU3RlcE1lbnVPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5hZGRTdGVwT3B0aW9uU2VsZWN0LmVtaXQob3B0aW9uKTtcbiAgfVxuXG4gIG9uU3RlcE1vcmVPcHRpb25TZWxlY3Qob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGVwTW9yZU9wdGlvblNlbGVjdC5lbWl0KG9wdGlvbik7XG4gIH1cblxuICB0b2dnbGVIZWFkZXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZSgpO1xuICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7XG4gICAgICB0aGlzLnNob3dGYWlsZWRTdGVwRGV0YWlscyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5vblN0ZXBDbGlja0hhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHN0ZXBUb1Bhc3MgPSB0aGlzLnN0ZXAgfHwgdGhpcy5jb25maWc7XG4gICAgICBpZiAoc3RlcFRvUGFzcykge1xuICAgICAgICB0aGlzLm9uU3RlcENsaWNrSGFuZGxlcihzdGVwVG9QYXNzLCBldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIHN0ZXAgaXMgYSBzdGVwLWdyb3VwIHdpdGggaGFzQ2hpbGRcbiAgaXNOZXN0ZWRTdGVwR3JvdXBXaXRoQ2hpbGRyZW4oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGVwLmRpc3BsYXlUeXBlID09PSAnc3RlcC1ncm91cCcgJiYgISEoc3RlcCBhcyBhbnkpLmhhc0NoaWxkO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgZ3JvdXBOYW1lIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0R3JvdXBOYW1lKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoc3RlcCBhcyBTdGVwR3JvdXBDb25maWcpLmdyb3VwTmFtZSB8fCAnJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHN0ZXBzIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0U3RlcHMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IEV4ZWN1dGlvblN0ZXBDb25maWdbXSB7XG4gICAgY29uc3Qgc3RlcEdyb3VwID0gc3RlcCBhcyBTdGVwR3JvdXBDb25maWc7XG4gICAgcmV0dXJuIHN0ZXBHcm91cC5zdGVwcyB8fCAoc3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8IFtdO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIHN0ZXAgaXMgYSBjb25kaXRpb24gc3RlcFxuICBpc05lc3RlZENvbmRpdGlvblN0ZXAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC5kaXNwbGF5VHlwZTtcbiAgICByZXR1cm4gc3RlcFR5cGUgPT09ICdDT05ESVRJT05fSUYnIHx8IHN0ZXBUeXBlID09PSAnQ09ORElUSU9OX0VMU0UnIHx8IFxuICAgICAgICAgICBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFX0lGJyB8fCBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFSUYnIHx8XG4gICAgICAgICAgIHN0ZXBUeXBlID09PSAnY29uZGl0aW9uJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgbG9vcCBzdGVwXG4gIGlzTmVzdGVkTG9vcFN0ZXAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC5kaXNwbGF5VHlwZTtcbiAgICByZXR1cm4gc3RlcFR5cGUgPT09ICdGT1JfTE9PUCcgfHwgc3RlcFR5cGUgPT09ICdXSElMRV9MT09QJyB8fCBzdGVwVHlwZSA9PT0gJ2xvb3AnO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgbG9vcCB0eXBlIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0TG9vcFR5cGUoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6ICdmb3InIHwgJ3doaWxlJyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RlcFR5cGUgPSAoc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZSB8fCBzdGVwLmRpc3BsYXlUeXBlO1xuICAgIGlmIChzdGVwVHlwZSA9PT0gJ0ZPUl9MT09QJyB8fCAoc3RlcCBhcyBMb29wU3RlcENvbmZpZykubG9vcFR5cGUgPT09ICdmb3InKSB7XG4gICAgICByZXR1cm4gJ2Zvcic7XG4gICAgfSBlbHNlIGlmIChzdGVwVHlwZSA9PT0gJ1dISUxFX0xPT1AnIHx8IChzdGVwIGFzIExvb3BTdGVwQ29uZmlnKS5sb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgcmV0dXJuICd3aGlsZSc7XG4gICAgfVxuICAgIHJldHVybiAoc3RlcCBhcyBMb29wU3RlcENvbmZpZykubG9vcFR5cGU7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBpdGVyYXRpb25zIGZyb20gc3RlcCBjb25maWdcbiAgZ2V0TG9vcEl0ZXJhdGlvbnMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGFueVtdIHtcbiAgICAvLyBVc2UgaGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgY29uZmlnXG4gICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuaXRlcmF0aW9ucyB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IG5lc3RlZCBzdGVwcyBmcm9tIGxvb3Agc3RlcCBjb25maWdcbiAgZ2V0TG9vcE5lc3RlZFN0ZXBzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBFeGVjdXRpb25TdGVwQ29uZmlnW10ge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAubmVzdGVkU3RlcHMgfHwgKHN0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gaGFuZGxlIG5lc3RlZCBsb29wIHN0ZXAgZXhwYW5zaW9uXG4gIGhhbmRsZUxvb3BTdGVwRXhwYW5kKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gaGFuZGxlIG5lc3RlZCBsb29wIHN0ZXAgaXRlcmF0aW9uIGNoYW5nZVxuICBoYW5kbGVMb29wU3RlcEl0ZXJhdGlvbkNoYW5nZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCBpdGVyYXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSB0aGUgcGFyZW50IGNvbXBvbmVudFxuICAgIC8vIEZvciBub3csIHdlIGp1c3QgZW1pdCB0aGUgZXhwYW5kIGV2ZW50XG4gICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIHRpdGxlXG4gIGdldFN0ZXBUaXRsZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgc3RlcC50aXRsZSB8fCAnJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHN0ZXAgc3RhdHVzXG4gIGdldFN0ZXBTdGF0dXMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IFN0ZXBTdGF0dXMge1xuICAgIGNvbnN0IHJlc3VsdCA9IChzdGVwIGFzIGFueSkucmVzdWx0O1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdExvd2VyID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocmVzdWx0TG93ZXIgPT09ICdzdWNjZXNzJyB8fCByZXN1bHRMb3dlciA9PT0gJ3Bhc3NlZCcpIHtcbiAgICAgICAgcmV0dXJuICdzdWNjZXNzJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdmYWlsdXJlJyB8fCByZXN1bHRMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRMb3dlciA9PT0gJ3BlbmRpbmcnIHx8IHJlc3VsdExvd2VyID09PSAnbm90LWV4ZWN1dGVkJykge1xuICAgICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRMb3dlciA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGVwLnN0YXR1cyB8fCAncGVuZGluZyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIGR1cmF0aW9uXG4gIGdldFN0ZXBEdXJhdGlvbihzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5kdXJhdGlvbiB8fCBzdGVwLmR1cmF0aW9uIHx8IDA7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgY29uZGl0aW9uIHN0ZXAgcHJvcGVydGllc1xuICBnZXRDb25kaXRpb25TdGVwRHVyYXRpb24oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IG51bWJlciB7XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmdldFN0ZXBEdXJhdGlvbihzdGVwKTtcbiAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKGR1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcEV4cGFuZGVkKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXAuZXhwYW5kZWQgfHwgZmFsc2U7XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwVGV4dChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KS5hY3Rpb24gfHwgc3RlcC50aXRsZSB8fCAnJztcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBCcmFuY2hlcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogQ29uZGl0aW9uQnJhbmNoW10ge1xuICAgIGlmICh0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwTG9hZGluZyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVDb25kaXRpb25TdGVwRXhwYW5kKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBGYWlsdXJlRGV0YWlscyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYW55IHtcbiAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBTZWxmSGVhbEFuYWx5c2lzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBTZWxmSGVhbEFjdGlvbihldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBNYWtlQmFzZWxpbmUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcFVwbG9hZEJhc2VsaW5lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcEFuYWx5emUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25BbmFseXplSGFuZGxlcikge1xuICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcFZpZXdMb2dzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcikge1xuICAgICAgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kcyB0byBzYWZlbHkgYWNjZXNzIExvb3BTdGVwQ29uZmlnIHByb3BlcnRpZXNcbiAgZ2V0TG9vcFNlbGVjdGVkSXRlcmF0aW9uSWQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9vcFN0ZXAgPSBzdGVwIGFzIExvb3BTdGVwQ29uZmlnO1xuICAgIHJldHVybiBsb29wU3RlcC5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICB9XG5cbiAgZ2V0TG9vcERlZmF1bHRJdGVyYXRpb24oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6ICdmaXJzdCcgfCAnbGFzdCcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuZGVmYXVsdEl0ZXJhdGlvbiB8fCAnbGFzdCc7XG4gIH1cblxuICBnZXRMb29wU2hvd1ZpZXdBbGxJdGVyYXRpb25zKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLnNob3dWaWV3QWxsSXRlcmF0aW9ucztcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgc3RlcCBpcyBjdXJyZW50bHkgbG9hZGluZyBuZXN0ZWQgY2hpbGRyZW5cbiAgaXNTdGVwTG9hZGluZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlciAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIodGhpcy5jb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgZmFsc2U7XG4gIH1cblxuICBvbkp1bXBUb1RpbWVzdGFtcChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyICYmIHRoaXMuc3RlcD8uZXhlY3V0ZWRSZXN1bHQ/LnZpZGVvX3N0YXJ0X3RpbWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN0ZXA/LmV4ZWN1dGVkUmVzdWx0Py52aWRlb19zdGFydF90aW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSB0eXBlb2YgdGhpcy5zdGVwLmV4ZWN1dGVkUmVzdWx0LnZpZGVvX3N0YXJ0X3RpbWUgPT09ICdudW1iZXInIFxuICAgICAgICA/IHRoaXMuc3RlcC5leGVjdXRlZFJlc3VsdC52aWRlb19zdGFydF90aW1lIFxuICAgICAgICA6IE51bWJlcih0aGlzLnN0ZXAuZXhlY3V0ZWRSZXN1bHQudmlkZW9fc3RhcnRfdGltZSk7XG4gICAgICBjb25zdCB0ZXN0U3RlcElkID0gdGhpcy5zdGVwPy50ZXN0U3RlcElkO1xuICAgICAgaWYgKGlzRmluaXRlKHRpbWVzdGFtcCkgJiYgdGltZXN0YW1wID49IDApIHtcbiAgICAgICAgdGhpcy5qdW1wVG9UaW1lc3RhbXBIYW5kbGVyKHRpbWVzdGFtcCwgdGVzdFN0ZXBJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xpdmUgfHwgIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24pIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50TGVuZ3RoID0gKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMgfHwgW10pLmxlbmd0aDtcbiAgICAvLyBSZXNldCBpZiBpdGVyYXRpb24gY2hhbmdlZCAoZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgaWYgd2UgaGF2ZSBhIGRpZmZlcmVudCBpdGVyYXRpb24ncyBzdWJTdGVwcylcbiAgICBpZiAodGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXggPiAwICYmIGN1cnJlbnRMZW5ndGggPCB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCkge1xuICAgICAgLy8gTGlrZWx5IHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvbiwgcmVzZXRcbiAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudExlbmd0aCAhPT0gdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXgpIHtcbiAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTGl2ZVN1YlN0ZXBzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiB8fCAhdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWxsU3ViU3RlcHMgPSAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcyB8fCBbXSkgYXMgYW55W107XG5cbiAgICAvLyBSZXNldCBpZiBzdWJTdGVwcyB3ZXJlIGNsZWFyZWQgb3IgcmVwbGFjZWQgd2l0aCBmZXdlciBlbnRyaWVzXG4gICAgaWYgKGFsbFN1YlN0ZXBzLmxlbmd0aCA8IHRoaXMubGFzdFByb2Nlc3NlZEluZGV4KSB7XG4gICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXg7IGkgPCBhbGxTdWJTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU3RlcCA9IGFsbFN1YlN0ZXBzW2ldO1xuICAgICAgY29uc3QgdWlUeXBlOiBzdHJpbmcgPSBzdWJTdGVwPy51aVR5cGUgfHwgc3ViU3RlcD8udHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1czogc3RyaW5nID0gKHN1YlN0ZXA/LnN0YXR1cyB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHVpVHlwZSA9PT0gJ1dBSVRfRk9SX0xPQ0FUT1InKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNpbmdsZSBncm91cGVkIGVudHJ5IHdpdGggYSBjb3VudGRvd247IGFic29yYnMgRklORF9MT0NBVE9SIGFuZCBMT0NBVE9SX0ZPVU5EXG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gdHlwZW9mIHN1YlN0ZXAudmFsdWUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBzdWJTdGVwLnZhbHVlXG4gICAgICAgICAgOiAoc3ViU3RlcC52YWx1ZSA/IHBhcnNlRmxvYXQoc3ViU3RlcC52YWx1ZSkgOiAzMCk7XG5cbiAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG5cbiAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSB7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICByZW1haW5pbmdTZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZER1cmF0aW9uVG9XYWl0TG9jYXRvckdyb3VwRW50cnkoc3ViU3RlcCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSk7XG5cbiAgICAgICAgLy8gVGljayBkb3duIGV2ZXJ5IHNlY29uZFxuICAgICAgICB0aGlzLmNvdW50ZG93bkludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gTWF0aC5tYXgoMCwgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyAtIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPD0gMCkge1xuICAgICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcblxuICAgICAgfSBlbHNlIGlmICh1aVR5cGUgPT09ICdGSU5EX0xPQ0FUT1InKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgLy8gQWJvcnQgY291bnRkb3duLCByZXBsYWNlIGdyb3VwIGVudHJ5IHdpdGggdGhpcyBmYWlsZWQgbG9nXG4gICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzID0gdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5maWx0ZXIoZW50cnkgPT4gZW50cnkgIT09IHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goeyAuLi5zdWJTdGVwLCBzdGF0dXM6ICdmYWlsZWQnIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBzaW5nbGUgZ3JvdXAgZW50cnkncyB0ZXh0IHNvIHRoZSB1c2VyIHNlZXMgcHJvZ3Jlc3NcbiAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwLnRleHQgfHwgc3ViU3RlcC50aXRsZTtcbiAgICAgICAgICBpZiAobmV3VGV4dCkgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuZGVzY3JpcHRpb24gPSBuZXdUZXh0O1xuICAgICAgICAgIHRoaXMuYWRkRHVyYXRpb25Ub1dhaXRMb2NhdG9yR3JvdXBFbnRyeShzdWJTdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBhY3RpdmUgZ3JvdXAg4oCTIHB1c2ggRklORF9MT0NBVE9SIG5vcm1hbGx5IG9uY2UgY291bnRkb3duIGlzIGNsZWFyZWRcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goeyAuLi5zdWJTdGVwIH0pO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAodWlUeXBlID09PSAnTE9DQVRPUl9GT1VORCcpIHtcblxuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIC8vIEFib3J0IGNvdW50ZG93biwgcmVwbGFjZSBncm91cCBlbnRyeSB3aXRoIHRoaXMgZmFpbGVkIGxvZ1xuICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcyA9IHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5ICE9PSB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCwgc3RhdHVzOiAnZmFpbGVkJyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXF1ZW5jZSBjb21wbGV0ZSDigJMgdXBkYXRlIGdyb3VwIGVudHJ5IHRvIHNob3cgTE9DQVRPUl9GT1VORCB0ZXh0IGFzIHN1Y2Nlc3NcbiAgICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBzdWJTdGVwLmRlc2NyaXB0aW9uIHx8IHN1YlN0ZXAudGV4dCB8fCBzdWJTdGVwLnRpdGxlO1xuICAgICAgICAgICAgaWYgKG5ld1RleHQpIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmRlc2NyaXB0aW9uID0gbmV3VGV4dDtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgIHRoaXMuYWRkRHVyYXRpb25Ub1dhaXRMb2NhdG9yR3JvdXBFbnRyeShzdWJTdGVwKTtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSBncm91cCDigJMgcHVzaCBMT0NBVE9SX0ZPVU5EIG5vcm1hbGx5XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goeyAuLi5zdWJTdGVwIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTCcpIHtcbiAgICAgICAgLy8gSWYgYSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBpcyBhY3RpdmUsIGNvbXBsZXRlIGl0IGFzIGZhaWxlZCBiZWZvcmUgc3RhcnRpbmcgQUkgYXV0by1oZWFsXG4gICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBzaW5nbGUgbG9hZGluZyBlbnRyeTsgd2lsbCBiZSByZXBsYWNlZCBieSBBSV9BVVRPX0hFQUxfU1VDQ0VTUyBvciBBSV9BVVRPX0hFQUxfRkFJTEVEXG4gICAgICAgIHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkgPSB7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwLnRleHQgfHwgJ0FJIGF1dG8taGVhbCBzdGFydGVkJyxcbiAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICB1aVR5cGU6ICdBSV9BVVRPX0hFQUwnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5KTtcblxuICAgICAgfSBlbHNlIGlmICh1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfU1VDQ0VTUycgfHwgdWlUeXBlID09PSAnQUlfQVVUT19IRUFMX0ZBSUxFRCcpIHtcbiAgICAgICAgLy8gSWYgYSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBpcyBhY3RpdmUsIGNvbXBsZXRlIGl0IGFzIGZhaWxlZCBiZWZvcmUgaGFuZGxpbmcgQUkgYXV0by1oZWFsIHJlc3VsdFxuICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgbG9hZGluZyBlbnRyeSBhbmQgYWRkIFRXTyBzZXBhcmF0ZSBlbnRyaWVzOiB2YWx1ZSBhbmQgcmVhc29uaW5nIChsaWtlIEFJX0FOU1dFUilcbiAgICAgICAgaWYgKHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzID0gdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5maWx0ZXIoZW50cnkgPT4gZW50cnkgIT09IHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkpO1xuICAgICAgICAgIHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9TVUNDRVNTJztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdWJTdGVwLnZhbHVlID8/IHN1YlN0ZXAudGV4dCA/PyAnJztcbiAgICAgICAgY29uc3QgcmVhc29uaW5nID0gc3ViU3RlcC5yZWFzb25pbmcgPz8gc3ViU3RlcC5SZWFzb25pbmcgPz8gJyc7XG4gICAgICAgIGNvbnN0IGJhc2VEdXJhdGlvbiA9IHN1YlN0ZXAuZHVyYXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBpc1N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbGVkJztcblxuICAgICAgICAvLyBGaXJzdCBlbnRyeTogdmFsdWUvZGVzY3JpcHRpb25cbiAgICAgICAgY29uc3QgdmFsdWVEZXNjcmlwdGlvbiA9IHN1YlN0ZXAudGV4dCB8fCBzdWJTdGVwLmRlc2NyaXB0aW9uIHx8IChpc1N1Y2Nlc3NcbiAgICAgICAgICA/IGBBSSBhdXRvLWhlYWwgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICA6IGBBSSBhdXRvLWhlYWwgZmFpbGVkYCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWVEZXNjcmlwdGlvbixcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcmVhc29uaW5nOiBudWxsLFxuICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgIGlzQWlBdXRvSGVhbFJlc3VsdDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZWNvbmQgZW50cnk6IHJlYXNvbmluZyAob25seSBpZiBwcmVzZW50KVxuICAgICAgICBpZiAocmVhc29uaW5nKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVhc29uaW5nLFxuICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICByZWFzb25pbmc6IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgICB1aVR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIHR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBiYXNlRHVyYXRpb24sXG4gICAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbnkgZmFpbGVkIGxvZyB3aGlsZSBhIGNvdW50ZG93biBpcyBhY3RpdmUg4oCTIHJlc29sdmUgaXQgYXMgZmFpbGVkXG4gICAgICAgIGlmICgoc3RhdHVzID09PSAnZmFpbGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsdXJlJykgJiYgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHN1YlN0ZXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGFzdFByb2Nlc3NlZEluZGV4ID0gYWxsU3ViU3RlcHMubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldExpdmVQcm9jZXNzaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMgPSBbXTtcbiAgICB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCA9IDA7XG4gICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgIHRoaXMuYWlBdXRvSGVhbEdyb3VwRW50cnkgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNvdW50ZG93blRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvdW50ZG93bkludGVydmFsSWQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudGRvd25JbnRlcnZhbElkKTtcbiAgICAgIHRoaXMuY291bnRkb3duSW50ZXJ2YWxJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGREdXJhdGlvblRvV2FpdExvY2F0b3JHcm91cEVudHJ5KHN1YlN0ZXA6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYXdEdXJhdGlvbiA9IHN1YlN0ZXA/LmR1cmF0aW9uO1xuICAgIGxldCBkZWx0YSA9IDA7XG4gICAgaWYgKHR5cGVvZiByYXdEdXJhdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlbHRhID0gcmF3RHVyYXRpb247XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3RHVyYXRpb24gPT09ICdzdHJpbmcnICYmIHJhd0R1cmF0aW9uLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQocmF3RHVyYXRpb24pO1xuICAgICAgZGVsdGEgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IDA7XG4gICAgfVxuXG4gICAgaWYgKGRlbHRhIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UmF3ID0gdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuZHVyYXRpb247XG4gICAgbGV0IGN1cnJlbnQgPSAwO1xuICAgIGlmICh0eXBlb2YgY3VycmVudFJhdyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50UmF3O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGN1cnJlbnRSYXcgPT09ICdzdHJpbmcnICYmIGN1cnJlbnRSYXcudHJpbSgpICE9PSAnJykge1xuICAgICAgY29uc3QgcGFyc2VkQ3VycmVudCA9IHBhcnNlRmxvYXQoY3VycmVudFJhdyk7XG4gICAgICBjdXJyZW50ID0gTnVtYmVyLmlzRmluaXRlKHBhcnNlZEN1cnJlbnQpID8gcGFyc2VkQ3VycmVudCA6IDA7XG4gICAgfVxuXG4gICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuZHVyYXRpb24gPSBjdXJyZW50ICsgZGVsdGE7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gfHwgIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxTdWJTdGVwcyA9ICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzIHx8IFtdKSBhcyBhbnlbXTtcbiAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHN1YlN0ZXAgb2YgYWxsU3ViU3RlcHMpIHtcbiAgICAgIGNvbnN0IHVpVHlwZTogc3RyaW5nID0gc3ViU3RlcD8udWlUeXBlIHx8IHN1YlN0ZXA/LnR5cGUgfHwgJyc7XG5cbiAgICAgIC8vIFNwbGl0IEFJX0FVVE9fSEVBTF9TVUNDRVNTL0ZBSUxFRCBpbnRvIHR3byBlbnRyaWVzXG4gICAgICBpZiAodWlUeXBlID09PSAnQUlfQVVUT19IRUFMX1NVQ0NFU1MnIHx8IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9GQUlMRUQnKSB7XG4gICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9TVUNDRVNTJztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdWJTdGVwLnZhbHVlID8/IHN1YlN0ZXAudGV4dCA/PyAnJztcbiAgICAgICAgY29uc3QgcmVhc29uaW5nID0gc3ViU3RlcC5yZWFzb25pbmcgPz8gc3ViU3RlcC5SZWFzb25pbmcgPz8gJyc7XG4gICAgICAgIGNvbnN0IGJhc2VEdXJhdGlvbiA9IHN1YlN0ZXAuZHVyYXRpb24gfHwgMDtcbiAgICAgICAgY29uc3QgZmluYWxTdGF0dXMgPSBpc1N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbGVkJztcblxuICAgICAgICAvLyBGaXJzdCBlbnRyeTogdmFsdWUvZGVzY3JpcHRpb25cbiAgICAgICAgY29uc3QgdmFsdWVEZXNjcmlwdGlvbiA9IChpc1N1Y2Nlc3NcbiAgICAgICAgICA/IGBBSSBhdXRvLWhlYWwgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICA6IGBBSSBhdXRvLWhlYWwgZmFpbGVkYCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQucHVzaCh7XG4gICAgICAgICAgLi4uc3ViU3RlcCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWVEZXNjcmlwdGlvbixcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcmVhc29uaW5nOiBudWxsLFxuICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1ZBTFVFJyxcbiAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgIGlzQWlBdXRvSGVhbFJlc3VsdDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZWNvbmQgZW50cnk6IHJlYXNvbmluZyAob25seSBpZiBwcmVzZW50KVxuICAgICAgICBpZiAocmVhc29uaW5nKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVhc29uaW5nLFxuICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICByZWFzb25pbmc6IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXG4gICAgICAgICAgICB1aVR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIHR5cGU6ICdBSV9BVVRPX0hFQUxfUkVBU09OSU5HJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBiYXNlRHVyYXRpb24sXG4gICAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gKHN1YlN0ZXA/LnN0YXR1cyA/PyAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBpc0ZhaWxlZCA9IHN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgc3RhdHVzID09PSAnZmFpbHVyZSc7XG4gICAgICAgIGNvbnN0IGlzTG9jYXRvclN0ZXAgPSB1aVR5cGUgPT09ICdXQUlUX0ZPUl9MT0NBVE9SJyB8fCB1aVR5cGUgPT09ICdGSU5EX0xPQ0FUT1InIHx8IHVpVHlwZSA9PT0gJ0xPQ0FUT1JfRk9VTkQnO1xuICAgICAgICBpZiAoaXNMb2NhdG9yU3RlcCAmJiBpc0ZhaWxlZCkge1xuICAgICAgICAgIGNvbnN0IGJhc2VEZXNjID0gc3ViU3RlcD8uZGVzY3JpcHRpb24gPz8gc3ViU3RlcD8udGV4dCA/PyBzdWJTdGVwPy50aXRsZSA/PyAnJztcbiAgICAgICAgICBjb25zdCBub3RGb3VuZFN1ZmZpeCA9ICcgLSBFbGVtZW50IG5vdCBmb3VuZCc7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogKGJhc2VEZXNjID8gYmFzZURlc2MgKyBub3RGb3VuZFN1ZmZpeCA6IG5vdEZvdW5kU3VmZml4LnRyaW0oKSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0LnB1c2goc3ViU3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZm9udC1pbnRlciBjcWEtdy1mdWxsXCIgW2NsYXNzLmNxYS1vcGFjaXR5LTUwXT1cImlzRGVidWcgJiYgaXNTa2lwcGVkICYmICFwYXJlbnRTa2lwcGVkXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiIWlzRGVidWcgPyBudWxsIDogc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdwYXVzZWQnID8gJyNGRkY5RTknIDogc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsZWQnID8gJyNGRUYyRjInIDogbnVsbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1wLTIgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyKCRldmVudClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlYnVnSWNvblwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgW21hdFRvb2x0aXBdPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJyA/ICdCcmVha3BvaW50IGNhbm5vdCBiZSBzZXQgb24gYSBydW5uaW5nIHN0ZXAnIDogKGlzU3RlcERlbGV0ZWQgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIGRlbGV0ZWQgc3RlcHMnIDogKCghIXBhcmVudFNraXBwZWQgJiYgIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCkgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIGEgcnVubmluZyBzdGVwJyA6ICghIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCA/ICdCcmVha3BvaW50IGNhbm5vdCBiZSBzZXQgb24gc2tpcHBlZCBzdGVwcycgOiAnJykpKVwiXG4gICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLXJvdW5kZWQtZnVsbCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICBbbmdDbGFzc109XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3J1bm5pbmcnIHx8ICEhc3RlcD8uZGVidWdQb2ludERpc2FibGVkIHx8ICEhcGFyZW50U2tpcHBlZCB8fCBpc1N0ZXBEZWxldGVkID8gJ2NxYS1jdXJzb3Itbm90LWFsbG93ZWQgY3FhLW9wYWNpdHktNDAgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUnIDogJ2NxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJyB8fCAhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZFwiXG4gICAgICAgIChjbGljayk9XCJvbkRlYnVnUG9pbnRDbGljaygkZXZlbnQpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJkZWJ1Z1BvaW50U2V0ID8gJ1JlbW92ZSBkZWJ1ZyBwb2ludCcgOiAnU2V0IGRlYnVnIHBvaW50J1wiPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiZGVidWdQb2ludFNldFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgW2F0dHIuZmlsbF09XCIhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZCA/ICcjOUU5RTlFJyA6ICcjQzYzNTM1J1wiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzdmcgKm5nSWY9XCIhZGVidWdQb2ludFNldFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgW2F0dHIuc3Ryb2tlXT1cIiEhc3RlcD8uZGVidWdQb2ludERpc2FibGVkIHx8ICEhcGFyZW50U2tpcHBlZCB8fCBpc1N0ZXBEZWxldGVkID8gJyM5RTlFOUUnIDogJyNDNjM1MzUnXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBTdGF0dXMgSWNvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDwhLS0gU3VjY2VzcyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3N1Y2Nlc3MnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTAuOTAwNSA0Ljk5OTk5QzExLjEyODkgNi4xMjA2NCAxMC45NjYyIDcuMjg1NzEgMTAuNDM5NSA4LjMwMDg5QzkuOTEyNzkgOS4zMTYwOCA5LjA1NCAxMC4xMiA4LjAwNjMxIDEwLjU3ODdDNi45NTg2MiAxMS4wMzczIDUuNzg1MzYgMTEuMTIyOSA0LjY4MjIgMTAuODIxMkMzLjU3OTA0IDEwLjUxOTUgMi42MTI2NSA5Ljg0ODY5IDEuOTQ0MTkgOC45MjA3MUMxLjI3NTczIDcuOTkyNzIgMC45NDU2MTEgNi44NjM2MSAxLjAwODg4IDUuNzIxNjlDMS4wNzIxNSA0LjU3OTc2IDEuNTI0OTkgMy40OTQwNCAyLjI5MTg4IDIuNjQ1NThDMy4wNTg3NiAxLjc5NzEyIDQuMDkzMzQgMS4yMzcyMSA1LjIyMzA4IDEuMDU5MjJDNi4zNTI4MiAwLjg4MTIzMyA3LjUwOTQ0IDEuMDk1OTIgOC41MDAwNSAxLjY2NzQ5XCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNSA1LjVMNiA3TDExIDJcIiBzdHJva2U9XCIjMjJDNTVFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPCEtLSBGYWlsZWQgLS0+XG4gICAgICA8c3ZnICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhaWxlZCdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiNFRjQ0NDRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00IDRMOCA4TTggNEw0IDhcIiBzdHJva2U9XCIjRUY0NDQ0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPCEtLSBQZW5kaW5nIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncGVuZGluZydcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgPCEtLSBSdW5uaW5nIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZydcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiMzQjgyRjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjM0I4MkY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgXG4gICAgICAgIDxzcGFuICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdza2lwcGVkJ1wiICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVsxMnB4XVwiPlxuICAgICAgICAgIHNraXBfbmV4dFxuICAgICAgICA8L3NwYW4+XG4gICAgICA8ZGl2ICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdwYXVzZWQnXCI+PHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk04LjUgMkg3LjVDNy4yMjM4NiAyIDcgMi4yMjM4NiA3IDIuNVY5LjVDNyA5Ljc3NjE0IDcuMjIzODYgMTAgNy41IDEwSDguNUM4Ljc3NjE0IDEwIDkgOS43NzYxNCA5IDkuNVYyLjVDOSAyLjIyMzg2IDguNzc2MTQgMiA4LjUgMlpcIiBzdHJva2U9XCIjRTE3MTAwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC41IDJIMy41QzMuMjIzODYgMiAzIDIuMjIzODYgMyAyLjVWOS41QzMgOS43NzYxNCAzLjIyMzg2IDEwIDMuNSAxMEg0LjVDNC43NzYxNCAxMCA1IDkuNzc2MTQgNSA5LjVWMi41QzUgMi4yMjM4NiA0Ljc3NjE0IDIgNC41IDJaXCIgc3Ryb2tlPVwiI0UxNzEwMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9vcCBJY29uIC0tPlxuICAgIDxkaXY+PHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCI0XCIgZmlsbD1cIiNFQkVDRkRcIi8+PHBhdGggZD1cIk05LjY2NjYzIDQuNjY2NjZMMTEgNS45OTk5OUw5LjY2NjYzIDcuMzMzMzJcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNSA3LjY2NjY3VjcuMzMzMzNDNSA2Ljk3OTcxIDUuMTQwNDggNi42NDA1NyA1LjM5MDUyIDYuMzkwNTJDNS42NDA1NyA2LjE0MDQ4IDUuOTc5NzEgNiA2LjMzMzMzIDZIMTFcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNi4zMzMzMyAxMS4zMzMzTDUgOS45OTk5OUw2LjMzMzMzIDguNjY2NjZcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNMTEgOC4zMzMzNFY4LjY2NjY4QzExIDkuMDIwMyAxMC44NTk1IDkuMzU5NDQgMTAuNjA5NSA5LjYwOTQ5QzEwLjM1OTQgOS44NTk1MyAxMC4wMjAzIDEwIDkuNjY2NjcgMTBINVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+PC9kaXY+XG5cbiAgICA8IS0tIFN0ZXAgTnVtYmVyIGFuZCBUaXRsZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtZm9udC1pbnRlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzMzNDE1NV0gY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsxOHB4XVwiIHN0eWxlPVwid29yZC1icmVhazogYnJlYWstd29yZDtcIj5cbiAgICAgICAge3sgY29uZmlnPy5zdGVwTnVtYmVyIH19LiA8c3BhbiBbaW5uZXJIVE1MXT1cImNvbmZpZz8udGl0bGVcIj48L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICBcbiAgICAgIDwhLS0gTG9vcCBUeXBlIEJhZGdlcyAtLT5cbiAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBiYWRnZSBvZiBnZXRMb29wVHlwZUJhZGdlcygpXCIgXG4gICAgICAgIGNsYXNzPVwiY3FhLXB4LTEuNSBjcWEtcm91bmRlZC1mdWxsIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1wcmltYXJ5IGNxYS1iZy1bI0VCRUNGRF0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XVwiPlxuICAgICAgICB7eyBiYWRnZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWcuc3RlcERlbGV0ZWRcIiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXB5LVsycHhdIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjQjQyMzE4XSBjcWEtYmctWyNGRUYzRjJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZFRTRFMl1cIj5cbiAgICAgICAgRGVsZXRlZFxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1mb250LWludGVyXCI+XG4gICAgICA8IS0tIFN0ZXAgQ2hhbmdlIEJhZGdlcyAoZGVidWcgb25seSkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEZWJ1Z1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiYWRnZSBvZiBzdGVwQmFkZ2VzXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdJZj1cImJhZGdlID09PSAnc2tpcHBlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiU2tpcHBlZFwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbdGV4dENvbG9yXT1cIicjNEE1NTY1J1wiXG4gICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjOTlBMUFGJ1wiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInI0ZGRkZGRidcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdJZj1cImJhZGdlID09PSAnZWRpdGVkJ1wiXG4gICAgICAgICAgbGFiZWw9XCJFZGl0ZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInI0ZCQkYyNCdcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0ZEREY5MidcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGRkY5RTknXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ2FkZGVkJ1wiXG4gICAgICAgICAgbGFiZWw9XCJBZGRlZFwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbdGV4dENvbG9yXT1cIicjMERCRDdEJ1wiXG4gICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjNUVEM0E4J1wiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInI0NGRjJFNSdcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICAqbmdJZj1cImJhZGdlID09PSAncmVtb3ZlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiUmVtb3ZlZFwiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICBbdGV4dENvbG9yXT1cIicjRUUzRjNGJ1wiXG4gICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjRjQ3RjdGJ1wiXG4gICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCInI0ZDRDlEOSdcIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3BhbiAqbmdJZj1cInNlbGZIZWFsQW5hbHlzaXNcIiBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwOTdFNTNdIGNxYS1iZy1bI0NGRjJFNV0gY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbWluLXctbWF4IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bNnB4XVwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjlcIiBoZWlnaHQ9XCI5XCIgdmlld0JveD1cIjAgMCA5IDlcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNC41MDk0MSAwQzQuNTY0ODkgMC4wMjI3Mzg0IDQuNTg4NTkgMC4wNzgyNjUyIDQuNjExMzEgMC4xMjk4NDZDNC42MjI2OSAwLjE1OTkgNC42MzMxNCAwLjE5MDExNyA0LjY0MzI5IDAuMjIwNTc1QzQuNjQ3MjYgMC4yMzIyNDcgNC42NTEyMyAwLjI0MzkxOCA0LjY1NTMyIDAuMjU1OTQzQzQuNzA4MDYgMC40MTMwMDUgNC43NTUwNCAwLjU3MTc0OCA0LjgwMjI5IDAuNzMwMzhDNC44MTI5NyAwLjc2NjE5IDQuODIzNjkgMC44MDE5ODcgNC44MzQ0MiAwLjgzNzc4M0M0Ljg4OTA1IDEuMDIwMDQgNC45NDMyNyAxLjIwMjQgNC45OTcxOSAxLjM4NDg0QzUuMDA0NzYgMS40MTA0NyA1LjAxMjM0IDEuNDM2MDkgNS4wMTk5MiAxLjQ2MTcxQzUuMDQxMjggMS41MzM5NSA1LjA2MjYyIDEuNjA2MTkgNS4wODM4MyAxLjY3ODQ3QzUuMTI4NjcgMS44MzEyIDUuMTc0NzMgMS45ODM0NyA1LjIyMzc4IDIuMTM1MDFDNS4yMjgwNyAyLjE0ODI3IDUuMjMyMzYgMi4xNjE1MiA1LjIzNjc3IDIuMTc1MThDNS4zNjQyIDIuNTY1IDUuNTQ0ODIgMi45MTQzNyA1Ljg0MDkgMy4yMTE5NkM1Ljg0ODIzIDMuMjE5NyA1Ljg1NTU2IDMuMjI3NDQgNS44NjMxMiAzLjIzNTQxQzUuOTg5NSAzLjM2NDM3IDYuMTUxNjkgMy40Njc3MSA2LjMxMzggMy41NTExMUM2LjMyMjA2IDMuNTU1NDIgNi4zMzAzMSAzLjU1OTc0IDYuMzM4ODIgMy41NjQxOUM2LjgxNTg3IDMuODA5MjUgNy4zODk1MSAzLjkxNzA0IDcuOTA2MTkgNC4wNjA1QzguMTMyNiA0LjEyMzQgOC4zNTgzIDQuMTg4MjkgOC41ODMxNyA0LjI1NjAzQzguNTk4OTcgNC4yNjA3OSA4LjYxNDc4IDQuMjY1NTQgOC42MzA1OCA0LjI3MDI4QzguNjc3ODQgNC4yODQ0NSA4LjcyNSA0LjI5ODg3IDguNzcyMTEgNC4zMTM0N0M4Ljc4MzEgNC4zMTY3OSA4Ljc5NDA4IDQuMzIwMTEgOC44MDUzOSA0LjMyMzUzQzguODcwMjkgNC4zNDQwNiA4LjkzMjM5IDQuMzY4MjkgOC45ODU2NiA0LjQxMDI3QzkuMDAxOTEgNC40NDQxOCA5LjAwMTkxIDQuNDQ0MTggOC45OTc0OCA0LjQ3ODFDOC45NDU2NCA0LjUyNzM2IDguODk0MiA0LjU1MDQ2IDguODI1NzggNC41NzNDOC44MTYgNC41NzYzMiA4LjgwNjIyIDQuNTc5NjUgOC43OTYxNCA0LjU4MzA4QzguNjgwNjEgNC42MjE4MyA4LjU2MzUxIDQuNjU1NzUgOC40NDYyNiA0LjY4OTM1QzguNDIyMiA0LjY5NjMgOC4zOTgxNCA0LjcwMzI2IDguMzc0MDggNC43MTAyMUM4LjIyNTcxIDQuNzUzMDEgOC4wNzcwOCA0Ljc5NDkgNy45MjgyOSA0LjgzNjMyQzcuNzMyMzIgNC44OTA4OCA3LjUzNjYzIDQuOTQ2MzQgNy4zNDExMyA1LjAwMjQzQzcuMzA5MSA1LjAxMTYyIDcuMjc3MDYgNS4wMjA3OCA3LjI0NTAxIDUuMDI5OTFDNy4wNzY3MSA1LjA3Nzg2IDYuOTA5MjMgNS4xMjc1MyA2Ljc0MzE0IDUuMTgyMDhDNi43MjkzNyA1LjE4NjU5IDYuNzE1NTkgNS4xOTExIDYuNzAxMzkgNS4xOTU3NEM2LjE0NTExIDUuMzgwODIgNS43MjExIDUuNzI2MDkgNS40NTU3MSA2LjIzMDk5QzUuMzEyNjMgNi41MTQ3NSA1LjIyODIzIDYuODIxNjEgNS4xNDIxNCA3LjEyNDQ3QzUuMTE4ODQgNy4yMDYxOSA1LjA5NDA5IDcuMjg3NDUgNS4wNjkwNSA3LjM2ODY5QzUuMDQ5NCA3LjQzMjYxIDUuMDMwMiA3LjQ5NjYzIDUuMDExNDkgNy41NjA4MUM1LjAwOTI2IDcuNTY4NDQgNS4wMDcwMyA3LjU3NjA4IDUuMDA0NzMgNy41ODM5NUM0Ljk5Mzk0IDcuNjIwOTQgNC45ODMxOSA3LjY1NzkzIDQuOTcyNTIgNy42OTQ5NUM0Ljk0NTE5IDcuNzg4NzkgNC45MTU3OCA3Ljg4MTg3IDQuODg1NTUgNy45NzQ4OUM0LjgzMTkxIDguMTQwMjEgNC43ODMxIDguMzA2NzQgNC43MzQ1OSA4LjQ3MzVDNC42NjE0NCA4LjcyNDU3IDQuNjYxNDQgOC43MjQ1NyA0LjYxOTk3IDguODQ1MjdDNC42MTcyMSA4Ljg1MzM3IDQuNjE0NDYgOC44NjE0NyA0LjYxMTYzIDguODY5ODJDNC41OTY0OSA4LjkxMjc4IDQuNTgwOTIgOC45NTIzMyA0LjU1MjI2IDguOTg4N0M0LjUwODY3IDguOTk3ODggNC41MDg2NyA4Ljk5Nzg4IDQuNDY5NTEgOUM0LjQyNDczIDguOTM3NTkgNC4zOTUwOCA4Ljg3NzExIDQuMzcxMzMgOC44MDUwOEM0LjM2Nzg3IDguNzk0ODcgNC4zNjQ0MSA4Ljc4NDY2IDQuMzYwODUgOC43NzQxNUM0LjMxNjg0IDguNjQyNDggNC4yNzc1MSA4LjUwOTQ2IDQuMjM4MTcgOC4zNzY0NkM0LjIyOTE2IDguMzQ2MDQgNC4yMjAxMSA4LjMxNTY0IDQuMjExMDUgOC4yODUyNEM0LjE0MzYgOC4wNTg2MyA0LjA3NzI1IDcuODMxNzQgNC4wMTEwMSA3LjYwNDgxQzMuNzM1MDcgNi40ODIyNCAzLjczNTA3IDYuNDgyMjQgMy4wMzkgNS41NzQ2NkMzLjAyNzg0IDUuNTY1OTYgMy4wMTY2OSA1LjU1NzI2IDMuMDA1MTkgNS41NDgzQzIuNTQ5MTMgNS4xOTkwMiAxLjk0ODM0IDUuMDY5NjkgMS4zOTgxNSA0LjkxODEzQzEuMjYyMDcgNC44ODA2MiAxLjEyNjA1IDQuODQyOTMgMC45OTAwMzIgNC44MDUyM0MwLjk3ODEzOCA0LjgwMTkzIDAuOTc4MTM4IDQuODAxOTMgMC45NjYwMDMgNC43OTg1N0MwLjc2OTgxMSA0Ljc0NDE3IDAuNTczNjc0IDQuNjg5NjMgMC4zNzgyMjQgNC42MzI4M0MwLjM2OTk1NiA0LjYzMDQ1IDAuMzYxNjg4IDQuNjI4MDYgMC4zNTMxNjkgNC42MjU2MUMwLjA1Mjg5ODkgNC41Mzg4MyAwLjA1Mjg5ODkgNC41Mzg4MyAwLjAwMDY0NjUzNyA0LjQ3ODFDLTAuMDAwODMxMjYxIDQuNDUwNTQgLTAuMDAwODMxMjYxIDQuNDUwNTQgMC4wMTI0Njg5IDQuNDIxNTdDMC4wNjcwODM1IDQuMzcwNCAwLjEyMDA3NyA0LjM0ODQ4IDAuMTkyMTYgNC4zMjYxOUMwLjIwMjU5NyA0LjMyMjg0IDAuMjEzMDM0IDQuMzE5NDggMC4yMjM3ODcgNC4zMTYwM0MwLjI1NTc1MyA0LjMwNTgyIDAuMjg3Nzg4IDQuMjk1ODQgMC4zMTk4NTEgNC4yODU5MkMwLjMyOTAwMSA0LjI4MzA1IDAuMzM4MTUxIDQuMjgwMTcgMC4zNDc1NzggNC4yNzcyMkMwLjQxMjI4NSA0LjI1NjkzIDAuNDc3MjI1IDQuMjM3NCAwLjU0MjI1OSA0LjIxODA5QzAuNTU4MjQgNC4yMTMzMiAwLjU1ODI0IDQuMjEzMzIgMC41NzQ1NDQgNC4yMDg0NkMwLjg1MjI2OSA0LjEyNTg3IDEuMTMxODEgNC4wNDkgMS40MTEyNiAzLjk3MTk2QzEuNjE5NSAzLjkxNDU1IDEuODI3MzggMy44NTYxOCAyLjAzNDYgMy43OTU0OEMyLjA0NDEzIDMuNzkyNzEgMi4wNTM2NSAzLjc4OTkzIDIuMDYzNDYgMy43ODcwN0MyLjU0MzUgMy42NDY5NiAzLjAxMjc4IDMuNDQ4MTYgMy4zMjI3NCAzLjA1MzdDMy4zMjczOCAzLjA0Nzg1IDMuMzMyMDIgMy4wNDIgMy4zMzY4IDMuMDM1OTdDMy42ODE5NyAyLjU5ODE1IDMuODE2NTggMi4wNjU3MiAzLjk2Njk1IDEuNTQ2MjFDNC4wMTY0MyAxLjM3NTM0IDQuMDY2NDkgMS4yMDQ2NCA0LjExNjczIDEuMDMzOTlDNC4xMzA2NCAwLjk4NjczMyA0LjE0NDUzIDAuOTM5NDcxIDQuMTU4MzYgMC44OTIxOTRDNC4yMTM5NCAwLjcwMjI4OSA0LjI3MDM1IDAuNTEyNjQyIDQuMzMgMC4zMjM4NjRDNC4zMzU1OCAwLjMwNjE4NiA0LjM0MTE0IDAuMjg4NTAxIDQuMzQ2NjYgMC4yNzA4MDdDNC40MzAxNyAwLjAwMzk4NzYxIDQuNDMwMTcgMC4wMDM5ODc2MSA0LjUwOTQxIDBaXCIgZmlsbD1cIiMwREJEN0RcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk03LjIzNTk3IDAuNTU0ODU5QzcuMjkwMjQgMC42MTM1OTkgNy4zMDEwOSAwLjY4MjYzMSA3LjMxNzk5IDAuNzU3NjM4QzcuMzc0MzYgMC45OTMyNjkgNy40MzkyOSAxLjIwOTkzIDcuNjY0NjcgMS4zNDY4MUM3LjgwMzcxIDEuNDIwMzUgNy45Njk0NCAxLjQ1MzgxIDguMTIzNSAxLjQ4NTQxQzguMTg4NTQgMS40OTkwMiA4LjI0MzQ4IDEuNTE3MDkgOC4yOTkyNCAxLjU1MzIxQzguMzExODEgMS41NzIyOSA4LjMxMTgxIDEuNTcyMjkgOC4zMTEwNyAxLjYwNTQ5QzguMjk4MTQgMS42NDU4OCA4LjI4Njc4IDEuNjU4OSA4LjI1MjY5IDEuNjg1MzNDOC4yMTU0MyAxLjY5NzI2IDguMjE1NDMgMS42OTcyNiA4LjE3MDY4IDEuNzA2NTNDOC4xNTM3NSAxLjcxMDI1IDguMTM2ODMgMS43MTQgOC4xMTk5MiAxLjcxNzc5QzguMTEwODYgMS43MTk4IDguMTAxODEgMS43MjE4MSA4LjA5MjQ3IDEuNzIzODhDNy44MTY5NiAxLjc4NDgyIDcuODE2OTYgMS43ODQ4MiA3LjU3ODgyIDEuOTIyNzNDNy41NzEwOCAxLjkyODY5IDcuNTYzMzMgMS45MzQ2NiA3LjU1NTM2IDEuOTQwOEM3LjM4NTE2IDIuMDg0MzEgNy4zNDkxNiAyLjMyMzAzIDcuMjk3OTMgMi41MjMwMUM3LjI5NDk5IDIuNTMzOTkgNy4yOTIwNiAyLjU0NDk3IDcuMjg5MDMgMi41NTYyOUM3LjI4NjQ5IDIuNTY2MDEgNy4yODM5NSAyLjU3NTczIDcuMjgxMzMgMi41ODU3NUM3LjI3MDI4IDIuNjE1NDQgNy4yNTg4MSAyLjYzNDc5IDcuMjM1OTcgMi42NTc1NEM3LjE3MjM0IDIuNjY1MjcgNy4xNzIzNCAyLjY2NTI3IDcuMTQxMzkgMi42NTc1NEM3LjA5MjE2IDIuNjIxMDYgNy4wODExNCAyLjU3OTUgNy4wNjgyOCAyLjUyMzY1QzcuMDY2MTMgMi41MTUwMSA3LjA2Mzk4IDIuNTA2MzYgNy4wNjE3NiAyLjQ5NzQ1QzcuMDU0ODkgMi40Njk4MyA3LjA0ODI0IDIuNDQyMTcgNy4wNDE2NCAyLjQxNDQ5QzYuOTg5NzkgMi4xOTg5NyA2LjkzMTI2IDEuOTg3NTEgNi43MjQ1MSAxLjg2MTE4QzYuNTYyOTMgMS43NzUwMSA2LjM2NjQ2IDEuNzM0MjYgNi4xODU4NyAxLjcwMTM2QzYuMTM2MzcgMS42OTE1MSA2LjEwODAyIDEuNjc5MTEgNi4wNzczOCAxLjY0MDEyQzYuMDcwNzMgMS42MDA1NSA2LjA3MDczIDEuNjAwNTUgNi4wNzczOCAxLjU2MDk4QzYuMTI0NDcgMS41MTQzNyA2LjE3NDAyIDEuNTAyOTkgNi4yMzc3MiAxLjQ4ODkxQzYuMjU3NzggMS40ODQxNiA2LjI3Nzg0IDEuNDc5MzggNi4yOTc4OSAxLjQ3NDU2QzYuMzA4MjUgMS40NzIwOSA2LjMxODYxIDEuNDY5NjIgNi4zMjkyOSAxLjQ2NzA3QzYuMzgyMTIgMS40NTQwNyA2LjQzNDQzIDEuNDM5NDkgNi40ODY3MyAxLjQyNDYyQzYuNDk2MjMgMS40MjE5OCA2LjUwNTczIDEuNDE5MzUgNi41MTU1MiAxLjQxNjYzQzYuNjIxODIgMS4zODYyNCA2LjcxMzU2IDEuMzQ3MzcgNi43OTg1NCAxLjI3ODM2QzYuODA2NDcgMS4yNzIxMyA2LjgxNDM5IDEuMjY1ODkgNi44MjI1NSAxLjI1OTQ2QzYuOTU0OCAxLjE0NTY1IDYuOTk5NzQgMC45NzQ2NzQgNy4wNDA1MyAwLjgxNTEzNEM3LjA0MzY0IDAuODAzMDIyIDcuMDQ2NzUgMC43OTA5MSA3LjA0OTk1IDAuNzc4NDMyQzcuMDU2MTQgMC43NTQxMDEgNy4wNjIyMiAwLjcyOTc0MyA3LjA2ODE3IDAuNzA1MzU5QzcuMDcyNDMgMC42ODgzOTQgNy4wNzI0MyAwLjY4ODM5NCA3LjA3Njc4IDAuNjcxMDg2QzcuMDc5MjcgMC42NjA5NTEgNy4wODE3NSAwLjY1MDgxNiA3LjA4NDMxIDAuNjQwMzczQzcuMDk1MjEgMC42MDgxMDggNy4xMDk1MiAwLjU4Mjc3MiA3LjEyOTU3IDAuNTU0ODU5QzcuMTY4MSAwLjUzNjQzNSA3LjE5NTE1IDAuNTQ0NzY0IDcuMjM1OTcgMC41NTQ4NTlaXCIgZmlsbD1cIiMwNzVGM0ZcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xLjc5NTQ1IDYuMjQ3MUMxLjgwOTUxIDYuMjQ3MTkgMS44MDk1MSA2LjI0NzE5IDEuODIzODYgNi4yNDcyOUMxLjkyNDc3IDYuMjUwMjIgMS45OTMwNCA2LjI4MTE1IDIuMDY3MzYgNi4zNDYwMUMyLjE1Mzg0IDYuNDM1MzMgMi4xOTM3NyA2LjUzNjExIDIuMTkxNSA2LjY1NjVDMi4xODE3OCA2Ljc1NDEyIDIuMTIxNTggNi44MzkzNSAyLjA0NzczIDYuOTA1MzNDMS45NjA4MSA2Ljk3MjQyIDEuODczMTMgNi45OTQ1OSAxLjc2MjA2IDYuOTkxNDlDMS42Njg0MSA2Ljk4MTA3IDEuNTgwMyA2LjkzODUyIDEuNTEzOTMgNi44NzQ1MUMxLjQzMTM4IDYuNzY2ODEgMS40MDcyNSA2LjY2ODAzIDEuNDE5MzUgNi41MzUzN0MxLjQ0NDMzIDYuNDMwOTIgMS41MTYzNyA2LjM0NjEzIDEuNjA4NSA2LjI4NjY2QzEuNjcyNTEgNi4yNTU2NCAxLjcyMzk5IDYuMjQ2NTIgMS43OTU0NSA2LjI0NzFaXCIgZmlsbD1cIiMwREJEN0RcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIFNlbGYtaGVhbGVkXG4gICAgICA8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXJvdW5kZWQtWzRweF0gY3FhLXB5LTAuNSBjcWEtcHgtMSBjcWEtYmctWyM2MzY2RjExQV0gY3FhLW1sLTEgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHlcIiBcbiAgICAgICAgICAgKm5nSWY9XCJzdGVwPy5leGVjdXRlZFJlc3VsdD8udmlkZW9fc3RhcnRfdGltZVwiIFxuICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInSnVtcCB0byB2aWRlbyB0aW1lJ1wiIFxuICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgIChjbGljayk9XCJvbkp1bXBUb1RpbWVzdGFtcCgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjM2MzYzXSAhY3FhLXRleHQtWzEwcHhdICFjcWEtdy1bMTBweF0gIWNxYS1oLVsxMHB4XVwiPlxuICAgICAgICAgIHBsYXlfYXJyb3dcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bOHB4XSBjcWEtbGVhZGluZy1bMTJweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjNjM2MzYzXVwiPlxuICAgICAgICAgIHt7IGZvcm1hdER1cmF0aW9uQ2xvY2soc3RlcD8uZXhlY3V0ZWRSZXN1bHQ/LnZpZGVvX3N0YXJ0X3RpbWUgfHwgMCkgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNEZWJ1Z1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTAuNSBjcWEtdGV4dC1bIzlDQTNBRl1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiAqbmdJZj1cIiFzdGVwPy5pc1N0ZXBHcm91cENoaWxkcmVuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIiBhcmlhLWxhYmVsPVwiRWRpdFwiIChjbGljayk9XCJvbkVkaXRTdGVwKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXRleHQtWzE0cHhdICFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhc3RlcD8uaXNTdGVwR3JvdXBDaGlsZHJlblwiIHR5cGU9XCJidXR0b25cIiAjYWRkU3RlcE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIkFkZFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJhZGRTdGVwTWVudVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtbWVudSAjYWRkU3RlcE1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJjcWEtYWRkLXN0ZXAtbWVudVwiIHhQb3NpdGlvbj1cImJlZm9yZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBvcHQgb2YgYWRkU3RlcE1lbnVPcHRpb25zXCIgKGNsaWNrKT1cIm9uQWRkU3RlcE9wdGlvblNlbGVjdChvcHQsICRldmVudClcIj5cbiAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWZmZWN0aXZlU3RlcE1vcmVNZW51T3B0aW9ucy5sZW5ndGhcIiB0eXBlPVwiYnV0dG9uXCIgI3N0ZXBNb3JlTWVudVRyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGZvY3VzOmNxYS1vdXRsaW5lLW5vbmVcIiBhcmlhLWxhYmVsPVwiTW9yZSBvcHRpb25zXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInN0ZXBNb3JlTWVudVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxtYXQtbWVudSAjc3RlcE1vcmVNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiY3FhLXN0ZXAtbW9yZS1tZW51XCIgeFBvc2l0aW9uPVwiYmVmb3JlXCIgeVBvc2l0aW9uPVwiYmVsb3dcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKm5nRm9yPVwibGV0IG9wdCBvZiBlZmZlY3RpdmVTdGVwTW9yZU1lbnVPcHRpb25zXCIgKGNsaWNrKT1cIm9uU3RlcE1vcmVPcHRpb25TZWxlY3Qob3B0LCAkZXZlbnQpXCI+e3sgb3B0LmxhYmVsIH19PC9idXR0b24+XG4gICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM5Q0EzQUZdXCI+XG4gICAgICAgIHt7IGZvcm1hdER1cmF0aW9uKGNvbmZpZy5kdXJhdGlvbikgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImlzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS10cmFuc2l0aW9uLXRyYW5zZm9ybVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTMuNSA1TDcgOC41TDEwLjUgNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFeHBhbmRlZCBDb250ZW50IC0tPlxuICA8ZGl2ICpuZ0lmPVwiaXNFeHBhbmRlZFwiPlxuICAgIDwhLS0gSXRlcmF0aW9uIFNlbGVjdG9yIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtNCBjcWEtcHktMiBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzczNzM3M11cIiAqbmdJZj1cIiFpc0xpdmUgfHwgKGlzTGl2ZSAmJiBjb25maWc/Lml0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZClcIj5cbiAgICAgIDxsYWJlbD5JdGVyYXRpb248L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bMTU2cHhdXCI+XG4gICAgICAgIDwhLS0gU3RhdHVzIGluZGljYXRvciBmb3Igc2VsZWN0ZWQgaXRlcmF0aW9uIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24gJiYgY29uZmlnPy5pdGVyYXRpb25zICYmIGNvbmZpZz8uaXRlcmF0aW9ucz8ubGVuZ3RoID4gMFwiIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LVsxMHB4XSBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCI+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgNiA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiM1wiIGZpbGw9XCIjMDBBNjNFXCIvPjwvc3ZnPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZEl0ZXJhdGlvbi5zdGF0dXMgPT09ICdmYWlsZWQnXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgNiA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiM1wiIGZpbGw9XCIjRUY0NDQ0XCIvPjwvc3ZnPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZEl0ZXJhdGlvbi5zdGF0dXMgPT09ICdwZW5kaW5nJ1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDYgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjNcIiBmaWxsPVwiIzlDQTNBRlwiLz48L3N2Zz5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24uc3RhdHVzID09PSAncnVubmluZydcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCA2IDZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIzXCIgZmlsbD1cIiMzQjgyRjZcIi8+PC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJjcWEtcGwtWzIycHhdIGNxYS1wci02IGNxYS1weS1bNXB4XSBjcWEtdy1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0U1RTVFNV0gY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWJnLVsjRkFGQUZBXSBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLWFwcGVhcmFuY2Utbm9uZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEl0ZXJhdGlvblwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiaGFuZGxlSXRlcmF0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJjb21wYXJlSXRlcmF0aW9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiKGlzTGl2ZSAmJiAoc3RhdHVzID09PSAncnVubmluZycgfHwgc3RhdHVzID09PSAnUlVOTklORycpKVwiPlxuICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCIhY29uZmlnPy5pdGVyYXRpb25zIHx8IGNvbmZpZz8uaXRlcmF0aW9ucz8ubGVuZ3RoID09PSAwXCIgdmFsdWU9XCJcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgIE5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlXG4gICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlcmF0aW9uIG9mIGNvbmZpZy5pdGVyYXRpb25zXCIgW25nVmFsdWVdPVwiaXRlcmF0aW9uXCI+XG4gICAgICAgICAgICB7eyBnZXRJdGVyYXRpb25MYWJlbChpdGVyYXRpb24pIH19XG4gICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8IS0tIERyb3Bkb3duIGFycm93IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yaWdodC0yIGNxYS10b3AtMS8yIGNxYS10cmFuc2Zvcm0gY3FhLS10cmFuc2xhdGUteS0xLzIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCAxMCA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xIDFMNSA1TDkgMVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1tbC1hdXRvXCIgKm5nSWY9XCJjb25maWc/Lml0ZXJhdGlvbnMgJiYgY29uZmlnPy5pdGVyYXRpb25zPy5sZW5ndGggPiAwXCI+XG4gICAgICAgIERlZmF1bHQ6IHt7IGNvbmZpZy5kZWZhdWx0SXRlcmF0aW9uID09PSAnbGFzdCcgPyAnbGFzdCBpdGVyYXRpb24nIDogJ2ZpcnN0IGl0ZXJhdGlvbicgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2VsZWN0ZWQgSXRlcmF0aW9uIFN1Yi1zdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24gJiYgc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLXB5LTEgY3FhLW1sLTlcIiBzdHlsZT1cImJvcmRlci1ib3R0b206ICcxcHggc29saWQgI0YzRjRGNidcIj5cbiAgICAgIDwhLS0gU2luZ2xlIGxvb3A6IHJlbmRlciBhbGwgZW50cmllcyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3ViU3RlcCBvZiAoaXNMaXZlID8gcHJvY2Vzc2VkU3ViU3RlcHMgOiBwcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdClcIj5cbiAgICAgICAgPCEtLSBBSV9BVVRPX0hFQUxfU1VDQ0VTUy9GQUlMRUQ6IHJlbmRlciB3aXRoIGFpLWFnZW50LXN0ZXAgc3R5bGUgKGJvdGggbGl2ZSBhbmQgcnVuIHJlc3VsdCBzY3JlZW5zKSAtLT5cbiAgICAgICAgPGNxYS1haS1sb2dzLXdpdGgtcmVhc29uaW5nXG4gICAgICAgICAgKm5nSWY9XCIkYW55KHN1YlN0ZXApLmlzQWlBdXRvSGVhbFJlc3VsdFwiXG4gICAgICAgICAgW3N0YXR1c109XCJzdWJTdGVwLnN0YXR1c1wiXG4gICAgICAgICAgW3RleHRdPVwiJGFueShzdWJTdGVwKS50ZXh0IHx8IHN1YlN0ZXA/LnZhbHVlXCJcbiAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiJGFueShzdWJTdGVwKS5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwPy50ZXh0IHx8IHN1YlN0ZXA/LnZhbHVlXCJcbiAgICAgICAgICBbcmVhc29uaW5nXT1cIiRhbnkoc3ViU3RlcCkucmVhc29uaW5nIHx8IHN1YlN0ZXA/LnJlYXNvbmluZ1wiXG4gICAgICAgICAgW2R1cmF0aW9uXT1cInN1YlN0ZXAuZHVyYXRpb25cIj5cbiAgICAgICAgPC9jcWEtYWktbG9ncy13aXRoLXJlYXNvbmluZz5cblxuICAgICAgICA8IS0tIFJlZ3VsYXIgc3ViLXN0ZXBzIC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCIhJGFueShzdWJTdGVwKS5pc0FpQXV0b0hlYWxSZXN1bHRcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LVs1LjVweF0gY3FhLXB4LTNcIj5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFN1Yi1zdGVwIFN0YXR1cyBJY29uIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdzdWNjZXNzJyB8fCBzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdwYXNzZWQnXCIgPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0xMC45MDA1IDQuOTk5OTlDMTEuMTI4OSA2LjEyMDY0IDEwLjk2NjIgNy4yODU3MSAxMC40Mzk1IDguMzAwODlDOS45MTI3OSA5LjMxNjA4IDkuMDU0IDEwLjEyIDguMDA2MzEgMTAuNTc4N0M2Ljk1ODYyIDExLjAzNzMgNS43ODUzNiAxMS4xMjI5IDQuNjgyMiAxMC44MjEyQzMuNTc5MDQgMTAuNTE5NSAyLjYxMjY1IDkuODQ4NjkgMS45NDQxOSA4LjkyMDcxQzEuMjc1NzMgNy45OTI3MiAwLjk0NTYxMSA2Ljg2MzYxIDEuMDA4ODggNS43MjE2OUMxLjA3MjE1IDQuNTc5NzYgMS41MjQ5OSAzLjQ5NDA0IDIuMjkxODggMi42NDU1OEMzLjA1ODc2IDEuNzk3MTIgNC4wOTMzNCAxLjIzNzIxIDUuMjIzMDggMS4wNTkyMkM2LjM1MjgyIDAuODgxMjMzIDcuNTA5NDQgMS4wOTU5MiA4LjUwMDA1IDEuNjY3NDlcIiBzdHJva2U9XCIjMjJDNTVFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC41IDUuNUw2IDdMMTEgMlwiIHN0cm9rZT1cIiMyMkM1NUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBGYWlsdXJlIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsdXJlJyB8fCBzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsZWQnXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiI0RDMjYyNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTcuNSA0LjVMNC41IDcuNVwiIHN0cm9rZT1cIiNEQzI2MjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjUgNC41TDcuNSA3LjVcIiBzdHJva2U9XCIjREMyNjI2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAncGVuZGluZydcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIFJ1bm5pbmcgLSBTaG93IHNwaW5uZXIgKGFsc28gdXNlZCBmb3IgYWN0aXZlIFdBSVRfRk9SX0xPQ0FUT1IgY291bnRkb3duIGluIGxpdmUgbW9kZSkgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlN0ZXA/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3J1bm5pbmcnXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFuaW1hdGUtc3BpbiBjcWEtdGV4dC1bIzNCODJGNl1cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCI2XCIgcj1cIjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiIG9wYWNpdHk9XCIwLjI1XCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMUE1IDUgMCAwIDEgMTEgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInN1YlN0ZXA/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3NraXBwZWQnXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS10ZXh0LVsxMnB4XVwiPlxuICAgICAgICAgICAgICBza2lwX25leHRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gU3ViLXN0ZXAgRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LVsxM3B4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLXRleHQtWyMzNjQxNTNdXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLWxpbmU7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCI+XG4gICAgICAgICAgICB7eyAkYW55KHN1YlN0ZXApLmRlc2NyaXB0aW9uIHx8ICRhbnkoc3ViU3RlcCkudGV4dCB9fVxuICAgICAgICAgICAgPCEtLSBDb3VudGRvd24gZm9yIGFjdGl2ZSBXQUlUX0ZPUl9MT0NBVE9SIGluIGxpdmUgbW9kZSAtLT5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNMaXZlICYmICRhbnkoc3ViU3RlcCkucmVtYWluaW5nU2Vjb25kcyAhPSBudWxsXCIgY2xhc3M9XCJjcWEtdGV4dC1bI0Y5NzMxNl0gY3FhLWZvbnQtbWVkaXVtIGNxYS1tbC0xXCI+KHt7ICRhbnkoc3ViU3RlcCkucmVtYWluaW5nU2Vjb25kcyB9fXMgcmVtYWluaW5nKTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8IS0tIFN1Yi1zdGVwIER1cmF0aW9uIC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtbWV0YWRhdGEta2V5XCI+XG4gICAgICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihzdWJTdGVwLmR1cmF0aW9uKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTmVzdGVkIFN0ZXBzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJoYXNDaGlsZCB8fCAoY29uZmlnLm5lc3RlZFN0ZXBzICYmIGNvbmZpZy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKVwiIGNsYXNzPVwiY3FhLW1sLTkgY3FhLXBiLTEgY3FhLW5lc3RlZC1zdGVwcy1jb250YWluZXJcIiBzdHlsZT1cImJvcmRlci1ib3R0b206ICcxcHggc29saWQgI0YzRjRGNidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzczNzM3M10gY3FhLXB5LVsycHhdIGNxYS1weC0zXCI+TmVzdGVkIHN0ZXBzPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcGwtWzE4cHhdXCIgc3R5bGU9XCJib3JkZXItbGVmdDogMnB4IHNvbGlkICNDNUM3RkE7XCI+XG4gICAgICAgIDwhLS0gTG9hZGluZyBpbmRpY2F0b3Igd2hlbiBuZXN0ZWQgc3RlcHMgYXJlIGJlaW5nIGxvYWRlZCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImhhc0NoaWxkICYmICghY29uZmlnLm5lc3RlZFN0ZXBzIHx8IGNvbmZpZy5uZXN0ZWRTdGVwcy5sZW5ndGggPT09IDApICYmIGlzU3RlcExvYWRpbmcoKVwiIFxuICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB5LTIgY3FhLXB4LTNcIj5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLWFuaW1hdGUtc3BpbiBjcWEtdGV4dC1bIzNCODJGNl1cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiN1wiIGN5PVwiN1wiIHI9XCI2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIiBvcGFjaXR5PVwiMC4yNVwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxQTYgNiAwIDAgMSAxMyA3XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzExcHhdIGNxYS1sZWFkaW5nLVsxM3B4XSBjcWEtdGV4dC1bIzczNzM3M11cIj5Mb2FkaW5nIG5lc3RlZCBzdGVwcy4uLjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXAgb2YgY29uZmlnLm5lc3RlZFN0ZXBzOyBpbmRleCBhcyBpXCI+XG4gICAgICAgICAgPCEtLSBXcmFwcGVyIHRvIHNob3cgc2tlbGV0b24gd2hpbGUgc3RlcC1yZW5kZXJlciBpcyBsb2FkaW5nIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXN0ZXAtcmVuZGVyZXItd3JhcHBlclwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCInZXhjLScgKyBzdGVwLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5sb2FkZWRdPVwiIWlzTmVzdGVkU3RlcExvYWRpbmcoc3RlcClcIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBza2VsZXRvbiBvdmVybGF5IC0tPlxuICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaXNOZXN0ZWRTdGVwTG9hZGluZyhzdGVwKVwiIGNsYXNzPVwiY3FhLXN0ZXAtc2tlbGV0b24tb3ZlcmxheVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXN0ZXAtc2tlbGV0b24gY3FhLW14LTMgY3FhLW15LTFcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gVXNlIHN0ZXAtcmVuZGVyZXIgZm9yIGFsbCBuZXN0ZWQgc3RlcHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIC0tPlxuICAgICAgICAgICAgPCEtLSBUaGUgc3RlcC1yZW5kZXJlciB3aWxsIGR5bmFtaWNhbGx5IGxvYWQgdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudCBhbmQgcGFzcyBoYW5kbGVycyAtLT5cbiAgICAgICAgICAgIDxjcWEtc3RlcC1yZW5kZXJlciBcbiAgICAgICAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgICAgICAgIFtzdGVwTnVtYmVyXT1cInN0ZXBOdW1iZXIgKyAnLicgKyAoaSArIDEpXCJcbiAgICAgICAgICAgICAgW29uRXhwYW5kSGFuZGxlcl09XCJvbkV4cGFuZEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyXT1cImdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlcl09XCJvbkNvbmRpdGlvbkJyYW5jaENsaWNrSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtpc1N0ZXBMb2FkaW5nSGFuZGxlcl09XCJpc1N0ZXBMb2FkaW5nSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtpc1N0ZXBFeHBhbmRlZEhhbmRsZXJdPVwiaXNTdGVwRXhwYW5kZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2NvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXJdPVwiY29udmVydE1zVG9TZWNvbmRzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXJdPVwiZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyXT1cImdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldExvb3BJdGVyYXRpb25zSGFuZGxlcl09XCJnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXJdPVwiZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbZm9ybWF0QWN0aW9uc0hhbmRsZXJdPVwiZm9ybWF0QWN0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXJdPVwib25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcl09XCJvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVXBsb2FkQmFzZWxpbmVIYW5kbGVyXT1cIm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXJdPVwiZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkFuYWx5emVIYW5kbGVyXT1cIm9uQW5hbHl6ZUhhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25WaWV3RnVsbExvZ3NIYW5kbGVyXT1cIm9uVmlld0Z1bGxMb2dzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblNlbGZIZWFsQWN0aW9uSGFuZGxlcl09XCJvblNlbGZIZWFsQWN0aW9uSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblN0ZXBDbGlja0hhbmRsZXJdPVwib25TdGVwQ2xpY2tIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uSnNvblBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uSnNvblBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uRG93bmxvYWRIYW5kbGVyXT1cIm9uRG93bmxvYWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uRmlsZVBhdGhDb3BpZWRIYW5kbGVyXT1cIm9uRmlsZVBhdGhDb3BpZWRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVGV4dENvcGllZEhhbmRsZXJdPVwib25UZXh0Q29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtqdW1wVG9UaW1lc3RhbXBIYW5kbGVyXT1cImp1bXBUb1RpbWVzdGFtcEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbZG93bmxvYWRpbmdTdGVwSWRdPVwiZG93bmxvYWRpbmdTdGVwSWRcIlxuICAgICAgICAgICAgICBbaXNVcGxvYWRpbmdCYXNlbGluZV09XCJpc1VwbG9hZGluZ0Jhc2VsaW5lXCJcbiAgICAgICAgICAgICAgW2lzTWFraW5nQ3VycmVudEJhc2VsaW5lXT1cImlzTWFraW5nQ3VycmVudEJhc2VsaW5lXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSXRlcmF0aW9uSWRdPVwic3RlcD8uc2VsZWN0ZWRJdGVyYXRpb25JZCB8fCAnJ1wiXG4gICAgICAgICAgICBbaXNMaXZlXT1cImlzTGl2ZVwiXG4gICAgICAgICAgICBbaXNEZWJ1Z109XCJpc0RlYnVnXCJcbiAgICAgICAgICAgIFtwYXJlbnRTa2lwcGVkXT1cInNlbGZEZWJ1Z0Rpc2FibGVkXCJcbiAgICAgICAgICAgIFtkZWJ1Z1BvaW50U2V0XT1cImdldERlYnVnUG9pbnRTZXRIYW5kbGVyID8gZ2V0RGVidWdQb2ludFNldEhhbmRsZXIoc3RlcCkgOiBkZWJ1Z1BvaW50U2V0XCJcbiAgICAgICAgICAgIFtnZXREZWJ1Z1BvaW50U2V0SGFuZGxlcl09XCJnZXREZWJ1Z1BvaW50U2V0SGFuZGxlclwiXG4gICAgICAgICAgICBbb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcl09XCJvbkRlYnVnUG9pbnRDaGFuZ2VIYW5kbGVyXCJcbiAgICAgICAgICAgIFtvbkVkaXRTdGVwSGFuZGxlcl09XCJvbkVkaXRTdGVwSGFuZGxlclwiXG4gICAgICAgICAgICBbYWRkU3RlcE1lbnVPcHRpb25zXT1cImdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZCA/IGdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZChzdGVwKSA6IGFkZFN0ZXBNZW51T3B0aW9uc1wiXG4gICAgICAgICAgICBbb25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcl09XCJvbkFkZFN0ZXBPcHRpb25TZWxlY3RIYW5kbGVyXCJcbiAgICAgICAgICAgIFtzdGVwTW9yZU1lbnVPcHRpb25zXT1cImdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWQgPyBnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkKHN0ZXApIDogc3RlcE1vcmVNZW51T3B0aW9uc1wiXG4gICAgICAgICAgICBbb25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXJdPVwib25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXJcIlxuICAgICAgICAgICAgW2dldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZF09XCJnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWRcIlxuICAgICAgICAgICAgW2dldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWRdPVwiZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZFwiXG4gICAgICAgICAgICAgIChjb21wb25lbnRSZWFkeSk9XCJtYXJrU3RlcExvYWRlZChzdGVwKVwiPlxuICAgICAgICAgICAgPC9jcWEtc3RlcC1yZW5kZXJlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVmlldyBBbGwgSXRlcmF0aW9ucyBMaW5rIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJjb25maWcuc2hvd1ZpZXdBbGxJdGVyYXRpb25zICYmICFpc0xpdmVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWVuZCBjcWEtcHgtMyBjcWEtcHktWzEwcHhdXCI+XG4gICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvblZpZXdBbGxJdGVyYXRpb25zQ2xpY2soJGV2ZW50KVwiIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtbm8tdW5kZXJsaW5lIGNxYS10ZXh0LXByaW1hcnkgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIj5cbiAgICAgICAgVmlldyBhbGwgaXRlcmF0aW9uc1xuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTcuNjM2MzYgMTEuMjY3TDYuNzU4NTIgMTAuMzk3N0w5LjM4Nzc4IDcuNzY4NDdIM1Y2LjQ5ODU4SDkuMzg3NzhMNi43NTg1MiAzLjg3MzU4TDcuNjM2MzYgM0wxMS43Njk5IDcuMTMzNTJMNy42MzYzNiAxMS4yNjdaXCIgZmlsbD1cIiMzRjQzRUVcIi8+PC9zdmc+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VsZiBIZWFsIEFuYWx5c2lzIC0tPlxuICAgIDxjcWEtc2VsZi1oZWFsLWFuYWx5c2lzIFxuICAgICAgKm5nSWY9XCJzZWxmSGVhbEFuYWx5c2lzXCJcbiAgICAgIFtpZF09XCJzdGVwPy50ZXN0U3RlcElkXCJcbiAgICAgIFtvcmlnaW5hbExvY2F0b3JdPVwic2VsZkhlYWxBbmFseXNpcy5vcmlnaW5hbExvY2F0b3JcIlxuICAgICAgW2hlYWxlZExvY2F0b3JdPVwic2VsZkhlYWxBbmFseXNpcy5oZWFsZWRMb2NhdG9yXCJcbiAgICAgIFtjb25maWRlbmNlXT1cInNlbGZIZWFsQW5hbHlzaXMuY29uZmlkZW5jZVwiXG4gICAgICBbaGVhbE1ldGhvZF09XCJzZWxmSGVhbEFuYWx5c2lzLmhlYWxNZXRob2RcIlxuICAgICAgW2lzTG9hZGluZ0FjY2VwdF09XCJnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID8gZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcigpLmlzTG9hZGluZ0FjY2VwdD8uW3N0ZXA/LnRlc3RTdGVwSWRdIDogZmFsc2VcIlxuICAgICAgW2lzTG9hZGluZ01vZGlmeUFjY2VwdF09XCJnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyID8gZ2V0U2VsZkhlYWxMb2FkaW5nU3RhdGVzSGFuZGxlcigpLmlzTG9hZGluZ01vZGlmeUFjY2VwdD8uW3N0ZXA/LnRlc3RTdGVwSWRdIDogZmFsc2VcIlxuICAgICAgKGFjdGlvbik9XCJvblNlbGZIZWFsQWN0aW9uKCRldmVudClcIj5cbiAgICA8L2NxYS1zZWxmLWhlYWwtYW5hbHlzaXM+XG5cbiAgICA8IS0tIFRpbWluZyBCcmVha2Rvd24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImNvbmZpZy50aW1pbmdCcmVha2Rvd25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktZW5kIGNxYS1nYXAtNSBjcWEtcHQtMS41IGNxYS1weC00IGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjOUNBM0FGXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXY+PHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk02IDNWNkw4IDdcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPjwvZGl2PlxuICAgICAgICA8c3Bhbj5UaW1pbmcgYnJlYWtkb3duPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LWRpYWxvZy1tdXRlZCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtM1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIEFwcCA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LWdyYXktNzAwXCI+e3sgZm9ybWF0RHVyYXRpb24oY29uZmlnLnRpbWluZ0JyZWFrZG93bi5hcHApIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj48c3ZnIHdpZHRoPVwiMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAxIDExXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0tMy44MTQ3ZS0wNiAxMC4zMlYtNy4xNTI1NmUtMDdIMC45NTk5OTZWMTAuMzJILTMuODE0N2UtMDZaXCIgZmlsbD1cIiNFNUU3RUJcIi8+PC9zdmc+PC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgVG9vbCA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LWdyYXktNzAwXCI+e3sgZm9ybWF0RHVyYXRpb24oY29uZmlnLnRpbWluZ0JyZWFrZG93bi50b29sKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVmlldyBNb3JlIEZhaWxlZCBTdGVwIEJ1dHRvbiAtIHNob3duIHdoZW4gZXhwYW5kZWQgYW5kIGZhaWx1cmUgZGV0YWlscyBleGlzdCAtLT5cbiAgPGRpdiAqbmdJZj1cInNob3dWaWV3TW9yZUJ1dHRvblwiIGNsYXNzPVwiY3FhLW10LTIgY3FhLXB4LTRcIj5cbiAgICA8Y3FhLXZpZXctbW9yZS1mYWlsZWQtc3RlcC1idXR0b25cbiAgICAgIFt0aW1pbmdCcmVha2Rvd25dPVwidGltaW5nQnJlYWtkb3duXCJcbiAgICAgIFtzdWJTdGVwc109XCJnZXRTdWJTdGVwc0ZvckZhaWxlZFN0ZXAoKVwiXG4gICAgICBbZmFpbHVyZURldGFpbHNdPVwiZmFpbHVyZURldGFpbHNcIlxuICAgICAgW2lzRXhwYW5kZWRdPVwic2hvd0ZhaWxlZFN0ZXBEZXRhaWxzXCJcbiAgICAgICh2aWV3TW9yZUNsaWNrKT1cIm9uVmlld01vcmVGYWlsZWRTdGVwQ2xpY2soJGV2ZW50KVwiPlxuICAgIDwvY3FhLXZpZXctbW9yZS1mYWlsZWQtc3RlcC1idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVXBkYXRlZCBGYWlsZWQgU3RlcCBDb21wb25lbnQgLSBzaG93biB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkIC0tPlxuICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZXdNb3JlQnV0dG9uICYmc2hvd0ZhaWxlZFN0ZXBEZXRhaWxzICYmIGZhaWx1cmVEZXRhaWxzXCIgY2xhc3M9XCJjcWEtbXQtMiBjcWEtcHgtNFwiPlxuICAgIDxjcWEtdXBkYXRlZC1mYWlsZWQtc3RlcFxuICAgICAgW3Rlc3RTdGVwUmVzdWx0SWRdPVwidGVzdFN0ZXBSZXN1bHRJZFwiXG4gICAgICBbdGltaW5nQnJlYWtkb3duXT1cInRpbWluZ0JyZWFrZG93blwiXG4gICAgICBbZXhwYW5kZWRdPVwidHJ1ZVwiXG4gICAgICBbc3ViU3RlcHNdPVwiZ2V0U3ViU3RlcHNGb3JGYWlsZWRTdGVwKClcIlxuICAgICAgW2ZhaWx1cmVEZXRhaWxzXT1cImZhaWx1cmVEZXRhaWxzXCJcbiAgICAgIFtyZWFzb25pbmddPVwicmVhc29uaW5nXCJcbiAgICAgIFtjb25maWRlbmNlXT1cImNvbmZpZGVuY2VcIlxuICAgICAgW2lzVXBsb2FkaW5nQmFzZWxpbmVdPVwiaXNVcGxvYWRpbmdCYXNlbGluZVwiXG4gICAgICBbaXNNYWtpbmdDdXJyZW50QmFzZWxpbmVdPVwiaXNNYWtpbmdDdXJyZW50QmFzZWxpbmVcIlxuICAgICAgW2lzTGl2ZV09XCJpc0xpdmVcIlxuICAgICAgKG1ha2VDdXJyZW50QmFzZWxpbmUpPVwib25NYWtlQ3VycmVudEJhc2VsaW5lKCRldmVudClcIlxuICAgICAgKHVwbG9hZEJhc2VsaW5lKT1cIm9uVXBsb2FkQmFzZWxpbmUoJGV2ZW50KVwiXG4gICAgICAoYW5hbHl6ZSk9XCJvbkFuYWx5emUoKVwiXG4gICAgICAodmlld0Z1bGxMb2dzKT1cIm9uVmlld0Z1bGxMb2dzKClcIj5cbiAgICA8L2NxYS11cGRhdGVkLWZhaWxlZC1zdGVwPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
1279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vcC1zdGVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9sb29wLXN0ZXAvbG9vcC1zdGVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXVELFNBQVMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFFM0osT0FBTyxFQUE0Tiw2QkFBNkIsRUFBc0IsOEJBQThCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2VixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVEzRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsaUJBQWlCO0lBTHhEOztRQWtCVyxxQkFBZ0IsR0FBc0IsTUFBTSxDQUFDO1FBSTdDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFhLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFhLEtBQUssQ0FBQztRQUcvQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQy9DLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3BDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQzVELHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3hFLHVKQUF1SjtRQUM3SSxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzdDLHVCQUFrQixHQUF3Qiw2QkFBNkIsQ0FBQztRQUN4RSx3QkFBbUIsR0FBeUIsOEJBQThCLENBQUM7UUFxQzNF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dUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFlRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUkwQixrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNHLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBOEJ0QixRQUFRO3NCQUFqQixNQUFNO2dCQUdHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgRG9DaGVjayB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IExvb3BTdGVwQ29uZmlnLCBMb29wSXRlcmF0aW9uLCBFeGVjdXRpb25TdGVwQ29uZmlnLCBTdGVwU3RhdHVzLCBUaW1pbmdCcmVha2Rvd24sIEZhaWx1cmVEZXRhaWxzLCBTdWJTdGVwLCBTZWxmSGVhbEFuYWx5c2lzRGF0YSwgU2VsZkhlYWxBY3Rpb24sIFN0ZXBHcm91cENvbmZpZywgQ29uZGl0aW9uQnJhbmNoLCBTZWxmSGVhbEFjdGlvbkV2ZW50LCBBZGRTdGVwTWVudU9wdGlvbiwgREVGQVVMVF9BRERfU1RFUF9NRU5VX09QVElPTlMsIFN0ZXBNb3JlTWVudU9wdGlvbiwgREVGQVVMVF9TVEVQX01PUkVfTUVOVV9PUFRJT05TIH0gZnJvbSAnLi4vZXhlY3V0aW9uLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IEJhc2VTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1zdGVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBtYWtlQ3VycmVudEJhc2VsaW5lRXZlbnQsIHVwbG9hZEJhc2VsaW5lRXZlbnQgfSBmcm9tICcuLi92aXN1YWwtY29tcGFyaXNvbi92aXN1YWwtY29tcGFyaXNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbG9vcC1zdGVwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvb3Atc3RlcC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCBjcWEtdy1mdWxsJyB9XG59KVxuZXhwb3J0IGNsYXNzIExvb3BTdGVwQ29tcG9uZW50IGV4dGVuZHMgQmFzZVN0ZXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBEb0NoZWNrIHtcbiAgLy8gSW5kaXZpZHVhbCBpbnB1dHNcbiAgQElucHV0KCkgaWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRlc3RTdGVwUmVzdWx0SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlITogc3RyaW5nO1xuICBASW5wdXQoKSBzdGF0dXMhOiBTdGVwU3RhdHVzO1xuICBASW5wdXQoKSBkdXJhdGlvbiE6IG51bWJlcjtcbiAgQElucHV0KCkgdGltaW5nQnJlYWtkb3duPzogVGltaW5nQnJlYWtkb3duO1xuICBASW5wdXQoKSBleHBhbmRlZD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGxvb3BUeXBlPzogJ2ZvcicgfCAnd2hpbGUnO1xuICBASW5wdXQoKSBpdGVyYXRpb25zITogTG9vcEl0ZXJhdGlvbltdO1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZXJhdGlvbklkPzogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0SXRlcmF0aW9uPzogJ2ZpcnN0JyB8ICdsYXN0JyA9ICdsYXN0JztcbiAgQElucHV0KCkgbmVzdGVkU3RlcHM/OiBFeGVjdXRpb25TdGVwQ29uZmlnW107XG4gIEBJbnB1dCgpIHNob3dWaWV3QWxsSXRlcmF0aW9ucz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGhhc0NoaWxkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN0ZXBEZWxldGVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNEZWJ1Zz86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGVidWdQb2ludFNldD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcGFyZW50U2tpcHBlZD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ2V0RGVidWdQb2ludFNldEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgb25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCB2YWx1ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgQE91dHB1dCgpIGRlYnVnUG9pbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBlZGl0U3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGFkZFN0ZXBPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFkZFN0ZXBNZW51T3B0aW9uPigpO1xuICBAT3V0cHV0KCkgc3RlcE1vcmVPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBNb3JlTWVudU9wdGlvbj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBcIisgQWRkIHN0ZXAgaW5zaWRlIGxvb3BcIiAoZGVidWcgb25seSkuIFBheWxvYWQgaXMgdGhlIGxvb3Agc3RlcCBzbyBwYXJlbnQgY2FuIG9wZW4gQWRkIFN0ZXAgbW9kYWwgYXQgYW55IG5lc3RpbmcgbGV2ZWwuICovXG4gIEBPdXRwdXQoKSBhZGRTdGVwSW5zaWRlTG9vcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBhZGRTdGVwTWVudU9wdGlvbnM6IEFkZFN0ZXBNZW51T3B0aW9uW10gPSBERUZBVUxUX0FERF9TVEVQX01FTlVfT1BUSU9OUztcbiAgQElucHV0KCkgc3RlcE1vcmVNZW51T3B0aW9uczogU3RlcE1vcmVNZW51T3B0aW9uW10gPSBERUZBVUxUX1NURVBfTU9SRV9NRU5VX09QVElPTlM7XG5cbiAgLy8gSGFuZGxlciBmdW5jdGlvbiB0byBwYXNzIGRvd24gdG8gbmVzdGVkIGNoaWxkIHN0ZXAgZ3JvdXBzIGZvciByZWN1cnNpdmUgZXhwYW5zaW9uXG4gIEBJbnB1dCgpIG9uRXhwYW5kSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogV2hlbiBwcm92aWRlZCwgcGFzc2VkIHRvIG5lc3RlZCBzdGVwLXJlbmRlcmVyIHNvIEVkaXQgb24gbmVzdGVkIHN0ZXBzIGlzIGZvcndhcmRlZCB3aXRoIHRoZSBzdGVwIGNvbmZpZy4gKi9cbiAgQElucHV0KCkgb25FZGl0U3RlcEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlcj86IChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBzdGVwPzogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQElucHV0KCkgb25TdGVwTW9yZU9wdGlvblNlbGVjdEhhbmRsZXI/OiAob3B0aW9uOiBTdGVwTW9yZU1lbnVPcHRpb24sIHN0ZXA/OiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiB2b2lkO1xuICAvKiogV2hlbiBwcm92aWRlZCwgdXNlZCB0byBnZXQgYWRkLXN0ZXAgbWVudSBvcHRpb25zIHBlciBuZXN0ZWQgc3RlcDsgb3RoZXJ3aXNlIGFkZFN0ZXBNZW51T3B0aW9ucyBpcyB1c2VkIGZvciBhbGwuICovXG4gIEBJbnB1dCgpIGdldEFkZFN0ZXBNZW51T3B0aW9uc0Zvck5lc3RlZD86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBBZGRTdGVwTWVudU9wdGlvbltdO1xuICAvKiogV2hlbiBwcm92aWRlZCwgdXNlZCB0byBnZXQgc3RlcC1tb3JlIG1lbnUgb3B0aW9ucyBwZXIgbmVzdGVkIHN0ZXA7IG90aGVyd2lzZSBzdGVwTW9yZU1lbnVPcHRpb25zIGlzIHVzZWQgZm9yIGFsbC4gKi9cbiAgQElucHV0KCkgZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZD86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBTdGVwTW9yZU1lbnVPcHRpb25bXTtcblxuICAvLyBIYW5kbGVyIGZ1bmN0aW9ucyBmb3IgY29uZGl0aW9uIHN0ZXBzXG4gIEBJbnB1dCgpIGdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBDb25kaXRpb25CcmFuY2hbXTtcbiAgQElucHV0KCkgb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXI/OiAoc3RlcDogYW55LCBicmFuY2g6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNTdGVwTG9hZGluZ0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXI/OiAoZHVyYXRpb246IG51bWJlcikgPT4gbnVtYmVyO1xuICBASW5wdXQoKSBmb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIG9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25VcGxvYWRCYXNlbGluZUhhbmRsZXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVmlld0Z1bGxMb2dzSGFuZGxlcj86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXI/OiAoKSA9PiB7IGlzTG9hZGluZ0FjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH07IGlzTG9hZGluZ01vZGlmeUFjY2VwdDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfTtcbiAgQElucHV0KCkgZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBnZXRBcGlBc3NlcnRpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgZm9ybWF0QWN0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIG9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3RlcENsaWNrSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnLCBldmVudD86IEV2ZW50KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvbkpzb25QYXRoQ29waWVkSGFuZGxlcj86IChldmVudDogeyBwYXRoOiBzdHJpbmc7IHNvdXJjZTogJ3JlcXVlc3RCb2R5JyB8ICdyZXNwb25zZUJvZHknIHwgJ3JlcXVlc3RIZWFkZXJzJyB8ICdyZXNwb25zZUhlYWRlcnMnIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRG93bmxvYWRIYW5kbGVyPzogKGV2ZW50OiB7IGZpbGVOYW1lOiBzdHJpbmc7IGZpbGVQYXRoPzogc3RyaW5nOyBmaWxlVHlwZTogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25GaWxlUGF0aENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgZmlsZVBhdGg6IHN0cmluZzsgdGVzdFN0ZXBSZXN1bHRJZDogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVGV4dENvcGllZEhhbmRsZXI/OiAoZXZlbnQ6IHsgdGV4dDogc3RyaW5nOyB0ZXN0U3RlcFJlc3VsdElkOiBzdHJpbmcgfSkgPT4gdm9pZDtcbiAgQElucHV0KCkganVtcFRvVGltZXN0YW1wSGFuZGxlcj86ICh0aW1lc3RhbXA6IG51bWJlciwgdGVzdFN0ZXBJZD86IG51bWJlciB8IHN0cmluZykgPT4gdm9pZDtcbiAgQElucHV0KCkgZG93bmxvYWRpbmdTdGVwSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzdGVwPzogYW55O1xuICBnZXQgc3RlcEJhZGdlcygpOiAoJ3NraXBwZWQnIHwgJ2VkaXRlZCcgfCAnYWRkZWQnIHwgJ3JlbW92ZWQnKVtdIHtcbiAgICBjb25zdCBiYWRnZSA9IHRoaXMuc3RlcD8uc3RlcEJhZGdlO1xuICAgIGlmICghYmFkZ2UpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShiYWRnZSkgPyBiYWRnZSA6IFtiYWRnZV07XG4gIH1cblxuICBnZXQgaXNTa2lwcGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBCYWRnZXMuaW5jbHVkZXMoJ3NraXBwZWQnKTtcbiAgfVxuXG4gIGdldCBpc1N0ZXBEZWxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBCYWRnZXMuaW5jbHVkZXMoJ3JlbW92ZWQnKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGZhaWx1cmVEZXRhaWxzPzogRmFpbHVyZURldGFpbHM7XG4gIEBJbnB1dCgpIHJlYXNvbmluZz86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBjb25maWRlbmNlPzogc3RyaW5nO1xuICBASW5wdXQoKSBpc1VwbG9hZGluZ0Jhc2VsaW5lID0ge307XG4gIEBJbnB1dCgpIGlzTWFraW5nQ3VycmVudEJhc2VsaW5lID0ge307XG4gIEBJbnB1dCgpIHNlbGZIZWFsQW5hbHlzaXM/OiBTZWxmSGVhbEFuYWx5c2lzRGF0YTtcbiAgQElucHV0KCkgaXRlcmF0aW9uRGF0YT86IGFueTtcbiAgQE91dHB1dCgpIG1ha2VDdXJyZW50QmFzZWxpbmUgPSBuZXcgRXZlbnRFbWl0dGVyPG1ha2VDdXJyZW50QmFzZWxpbmVFdmVudD4oKTtcbiAgQE91dHB1dCgpIHVwbG9hZEJhc2VsaW5lID0gbmV3IEV2ZW50RW1pdHRlcjx1cGxvYWRCYXNlbGluZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgYW5hbHl6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHZpZXdGdWxsTG9ncyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlbGZIZWFsQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxmSGVhbEFjdGlvbkV2ZW50PigpO1xuXG4gIHNob3dGYWlsZWRTdGVwRGV0YWlsczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2FkZFN0ZXBNZW51VHJpZ2dlcicpIGFkZFN0ZXBNZW51VHJpZ2dlcj86IE1hdE1lbnVUcmlnZ2VyO1xuICBAVmlld0NoaWxkKCdzdGVwTW9yZU1lbnVUcmlnZ2VyJykgc3RlcE1vcmVNZW51VHJpZ2dlcj86IE1hdE1lbnVUcmlnZ2VyO1xuXG4gIC8qKiBTaG93IGRlYnVnIGljb24gd2hlbiBkZWJ1ZyBtb2RlIGlzIG9uIChzaG93biBvbiBwYXJlbnQgYW5kIGFsbCBjaGlsZCBzdGVwcykuICovXG4gIGdldCBzaG93RGVidWdJY29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVidWcgPT09IHRydWU7XG4gIH1cblxuICAvKiogUGVyLXN0ZXAgZmlsdGVyZWQgdGhyZWUtZG90IG1lbnUgb3B0aW9ucyAoZS5nLiBoaWRlIER1cGxpY2F0ZS9EZWxldGUgZm9yIHN0ZXAtZ3JvdXAgY2hpbGRyZW4pLiAqL1xuICBnZXQgZWZmZWN0aXZlU3RlcE1vcmVNZW51T3B0aW9ucygpOiBTdGVwTW9yZU1lbnVPcHRpb25bXSB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuc3RlcE1vcmVNZW51T3B0aW9ucyB8fCBbXTtcbiAgICAvLyBBbHdheXMgaGlkZSBkdXBsaWNhdGUgb3B0aW9uIGZvciB0aGlzIGNvbnRhaW5lciBzdGVwXG4gICAgbGV0IGZpbHRlcmVkID0gYmFzZS5maWx0ZXIob3B0ID0+IG9wdC5pZCAhPT0gJ2R1cGxpY2F0ZScpO1xuICAgIFxuICAgIGNvbnN0IHN0ZXBSZWY6IGFueSA9IHRoaXMuc3RlcDtcbiAgICBpZiAoIXN0ZXBSZWYpIHJldHVybiBmaWx0ZXJlZDtcblxuICAgIGNvbnN0IGlzR3JvdXBDaGlsZCA9ICEhc3RlcFJlZi5pc1N0ZXBHcm91cENoaWxkcmVuO1xuICAgIC8vIFdoZW4gc3RlcC5zdGVwTW9yZU1lbnVPcHRpb25zIGlzIHRydXRoeSBPUiBzdGVwIGlzIGEgc3RlcC1ncm91cCBjaGlsZCwgaGlkZSBtdXRhdGluZyBpdGVtc1xuICAgIGNvbnN0IHN1cHByZXNzTXV0YXRpbmcgPSAhIXN0ZXBSZWYuc3RlcE1vcmVNZW51T3B0aW9ucyB8fCBpc0dyb3VwQ2hpbGQ7XG4gICAgaWYgKCFzdXBwcmVzc011dGF0aW5nKSByZXR1cm4gZmlsdGVyZWQ7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQuZmlsdGVyKG9wdCA9PiBvcHQuaWQgIT09ICdkZWxldGUnKTtcbiAgfVxuICBcbiAgLyoqIFRydWUgd2hlbiB0aGlzIGxvb3Atc3RlcCdzIG93biBicmVha3BvaW50IGlzIGRpc2FibGVkICh1c2VkIHRvIHByb3BhZ2F0ZSBwYXJlbnRTa2lwcGVkIHRvIGNoaWxkcmVuKS4gKi9cbiAgZ2V0IHNlbGZEZWJ1Z0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnN0ZXAgYXMgYW55KT8uZGVidWdQb2ludERpc2FibGVkIHx8ICEhdGhpcy5wYXJlbnRTa2lwcGVkIHx8IHRoaXMuaXNTdGVwRGVsZXRlZDtcbiAgfVxuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiB0aGUgbG9vcCBzdGVwIGV4cGFuZHNcbiAgQE91dHB1dCgpIG9uRXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiBcIlZpZXcgYWxsIGl0ZXJhdGlvbnNcIiBpcyBjbGlja2VkXG4gIEBPdXRwdXQoKSBvblZpZXdBbGxJdGVyYXRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIE91dHB1dCBldmVudCBmb3Igd2hlbiBpdGVyYXRpb24gc2VsZWN0aW9uIGNoYW5nZXNcbiAgQE91dHB1dCgpIG9uSXRlcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLy8gQ29uZmlnIHByb3BlcnR5IGZvciBiYXNlIGNsYXNzIC0gYnVpbHQgZnJvbSBpbmRpdmlkdWFsIGlucHV0cyBpbiBuZ09uSW5pdFxuICBvdmVycmlkZSBjb25maWchOiBMb29wU3RlcENvbmZpZztcblxuICBzZWxlY3RlZEl0ZXJhdGlvbjogTG9vcEl0ZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdXNlcidzIG1hbnVhbCBzZWxlY3Rpb25cbiAgcHJpdmF0ZSBwcmV2aW91c1N0YXR1cz86IFN0ZXBTdGF0dXM7XG4gIHByaXZhdGUgdXNlck1hbnVhbGx5Q2xvc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIFRyYWNrIHdoaWNoIHN0ZXBzIGFyZSBzdGlsbCBsb2FkaW5nIHRvIHNob3cgc2tlbGV0b25cbiAgbG9hZGluZ1N0ZXBzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBQcm9jZXNzZWQgc3ViLXN0ZXBzIGZvciBsaXZlIG1vZGUgV0FJVF9GT1JfTE9DQVRPUiBjb3VudGRvd24gZ3JvdXBpbmdcbiAgcHJvY2Vzc2VkU3ViU3RlcHM6IGFueVtdID0gW107XG4gIHByaXZhdGUgbGFzdFByb2Nlc3NlZEluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHdhaXRMb2NhdG9yR3JvdXBFbnRyeTogYW55IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY291bnRkb3duSW50ZXJ2YWxJZDogYW55ID0gbnVsbDtcblxuICAvLyBBSV9BVVRPX0hFQUwgZ3JvdXBpbmc6IHNob3cgbG9hZGluZyB1bnRpbCBBSV9BVVRPX0hFQUxfU1VDQ0VTUyBvciBBSV9BVVRPX0hFQUxfRkFJTEVEXG4gIHByaXZhdGUgYWlBdXRvSGVhbEdyb3VwRW50cnk6IGFueSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFByb2Nlc3NlZCBzdWItc3RlcHMgZm9yIHJ1biByZXN1bHQgc2NyZWVuIChmaWx0ZXIgYW5kIHNwbGl0IEFJX0FVVE9fSEVBTF9TVUNDRVNTL0ZBSUxFRClcbiAgcHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQ6IGFueVtdID0gW107XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQnVpbGQgY29uZmlnIGZyb20gaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAvLyBVc2UgbmVzdGVkU3RlcHMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gZW1wdHkgYXJyYXlcbiAgICBjb25zdCBzdGVwc1RvVXNlID0gdGhpcy5uZXN0ZWRTdGVwcyB8fCBbXTtcblxuICAgIC8vIFVzZSBhY3Rpb24gYXMgZmFsbGJhY2sgZm9yIHRpdGxlIGlmIHRpdGxlIGlzIGVtcHR5XG4gICAgLy8gQ2hlY2sgYm90aCBpbnN0YW5jZSBwcm9wZXJ0eSBhbmQgY29uZmlnIGZvciBhY3Rpb25cbiAgICBjb25zdCBhY3Rpb25WYWx1ZSA9ICh0aGlzIGFzIGFueSkuYWN0aW9uIHx8ICcnO1xuICAgIGNvbnN0IHN0ZXBUaXRsZSA9ICh0aGlzLnRpdGxlICYmIHRoaXMudGl0bGUudHJpbSgpKSA/IHRoaXMudGl0bGUgOiBhY3Rpb25WYWx1ZTtcblxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0ZXN0U3RlcElkOiB0aGlzLnN0ZXA/LnRlc3RTdGVwSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgdGVzdFN0ZXBSZXN1bHRJZDogdGhpcy50ZXN0U3RlcFJlc3VsdElkLFxuICAgICAgc3RlcE51bWJlcjogdGhpcy5zdGVwTnVtYmVyLFxuICAgICAgdGl0bGU6IHN0ZXBUaXRsZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIGRpc3BsYXlUeXBlOiAnbG9vcCcsXG4gICAgICBsb29wVHlwZTogdGhpcy5sb29wVHlwZSxcbiAgICAgIGl0ZXJhdGlvbnM6IHRoaXMuaXRlcmF0aW9ucyxcbiAgICAgIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCxcbiAgICAgIGRlZmF1bHRJdGVyYXRpb246IHRoaXMuZGVmYXVsdEl0ZXJhdGlvbixcbiAgICAgIG5lc3RlZFN0ZXBzOiBzdGVwc1RvVXNlLFxuICAgICAgc3RlcERlbGV0ZWQ6IHRoaXMuc3RlcERlbGV0ZWQsXG4gICAgICBzaG93Vmlld0FsbEl0ZXJhdGlvbnM6IHRoaXMuc2hvd1ZpZXdBbGxJdGVyYXRpb25zLFxuICAgICAgdGltaW5nQnJlYWtkb3duOiB0aGlzLnRpbWluZ0JyZWFrZG93bixcbiAgICAgIGV4cGFuZGVkOiB0aGlzLmV4cGFuZGVkLFxuICAgIH0gYXMgTG9vcFN0ZXBDb25maWc7XG5cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBsaXZlIHN1Yi1zdGVwIHByb2Nlc3NpbmcgZm9yIFdBSVRfRk9SX0xPQ0FUT1IgZ3JvdXBpbmdcbiAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUHJvY2VzcyBmb3IgcnVuIHJlc3VsdCBzY3JlZW46IGZpbHRlciBhbmQgc3BsaXQgQUlfQVVUT19IRUFMX1NVQ0NFU1MvRkFJTEVEXG4gICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgc2VsZWN0aW9uIC0gcHJpb3JpdGl6ZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0LCB0aGVuIGRlZmF1bHRcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkICYmIHRoaXMuaXRlcmF0aW9ucyAmJiB0aGlzLml0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLml0ZXJhdGlvbnMgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgLy8gSWYgZGVmYXVsdEl0ZXJhdGlvbiBpcyAnbGFzdCcsIGFsc28gc2V0IHVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkIHRvIHRoZSBsYXN0IGl0ZXJhdGlvblxuICAgICAgaWYgKHRoaXMuZGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2xhc3QnICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24pIHtcbiAgICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIHN0YXRlIGlmIGFscmVhZHkgZXhwYW5kZWRcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkICYmIHRoaXMubmVzdGVkU3RlcHMgJiYgdGhpcy5uZXN0ZWRTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgICAgdGhpcy5uZXN0ZWRTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICBjb25zdCBzdGVwSWQgPSBzdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgc3RlcC5pZDtcbiAgICAgICAgaWYgKHN0ZXBJZCkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmFkZChTdHJpbmcoc3RlcElkKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHdoZW4gc2VsZWN0ZWRJdGVyYXRpb25JZCBpbnB1dCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXSAmJiB0aGlzLml0ZXJhdGlvbnMgJiYgdGhpcy5pdGVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkSXRlcmF0aW9uSWQnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddLnByZXZpb3VzVmFsdWU7XG5cbiAgICAgIC8vIEFsd2F5cyB1cGRhdGUgd2hlbiBzZWxlY3RlZEl0ZXJhdGlvbklkIGlucHV0IGNoYW5nZXMgZnJvbSBwYXJlbnRcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAgICAgLy8gU3luYyB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB3aXRoIHRoZSBpbnB1dCB2YWx1ZVxuICAgICAgICAgICAgdGhpcy51c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gY2hhbmdlc1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdWJTdGVwc0ZvclJ1blJlc3VsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBub3QgZm91bmQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSWYgbm8gdmFsdWUgcHJvdmlkZWQsIHNlbGVjdCBkZWZhdWx0XG4gICAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0SXRlcmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVXBkYXRlIHNlbGVjdGlvbiB3aGVuIGl0ZXJhdGlvbnMgYXJyYXkgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydpdGVyYXRpb25zJ10gJiYgdGhpcy5pdGVyYXRpb25zICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlciBzZWxlY3Rpb24sIHRyeSB0byBwcmVzZXJ2ZSBpdFxuICAgICAgaWYgKHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChpdGVyID0+IGl0ZXIuaWQgPT09IHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uaWQgIT09IGZvdW5kLmlkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGZvdW5kO1xuICAgICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gY2hhbmdlc1xuICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlciBzZWxlY3Rpb24gbm8gbG9uZ2VyIHZhbGlkLCB1c2Ugc2VsZWN0ZWRJdGVyYXRpb25JZCBvciBkZWZhdWx0XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgICAgICAgY29uc3QgZm91bmRCeUlkID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kQnlJZCkge1xuICAgICAgICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZEJ5SWQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmRCeUlkO1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gfHwgIXRoaXMuaXRlcmF0aW9ucy5zb21lKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbj8uaWQpKSB7XG4gICAgICAgIC8vIE5vIHVzZXIgc2VsZWN0aW9uLCB1c2Ugc2VsZWN0ZWRJdGVyYXRpb25JZCBvciBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kKGl0ZXIgPT4gaXRlci5pZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRJdGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBVcGRhdGUgdGl0bGUgaWYgaXQgY2hhbmdlcyAtIGFsc28gY2hlY2sgZm9yIGFjdGlvbiBpbiBjb25maWcgb3IgaW5zdGFuY2VcbiAgICBpZiAoY2hhbmdlc1sndGl0bGUnXSkge1xuICAgICAgY29uc3QgYWN0aW9uVmFsdWUgPSAodGhpcyBhcyBhbnkpLmFjdGlvbiB8fCAodGhpcy5jb25maWcgYXMgYW55KT8uYWN0aW9uIHx8ICcnO1xuICAgICAgY29uc3Qgc3RlcFRpdGxlID0gKHRoaXMudGl0bGUgJiYgdGhpcy50aXRsZS50cmltKCkpID8gdGhpcy50aXRsZSA6IGFjdGlvblZhbHVlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnRpdGxlID0gc3RlcFRpdGxlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoY2hhbmdlc1snZHVyYXRpb24nXSAmJiB0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcuZHVyYXRpb24gPSBjaGFuZ2VzWydkdXJhdGlvbiddLmN1cnJlbnRWYWx1ZSB8fCAwO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydzdGVwRGVsZXRlZCddICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zdGVwRGVsZXRlZCA9IGNoYW5nZXNbJ3N0ZXBEZWxldGVkJ10uY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydzdGVwTnVtYmVyJ10gJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLnN0ZXBOdW1iZXIgPSBjaGFuZ2VzWydzdGVwTnVtYmVyJ10uY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydleHBhbmRlZCddICYmIHRoaXMuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS5sb2coJ2V4cGFuZGVkIGNoYW5nZWQgaW4gbG9vcC1zdGVwJywgdGhpcy5pZCwgY2hhbmdlc1snZXhwYW5kZWQnXSk7XG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmV4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29uZmlnIHdoZW4gaW5wdXRzIGNoYW5nZVxuICAgIGlmIChjaGFuZ2VzWydpdGVyYXRpb25zJ10gfHwgY2hhbmdlc1snc2VsZWN0ZWRJdGVyYXRpb25JZCddIHx8IGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10pIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy5pdGVyYXRpb25zID0gdGhpcy5pdGVyYXRpb25zO1xuICAgICAgICB0aGlzLmNvbmZpZy5zZWxlY3RlZEl0ZXJhdGlvbklkID0gdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IHRoaXMubmVzdGVkU3RlcHMgfHwgW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIHN0YXRlIHdoZW4gbmVzdGVkIHN0ZXBzIGFyZSBhZGRlZCBhbmQgc3RlcCBpcyBleHBhbmRlZFxuICAgIC8vIGlmIChjaGFuZ2VzWyduZXN0ZWRTdGVwcyddICYmIHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgIC8vICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICAvLyAgIHRoaXMubmVzdGVkU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAvLyAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgLy8gICAgIGlmIChzdGVwSWQpIHtcbiAgICAvLyAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5hZGQoU3RyaW5nKHN0ZXBJZCkpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICAvLyBJbml0aWFsaXplIGxvYWRpbmcgc3RhdGUgaWYgYWxyZWFkeSBleHBhbmRlZCB3aGVuIGNvbXBvbmVudCBpbml0aWFsaXplc1xuICAgIGlmIChjaGFuZ2VzWydleHBhbmRlZCddICYmIHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuY2xlYXIoKTtcbiAgICAgIHRoaXMubmVzdGVkU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgICAgIGlmIChzdGVwSWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5hZGQoU3RyaW5nKHN0ZXBJZCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIGhhbmRsZSB3aGVuIG5lc3RlZFN0ZXBzIGlzIHBhc3NlZCB2aWEgY2hpbGRyZW4gcHJvcGVydHkgKGZvciBzdGVwLXJlbmRlcmVyIGNvbXBhdGliaWxpdHkpXG4gICAgaWYgKGNoYW5nZXNbJ25lc3RlZFN0ZXBzJ10gJiYgdGhpcy5uZXN0ZWRTdGVwcykge1xuICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyB1cGRhdGVkIHdpdGggbmVzdGVkU3RlcHNcbiAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyA9IHRoaXMubmVzdGVkU3RlcHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbmVzdGVkU3RlcHMgaXMgbm90IHByb3ZpZGVkIGJ1dCBjaGlsZHJlbiBpcyAoZnJvbSBzdGVwLXJlbmRlcmVyKSwgdXNlIGNoaWxkcmVuXG4gICAgaWYgKCF0aGlzLm5lc3RlZFN0ZXBzICYmICh0aGlzLmNvbmZpZyBhcyBhbnkpLmNoaWxkcmVuICYmIEFycmF5LmlzQXJyYXkoKHRoaXMuY29uZmlnIGFzIGFueSkuY2hpbGRyZW4pKSB7XG4gICAgICB0aGlzLm5lc3RlZFN0ZXBzID0gKHRoaXMuY29uZmlnIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcubmVzdGVkU3RlcHMgPSB0aGlzLm5lc3RlZFN0ZXBzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTGl2ZSkge1xuICAgICAgLy8gVXBkYXRlIHN1YlN0ZXBzIGFycmF5IHdoZW4gbmV3IG9uZXMgYXJlIGFkZGVkXG4gICAgICBpZiAoY2hhbmdlc1snbmVzdGVkU3RlcHMnXSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1N1YlN0ZXBzQ291bnQgPSBjaGFuZ2VzWyduZXN0ZWRTdGVwcyddLnByZXZpb3VzVmFsdWU/Lmxlbmd0aCB8fCAwO1xuICAgICAgICBjb25zdCBjdXJyZW50U3ViU3RlcHNDb3VudCA9ICh0aGlzLm5lc3RlZFN0ZXBzIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgICAgLy8gU3ViLXN0ZXBzIGFyZSBhcHBlbmRlZCBleHRlcm5hbGx5LCBzbyB3ZSBqdXN0IHVwZGF0ZSB0aGUgY29uZmlnXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgIHRoaXMuY29uZmlnLm5lc3RlZFN0ZXBzID0gdGhpcy5uZXN0ZWRTdGVwcyB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQXV0by1leHBhbmQgaWYgc3RlcCBpcyBydW5uaW5nIGFuZCBuZXcgc3ViU3RlcHMgYXJlIGFkZGVkIChsb2dzIGNvbWluZyBpbilcbiAgICAgICAgaWYgKCFjaGFuZ2VzWyduZXN0ZWRTdGVwcyddLmZpcnN0Q2hhbmdlICYmIFxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPT09ICdydW5uaW5nJyAmJiBcbiAgICAgICAgICAgIGN1cnJlbnRTdWJTdGVwc0NvdW50ID4gcHJldmlvdXNTdWJTdGVwc0NvdW50ICYmXG4gICAgICAgICAgICB0aGlzLmhhc1N1YlN0ZXBzICYmIFxuICAgICAgICAgICAgIXRoaXMuaXNFeHBhbmRlZCAmJiBcbiAgICAgICAgICAgICF0aGlzLnVzZXJNYW51YWxseUNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuYXV0b0V4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdGF0dXMgY2hhbmdlcyAtIGF1dG8tZXhwYW5kIHdoZW4gc3RlcCBzdGFydHMgZXhlY3V0aW5nXG4gICAgICBpZiAoY2hhbmdlc1snc3RhdHVzJ10gJiYgIWNoYW5nZXNbJ3N0YXR1cyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXR1cyA9IGNoYW5nZXNbJ3N0YXR1cyddLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgY29uc3Qgb2xkU3RhdHVzID0gY2hhbmdlc1snc3RhdHVzJ10ucHJldmlvdXNWYWx1ZTtcblxuICAgICAgICAvLyBBdXRvLWV4cGFuZCB3aGVuIHN0YXR1cyBjaGFuZ2VzIHRvICdydW5uaW5nJyBhbmQgaGFzIHN1YlN0ZXBzIChvciB3aWxsIGhhdmUgc29vbilcbiAgICAgICAgaWYgKG5ld1N0YXR1cyA9PT0gJ3J1bm5pbmcnICYmIG9sZFN0YXR1cyAhPT0gJ3J1bm5pbmcnICYmICF0aGlzLnVzZXJNYW51YWxseUNsb3NlZCkge1xuICAgICAgICAgIC8vIEV4cGFuZCBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGhhcyBzdWJTdGVwcywgb3Igd2FpdCBmb3IgdGhlbVxuICAgICAgICAgIGlmICh0aGlzLmhhc1N1YlN0ZXBzKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9FeHBhbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByZXZpb3VzU3RhdHVzID0gbmV3U3RhdHVzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXV0b0V4cGFuZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmhhc1N1YlN0ZXBzKSB7XG4gICAgICB0aGlzLmlzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy51c2VyTWFudWFsbHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQuZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaGFzU3ViU3RlcHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmVzdGVkU3RlcHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm5lc3RlZFN0ZXBzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBvdmVycmlkZSB0b2dnbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgd2FzRXhwYW5kZWQgPSB0aGlzLmlzRXhwYW5kZWQ7XG4gICAgc3VwZXIudG9nZ2xlKCk7XG4gICAgLy8gRW1pdCBldmVudCB3aGVuIGV4cGFuZGluZyAodHJhbnNpdGlvbmluZyBmcm9tIGNvbGxhcHNlZCB0byBleHBhbmRlZClcbiAgICBpZiAoIXdhc0V4cGFuZGVkICYmIHRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5vbkV4cGFuZC5lbWl0KCk7XG4gICAgICAvLyBJZiB0aGlzIHN0ZXAgaGFzIGNoaWxkcmVuIChoYXNDaGlsZCBpcyB0cnVlKSBhbmQgb25FeHBhbmRIYW5kbGVyIGlzIHByb3ZpZGVkLCBjYWxsIGl0IHRvIGZldGNoIGNoaWxkcmVuXG4gICAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIgJiYgdGhpcy5jb25maWcgJiYgdGhpcy5oYXNDaGlsZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBzdGVwIGNvbmZpZyBvYmplY3QgZm9yIHRoZSBoYW5kbGVyIHdpdGggaGFzQ2hpbGQgcHJvcGVydHlcbiAgICAgICAgY29uc3Qgc3RlcENvbmZpZyA9IHtcbiAgICAgICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgICAgICBoYXNDaGlsZDogdHJ1ZSxcbiAgICAgICAgICBleHBhbmRlZDogdHJ1ZSwgLy8gRW5zdXJlIGV4cGFuZGVkIGlzIHNldFxuICAgICAgICAgIHRlc3RTdGVwVHlwZTogKHRoaXMuY29uZmlnIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8ICh0aGlzLmxvb3BUeXBlID09PSAnZm9yJyA/ICdGT1JfTE9PUCcgOiAnV0hJTEVfTE9PUCcpLFxuICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLmNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBbXSxcbiAgICAgICAgICB0ZXN0U3RlcFJlc3VsdElkOiB0aGlzLnRlc3RTdGVwUmVzdWx0SWQsXG4gICAgICAgICAgaWQ6IHRoaXMuaWRcbiAgICAgICAgfSBhcyBFeGVjdXRpb25TdGVwQ29uZmlnICYgeyBoYXNDaGlsZDogYm9vbGVhbjsgdGVzdFN0ZXBUeXBlPzogc3RyaW5nOyBjaGlsZHJlbj86IGFueVtdOyBleHBhbmRlZD86IGJvb2xlYW4gfTtcbiAgICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXIoc3RlcENvbmZpZyk7XG4gICAgICB9XG4gICAgICAvLyBJbml0aWFsaXplIGxvYWRpbmcgc3RhdGUgZm9yIGFsbCBuZXN0ZWQgc3RlcHNcbiAgICAgIGlmICh0aGlzLm5lc3RlZFN0ZXBzICYmIHRoaXMubmVzdGVkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGVwcy5jbGVhcigpO1xuICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgICAgICAgaWYgKHN0ZXBJZCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RlcHMuYWRkKFN0cmluZyhzdGVwSWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgLy8gQ2xlYXIgbG9hZGluZyBzdGF0ZSB3aGVuIGNvbGxhcHNpbmdcbiAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGV4cGFuZGVkIHN0YXRlIGlzIHN5bmNlZCB3aXRoIGNvbmZpZ1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcuZXhwYW5kZWQgPSB0aGlzLmlzRXhwYW5kZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSBzdGVwIGlzIHN0aWxsIGxvYWRpbmdcbiAgaXNOZXN0ZWRTdGVwTG9hZGluZyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RlcElkID0gc3RlcC50ZXN0U3RlcFJlc3VsdElkIHx8IHN0ZXAuaWQ7XG4gICAgcmV0dXJuIHN0ZXBJZCA/IHRoaXMubG9hZGluZ1N0ZXBzLmhhcyhTdHJpbmcoc3RlcElkKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIE1hcmsgYSBzdGVwIGFzIGxvYWRlZCAoY2FsbGVkIHdoZW4gc3RlcC1yZW5kZXJlciBpcyByZWFkeSlcbiAgbWFya1N0ZXBMb2FkZWQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBJZCA9IHN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBzdGVwLmlkO1xuICAgIGlmIChzdGVwSWQpIHtcbiAgICAgIHRoaXMubG9hZGluZ1N0ZXBzLmRlbGV0ZShTdHJpbmcoc3RlcElkKSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0RGVmYXVsdEl0ZXJhdGlvbigpOiB2b2lkIHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIHVzZSBzZWxlY3RlZEl0ZXJhdGlvbklkIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLml0ZXJhdGlvbnMuZmluZChcbiAgICAgICAgaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uSWRcbiAgICAgICk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRpb25cbiAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gZm91bmQuaWQpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uID0gZm91bmQ7XG4gICAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB1c2VyIGhhcyBtYW51YWxseSBzZWxlY3RlZCBzb21ldGhpbmcsIHByZXNlcnZlIGl0XG4gICAgaWYgKHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5pdGVyYXRpb25zLmZpbmQoaXRlciA9PiBpdGVyLmlkID09PSB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAvLyBSZXNldCBwcm9jZXNzaW5nIHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50IGl0ZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmb3VuZC5pZCkge1xuICAgICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmb3VuZDtcbiAgICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBpcyBzZWxlY3RlZFxuICAgICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHQgYmFzZWQgb24gZGVmYXVsdEl0ZXJhdGlvbiBzZXR0aW5nXG4gICAgaWYgKHRoaXMuZGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2xhc3QnICYmIHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0SXRlcmF0aW9uID0gdGhpcy5pdGVyYXRpb25zW3RoaXMuaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBsYXN0SXRlcmF0aW9uLmlkKSB7XG4gICAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGxhc3RJdGVyYXRpb247XG4gICAgICAvLyBTZXQgdXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgdG8gdHJhY2sgdGhlIGRlZmF1bHQgc2VsZWN0aW9uXG4gICAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdEl0ZXJhdGlvbiA9IHRoaXMuaXRlcmF0aW9uc1swXTtcbiAgICAgIC8vIFJlc2V0IHByb2Nlc3Npbmcgd2hlbiBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgaXRlcmF0aW9uXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLmlkICE9PSBmaXJzdEl0ZXJhdGlvbi5pZCkge1xuICAgICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gPSBmaXJzdEl0ZXJhdGlvbjtcbiAgICAgIC8vIFNldCB1c2VyU2VsZWN0ZWRJdGVyYXRpb25JZCB0byB0cmFjayB0aGUgZGVmYXVsdCBzZWxlY3Rpb25cbiAgICAgIHRoaXMudXNlclNlbGVjdGVkSXRlcmF0aW9uSWQgPSBmaXJzdEl0ZXJhdGlvbi5pZDtcbiAgICAgIC8vIFByb2Nlc3MgbGl2ZSBzdWItc3RlcHMgd2hlbiBpdGVyYXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGl2ZVN1YlN0ZXBzKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTGl2ZSAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVJdGVyYXRpb25DaGFuZ2UoaXRlcmF0aW9uOiBMb29wSXRlcmF0aW9uKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJJVEVSQVRJT04gQ0hBTkdFXCIsIHRoaXMuY29uZmlnICxpdGVyYXRpb24pXG4gICAgLy8gUmVzZXQgcHJvY2Vzc2luZyB3aGVuIHN3aXRjaGluZyBpdGVyYXRpb25zXG4gICAgaWYgKHRoaXMuaXNMaXZlICYmIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5pZCAhPT0gaXRlcmF0aW9uLmlkKSB7XG4gICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICB9XG4gICAgLy8gU3RvcmUgdGhlIHVzZXIncyBtYW51YWwgc2VsZWN0aW9uXG4gICAgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbjtcbiAgICB0aGlzLnVzZXJTZWxlY3RlZEl0ZXJhdGlvbklkID0gaXRlcmF0aW9uLmlkO1xuXG4gICAgaWYgKHRoaXMuaXNMaXZlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXRlcmF0aW9ucy5maW5kSW5kZXgoaXRlciA9PiBpdGVyLmlkID09PSBpdGVyYXRpb24uaWQpO1xuXG4gICAgICBpZiAoaW5kZXggPiAtMSAmJiB0aGlzLml0ZXJhdGlvbkRhdGE/LltpbmRleF0gJiYgdGhpcy5uZXN0ZWRTdGVwcykge1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWROZXN0ZWRTdGVwczogRXhlY3V0aW9uU3RlcENvbmZpZ1tdID1cbiAgICAgICAgICB0aGlzLm5lc3RlZFN0ZXBzLm1hcChzdGVwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTdWJTdGVwcyA9IHRoaXMuaXRlcmF0aW9uRGF0YVtpbmRleF1bc3RlcC5pZF07XG4gICAgICAgICAgICBzdGVwLmR1cmF0aW9uID0gdXBkYXRlZFN1YlN0ZXBzLnJlZHVjZSgoYWNjOiBudW1iZXIsIHN1YlN0ZXA6IGFueSkgPT4gYWNjICsgc3ViU3RlcD8uZHVyYXRpb24gfHwgMCwgMCk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkU3ViU3RlcHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5zdGVwLFxuICAgICAgICAgICAgICAgIHN1YlN0ZXBzOiBbLi4udXBkYXRlZFN1YlN0ZXBzXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyAuLi5zdGVwIH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5uZXN0ZWRTdGVwcyA9IHVwZGF0ZWROZXN0ZWRTdGVwcztcblxuICAgICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgbmVzdGVkU3RlcHM6IHVwZGF0ZWROZXN0ZWRTdGVwc1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBsaXZlIHN1Yi1zdGVwcyB3aGVuIGl0ZXJhdGlvbiBjaGFuZ2VzXG4gICAgICBpZiAodGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpdmVTdWJTdGVwcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0xpdmUgJiYgdGhpcy5zZWxlY3RlZEl0ZXJhdGlvbiAmJiB0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N1YlN0ZXBzRm9yUnVuUmVzdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEVtaXQgdGhlIGV2ZW50IHdpdGggdGhlIGl0ZXJhdGlvbiBJRFxuICAgIHRoaXMub25JdGVyYXRpb25DaGFuZ2UuZW1pdChpdGVyYXRpb24uaWQpO1xuICB9XG5cbiAgY29tcGFyZUl0ZXJhdGlvbihhOiBMb29wSXRlcmF0aW9uLCBiOiBMb29wSXRlcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGEuaWQgPT09IGIuaWQgOiBhID09PSBiO1xuICB9XG5cbiAgZ2V0TG9vcFR5cGVCYWRnZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbJ0xPT1AnXTtcbiAgICBpZiAodGhpcy5sb29wVHlwZSA9PT0gJ2ZvcicpIHtcbiAgICAgIGJhZGdlcy5wdXNoKCdGT1InKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIGJhZGdlcy5wdXNoKCdXSElMRScpO1xuICAgIH1cbiAgICByZXR1cm4gYmFkZ2VzO1xuICB9XG5cbiAgZ2V0SXRlcmF0aW9uTGFiZWwoaXRlcmF0aW9uOiBMb29wSXRlcmF0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlcmF0aW9uLmxhYmVsO1xuICB9XG5cbiAgb25WaWV3QWxsSXRlcmF0aW9uc0NsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vblZpZXdBbGxJdGVyYXRpb25zLmVtaXQoKTtcbiAgfVxuXG4gIG9uQWRkU3RlcEluc2lkZUxvb3AoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmFkZFN0ZXBJbnNpZGVMb29wLmVtaXQodGhpcy5zdGVwID8/IHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIG9uVmlld01vcmVGYWlsZWRTdGVwQ2xpY2soZXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNob3dGYWlsZWRTdGVwRGV0YWlscyA9IGV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0U3ViU3RlcHNGb3JGYWlsZWRTdGVwKCk6IFN1YlN0ZXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24/LnN1YlN0ZXBzIHx8IFtdO1xuICB9XG5cbiAgb25NYWtlQ3VycmVudEJhc2VsaW5lKGV2ZW50OiBtYWtlQ3VycmVudEJhc2VsaW5lRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1ha2VDdXJyZW50QmFzZWxpbmUuZW1pdChldmVudCk7XG4gIH1cblxuICBvblVwbG9hZEJhc2VsaW5lKGV2ZW50OiB1cGxvYWRCYXNlbGluZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy51cGxvYWRCYXNlbGluZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQW5hbHl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFuYWx5emUuZW1pdCgpO1xuICB9XG5cbiAgb25WaWV3RnVsbExvZ3MoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3RnVsbExvZ3MuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxmSGVhbEFjdGlvbihldmVudDogU2VsZkhlYWxBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZkhlYWxBY3Rpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBnZXQgc2hvd1ZpZXdNb3JlQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQgJiYgQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzKSAmJlxuICAgICAgKFxuICAgICAgICAoQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5leHBlY3RlZCB8fCB0aGlzLmZhaWx1cmVEZXRhaWxzPy5hY3R1YWwpKSB8fFxuICAgICAgICAoQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5zY3JlZW5zaG90cz8uY3VycmVudCB8fCB0aGlzLmZhaWx1cmVEZXRhaWxzPy5zY3JlZW5zaG90cz8uYmFzZWxpbmUgfHwgdGhpcy5mYWlsdXJlRGV0YWlscz8uc2NyZWVuc2hvdHM/LmRpZmZlcmVuY2UpXG4gICAgICAgICAgfHwgQm9vbGVhbih0aGlzLmZhaWx1cmVEZXRhaWxzPy5sb2dzPy5sZW5ndGgpKSB8fCBcbiAgICAgICAgKEJvb2xlYW4odGhpcy5mYWlsdXJlRGV0YWlscz8uYWlGaXhBcHBsaWVkICYmICh0aGlzLmZhaWx1cmVEZXRhaWxzPy5haUZpeE1lc3NhZ2UgfHwgdGhpcy5jb25maWRlbmNlIHx8IHRoaXMucmVhc29uaW5nPy5sZW5ndGgpKSlcbiAgICAgIClcbiAgfVxuXG4gIG9uRGVidWdQb2ludENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5kZWJ1Z1BvaW50Q2hhbmdlLmVtaXQoIXRoaXMuZGVidWdQb2ludFNldCk7XG4gIH1cblxuICBvbkVkaXRTdGVwKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMub25FZGl0U3RlcEhhbmRsZXIgJiYgdGhpcy5zdGVwKSB7XG4gICAgICB0aGlzLm9uRWRpdFN0ZXBIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWRpdFN0ZXAuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQWRkU3RlcE9wdGlvblNlbGVjdChvcHRpb246IEFkZFN0ZXBNZW51T3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuYWRkU3RlcE9wdGlvblNlbGVjdC5lbWl0KG9wdGlvbik7XG4gIH1cblxuICBvblN0ZXBNb3JlT3B0aW9uU2VsZWN0KG9wdGlvbjogU3RlcE1vcmVNZW51T3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc3RlcE1vcmVPcHRpb25TZWxlY3QuZW1pdChvcHRpb24pO1xuICB9XG5cbiAgdG9nZ2xlSGVhZGVyKGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGUoKTtcbiAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5zaG93RmFpbGVkU3RlcERldGFpbHMgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25TdGVwQ2xpY2tIYW5kbGVyKSB7XG4gICAgICBjb25zdCBzdGVwVG9QYXNzID0gdGhpcy5zdGVwIHx8IHRoaXMuY29uZmlnO1xuICAgICAgaWYgKHN0ZXBUb1Bhc3MpIHtcbiAgICAgICAgdGhpcy5vblN0ZXBDbGlja0hhbmRsZXIoc3RlcFRvUGFzcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgc3RlcC1ncm91cCB3aXRoIGhhc0NoaWxkXG4gIGlzTmVzdGVkU3RlcEdyb3VwV2l0aENoaWxkcmVuKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RlcC5kaXNwbGF5VHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICEhKHN0ZXAgYXMgYW55KS5oYXNDaGlsZDtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IGdyb3VwTmFtZSBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldEdyb3VwTmFtZShzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHN0ZXAgYXMgU3RlcEdyb3VwQ29uZmlnKS5ncm91cE5hbWUgfHwgJyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwcyBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldFN0ZXBzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBFeGVjdXRpb25TdGVwQ29uZmlnW10ge1xuICAgIGNvbnN0IHN0ZXBHcm91cCA9IHN0ZXAgYXMgU3RlcEdyb3VwQ29uZmlnO1xuICAgIHJldHVybiBzdGVwR3JvdXAuc3RlcHMgfHwgKHN0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fCBbXTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgYSBzdGVwIGlzIGEgY29uZGl0aW9uIHN0ZXBcbiAgaXNOZXN0ZWRDb25kaXRpb25TdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGVwVHlwZSA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8IHN0ZXAuZGlzcGxheVR5cGU7XG4gICAgcmV0dXJuIHN0ZXBUeXBlID09PSAnQ09ORElUSU9OX0lGJyB8fCBzdGVwVHlwZSA9PT0gJ0NPTkRJVElPTl9FTFNFJyB8fCBcbiAgICAgICAgICAgc3RlcFR5cGUgPT09ICdDT05ESVRJT05fRUxTRV9JRicgfHwgc3RlcFR5cGUgPT09ICdDT05ESVRJT05fRUxTRUlGJyB8fFxuICAgICAgICAgICBzdGVwVHlwZSA9PT0gJ2NvbmRpdGlvbic7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIGEgc3RlcCBpcyBhIGxvb3Agc3RlcFxuICBpc05lc3RlZExvb3BTdGVwKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGVwVHlwZSA9IChzdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlIHx8IHN0ZXAuZGlzcGxheVR5cGU7XG4gICAgcmV0dXJuIHN0ZXBUeXBlID09PSAnRk9SX0xPT1AnIHx8IHN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcgfHwgc3RlcFR5cGUgPT09ICdsb29wJztcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IGxvb3AgdHlwZSBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldExvb3BUeXBlKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiAnZm9yJyB8ICd3aGlsZScgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0ZXBUeXBlID0gKHN0ZXAgYXMgYW55KS50ZXN0U3RlcFR5cGUgfHwgc3RlcC5kaXNwbGF5VHlwZTtcbiAgICBpZiAoc3RlcFR5cGUgPT09ICdGT1JfTE9PUCcgfHwgKHN0ZXAgYXMgTG9vcFN0ZXBDb25maWcpLmxvb3BUeXBlID09PSAnZm9yJykge1xuICAgICAgcmV0dXJuICdmb3InO1xuICAgIH0gZWxzZSBpZiAoc3RlcFR5cGUgPT09ICdXSElMRV9MT09QJyB8fCAoc3RlcCBhcyBMb29wU3RlcENvbmZpZykubG9vcFR5cGUgPT09ICd3aGlsZScpIHtcbiAgICAgIHJldHVybiAnd2hpbGUnO1xuICAgIH1cbiAgICByZXR1cm4gKHN0ZXAgYXMgTG9vcFN0ZXBDb25maWcpLmxvb3BUeXBlO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgaXRlcmF0aW9ucyBmcm9tIHN0ZXAgY29uZmlnXG4gIGdldExvb3BJdGVyYXRpb25zKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBhbnlbXSB7XG4gICAgLy8gVXNlIGhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGNvbmZpZ1xuICAgIGlmICh0aGlzLmdldExvb3BJdGVyYXRpb25zSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKHN0ZXApO1xuICAgIH1cbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLml0ZXJhdGlvbnMgfHwgW107XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBuZXN0ZWQgc3RlcHMgZnJvbSBsb29wIHN0ZXAgY29uZmlnXG4gIGdldExvb3BOZXN0ZWRTdGVwcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogRXhlY3V0aW9uU3RlcENvbmZpZ1tdIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLm5lc3RlZFN0ZXBzIHx8IChzdGVwIGFzIGFueSkuY2hpbGRyZW4gfHwgW107XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSBuZXN0ZWQgbG9vcCBzdGVwIGV4cGFuc2lvblxuICBoYW5kbGVMb29wU3RlcEV4cGFuZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSBuZXN0ZWQgbG9vcCBzdGVwIGl0ZXJhdGlvbiBjaGFuZ2VcbiAgaGFuZGxlTG9vcFN0ZXBJdGVyYXRpb25DaGFuZ2Uoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZywgaXRlcmF0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgdGhlIHBhcmVudCBjb21wb25lbnRcbiAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IGVtaXQgdGhlIGV4cGFuZCBldmVudFxuICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikge1xuICAgICAgdGhpcy5vbkV4cGFuZEhhbmRsZXIoc3RlcCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgc3RlcCB0aXRsZVxuICBnZXRTdGVwVGl0bGUoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkuYWN0aW9uIHx8IHN0ZXAudGl0bGUgfHwgJyc7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBzdGVwIHN0YXR1c1xuICBnZXRTdGVwU3RhdHVzKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBTdGVwU3RhdHVzIHtcbiAgICBjb25zdCByZXN1bHQgPSAoc3RlcCBhcyBhbnkpLnJlc3VsdDtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCByZXN1bHRMb3dlciA9IHJlc3VsdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHJlc3VsdExvd2VyID09PSAnc3VjY2VzcycgfHwgcmVzdWx0TG93ZXIgPT09ICdwYXNzZWQnKSB7XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdExvd2VyID09PSAnZmFpbHVyZScgfHwgcmVzdWx0TG93ZXIgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdwZW5kaW5nJyB8fCByZXN1bHRMb3dlciA9PT0gJ25vdC1leGVjdXRlZCcpIHtcbiAgICAgICAgcmV0dXJuICdwZW5kaW5nJztcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0TG93ZXIgPT09ICdydW5uaW5nJykge1xuICAgICAgICByZXR1cm4gJ3J1bm5pbmcnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RlcC5zdGF0dXMgfHwgJ3BlbmRpbmcnO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgc3RlcCBkdXJhdGlvblxuICBnZXRTdGVwRHVyYXRpb24oc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkuZHVyYXRpb24gfHwgc3RlcC5kdXJhdGlvbiB8fCAwO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHMgZm9yIGNvbmRpdGlvbiBzdGVwIHByb3BlcnRpZXNcbiAgZ2V0Q29uZGl0aW9uU3RlcER1cmF0aW9uKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBudW1iZXIge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5nZXRTdGVwRHVyYXRpb24oc3RlcCk7XG4gICAgaWYgKHRoaXMuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcihkdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxuXG4gIGdldENvbmRpdGlvblN0ZXBFeHBhbmRlZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwLmV4cGFuZGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcFRleHQoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChzdGVwIGFzIGFueSkuYWN0aW9uIHx8IHN0ZXAudGl0bGUgfHwgJyc7XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwQnJhbmNoZXMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IENvbmRpdGlvbkJyYW5jaFtdIHtcbiAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0Q29uZGl0aW9uU3RlcExvYWRpbmcoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlQ29uZGl0aW9uU3RlcEV4cGFuZChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcihzdGVwKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwRmFpbHVyZURldGFpbHMoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZyk6IGFueSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRDb25kaXRpb25TdGVwU2VsZkhlYWxBbmFseXNpcyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYW55IHtcbiAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIoc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYW5kbGVDb25kaXRpb25TdGVwU2VsZkhlYWxBY3Rpb24oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDb25kaXRpb25TdGVwTWFrZUJhc2VsaW5lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSB7XG4gICAgICB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBVcGxvYWRCYXNlbGluZShldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBBbmFseXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMub25BbmFseXplSGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNvbmRpdGlvblN0ZXBWaWV3TG9ncygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIHtcbiAgICAgIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHMgdG8gc2FmZWx5IGFjY2VzcyBMb29wU3RlcENvbmZpZyBwcm9wZXJ0aWVzXG4gIGdldExvb3BTZWxlY3RlZEl0ZXJhdGlvbklkKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvb3BTdGVwID0gc3RlcCBhcyBMb29wU3RlcENvbmZpZztcbiAgICByZXR1cm4gbG9vcFN0ZXAuc2VsZWN0ZWRJdGVyYXRpb25JZDtcbiAgfVxuXG4gIGdldExvb3BEZWZhdWx0SXRlcmF0aW9uKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpOiAnZmlyc3QnIHwgJ2xhc3QnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb29wU3RlcCA9IHN0ZXAgYXMgTG9vcFN0ZXBDb25maWc7XG4gICAgcmV0dXJuIGxvb3BTdGVwLmRlZmF1bHRJdGVyYXRpb24gfHwgJ2xhc3QnO1xuICB9XG5cbiAgZ2V0TG9vcFNob3dWaWV3QWxsSXRlcmF0aW9ucyhzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9vcFN0ZXAgPSBzdGVwIGFzIExvb3BTdGVwQ29uZmlnO1xuICAgIHJldHVybiBsb29wU3RlcC5zaG93Vmlld0FsbEl0ZXJhdGlvbnM7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGlzIHN0ZXAgaXMgY3VycmVudGx5IGxvYWRpbmcgbmVzdGVkIGNoaWxkcmVuXG4gIGlzU3RlcExvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIgJiYgdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHRoaXMuY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nIHx8IGZhbHNlO1xuICB9XG5cbiAgb25KdW1wVG9UaW1lc3RhbXAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlciAmJiB0aGlzLnN0ZXA/LmV4ZWN1dGVkUmVzdWx0Py52aWRlb19zdGFydF90aW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zdGVwPy5leGVjdXRlZFJlc3VsdD8udmlkZW9fc3RhcnRfdGltZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gdHlwZW9mIHRoaXMuc3RlcC5leGVjdXRlZFJlc3VsdC52aWRlb19zdGFydF90aW1lID09PSAnbnVtYmVyJyBcbiAgICAgICAgPyB0aGlzLnN0ZXAuZXhlY3V0ZWRSZXN1bHQudmlkZW9fc3RhcnRfdGltZSBcbiAgICAgICAgOiBOdW1iZXIodGhpcy5zdGVwLmV4ZWN1dGVkUmVzdWx0LnZpZGVvX3N0YXJ0X3RpbWUpO1xuICAgICAgY29uc3QgdGVzdFN0ZXBJZCA9IHRoaXMuc3RlcD8udGVzdFN0ZXBJZDtcbiAgICAgIGlmIChpc0Zpbml0ZSh0aW1lc3RhbXApICYmIHRpbWVzdGFtcCA+PSAwKSB7XG4gICAgICAgIHRoaXMuanVtcFRvVGltZXN0YW1wSGFuZGxlcih0aW1lc3RhbXAsIHRlc3RTdGVwSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNMaXZlIHx8ICF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudExlbmd0aCA9ICh0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzIHx8IFtdKS5sZW5ndGg7XG4gICAgLy8gUmVzZXQgaWYgaXRlcmF0aW9uIGNoYW5nZWQgKGRldGVjdGVkIGJ5IGNoZWNraW5nIGlmIHdlIGhhdmUgYSBkaWZmZXJlbnQgaXRlcmF0aW9uJ3Mgc3ViU3RlcHMpXG4gICAgaWYgKHRoaXMubGFzdFByb2Nlc3NlZEluZGV4ID4gMCAmJiBjdXJyZW50TGVuZ3RoIDwgdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXgpIHtcbiAgICAgIC8vIExpa2VseSBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBpdGVyYXRpb24sIHJlc2V0XG4gICAgICB0aGlzLnJlc2V0TGl2ZVByb2Nlc3NpbmcoKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMZW5ndGggIT09IHRoaXMubGFzdFByb2Nlc3NlZEluZGV4KSB7XG4gICAgICB0aGlzLnByb2Nlc3NMaXZlU3ViU3RlcHMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0xpdmVTdWJTdGVwcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24gfHwgIXRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMpIHtcbiAgICAgIHRoaXMucmVzZXRMaXZlUHJvY2Vzc2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFN1YlN0ZXBzID0gKHRoaXMuc2VsZWN0ZWRJdGVyYXRpb24uc3ViU3RlcHMgfHwgW10pIGFzIGFueVtdO1xuXG4gICAgLy8gUmVzZXQgaWYgc3ViU3RlcHMgd2VyZSBjbGVhcmVkIG9yIHJlcGxhY2VkIHdpdGggZmV3ZXIgZW50cmllc1xuICAgIGlmIChhbGxTdWJTdGVwcy5sZW5ndGggPCB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCkge1xuICAgICAgdGhpcy5yZXNldExpdmVQcm9jZXNzaW5nKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZEluZGV4OyBpIDwgYWxsU3ViU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlN0ZXAgPSBhbGxTdWJTdGVwc1tpXTtcbiAgICAgIGNvbnN0IHVpVHlwZTogc3RyaW5nID0gc3ViU3RlcD8udWlUeXBlIHx8IHN1YlN0ZXA/LnR5cGUgfHwgJyc7XG4gICAgICBjb25zdCBzdGF0dXM6IHN0cmluZyA9IChzdWJTdGVwPy5zdGF0dXMgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh1aVR5cGUgPT09ICdXQUlUX0ZPUl9MT0NBVE9SJykge1xuICAgICAgICAvLyBDcmVhdGUgYSBzaW5nbGUgZ3JvdXBlZCBlbnRyeSB3aXRoIGEgY291bnRkb3duOyBhYnNvcmJzIEZJTkRfTE9DQVRPUiBhbmQgTE9DQVRPUl9GT1VORFxuICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHR5cGVvZiBzdWJTdGVwLnZhbHVlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gc3ViU3RlcC52YWx1ZVxuICAgICAgICAgIDogKHN1YlN0ZXAudmFsdWUgPyBwYXJzZUZsb2F0KHN1YlN0ZXAudmFsdWUpIDogMzApO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuXG4gICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0ge1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgcmVtYWluaW5nU2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGREdXJhdGlvblRvV2FpdExvY2F0b3JHcm91cEVudHJ5KHN1YlN0ZXApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2godGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpO1xuXG4gICAgICAgIC8vIFRpY2sgZG93biBldmVyeSBzZWNvbmRcbiAgICAgICAgdGhpcy5jb3VudGRvd25JbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IE1hdGgubWF4KDAsIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgLSAxKTtcbiAgICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzIDw9IDApIHtcbiAgICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LnJlbWFpbmluZ1NlY29uZHMgPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgIH0gZWxzZSBpZiAodWlUeXBlID09PSAnRklORF9MT0NBVE9SJykge1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIC8vIEFib3J0IGNvdW50ZG93biwgcmVwbGFjZSBncm91cCBlbnRyeSB3aXRoIHRoaXMgZmFpbGVkIGxvZ1xuICAgICAgICAgIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcyA9IHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5ICE9PSB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCwgc3RhdHVzOiAnZmFpbGVkJyB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2luZ2xlIGdyb3VwIGVudHJ5J3MgdGV4dCBzbyB0aGUgdXNlciBzZWVzIHByb2dyZXNzXG4gICAgICAgICAgY29uc3QgbmV3VGV4dCA9IHN1YlN0ZXAuZGVzY3JpcHRpb24gfHwgc3ViU3RlcC50ZXh0IHx8IHN1YlN0ZXAudGl0bGU7XG4gICAgICAgICAgaWYgKG5ld1RleHQpIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmRlc2NyaXB0aW9uID0gbmV3VGV4dDtcbiAgICAgICAgICB0aGlzLmFkZER1cmF0aW9uVG9XYWl0TG9jYXRvckdyb3VwRW50cnkoc3ViU3RlcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gYWN0aXZlIGdyb3VwIOKAkyBwdXNoIEZJTkRfTE9DQVRPUiBub3JtYWxseSBvbmNlIGNvdW50ZG93biBpcyBjbGVhcmVkXG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCB9KTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKHVpVHlwZSA9PT0gJ0xPQ0FUT1JfRk9VTkQnKSB7XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgc3RhdHVzID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICAvLyBBYm9ydCBjb3VudGRvd24sIHJlcGxhY2UgZ3JvdXAgZW50cnkgd2l0aCB0aGlzIGZhaWxlZCBsb2dcbiAgICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMgPSB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLmZpbHRlcihlbnRyeSA9PiBlbnRyeSAhPT0gdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh7IC4uLnN1YlN0ZXAsIHN0YXR1czogJ2ZhaWxlZCcgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VxdWVuY2UgY29tcGxldGUg4oCTIHVwZGF0ZSBncm91cCBlbnRyeSB0byBzaG93IExPQ0FUT1JfRk9VTkQgdGV4dCBhcyBzdWNjZXNzXG4gICAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCBzdWJTdGVwLnRleHQgfHwgc3ViU3RlcC50aXRsZTtcbiAgICAgICAgICAgIGlmIChuZXdUZXh0KSB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5kZXNjcmlwdGlvbiA9IG5ld1RleHQ7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICB0aGlzLmFkZER1cmF0aW9uVG9XYWl0TG9jYXRvckdyb3VwRW50cnkoc3ViU3RlcCk7XG4gICAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDb3VudGRvd25UaW1lcigpO1xuICAgICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3RpdmUgZ3JvdXAg4oCTIHB1c2ggTE9DQVRPUl9GT1VORCBub3JtYWxseVxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcy5wdXNoKHsgLi4uc3ViU3RlcCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmICh1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUwnKSB7XG4gICAgICAgIC8vIElmIGEgV0FJVF9GT1JfTE9DQVRPUiBjb3VudGRvd24gaXMgYWN0aXZlLCBjb21wbGV0ZSBpdCBhcyBmYWlsZWQgYmVmb3JlIHN0YXJ0aW5nIEFJIGF1dG8taGVhbFxuICAgICAgICBpZiAodGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkpIHtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeS5yZW1haW5pbmdTZWNvbmRzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICAgICAgICB0aGlzLndhaXRMb2NhdG9yR3JvdXBFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgc2luZ2xlIGxvYWRpbmcgZW50cnk7IHdpbGwgYmUgcmVwbGFjZWQgYnkgQUlfQVVUT19IRUFMX1NVQ0NFU1Mgb3IgQUlfQVVUT19IRUFMX0ZBSUxFRFxuICAgICAgICB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5ID0ge1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHN1YlN0ZXAuZGVzY3JpcHRpb24gfHwgc3ViU3RlcC50ZXh0IHx8ICdBSSBhdXRvLWhlYWwgc3RhcnRlZCcsXG4gICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2godGhpcy5haUF1dG9IZWFsR3JvdXBFbnRyeSk7XG5cbiAgICAgIH0gZWxzZSBpZiAodWlUeXBlID09PSAnQUlfQVVUT19IRUFMX1NVQ0NFU1MnIHx8IHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9GQUlMRUQnKSB7XG4gICAgICAgIC8vIElmIGEgV0FJVF9GT1JfTE9DQVRPUiBjb3VudGRvd24gaXMgYWN0aXZlLCBjb21wbGV0ZSBpdCBhcyBmYWlsZWQgYmVmb3JlIGhhbmRsaW5nIEFJIGF1dG8taGVhbCByZXN1bHRcbiAgICAgICAgaWYgKHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxvYWRpbmcgZW50cnkgYW5kIGFkZCBUV08gc2VwYXJhdGUgZW50cmllczogdmFsdWUgYW5kIHJlYXNvbmluZyAobGlrZSBBSV9BTlNXRVIpXG4gICAgICAgIGlmICh0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwcyA9IHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMuZmlsdGVyKGVudHJ5ID0+IGVudHJ5ICE9PSB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5KTtcbiAgICAgICAgICB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1N1Y2Nlc3MgPSB1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfU1VDQ0VTUyc7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3ViU3RlcC52YWx1ZSA/PyBzdWJTdGVwLnRleHQgPz8gJyc7XG4gICAgICAgIGNvbnN0IHJlYXNvbmluZyA9IHN1YlN0ZXAucmVhc29uaW5nID8/IHN1YlN0ZXAuUmVhc29uaW5nID8/ICcnO1xuICAgICAgICBjb25zdCBiYXNlRHVyYXRpb24gPSBzdWJTdGVwLmR1cmF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsU3RhdHVzID0gaXNTdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCc7XG5cbiAgICAgICAgLy8gRmlyc3QgZW50cnk6IHZhbHVlL2Rlc2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IHZhbHVlRGVzY3JpcHRpb24gPSBzdWJTdGVwLnRleHQgfHwgc3ViU3RlcC5kZXNjcmlwdGlvbiB8fCAoaXNTdWNjZXNzXG4gICAgICAgICAgPyBgQUkgYXV0by1oZWFsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgXG4gICAgICAgICAgOiBgQUkgYXV0by1oZWFsIGZhaWxlZGApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzLnB1c2goe1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlRGVzY3JpcHRpb24sXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHJlYXNvbmluZzogbnVsbCxcbiAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgIHVpVHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgdHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgZHVyYXRpb246IGJhc2VEdXJhdGlvbixcbiAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2Vjb25kIGVudHJ5OiByZWFzb25pbmcgKG9ubHkgaWYgcHJlc2VudClcbiAgICAgICAgaWYgKHJlYXNvbmluZykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaCh7XG4gICAgICAgICAgICAuLi5zdWJTdGVwLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgcmVhc29uaW5nOiByZWFzb25pbmcsXG4gICAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgICAgaXNBaUF1dG9IZWFsUmVzdWx0OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW55IGZhaWxlZCBsb2cgd2hpbGUgYSBjb3VudGRvd24gaXMgYWN0aXZlIOKAkyByZXNvbHZlIGl0IGFzIGZhaWxlZFxuICAgICAgICBpZiAoKHN0YXR1cyA9PT0gJ2ZhaWxlZCcgfHwgc3RhdHVzID09PSAnZmFpbHVyZScpICYmIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkucmVtYWluaW5nU2Vjb25kcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jbGVhckNvdW50ZG93blRpbWVyKCk7XG4gICAgICAgICAgdGhpcy53YWl0TG9jYXRvckdyb3VwRW50cnkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHMucHVzaChzdWJTdGVwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQcm9jZXNzZWRJbmRleCA9IGFsbFN1YlN0ZXBzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRMaXZlUHJvY2Vzc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ291bnRkb3duVGltZXIoKTtcbiAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzID0gW107XG4gICAgdGhpcy5sYXN0UHJvY2Vzc2VkSW5kZXggPSAwO1xuICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5ID0gbnVsbDtcbiAgICB0aGlzLmFpQXV0b0hlYWxHcm91cEVudHJ5ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJDb3VudGRvd25UaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3VudGRvd25JbnRlcnZhbElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnRkb3duSW50ZXJ2YWxJZCk7XG4gICAgICB0aGlzLmNvdW50ZG93bkludGVydmFsSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRHVyYXRpb25Ub1dhaXRMb2NhdG9yR3JvdXBFbnRyeShzdWJTdGVwOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3RHVyYXRpb24gPSBzdWJTdGVwPy5kdXJhdGlvbjtcbiAgICBsZXQgZGVsdGEgPSAwO1xuICAgIGlmICh0eXBlb2YgcmF3RHVyYXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICBkZWx0YSA9IHJhd0R1cmF0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhd0R1cmF0aW9uID09PSAnc3RyaW5nJyAmJiByYXdEdXJhdGlvbi50cmltKCkgIT09ICcnKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHJhd0R1cmF0aW9uKTtcbiAgICAgIGRlbHRhID0gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiAwO1xuICAgIH1cblxuICAgIGlmIChkZWx0YSA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJhdyA9IHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmR1cmF0aW9uO1xuICAgIGxldCBjdXJyZW50ID0gMDtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSYXcgPT09ICdudW1iZXInKSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudFJhdztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50UmF3ID09PSAnc3RyaW5nJyAmJiBjdXJyZW50UmF3LnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEN1cnJlbnQgPSBwYXJzZUZsb2F0KGN1cnJlbnRSYXcpO1xuICAgICAgY3VycmVudCA9IE51bWJlci5pc0Zpbml0ZShwYXJzZWRDdXJyZW50KSA/IHBhcnNlZEN1cnJlbnQgOiAwO1xuICAgIH1cblxuICAgIHRoaXMud2FpdExvY2F0b3JHcm91cEVudHJ5LmR1cmF0aW9uID0gY3VycmVudCArIGRlbHRhO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU3ViU3RlcHNGb3JSdW5SZXN1bHQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uIHx8ICF0aGlzLnNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzKSB7XG4gICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWxsU3ViU3RlcHMgPSAodGhpcy5zZWxlY3RlZEl0ZXJhdGlvbi5zdWJTdGVwcyB8fCBbXSkgYXMgYW55W107XG4gICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzdWJTdGVwIG9mIGFsbFN1YlN0ZXBzKSB7XG4gICAgICBjb25zdCB1aVR5cGU6IHN0cmluZyA9IHN1YlN0ZXA/LnVpVHlwZSB8fCBzdWJTdGVwPy50eXBlIHx8ICcnO1xuXG4gICAgICAvLyBTcGxpdCBBSV9BVVRPX0hFQUxfU1VDQ0VTUy9GQUlMRUQgaW50byB0d28gZW50cmllc1xuICAgICAgaWYgKHVpVHlwZSA9PT0gJ0FJX0FVVE9fSEVBTF9TVUNDRVNTJyB8fCB1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfRkFJTEVEJykge1xuICAgICAgICBjb25zdCBpc1N1Y2Nlc3MgPSB1aVR5cGUgPT09ICdBSV9BVVRPX0hFQUxfU1VDQ0VTUyc7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3ViU3RlcC52YWx1ZSA/PyBzdWJTdGVwLnRleHQgPz8gJyc7XG4gICAgICAgIGNvbnN0IHJlYXNvbmluZyA9IHN1YlN0ZXAucmVhc29uaW5nID8/IHN1YlN0ZXAuUmVhc29uaW5nID8/ICcnO1xuICAgICAgICBjb25zdCBiYXNlRHVyYXRpb24gPSBzdWJTdGVwLmR1cmF0aW9uIHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsU3RhdHVzID0gaXNTdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCc7XG5cbiAgICAgICAgLy8gRmlyc3QgZW50cnk6IHZhbHVlL2Rlc2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IHZhbHVlRGVzY3JpcHRpb24gPSAoaXNTdWNjZXNzXG4gICAgICAgICAgPyBgQUkgYXV0by1oZWFsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgXG4gICAgICAgICAgOiBgQUkgYXV0by1oZWFsIGZhaWxlZGApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFN1YlN0ZXBzRm9yUnVuUmVzdWx0LnB1c2goe1xuICAgICAgICAgIC4uLnN1YlN0ZXAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlRGVzY3JpcHRpb24sXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHJlYXNvbmluZzogbnVsbCxcbiAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgIHVpVHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgdHlwZTogJ0FJX0FVVE9fSEVBTF9WQUxVRScsXG4gICAgICAgICAgZHVyYXRpb246IGJhc2VEdXJhdGlvbixcbiAgICAgICAgICBpc0FpQXV0b0hlYWxSZXN1bHQ6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2Vjb25kIGVudHJ5OiByZWFzb25pbmcgKG9ubHkgaWYgcHJlc2VudClcbiAgICAgICAgaWYgKHJlYXNvbmluZykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAuLi5zdWJTdGVwLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlYXNvbmluZyxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgcmVhc29uaW5nOiByZWFzb25pbmcsXG4gICAgICAgICAgICBzdGF0dXM6IGZpbmFsU3RhdHVzLFxuICAgICAgICAgICAgdWlUeXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICB0eXBlOiAnQUlfQVVUT19IRUFMX1JFQVNPTklORycsXG4gICAgICAgICAgICBkdXJhdGlvbjogYmFzZUR1cmF0aW9uLFxuICAgICAgICAgICAgaXNBaUF1dG9IZWFsUmVzdWx0OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IChzdWJTdGVwPy5zdGF0dXMgPz8gJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgaXNGYWlsZWQgPSBzdGF0dXMgPT09ICdmYWlsZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWx1cmUnO1xuICAgICAgICBjb25zdCBpc0xvY2F0b3JTdGVwID0gdWlUeXBlID09PSAnV0FJVF9GT1JfTE9DQVRPUicgfHwgdWlUeXBlID09PSAnRklORF9MT0NBVE9SJyB8fCB1aVR5cGUgPT09ICdMT0NBVE9SX0ZPVU5EJztcbiAgICAgICAgaWYgKGlzTG9jYXRvclN0ZXAgJiYgaXNGYWlsZWQpIHtcbiAgICAgICAgICBjb25zdCBiYXNlRGVzYyA9IHN1YlN0ZXA/LmRlc2NyaXB0aW9uID8/IHN1YlN0ZXA/LnRleHQgPz8gc3ViU3RlcD8udGl0bGUgPz8gJyc7XG4gICAgICAgICAgY29uc3Qgbm90Rm91bmRTdWZmaXggPSAnIC0gRWxlbWVudCBub3QgZm91bmQnO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAuLi5zdWJTdGVwLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IChiYXNlRGVzYyA/IGJhc2VEZXNjICsgbm90Rm91bmRTdWZmaXggOiBub3RGb3VuZFN1ZmZpeC50cmltKCkpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdWJTdGVwc0ZvclJ1blJlc3VsdC5wdXNoKHN1YlN0ZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZvbnQtaW50ZXIgY3FhLXctZnVsbFwiIFtjbGFzcy5jcWEtb3BhY2l0eS01MF09XCJpc0RlYnVnICYmIGlzU2tpcHBlZCAmJiAhcGFyZW50U2tpcHBlZFwiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIiFpc0RlYnVnID8gbnVsbCA6IHN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncGF1c2VkJyA/ICcjRkZGOUU5JyA6IHN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbGVkJyA/ICcjRkVGMkYyJyA6IG51bGxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcC0yIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUhlYWRlcigkZXZlbnQpXCI+XG4gICAgPGRpdiAqbmdJZj1cInNob3dEZWJ1Z0ljb25cIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgIFttYXRUb29sdGlwXT1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZycgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIGEgcnVubmluZyBzdGVwJyA6IChpc1N0ZXBEZWxldGVkID8gJ0JyZWFrcG9pbnQgY2Fubm90IGJlIHNldCBvbiBkZWxldGVkIHN0ZXBzJyA6ICgoISFwYXJlbnRTa2lwcGVkICYmICFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQpID8gJ0JyZWFrcG9pbnQgY2Fubm90IGJlIHNldCBvbiBhIHJ1bm5pbmcgc3RlcCcgOiAoISFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQgPyAnQnJlYWtwb2ludCBjYW5ub3QgYmUgc2V0IG9uIHNraXBwZWQgc3RlcHMnIDogJycpKSlcIlxuICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgW25nQ2xhc3NdPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJyB8fCAhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZCA/ICdjcWEtY3Vyc29yLW5vdC1hbGxvd2VkIGNxYS1vcGFjaXR5LTQwIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lJyA6ICdjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncnVubmluZycgfHwgISFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQgfHwgISFwYXJlbnRTa2lwcGVkIHx8IGlzU3RlcERlbGV0ZWRcIlxuICAgICAgICAoY2xpY2spPVwib25EZWJ1Z1BvaW50Q2xpY2soJGV2ZW50KVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZGVidWdQb2ludFNldCA/ICdSZW1vdmUgZGVidWcgcG9pbnQnIDogJ1NldCBkZWJ1ZyBwb2ludCdcIj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cImRlYnVnUG9pbnRTZXRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIFthdHRyLmZpbGxdPVwiISFzdGVwPy5kZWJ1Z1BvaW50RGlzYWJsZWQgfHwgISFwYXJlbnRTa2lwcGVkIHx8IGlzU3RlcERlbGV0ZWQgPyAnIzlFOUU5RScgOiAnI0M2MzUzNSdcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiIWRlYnVnUG9pbnRTZXRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIFthdHRyLnN0cm9rZV09XCIhIXN0ZXA/LmRlYnVnUG9pbnREaXNhYmxlZCB8fCAhIXBhcmVudFNraXBwZWQgfHwgaXNTdGVwRGVsZXRlZCA/ICcjOUU5RTlFJyA6ICcjQzYzNTM1J1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU3RhdHVzIEljb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8IS0tIFN1Y2Nlc3MgLS0+XG4gICAgICA8c3ZnICpuZ0lmPVwic3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTEwLjkwMDUgNC45OTk5OUMxMS4xMjg5IDYuMTIwNjQgMTAuOTY2MiA3LjI4NTcxIDEwLjQzOTUgOC4zMDA4OUM5LjkxMjc5IDkuMzE2MDggOS4wNTQgMTAuMTIgOC4wMDYzMSAxMC41Nzg3QzYuOTU4NjIgMTEuMDM3MyA1Ljc4NTM2IDExLjEyMjkgNC42ODIyIDEwLjgyMTJDMy41NzkwNCAxMC41MTk1IDIuNjEyNjUgOS44NDg2OSAxLjk0NDE5IDguOTIwNzFDMS4yNzU3MyA3Ljk5MjcyIDAuOTQ1NjExIDYuODYzNjEgMS4wMDg4OCA1LjcyMTY5QzEuMDcyMTUgNC41Nzk3NiAxLjUyNDk5IDMuNDk0MDQgMi4yOTE4OCAyLjY0NTU4QzMuMDU4NzYgMS43OTcxMiA0LjA5MzM0IDEuMjM3MjEgNS4yMjMwOCAxLjA1OTIyQzYuMzUyODIgMC44ODEyMzMgNy41MDk0NCAxLjA5NTkyIDguNTAwMDUgMS42Njc0OVwiIHN0cm9rZT1cIiMyMkM1NUVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk00LjUgNS41TDYgN0wxMSAyXCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gRmFpbGVkIC0tPlxuICAgICAgPHN2ZyAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbHVyZScgfHwgc3RhdHVzLnRvTG93ZXJDYXNlKCkgPT09ICdmYWlsZWQnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjRUY0NDQ0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNCA0TDggOE04IDRMNCA4XCIgc3Ryb2tlPVwiI0VGNDQ0NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gUGVuZGluZyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3BlbmRpbmcnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIDwhLS0gUnVubmluZyAtLT5cbiAgICAgIDxzdmcgKm5nSWY9XCJzdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gJ3J1bm5pbmcnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiAxMUM4Ljc2MTQyIDExIDExIDguNzYxNDIgMTEgNkMxMSAzLjIzODU4IDguNzYxNDIgMSA2IDFDMy4yMzg1OCAxIDEgMy4yMzg1OCAxIDZDMSA4Ljc2MTQyIDMuMjM4NTggMTEgNiAxMVpcIiBzdHJva2U9XCIjM0I4MkY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNiAzVjZMOCA3XCIgc3Ryb2tlPVwiIzNCODJGNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgIFxuICAgICAgICA8c3BhbiAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAnc2tpcHBlZCdcIiAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICBza2lwX25leHRcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiAqbmdJZj1cInN0YXR1cy50b0xvd2VyQ2FzZSgpID09PSAncGF1c2VkJ1wiPjxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNOC41IDJINy41QzcuMjIzODYgMiA3IDIuMjIzODYgNyAyLjVWOS41QzcgOS43NzYxNCA3LjIyMzg2IDEwIDcuNSAxMEg4LjVDOC43NzYxNCAxMCA5IDkuNzc2MTQgOSA5LjVWMi41QzkgMi4yMjM4NiA4Ljc3NjE0IDIgOC41IDJaXCIgc3Ryb2tlPVwiI0UxNzEwMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNSAySDMuNUMzLjIyMzg2IDIgMyAyLjIyMzg2IDMgMi41VjkuNUMzIDkuNzc2MTQgMy4yMjM4NiAxMCAzLjUgMTBINC41QzQuNzc2MTQgMTAgNSA5Ljc3NjE0IDUgOS41VjIuNUM1IDIuMjIzODYgNC43NzYxNCAyIDQuNSAyWlwiIHN0cm9rZT1cIiNFMTcxMDBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExvb3AgSWNvbiAtLT5cbiAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiNFwiIGZpbGw9XCIjRUJFQ0ZEXCIvPjxwYXRoIGQ9XCJNOS42NjY2MyA0LjY2NjY2TDExIDUuOTk5OTlMOS42NjY2MyA3LjMzMzMyXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTUgNy42NjY2N1Y3LjMzMzMzQzUgNi45Nzk3MSA1LjE0MDQ4IDYuNjQwNTcgNS4zOTA1MiA2LjM5MDUyQzUuNjQwNTcgNi4xNDA0OCA1Ljk3OTcxIDYgNi4zMzMzMyA2SDExXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYuMzMzMzMgMTEuMzMzM0w1IDkuOTk5OTlMNi4zMzMzMyA4LjY2NjY2XCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTExIDguMzMzMzRWOC42NjY2OEMxMSA5LjAyMDMgMTAuODU5NSA5LjM1OTQ0IDEwLjYwOTUgOS42MDk0OUMxMC4zNTk0IDkuODU5NTMgMTAuMDIwMyAxMCA5LjY2NjY3IDEwSDVcIiBzdHJva2U9XCIjM0Y0M0VFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPjwvZGl2PlxuXG4gICAgPCEtLSBTdGVwIE51bWJlciBhbmQgVGl0bGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLWZvbnQtaW50ZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMzMzQxNTVdIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMThweF1cIiBzdHlsZT1cIndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCI+XG4gICAgICAgIHt7IGNvbmZpZz8uc3RlcE51bWJlciB9fS4gPHNwYW4gW2lubmVySFRNTF09XCJjb25maWc/LnRpdGxlXCI+PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIExvb3AgVHlwZSBCYWRnZXMgLS0+XG4gICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2YgZ2V0TG9vcFR5cGVCYWRnZXMoKVwiIFxuICAgICAgICBjbGFzcz1cImNxYS1weC0xLjUgY3FhLXJvdW5kZWQtZnVsbCBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtcHJpbWFyeSBjcWEtYmctWyNFQkVDRkRdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF1cIj5cbiAgICAgICAge3sgYmFkZ2UgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnLnN0ZXBEZWxldGVkXCIgY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0I0MjMxOF0gY3FhLWJnLVsjRkVGM0YyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGRUU0RTJdXCI+XG4gICAgICAgIERlbGV0ZWRcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtZm9udC1pbnRlclwiPlxuICAgICAgPCEtLSBTdGVwIENoYW5nZSBCYWRnZXMgKGRlYnVnIG9ubHkpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRGVidWdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2Ygc3RlcEJhZGdlc1wiPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ3NraXBwZWQnXCJcbiAgICAgICAgICBsYWJlbD1cIlNraXBwZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInIzRBNTU2NSdcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInIzk5QTFBRidcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGRkZGRkYnXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ2VkaXRlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiRWRpdGVkXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiJyNGQkJGMjQnXCJcbiAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiJyNGRERGOTInXCJcbiAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cIicjRkZGOUU5J1wiPlxuICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICpuZ0lmPVwiYmFkZ2UgPT09ICdhZGRlZCdcIlxuICAgICAgICAgIGxhYmVsPVwiQWRkZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInIzBEQkQ3RCdcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInIzVFRDNBOCdcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNDRkYyRTUnXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgKm5nSWY9XCJiYWRnZSA9PT0gJ3JlbW92ZWQnXCJcbiAgICAgICAgICBsYWJlbD1cIlJlbW92ZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgW3RleHRDb2xvcl09XCInI0VFM0YzRidcIlxuICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0Y0N0Y3RidcIlxuICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGQ0Q5RDknXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHNwYW4gKm5nSWY9XCJzZWxmSGVhbEFuYWx5c2lzXCIgY2xhc3M9XCJjcWEtcHgtMS41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMDk3RTUzXSBjcWEtYmctWyNDRkYyRTVdIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLW1pbi13LW1heCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzZweF1cIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI5XCIgaGVpZ2h0PVwiOVwiIHZpZXdCb3g9XCIwIDAgOSA5XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQuNTA5NDEgMEM0LjU2NDg5IDAuMDIyNzM4NCA0LjU4ODU5IDAuMDc4MjY1MiA0LjYxMTMxIDAuMTI5ODQ2QzQuNjIyNjkgMC4xNTk5IDQuNjMzMTQgMC4xOTAxMTcgNC42NDMyOSAwLjIyMDU3NUM0LjY0NzI2IDAuMjMyMjQ3IDQuNjUxMjMgMC4yNDM5MTggNC42NTUzMiAwLjI1NTk0M0M0LjcwODA2IDAuNDEzMDA1IDQuNzU1MDQgMC41NzE3NDggNC44MDIyOSAwLjczMDM4QzQuODEyOTcgMC43NjYxOSA0LjgyMzY5IDAuODAxOTg3IDQuODM0NDIgMC44Mzc3ODNDNC44ODkwNSAxLjAyMDA0IDQuOTQzMjcgMS4yMDI0IDQuOTk3MTkgMS4zODQ4NEM1LjAwNDc2IDEuNDEwNDcgNS4wMTIzNCAxLjQzNjA5IDUuMDE5OTIgMS40NjE3MUM1LjA0MTI4IDEuNTMzOTUgNS4wNjI2MiAxLjYwNjE5IDUuMDgzODMgMS42Nzg0N0M1LjEyODY3IDEuODMxMiA1LjE3NDczIDEuOTgzNDcgNS4yMjM3OCAyLjEzNTAxQzUuMjI4MDcgMi4xNDgyNyA1LjIzMjM2IDIuMTYxNTIgNS4yMzY3NyAyLjE3NTE4QzUuMzY0MiAyLjU2NSA1LjU0NDgyIDIuOTE0MzcgNS44NDA5IDMuMjExOTZDNS44NDgyMyAzLjIxOTcgNS44NTU1NiAzLjIyNzQ0IDUuODYzMTIgMy4yMzU0MUM1Ljk4OTUgMy4zNjQzNyA2LjE1MTY5IDMuNDY3NzEgNi4zMTM4IDMuNTUxMTFDNi4zMjIwNiAzLjU1NTQyIDYuMzMwMzEgMy41NTk3NCA2LjMzODgyIDMuNTY0MTlDNi44MTU4NyAzLjgwOTI1IDcuMzg5NTEgMy45MTcwNCA3LjkwNjE5IDQuMDYwNUM4LjEzMjYgNC4xMjM0IDguMzU4MyA0LjE4ODI5IDguNTgzMTcgNC4yNTYwM0M4LjU5ODk3IDQuMjYwNzkgOC42MTQ3OCA0LjI2NTU0IDguNjMwNTggNC4yNzAyOEM4LjY3Nzg0IDQuMjg0NDUgOC43MjUgNC4yOTg4NyA4Ljc3MjExIDQuMzEzNDdDOC43ODMxIDQuMzE2NzkgOC43OTQwOCA0LjMyMDExIDguODA1MzkgNC4zMjM1M0M4Ljg3MDI5IDQuMzQ0MDYgOC45MzIzOSA0LjM2ODI5IDguOTg1NjYgNC40MTAyN0M5LjAwMTkxIDQuNDQ0MTggOS4wMDE5MSA0LjQ0NDE4IDguOTk3NDggNC40NzgxQzguOTQ1NjQgNC41MjczNiA4Ljg5NDIgNC41NTA0NiA4LjgyNTc4IDQuNTczQzguODE2IDQuNTc2MzIgOC44MDYyMiA0LjU3OTY1IDguNzk2MTQgNC41ODMwOEM4LjY4MDYxIDQuNjIxODMgOC41NjM1MSA0LjY1NTc1IDguNDQ2MjYgNC42ODkzNUM4LjQyMjIgNC42OTYzIDguMzk4MTQgNC43MDMyNiA4LjM3NDA4IDQuNzEwMjFDOC4yMjU3MSA0Ljc1MzAxIDguMDc3MDggNC43OTQ5IDcuOTI4MjkgNC44MzYzMkM3LjczMjMyIDQuODkwODggNy41MzY2MyA0Ljk0NjM0IDcuMzQxMTMgNS4wMDI0M0M3LjMwOTEgNS4wMTE2MiA3LjI3NzA2IDUuMDIwNzggNy4yNDUwMSA1LjAyOTkxQzcuMDc2NzEgNS4wNzc4NiA2LjkwOTIzIDUuMTI3NTMgNi43NDMxNCA1LjE4MjA4QzYuNzI5MzcgNS4xODY1OSA2LjcxNTU5IDUuMTkxMSA2LjcwMTM5IDUuMTk1NzRDNi4xNDUxMSA1LjM4MDgyIDUuNzIxMSA1LjcyNjA5IDUuNDU1NzEgNi4yMzA5OUM1LjMxMjYzIDYuNTE0NzUgNS4yMjgyMyA2LjgyMTYxIDUuMTQyMTQgNy4xMjQ0N0M1LjExODg0IDcuMjA2MTkgNS4wOTQwOSA3LjI4NzQ1IDUuMDY5MDUgNy4zNjg2OUM1LjA0OTQgNy40MzI2MSA1LjAzMDIgNy40OTY2MyA1LjAxMTQ5IDcuNTYwODFDNS4wMDkyNiA3LjU2ODQ0IDUuMDA3MDMgNy41NzYwOCA1LjAwNDczIDcuNTgzOTVDNC45OTM5NCA3LjYyMDk0IDQuOTgzMTkgNy42NTc5MyA0Ljk3MjUyIDcuNjk0OTVDNC45NDUxOSA3Ljc4ODc5IDQuOTE1NzggNy44ODE4NyA0Ljg4NTU1IDcuOTc0ODlDNC44MzE5MSA4LjE0MDIxIDQuNzgzMSA4LjMwNjc0IDQuNzM0NTkgOC40NzM1QzQuNjYxNDQgOC43MjQ1NyA0LjY2MTQ0IDguNzI0NTcgNC42MTk5NyA4Ljg0NTI3QzQuNjE3MjEgOC44NTMzNyA0LjYxNDQ2IDguODYxNDcgNC42MTE2MyA4Ljg2OTgyQzQuNTk2NDkgOC45MTI3OCA0LjU4MDkyIDguOTUyMzMgNC41NTIyNiA4Ljk4ODdDNC41MDg2NyA4Ljk5Nzg4IDQuNTA4NjcgOC45OTc4OCA0LjQ2OTUxIDlDNC40MjQ3MyA4LjkzNzU5IDQuMzk1MDggOC44NzcxMSA0LjM3MTMzIDguODA1MDhDNC4zNjc4NyA4Ljc5NDg3IDQuMzY0NDEgOC43ODQ2NiA0LjM2MDg1IDguNzc0MTVDNC4zMTY4NCA4LjY0MjQ4IDQuMjc3NTEgOC41MDk0NiA0LjIzODE3IDguMzc2NDZDNC4yMjkxNiA4LjM0NjA0IDQuMjIwMTEgOC4zMTU2NCA0LjIxMTA1IDguMjg1MjRDNC4xNDM2IDguMDU4NjMgNC4wNzcyNSA3LjgzMTc0IDQuMDExMDEgNy42MDQ4MUMzLjczNTA3IDYuNDgyMjQgMy43MzUwNyA2LjQ4MjI0IDMuMDM5IDUuNTc0NjZDMy4wMjc4NCA1LjU2NTk2IDMuMDE2NjkgNS41NTcyNiAzLjAwNTE5IDUuNTQ4M0MyLjU0OTEzIDUuMTk5MDIgMS45NDgzNCA1LjA2OTY5IDEuMzk4MTUgNC45MTgxM0MxLjI2MjA3IDQuODgwNjIgMS4xMjYwNSA0Ljg0MjkzIDAuOTkwMDMyIDQuODA1MjNDMC45NzgxMzggNC44MDE5MyAwLjk3ODEzOCA0LjgwMTkzIDAuOTY2MDAzIDQuNzk4NTdDMC43Njk4MTEgNC43NDQxNyAwLjU3MzY3NCA0LjY4OTYzIDAuMzc4MjI0IDQuNjMyODNDMC4zNjk5NTYgNC42MzA0NSAwLjM2MTY4OCA0LjYyODA2IDAuMzUzMTY5IDQuNjI1NjFDMC4wNTI4OTg5IDQuNTM4ODMgMC4wNTI4OTg5IDQuNTM4ODMgMC4wMDA2NDY1MzcgNC40NzgxQy0wLjAwMDgzMTI2MSA0LjQ1MDU0IC0wLjAwMDgzMTI2MSA0LjQ1MDU0IDAuMDEyNDY4OSA0LjQyMTU3QzAuMDY3MDgzNSA0LjM3MDQgMC4xMjAwNzcgNC4zNDg0OCAwLjE5MjE2IDQuMzI2MTlDMC4yMDI1OTcgNC4zMjI4NCAwLjIxMzAzNCA0LjMxOTQ4IDAuMjIzNzg3IDQuMzE2MDNDMC4yNTU3NTMgNC4zMDU4MiAwLjI4Nzc4OCA0LjI5NTg0IDAuMzE5ODUxIDQuMjg1OTJDMC4zMjkwMDEgNC4yODMwNSAwLjMzODE1MSA0LjI4MDE3IDAuMzQ3NTc4IDQuMjc3MjJDMC40MTIyODUgNC4yNTY5MyAwLjQ3NzIyNSA0LjIzNzQgMC41NDIyNTkgNC4yMTgwOUMwLjU1ODI0IDQuMjEzMzIgMC41NTgyNCA0LjIxMzMyIDAuNTc0NTQ0IDQuMjA4NDZDMC44NTIyNjkgNC4xMjU4NyAxLjEzMTgxIDQuMDQ5IDEuNDExMjYgMy45NzE5NkMxLjYxOTUgMy45MTQ1NSAxLjgyNzM4IDMuODU2MTggMi4wMzQ2IDMuNzk1NDhDMi4wNDQxMyAzLjc5MjcxIDIuMDUzNjUgMy43ODk5MyAyLjA2MzQ2IDMuNzg3MDdDMi41NDM1IDMuNjQ2OTYgMy4wMTI3OCAzLjQ0ODE2IDMuMzIyNzQgMy4wNTM3QzMuMzI3MzggMy4wNDc4NSAzLjMzMjAyIDMuMDQyIDMuMzM2OCAzLjAzNTk3QzMuNjgxOTcgMi41OTgxNSAzLjgxNjU4IDIuMDY1NzIgMy45NjY5NSAxLjU0NjIxQzQuMDE2NDMgMS4zNzUzNCA0LjA2NjQ5IDEuMjA0NjQgNC4xMTY3MyAxLjAzMzk5QzQuMTMwNjQgMC45ODY3MzMgNC4xNDQ1MyAwLjkzOTQ3MSA0LjE1ODM2IDAuODkyMTk0QzQuMjEzOTQgMC43MDIyODkgNC4yNzAzNSAwLjUxMjY0MiA0LjMzIDAuMzIzODY0QzQuMzM1NTggMC4zMDYxODYgNC4zNDExNCAwLjI4ODUwMSA0LjM0NjY2IDAuMjcwODA3QzQuNDMwMTcgMC4wMDM5ODc2MSA0LjQzMDE3IDAuMDAzOTg3NjEgNC41MDk0MSAwWlwiIGZpbGw9XCIjMERCRDdEXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yMzU5NyAwLjU1NDg1OUM3LjI5MDI0IDAuNjEzNTk5IDcuMzAxMDkgMC42ODI2MzEgNy4zMTc5OSAwLjc1NzYzOEM3LjM3NDM2IDAuOTkzMjY5IDcuNDM5MjkgMS4yMDk5MyA3LjY2NDY3IDEuMzQ2ODFDNy44MDM3MSAxLjQyMDM1IDcuOTY5NDQgMS40NTM4MSA4LjEyMzUgMS40ODU0MUM4LjE4ODU0IDEuNDk5MDIgOC4yNDM0OCAxLjUxNzA5IDguMjk5MjQgMS41NTMyMUM4LjMxMTgxIDEuNTcyMjkgOC4zMTE4MSAxLjU3MjI5IDguMzExMDcgMS42MDU0OUM4LjI5ODE0IDEuNjQ1ODggOC4yODY3OCAxLjY1ODkgOC4yNTI2OSAxLjY4NTMzQzguMjE1NDMgMS42OTcyNiA4LjIxNTQzIDEuNjk3MjYgOC4xNzA2OCAxLjcwNjUzQzguMTUzNzUgMS43MTAyNSA4LjEzNjgzIDEuNzE0IDguMTE5OTIgMS43MTc3OUM4LjExMDg2IDEuNzE5OCA4LjEwMTgxIDEuNzIxODEgOC4wOTI0NyAxLjcyMzg4QzcuODE2OTYgMS43ODQ4MiA3LjgxNjk2IDEuNzg0ODIgNy41Nzg4MiAxLjkyMjczQzcuNTcxMDggMS45Mjg2OSA3LjU2MzMzIDEuOTM0NjYgNy41NTUzNiAxLjk0MDhDNy4zODUxNiAyLjA4NDMxIDcuMzQ5MTYgMi4zMjMwMyA3LjI5NzkzIDIuNTIzMDFDNy4yOTQ5OSAyLjUzMzk5IDcuMjkyMDYgMi41NDQ5NyA3LjI4OTAzIDIuNTU2MjlDNy4yODY0OSAyLjU2NjAxIDcuMjgzOTUgMi41NzU3MyA3LjI4MTMzIDIuNTg1NzVDNy4yNzAyOCAyLjYxNTQ0IDcuMjU4ODEgMi42MzQ3OSA3LjIzNTk3IDIuNjU3NTRDNy4xNzIzNCAyLjY2NTI3IDcuMTcyMzQgMi42NjUyNyA3LjE0MTM5IDIuNjU3NTRDNy4wOTIxNiAyLjYyMTA2IDcuMDgxMTQgMi41Nzk1IDcuMDY4MjggMi41MjM2NUM3LjA2NjEzIDIuNTE1MDEgNy4wNjM5OCAyLjUwNjM2IDcuMDYxNzYgMi40OTc0NUM3LjA1NDg5IDIuNDY5ODMgNy4wNDgyNCAyLjQ0MjE3IDcuMDQxNjQgMi40MTQ0OUM2Ljk4OTc5IDIuMTk4OTcgNi45MzEyNiAxLjk4NzUxIDYuNzI0NTEgMS44NjExOEM2LjU2MjkzIDEuNzc1MDEgNi4zNjY0NiAxLjczNDI2IDYuMTg1ODcgMS43MDEzNkM2LjEzNjM3IDEuNjkxNTEgNi4xMDgwMiAxLjY3OTExIDYuMDc3MzggMS42NDAxMkM2LjA3MDczIDEuNjAwNTUgNi4wNzA3MyAxLjYwMDU1IDYuMDc3MzggMS41NjA5OEM2LjEyNDQ3IDEuNTE0MzcgNi4xNzQwMiAxLjUwMjk5IDYuMjM3NzIgMS40ODg5MUM2LjI1Nzc4IDEuNDg0MTYgNi4yNzc4NCAxLjQ3OTM4IDYuMjk3ODkgMS40NzQ1NkM2LjMwODI1IDEuNDcyMDkgNi4zMTg2MSAxLjQ2OTYyIDYuMzI5MjkgMS40NjcwN0M2LjM4MjEyIDEuNDU0MDcgNi40MzQ0MyAxLjQzOTQ5IDYuNDg2NzMgMS40MjQ2MkM2LjQ5NjIzIDEuNDIxOTggNi41MDU3MyAxLjQxOTM1IDYuNTE1NTIgMS40MTY2M0M2LjYyMTgyIDEuMzg2MjQgNi43MTM1NiAxLjM0NzM3IDYuNzk4NTQgMS4yNzgzNkM2LjgwNjQ3IDEuMjcyMTMgNi44MTQzOSAxLjI2NTg5IDYuODIyNTUgMS4yNTk0NkM2Ljk1NDggMS4xNDU2NSA2Ljk5OTc0IDAuOTc0Njc0IDcuMDQwNTMgMC44MTUxMzRDNy4wNDM2NCAwLjgwMzAyMiA3LjA0Njc1IDAuNzkwOTEgNy4wNDk5NSAwLjc3ODQzMkM3LjA1NjE0IDAuNzU0MTAxIDcuMDYyMjIgMC43Mjk3NDMgNy4wNjgxNyAwLjcwNTM1OUM3LjA3MjQzIDAuNjg4Mzk0IDcuMDcyNDMgMC42ODgzOTQgNy4wNzY3OCAwLjY3MTA4NkM3LjA3OTI3IDAuNjYwOTUxIDcuMDgxNzUgMC42NTA4MTYgNy4wODQzMSAwLjY0MDM3M0M3LjA5NTIxIDAuNjA4MTA4IDcuMTA5NTIgMC41ODI3NzIgNy4xMjk1NyAwLjU1NDg1OUM3LjE2ODEgMC41MzY0MzUgNy4xOTUxNSAwLjU0NDc2NCA3LjIzNTk3IDAuNTU0ODU5WlwiIGZpbGw9XCIjMDc1RjNGXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMS43OTU0NSA2LjI0NzFDMS44MDk1MSA2LjI0NzE5IDEuODA5NTEgNi4yNDcxOSAxLjgyMzg2IDYuMjQ3MjlDMS45MjQ3NyA2LjI1MDIyIDEuOTkzMDQgNi4yODExNSAyLjA2NzM2IDYuMzQ2MDFDMi4xNTM4NCA2LjQzNTMzIDIuMTkzNzcgNi41MzYxMSAyLjE5MTUgNi42NTY1QzIuMTgxNzggNi43NTQxMiAyLjEyMTU4IDYuODM5MzUgMi4wNDc3MyA2LjkwNTMzQzEuOTYwODEgNi45NzI0MiAxLjg3MzEzIDYuOTk0NTkgMS43NjIwNiA2Ljk5MTQ5QzEuNjY4NDEgNi45ODEwNyAxLjU4MDMgNi45Mzg1MiAxLjUxMzkzIDYuODc0NTFDMS40MzEzOCA2Ljc2NjgxIDEuNDA3MjUgNi42NjgwMyAxLjQxOTM1IDYuNTM1MzdDMS40NDQzMyA2LjQzMDkyIDEuNTE2MzcgNi4zNDYxMyAxLjYwODUgNi4yODY2NkMxLjY3MjUxIDYuMjU1NjQgMS43MjM5OSA2LjI0NjUyIDEuNzk1NDUgNi4yNDcxWlwiIGZpbGw9XCIjMERCRDdEXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICBTZWxmLWhlYWxlZFxuICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1weS0wLjUgY3FhLXB4LTEgY3FhLWJnLVsjNjM2NkYxMUFdIGNxYS1tbC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtb3BhY2l0eS04MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5XCIgXG4gICAgICAgICAgICpuZ0lmPVwic3RlcD8uZXhlY3V0ZWRSZXN1bHQ/LnZpZGVvX3N0YXJ0X3RpbWVcIiBcbiAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ0p1bXAgdG8gdmlkZW8gdGltZSdcIiBcbiAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAoY2xpY2spPVwib25KdW1wVG9UaW1lc3RhbXAoJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzYzNjM2M10gIWNxYS10ZXh0LVsxMHB4XSAhY3FhLXctWzEwcHhdICFjcWEtaC1bMTBweF1cIj5cbiAgICAgICAgICBwbGF5X2Fycm93XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzhweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzYzNjM2M11cIj5cbiAgICAgICAgICB7eyBmb3JtYXREdXJhdGlvbkNsb2NrKHN0ZXA/LmV4ZWN1dGVkUmVzdWx0Py52aWRlb19zdGFydF90aW1lIHx8IDApIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImlzRGVidWdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0wLjUgY3FhLXRleHQtWyM5Q0EzQUZdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXN0ZXA/LmlzU3RlcEdyb3VwQ2hpbGRyZW5cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZVwiIGFyaWEtbGFiZWw9XCJFZGl0XCIgKGNsaWNrKT1cIm9uRWRpdFN0ZXAoJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdGV4dC1bMTRweF0gIWNxYS13LVsxNHB4XSAhY3FhLWgtWzE0cHhdXCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXN0ZXA/LmlzU3RlcEdyb3VwQ2hpbGRyZW5cIiB0eXBlPVwiYnV0dG9uXCIgI2FkZFN0ZXBNZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgY2xhc3M9XCJjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZVwiIGFyaWEtbGFiZWw9XCJBZGRcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWRkU3RlcE1lbnVcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXRleHQtWzE0cHhdICFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XVwiPmFkZDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI2FkZFN0ZXBNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiY3FhLWFkZC1zdGVwLW1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIiB5UG9zaXRpb249XCJiZWxvd1wiPlxuICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgb3B0IG9mIGFkZFN0ZXBNZW51T3B0aW9uc1wiIChjbGljayk9XCJvbkFkZFN0ZXBPcHRpb25TZWxlY3Qob3B0LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVmZmVjdGl2ZVN0ZXBNb3JlTWVudU9wdGlvbnMubGVuZ3RoXCIgdHlwZT1cImJ1dHRvblwiICNzdGVwTW9yZU1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBjbGFzcz1cImNxYS1wLTAgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBmb2N1czpjcWEtb3V0bGluZS1ub25lXCIgYXJpYS1sYWJlbD1cIk1vcmUgb3B0aW9uc1wiIFttYXRNZW51VHJpZ2dlckZvcl09XCJzdGVwTW9yZU1lbnVcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXRleHQtWzE0cHhdICFjcWEtdy1bMTRweF0gIWNxYS1oLVsxNHB4XVwiPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI3N0ZXBNb3JlTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cImNxYS1zdGVwLW1vcmUtbWVudVwiIHhQb3NpdGlvbj1cImJlZm9yZVwiIHlQb3NpdGlvbj1cImJlbG93XCI+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBvcHQgb2YgZWZmZWN0aXZlU3RlcE1vcmVNZW51T3B0aW9uc1wiIChjbGljayk9XCJvblN0ZXBNb3JlT3B0aW9uU2VsZWN0KG9wdCwgJGV2ZW50KVwiPnt7IG9wdC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjOUNBM0FGXVwiPlxuICAgICAgICB7eyBmb3JtYXREdXJhdGlvbihjb25maWcuZHVyYXRpb24pIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3ZnIFtjbGFzcy5jcWEtcm90YXRlLTE4MF09XCJpc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtdHJhbnNpdGlvbi10cmFuc2Zvcm1cIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0zLjUgNUw3IDguNUwxMC41IDVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRXhwYW5kZWQgQ29udGVudCAtLT5cbiAgPGRpdiAqbmdJZj1cImlzRXhwYW5kZWRcIj5cbiAgICA8IS0tIEl0ZXJhdGlvbiBTZWxlY3RvciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB4LTQgY3FhLXB5LTIgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM3MzczNzNdXCIgKm5nSWY9XCIhaXNMaXZlIHx8IChpc0xpdmUgJiYgY29uZmlnPy5pdGVyYXRpb25zICE9PSB1bmRlZmluZWQpXCI+XG4gICAgICA8bGFiZWw+SXRlcmF0aW9uPC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctZnVsbCBjcWEtbWF4LXctWzE1NnB4XVwiPlxuICAgICAgICA8IS0tIFN0YXR1cyBpbmRpY2F0b3IgZm9yIHNlbGVjdGVkIGl0ZXJhdGlvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uICYmIGNvbmZpZz8uaXRlcmF0aW9ucyAmJiBjb25maWc/Lml0ZXJhdGlvbnM/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC1bMTBweF0gY3FhLXRvcC0xLzIgY3FhLXRyYW5zZm9ybSBjcWEtLXRyYW5zbGF0ZS15LTEvMiBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei0xMFwiPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJzZWxlY3RlZEl0ZXJhdGlvbi5zdGF0dXMgPT09ICdzdWNjZXNzJ1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDYgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjNcIiBmaWxsPVwiIzAwQTYzRVwiLz48L3N2Zz5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24uc3RhdHVzID09PSAnZmFpbGVkJ1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjZcIiB2aWV3Qm94PVwiMCAwIDYgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjNcIiBmaWxsPVwiI0VGNDQ0NFwiLz48L3N2Zz5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VsZWN0ZWRJdGVyYXRpb24uc3RhdHVzID09PSAncGVuZGluZydcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCI2XCIgdmlld0JveD1cIjAgMCA2IDZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48Y2lyY2xlIGN4PVwiM1wiIGN5PVwiM1wiIHI9XCIzXCIgZmlsbD1cIiM5Q0EzQUZcIi8+PC9zdmc+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uLnN0YXR1cyA9PT0gJ3J1bm5pbmcnXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgNiA2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiM1wiIGZpbGw9XCIjM0I4MkY2XCIvPjwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIGNsYXNzPVwiY3FhLXBsLVsyMnB4XSBjcWEtcHItNiBjcWEtcHktWzVweF0gY3FhLXctZnVsbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFNUU1RTVdIGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy1bI0ZBRkFGQV0gY3FhLXRleHQtYmxhY2stMTAwIGNxYS1hcHBlYXJhbmNlLW5vbmVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJdGVyYXRpb25cIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUl0ZXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUl0ZXJhdGlvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIihpc0xpdmUgJiYgKHN0YXR1cyA9PT0gJ3J1bm5pbmcnIHx8IHN0YXR1cyA9PT0gJ1JVTk5JTkcnKSlcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiIWNvbmZpZz8uaXRlcmF0aW9ucyB8fCBjb25maWc/Lml0ZXJhdGlvbnM/Lmxlbmd0aCA9PT0gMFwiIHZhbHVlPVwiXCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICBObyBpdGVyYXRpb25zIGF2YWlsYWJsZVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGl0ZXJhdGlvbiBvZiBjb25maWcuaXRlcmF0aW9uc1wiIFtuZ1ZhbHVlXT1cIml0ZXJhdGlvblwiPlxuICAgICAgICAgICAge3sgZ2V0SXRlcmF0aW9uTGFiZWwoaXRlcmF0aW9uKSB9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPCEtLSBEcm9wZG93biBhcnJvdyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcmlnaHQtMiBjcWEtdG9wLTEvMiBjcWEtdHJhbnNmb3JtIGNxYS0tdHJhbnNsYXRlLXktMS8yIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiNlwiIHZpZXdCb3g9XCIwIDAgMTAgNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMSAxTDUgNUw5IDFcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWwtYXV0b1wiICpuZ0lmPVwiY29uZmlnPy5pdGVyYXRpb25zICYmIGNvbmZpZz8uaXRlcmF0aW9ucz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICBEZWZhdWx0OiB7eyBjb25maWcuZGVmYXVsdEl0ZXJhdGlvbiA9PT0gJ2xhc3QnID8gJ2xhc3QgaXRlcmF0aW9uJyA6ICdmaXJzdCBpdGVyYXRpb24nIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlbGVjdGVkIEl0ZXJhdGlvbiBTdWItc3RlcHMgLS0+XG4gICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkSXRlcmF0aW9uICYmIHNlbGVjdGVkSXRlcmF0aW9uLnN1YlN0ZXBzXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1weS0xIGNxYS1tbC05XCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAnMXB4IHNvbGlkICNGM0Y0RjYnXCI+XG4gICAgICA8IS0tIFNpbmdsZSBsb29wOiByZW5kZXIgYWxsIGVudHJpZXMgaW4gY2hyb25vbG9naWNhbCBvcmRlciAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YlN0ZXAgb2YgKGlzTGl2ZSA/IHByb2Nlc3NlZFN1YlN0ZXBzIDogcHJvY2Vzc2VkU3ViU3RlcHNGb3JSdW5SZXN1bHQpXCI+XG4gICAgICAgIDwhLS0gQUlfQVVUT19IRUFMX1NVQ0NFU1MvRkFJTEVEOiByZW5kZXIgd2l0aCBhaS1hZ2VudC1zdGVwIHN0eWxlIChib3RoIGxpdmUgYW5kIHJ1biByZXN1bHQgc2NyZWVucykgLS0+XG4gICAgICAgIDxjcWEtYWktbG9ncy13aXRoLXJlYXNvbmluZ1xuICAgICAgICAgICpuZ0lmPVwiJGFueShzdWJTdGVwKS5pc0FpQXV0b0hlYWxSZXN1bHRcIlxuICAgICAgICAgIFtzdGF0dXNdPVwic3ViU3RlcC5zdGF0dXNcIlxuICAgICAgICAgIFt0ZXh0XT1cIiRhbnkoc3ViU3RlcCkudGV4dCB8fCBzdWJTdGVwPy52YWx1ZVwiXG4gICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cIiRhbnkoc3ViU3RlcCkuZGVzY3JpcHRpb24gfHwgc3ViU3RlcD8udGV4dCB8fCBzdWJTdGVwPy52YWx1ZVwiXG4gICAgICAgICAgW3JlYXNvbmluZ109XCIkYW55KHN1YlN0ZXApLnJlYXNvbmluZyB8fCBzdWJTdGVwPy5yZWFzb25pbmdcIlxuICAgICAgICAgIFtkdXJhdGlvbl09XCJzdWJTdGVwLmR1cmF0aW9uXCI+XG4gICAgICAgIDwvY3FhLWFpLWxvZ3Mtd2l0aC1yZWFzb25pbmc+XG5cbiAgICAgICAgPCEtLSBSZWd1bGFyIHN1Yi1zdGVwcyAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiISRhbnkoc3ViU3RlcCkuaXNBaUF1dG9IZWFsUmVzdWx0XCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weS1bNS41cHhdIGNxYS1weC0zXCI+XG4gICAgICAgICAgXG4gICAgICAgICAgPCEtLSBTdWItc3RlcCBTdGF0dXMgSWNvbiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnc3VjY2VzcycgfHwgc3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAncGFzc2VkJ1wiID5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMTAuOTAwNSA0Ljk5OTk5QzExLjEyODkgNi4xMjA2NCAxMC45NjYyIDcuMjg1NzEgMTAuNDM5NSA4LjMwMDg5QzkuOTEyNzkgOS4zMTYwOCA5LjA1NCAxMC4xMiA4LjAwNjMxIDEwLjU3ODdDNi45NTg2MiAxMS4wMzczIDUuNzg1MzYgMTEuMTIyOSA0LjY4MjIgMTAuODIxMkMzLjU3OTA0IDEwLjUxOTUgMi42MTI2NSA5Ljg0ODY5IDEuOTQ0MTkgOC45MjA3MUMxLjI3NTczIDcuOTkyNzIgMC45NDU2MTEgNi44NjM2MSAxLjAwODg4IDUuNzIxNjlDMS4wNzIxNSA0LjU3OTc2IDEuNTI0OTkgMy40OTQwNCAyLjI5MTg4IDIuNjQ1NThDMy4wNTg3NiAxLjc5NzEyIDQuMDkzMzQgMS4yMzcyMSA1LjIyMzA4IDEuMDU5MjJDNi4zNTI4MiAwLjg4MTIzMyA3LjUwOTQ0IDEuMDk1OTIgOC41MDAwNSAxLjY2NzQ5XCIgc3Ryb2tlPVwiIzIyQzU1RVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTQuNSA1LjVMNiA3TDExIDJcIiBzdHJva2U9XCIjMjJDNTVFXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gRmFpbHVyZSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbHVyZScgfHwgc3ViU3RlcD8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnZmFpbGVkJ1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk02IDExQzguNzYxNDIgMTEgMTEgOC43NjE0MiAxMSA2QzExIDMuMjM4NTggOC43NjE0MiAxIDYgMUMzLjIzODU4IDEgMSAzLjIzODU4IDEgNkMxIDguNzYxNDIgMy4yMzg1OCAxMSA2IDExWlwiIHN0cm9rZT1cIiNEQzI2MjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHBhdGggZD1cIk03LjUgNC41TDQuNSA3LjVcIiBzdHJva2U9XCIjREMyNjI2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNNC41IDQuNUw3LjUgNy41XCIgc3Ryb2tlPVwiI0RDMjYyNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIFBlbmRpbmcgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlN0ZXA/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ3BlbmRpbmcnXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBSdW5uaW5nIC0gU2hvdyBzcGlubmVyIChhbHNvIHVzZWQgZm9yIGFjdGl2ZSBXQUlUX0ZPUl9MT0NBVE9SIGNvdW50ZG93biBpbiBsaXZlIG1vZGUpIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdydW5uaW5nJ1wiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hbmltYXRlLXNwaW4gY3FhLXRleHQtWyMzQjgyRjZdXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIiBvcGFjaXR5PVwiMC4yNVwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDFBNSA1IDAgMCAxIDExIDZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzdWJTdGVwPy5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdza2lwcGVkJ1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgc2tpcF9uZXh0XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN1Yi1zdGVwIERlc2NyaXB0aW9uIC0tPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdGV4dC1bMTNweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS10ZXh0LVsjMzY0MTUzXVwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS1saW5lOyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiPlxuICAgICAgICAgICAge3sgJGFueShzdWJTdGVwKS5kZXNjcmlwdGlvbiB8fCAkYW55KHN1YlN0ZXApLnRleHQgfX1cbiAgICAgICAgICAgIDwhLS0gQ291bnRkb3duIGZvciBhY3RpdmUgV0FJVF9GT1JfTE9DQVRPUiBpbiBsaXZlIG1vZGUgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTGl2ZSAmJiAkYW55KHN1YlN0ZXApLnJlbWFpbmluZ1NlY29uZHMgIT0gbnVsbFwiIGNsYXNzPVwiY3FhLXRleHQtWyNGOTczMTZdIGNxYS1mb250LW1lZGl1bSBjcWEtbWwtMVwiPih7eyAkYW55KHN1YlN0ZXApLnJlbWFpbmluZ1NlY29uZHMgfX1zIHJlbWFpbmluZyk8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBTdWItc3RlcCBEdXJhdGlvbiAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMHB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LW1ldGFkYXRhLWtleVwiPlxuICAgICAgICAgICAge3sgZm9ybWF0RHVyYXRpb24oc3ViU3RlcC5kdXJhdGlvbikgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5lc3RlZCBTdGVwcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzQ2hpbGQgfHwgKGNvbmZpZy5uZXN0ZWRTdGVwcyAmJiBjb25maWcubmVzdGVkU3RlcHMubGVuZ3RoID4gMClcIiBjbGFzcz1cImNxYS1tbC05IGNxYS1wYi0xIGNxYS1uZXN0ZWQtc3RlcHMtY29udGFpbmVyXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAnMXB4IHNvbGlkICNGM0Y0RjYnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM3MzczNzNdIGNxYS1weS1bMnB4XSBjcWEtcHgtM1wiPk5lc3RlZCBzdGVwczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLXBsLVsxOHB4XVwiIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQzVDN0ZBO1wiPlxuICAgICAgICA8IS0tIExvYWRpbmcgaW5kaWNhdG9yIHdoZW4gbmVzdGVkIHN0ZXBzIGFyZSBiZWluZyBsb2FkZWQgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJoYXNDaGlsZCAmJiAoIWNvbmZpZy5uZXN0ZWRTdGVwcyB8fCBjb25maWcubmVzdGVkU3RlcHMubGVuZ3RoID09PSAwKSAmJiBpc1N0ZXBMb2FkaW5nKClcIiBcbiAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weS0yIGNxYS1weC0zXCI+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hbmltYXRlLXNwaW4gY3FhLXRleHQtWyMzQjgyRjZdXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIgb3BhY2l0eT1cIjAuMjVcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMUE2IDYgMCAwIDEgMTMgN1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMXB4XSBjcWEtbGVhZGluZy1bMTNweF0gY3FhLXRleHQtWyM3MzczNzNdXCI+TG9hZGluZyBuZXN0ZWQgc3RlcHMuLi48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGVwIG9mIGNvbmZpZy5uZXN0ZWRTdGVwczsgaW5kZXggYXMgaVwiPlxuICAgICAgICAgIDwhLS0gV3JhcHBlciB0byBzaG93IHNrZWxldG9uIHdoaWxlIHN0ZXAtcmVuZGVyZXIgaXMgbG9hZGluZyAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNxYS1zdGVwLXJlbmRlcmVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2V4Yy0nICsgc3RlcC5pZFwiXG4gICAgICAgICAgICBbY2xhc3MubG9hZGVkXT1cIiFpc05lc3RlZFN0ZXBMb2FkaW5nKHN0ZXApXCI+XG4gICAgICAgICAgICA8IS0tIExvYWRpbmcgc2tlbGV0b24gb3ZlcmxheSAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImlzTmVzdGVkU3RlcExvYWRpbmcoc3RlcClcIiBjbGFzcz1cImNxYS1zdGVwLXNrZWxldG9uLW92ZXJsYXlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1zdGVwLXNrZWxldG9uIGNxYS1teC0zIGNxYS1teS0xXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tIFVzZSBzdGVwLXJlbmRlcmVyIGZvciBhbGwgbmVzdGVkIHN0ZXBzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyAtLT5cbiAgICAgICAgICAgIDwhLS0gVGhlIHN0ZXAtcmVuZGVyZXIgd2lsbCBkeW5hbWljYWxseSBsb2FkIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQgYW5kIHBhc3MgaGFuZGxlcnMgLS0+XG4gICAgICAgICAgICA8Y3FhLXN0ZXAtcmVuZGVyZXIgXG4gICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXBcIlxuICAgICAgICAgICAgICBbc3RlcE51bWJlcl09XCJzdGVwTnVtYmVyICsgJy4nICsgKGkgKyAxKVwiXG4gICAgICAgICAgICAgIFtvbkV4cGFuZEhhbmRsZXJdPVwib25FeHBhbmRIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcl09XCJnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXJdPVwib25Db25kaXRpb25CcmFuY2hDbGlja0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbaXNTdGVwTG9hZGluZ0hhbmRsZXJdPVwiaXNTdGVwTG9hZGluZ0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbaXNTdGVwRXhwYW5kZWRIYW5kbGVyXT1cImlzU3RlcEV4cGFuZGVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyXT1cImNvbnZlcnRNc1RvU2Vjb25kc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyXT1cImZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcl09XCJnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXJdPVwiZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2dldEFwaUFzc2VydGlvbnNIYW5kbGVyXT1cImdldEFwaUFzc2VydGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2Zvcm1hdEFjdGlvbnNIYW5kbGVyXT1cImZvcm1hdEFjdGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyXT1cIm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXJdPVwib25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblVwbG9hZEJhc2VsaW5lSGFuZGxlcl09XCJvblVwbG9hZEJhc2VsaW5lSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyXT1cImdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25BbmFseXplSGFuZGxlcl09XCJvbkFuYWx5emVIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW29uVmlld0Z1bGxMb2dzSGFuZGxlcl09XCJvblZpZXdGdWxsTG9nc0hhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25TZWxmSGVhbEFjdGlvbkhhbmRsZXJdPVwib25TZWxmSGVhbEFjdGlvbkhhbmRsZXJcIlxuICAgICAgICAgICAgICBbb25TdGVwQ2xpY2tIYW5kbGVyXT1cIm9uU3RlcENsaWNrSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkpzb25QYXRoQ29waWVkSGFuZGxlcl09XCJvbkpzb25QYXRoQ29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkRvd25sb2FkSGFuZGxlcl09XCJvbkRvd25sb2FkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvbkZpbGVQYXRoQ29waWVkSGFuZGxlcl09XCJvbkZpbGVQYXRoQ29waWVkSGFuZGxlclwiXG4gICAgICAgICAgICAgIFtvblRleHRDb3BpZWRIYW5kbGVyXT1cIm9uVGV4dENvcGllZEhhbmRsZXJcIlxuICAgICAgICAgICAgICBbanVtcFRvVGltZXN0YW1wSGFuZGxlcl09XCJqdW1wVG9UaW1lc3RhbXBIYW5kbGVyXCJcbiAgICAgICAgICAgICAgW2Rvd25sb2FkaW5nU3RlcElkXT1cImRvd25sb2FkaW5nU3RlcElkXCJcbiAgICAgICAgICAgICAgW2lzVXBsb2FkaW5nQmFzZWxpbmVdPVwiaXNVcGxvYWRpbmdCYXNlbGluZVwiXG4gICAgICAgICAgICAgIFtpc01ha2luZ0N1cnJlbnRCYXNlbGluZV09XCJpc01ha2luZ0N1cnJlbnRCYXNlbGluZVwiXG4gICAgICAgICAgICAgIFtzZWxlY3RlZEl0ZXJhdGlvbklkXT1cInN0ZXA/LnNlbGVjdGVkSXRlcmF0aW9uSWQgfHwgJydcIlxuICAgICAgICAgICAgW2lzTGl2ZV09XCJpc0xpdmVcIlxuICAgICAgICAgICAgW2lzRGVidWddPVwiaXNEZWJ1Z1wiXG4gICAgICAgICAgICBbcGFyZW50U2tpcHBlZF09XCJzZWxmRGVidWdEaXNhYmxlZFwiXG4gICAgICAgICAgICBbZGVidWdQb2ludFNldF09XCJnZXREZWJ1Z1BvaW50U2V0SGFuZGxlciA/IGdldERlYnVnUG9pbnRTZXRIYW5kbGVyKHN0ZXApIDogZGVidWdQb2ludFNldFwiXG4gICAgICAgICAgICBbZ2V0RGVidWdQb2ludFNldEhhbmRsZXJdPVwiZ2V0RGVidWdQb2ludFNldEhhbmRsZXJcIlxuICAgICAgICAgICAgW29uRGVidWdQb2ludENoYW5nZUhhbmRsZXJdPVwib25EZWJ1Z1BvaW50Q2hhbmdlSGFuZGxlclwiXG4gICAgICAgICAgICBbb25FZGl0U3RlcEhhbmRsZXJdPVwib25FZGl0U3RlcEhhbmRsZXJcIlxuICAgICAgICAgICAgW2FkZFN0ZXBNZW51T3B0aW9uc109XCJnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQgPyBnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWQoc3RlcCkgOiBhZGRTdGVwTWVudU9wdGlvbnNcIlxuICAgICAgICAgICAgW29uQWRkU3RlcE9wdGlvblNlbGVjdEhhbmRsZXJdPVwib25BZGRTdGVwT3B0aW9uU2VsZWN0SGFuZGxlclwiXG4gICAgICAgICAgICBbc3RlcE1vcmVNZW51T3B0aW9uc109XCJnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkID8gZ2V0U3RlcE1vcmVNZW51T3B0aW9uc0Zvck5lc3RlZChzdGVwKSA6IHN0ZXBNb3JlTWVudU9wdGlvbnNcIlxuICAgICAgICAgICAgW29uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyXT1cIm9uU3RlcE1vcmVPcHRpb25TZWxlY3RIYW5kbGVyXCJcbiAgICAgICAgICAgIFtnZXRBZGRTdGVwTWVudU9wdGlvbnNGb3JOZXN0ZWRdPVwiZ2V0QWRkU3RlcE1lbnVPcHRpb25zRm9yTmVzdGVkXCJcbiAgICAgICAgICAgIFtnZXRTdGVwTW9yZU1lbnVPcHRpb25zRm9yTmVzdGVkXT1cImdldFN0ZXBNb3JlTWVudU9wdGlvbnNGb3JOZXN0ZWRcIlxuICAgICAgICAgICAgICAoYWRkU3RlcEluc2lkZUxvb3ApPVwiYWRkU3RlcEluc2lkZUxvb3AuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNvbXBvbmVudFJlYWR5KT1cIm1hcmtTdGVwTG9hZGVkKHN0ZXApXCI+XG4gICAgICAgICAgICA8L2NxYS1zdGVwLXJlbmRlcmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSArIEFkZCBzdGVwIGluc2lkZSBsb29wIChkZWJ1ZyBvbmx5KSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNEZWJ1Z1wiIGNsYXNzPVwiY3FhLW1sLTkgY3FhLXB5LTIgY3FhLXBsLVsxOHB4XVwiIHN0eWxlPVwiYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQzVDN0ZBO1wiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQWRkU3RlcEluc2lkZUxvb3AoJGV2ZW50KVwiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMTVweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLTAgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBmb2N1czpjcWEtb3V0bGluZS1ub25lXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNyAyVjEyTTIgN0gxMlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3Bhbj5BZGQgc3RlcCBpbnNpZGUgbG9vcDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBWaWV3IEFsbCBJdGVyYXRpb25zIExpbmsgLS0+XG4gICAgPGRpdiAqbmdJZj1cImNvbmZpZy5zaG93Vmlld0FsbEl0ZXJhdGlvbnMgJiYgIWlzTGl2ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWp1c3RpZnktZW5kIGNxYS1weC0zIGNxYS1weS1bMTBweF1cIj5cbiAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uVmlld0FsbEl0ZXJhdGlvbnNDbGljaygkZXZlbnQpXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1uby11bmRlcmxpbmUgY3FhLXRleHQtcHJpbWFyeSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiPlxuICAgICAgICBWaWV3IGFsbCBpdGVyYXRpb25zXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNy42MzYzNiAxMS4yNjdMNi43NTg1MiAxMC4zOTc3TDkuMzg3NzggNy43Njg0N0gzVjYuNDk4NThIOS4zODc3OEw2Ljc1ODUyIDMuODczNThMNy42MzYzNiAzTDExLjc2OTkgNy4xMzM1Mkw3LjYzNjM2IDExLjI2N1pcIiBmaWxsPVwiIzNGNDNFRVwiLz48L3N2Zz5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWxmIEhlYWwgQW5hbHlzaXMgLS0+XG4gICAgPGNxYS1zZWxmLWhlYWwtYW5hbHlzaXMgXG4gICAgICAqbmdJZj1cInNlbGZIZWFsQW5hbHlzaXNcIlxuICAgICAgW2lkXT1cInN0ZXA/LnRlc3RTdGVwSWRcIlxuICAgICAgW29yaWdpbmFsTG9jYXRvcl09XCJzZWxmSGVhbEFuYWx5c2lzLm9yaWdpbmFsTG9jYXRvclwiXG4gICAgICBbaGVhbGVkTG9jYXRvcl09XCJzZWxmSGVhbEFuYWx5c2lzLmhlYWxlZExvY2F0b3JcIlxuICAgICAgW2NvbmZpZGVuY2VdPVwic2VsZkhlYWxBbmFseXNpcy5jb25maWRlbmNlXCJcbiAgICAgIFtoZWFsTWV0aG9kXT1cInNlbGZIZWFsQW5hbHlzaXMuaGVhbE1ldGhvZFwiXG4gICAgICBbaXNMb2FkaW5nQWNjZXB0XT1cImdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPyBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKCkuaXNMb2FkaW5nQWNjZXB0Py5bc3RlcD8udGVzdFN0ZXBJZF0gOiBmYWxzZVwiXG4gICAgICBbaXNMb2FkaW5nTW9kaWZ5QWNjZXB0XT1cImdldFNlbGZIZWFsTG9hZGluZ1N0YXRlc0hhbmRsZXIgPyBnZXRTZWxmSGVhbExvYWRpbmdTdGF0ZXNIYW5kbGVyKCkuaXNMb2FkaW5nTW9kaWZ5QWNjZXB0Py5bc3RlcD8udGVzdFN0ZXBJZF0gOiBmYWxzZVwiXG4gICAgICAoYWN0aW9uKT1cIm9uU2VsZkhlYWxBY3Rpb24oJGV2ZW50KVwiPlxuICAgIDwvY3FhLXNlbGYtaGVhbC1hbmFseXNpcz5cblxuICAgIDwhLS0gVGltaW5nIEJyZWFrZG93biAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnRpbWluZ0JyZWFrZG93blwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1lbmQgY3FhLWdhcC01IGNxYS1wdC0xLjUgY3FhLXB4LTQgY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxNXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM5Q0EzQUZdXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdj48c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgMTFDOC43NjE0MiAxMSAxMSA4Ljc2MTQyIDExIDZDMTEgMy4yMzg1OCA4Ljc2MTQyIDEgNiAxQzMuMjM4NTggMSAxIDMuMjM4NTggMSA2QzEgOC43NjE0MiAzLjIzODU4IDExIDYgMTFaXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTYgM1Y2TDggN1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+PC9kaXY+XG4gICAgICAgIDxzcGFuPlRpbWluZyBicmVha2Rvd248L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZGlhbG9nLW11dGVkIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgQXBwIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS03MDBcIj57eyBmb3JtYXREdXJhdGlvbihjb25maWcudGltaW5nQnJlYWtkb3duLmFwcCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2Pjxzdmcgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEgMTFcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTS0zLjgxNDdlLTA2IDEwLjMyVi03LjE1MjU2ZS0wN0gwLjk1OTk5NlYxMC4zMkgtMy44MTQ3ZS0wNlpcIiBmaWxsPVwiI0U1RTdFQlwiLz48L3N2Zz48L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICBUb29sIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtZ3JheS03MDBcIj57eyBmb3JtYXREdXJhdGlvbihjb25maWcudGltaW5nQnJlYWtkb3duLnRvb2wpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBWaWV3IE1vcmUgRmFpbGVkIFN0ZXAgQnV0dG9uIC0gc2hvd24gd2hlbiBleHBhbmRlZCBhbmQgZmFpbHVyZSBkZXRhaWxzIGV4aXN0IC0tPlxuICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZXdNb3JlQnV0dG9uXCIgY2xhc3M9XCJjcWEtbXQtMiBjcWEtcHgtNFwiPlxuICAgIDxjcWEtdmlldy1tb3JlLWZhaWxlZC1zdGVwLWJ1dHRvblxuICAgICAgW3RpbWluZ0JyZWFrZG93bl09XCJ0aW1pbmdCcmVha2Rvd25cIlxuICAgICAgW3N1YlN0ZXBzXT1cImdldFN1YlN0ZXBzRm9yRmFpbGVkU3RlcCgpXCJcbiAgICAgIFtmYWlsdXJlRGV0YWlsc109XCJmYWlsdXJlRGV0YWlsc1wiXG4gICAgICBbaXNFeHBhbmRlZF09XCJzaG93RmFpbGVkU3RlcERldGFpbHNcIlxuICAgICAgKHZpZXdNb3JlQ2xpY2spPVwib25WaWV3TW9yZUZhaWxlZFN0ZXBDbGljaygkZXZlbnQpXCI+XG4gICAgPC9jcWEtdmlldy1tb3JlLWZhaWxlZC1zdGVwLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBVcGRhdGVkIEZhaWxlZCBTdGVwIENvbXBvbmVudCAtIHNob3duIHdoZW4gYnV0dG9uIGlzIGNsaWNrZWQgLS0+XG4gIDxkaXYgKm5nSWY9XCJzaG93Vmlld01vcmVCdXR0b24gJiZzaG93RmFpbGVkU3RlcERldGFpbHMgJiYgZmFpbHVyZURldGFpbHNcIiBjbGFzcz1cImNxYS1tdC0yIGNxYS1weC00XCI+XG4gICAgPGNxYS11cGRhdGVkLWZhaWxlZC1zdGVwXG4gICAgICBbdGVzdFN0ZXBSZXN1bHRJZF09XCJ0ZXN0U3RlcFJlc3VsdElkXCJcbiAgICAgIFt0aW1pbmdCcmVha2Rvd25dPVwidGltaW5nQnJlYWtkb3duXCJcbiAgICAgIFtleHBhbmRlZF09XCJ0cnVlXCJcbiAgICAgIFtzdWJTdGVwc109XCJnZXRTdWJTdGVwc0ZvckZhaWxlZFN0ZXAoKVwiXG4gICAgICBbZmFpbHVyZURldGFpbHNdPVwiZmFpbHVyZURldGFpbHNcIlxuICAgICAgW3JlYXNvbmluZ109XCJyZWFzb25pbmdcIlxuICAgICAgW2NvbmZpZGVuY2VdPVwiY29uZmlkZW5jZVwiXG4gICAgICBbaXNVcGxvYWRpbmdCYXNlbGluZV09XCJpc1VwbG9hZGluZ0Jhc2VsaW5lXCJcbiAgICAgIFtpc01ha2luZ0N1cnJlbnRCYXNlbGluZV09XCJpc01ha2luZ0N1cnJlbnRCYXNlbGluZVwiXG4gICAgICBbaXNMaXZlXT1cImlzTGl2ZVwiXG4gICAgICAobWFrZUN1cnJlbnRCYXNlbGluZSk9XCJvbk1ha2VDdXJyZW50QmFzZWxpbmUoJGV2ZW50KVwiXG4gICAgICAodXBsb2FkQmFzZWxpbmUpPVwib25VcGxvYWRCYXNlbGluZSgkZXZlbnQpXCJcbiAgICAgIChhbmFseXplKT1cIm9uQW5hbHl6ZSgpXCJcbiAgICAgICh2aWV3RnVsbExvZ3MpPVwib25WaWV3RnVsbExvZ3MoKVwiPlxuICAgIDwvY3FhLXVwZGF0ZWQtZmFpbGVkLXN0ZXA+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|