@cqa-lib/cqa-ui 1.1.477 → 1.1.479

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.
@@ -17,6 +17,8 @@ export class ErrorModalComponent {
17
17
  this.buttons = [];
18
18
  /** When true, shows a loading badge instead of buttons (e.g. while waiting for async completion) */
19
19
  this.showLoading = false;
20
+ /** Label shown inside the loading badge. Override per context (e.g. "Restoring Session.." vs "Updating Steps.."). */
21
+ this.loadingBadgeLabel = 'Updating Steps..';
20
22
  this.buttonClick = new EventEmitter();
21
23
  this.closeModal = new EventEmitter();
22
24
  }
@@ -52,10 +54,10 @@ export class ErrorModalComponent {
52
54
  }
53
55
  }
54
56
  ErrorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
- ErrorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ErrorModalComponent, selector: "cqa-error-modal", inputs: { isOpen: "isOpen", status: "status", title: "title", instructionalMessage: "instructionalMessage", errorMessage: "errorMessage", totalSteps: "totalSteps", completedSteps: "completedSteps", totalTime: "totalTime", appTime: "appTime", toolTime: "toolTime", buttons: "buttons", showLoading: "showLoading", loadingBadgeInlineStyles: "loadingBadgeInlineStyles" }, outputs: { buttonClick: "buttonClick", closeModal: "closeModal" }, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[85vh] cqa-overflow-y-auto\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <div *ngIf=\"status === 'error'\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#F15F5F\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#FCD9D9\" stroke-width=\"8\"/>\n <path d=\"M32.3815 62.4437H60.619C63.5065 62.4437 65.3065 59.3125 63.8627 56.8188L49.744 32.425C48.3002 29.9313 44.7002 29.9313 43.2565 32.425L29.1377 56.8188C27.694 59.3125 29.494 62.4437 32.3815 62.4437ZM46.5002 49.3188C45.469 49.3188 44.6252 48.475 44.6252 47.4438V43.6938C44.6252 42.6625 45.469 41.8188 46.5002 41.8188C47.5315 41.8188 48.3752 42.6625 48.3752 43.6938V47.4438C48.3752 48.475 47.5315 49.3188 46.5002 49.3188ZM48.3752 56.8188H44.6252V53.0688H48.3752V56.8188Z\" fill=\"white\"/>\n </svg>\n </div>\n <div *ngIf=\"status === 'success'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#AEE9D4\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#CFF2E5\" stroke-width=\"8\"/>\n <path d=\"M75.25 43.8549V46.4999C75.2465 52.6996 73.2389 58.732 69.5268 63.6976C65.8147 68.6632 60.5969 72.2957 54.6517 74.0536C48.7064 75.8114 42.3521 75.6003 36.5366 73.4518C30.7211 71.3033 25.7559 67.3324 22.3815 62.1314C19.0071 56.9305 17.4044 50.778 17.8123 44.5918C18.2202 38.4055 20.617 32.5168 24.6451 27.8039C28.6731 23.0911 34.1168 19.8066 40.164 18.4403C46.2113 17.074 52.5383 17.6991 58.2013 20.2224M75.25 23.4999L46.5 52.2786L37.875 43.6536\" stroke=\"#0DBD7D\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n \n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ title }}\n </h2>\n\n <!-- Instructional Message -->\n <p *ngIf=\"instructionalMessage\" class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mt-2 cqa-text-center\">\n {{ instructionalMessage }}\n </p>\n </div>\n\n <!-- <div *ngIf=\"hasTimingData\" class=\"cqa-rounded-lg cqa-border cqa-p-[17px] cqa-my-4\" [ngClass]=\"stepsBackgroundClass\"\n style=\"border: 1px solid;\" [style.border-color]=\"stepsBorderClass\">\n <div\n class=\"cqa-grid sm:cqa-flex sm:cqa-justify-between sm:cqa-items-center cqa-grid-cols-2 sm:cqa-grid-cols-4 cqa-gap-4 sm:cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalSteps\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Steps</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ completedSteps }} / {{ totalSteps }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ totalTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"appTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">App Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ appTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"toolTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Tool Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ toolTime }}\n </span>\n </div>\n </div>\n </div> -->\n\n <!-- Error Message Section -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-2 cqa-font-medium\">\n {{ status === 'success' ? 'Details' : 'Error Message' }}\n </div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-semibold cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n <!-- Buttons (or loading badge when showLoading) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <cqa-badge\n *ngIf=\"showLoading\"\n label=\"Updating Steps..\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\"\n [inlineStyles]=\"loadingBadgeInlineStyles\">\n </cqa-badge>\n <ng-container *ngIf=\"!showLoading\">\n <cqa-button\n *ngFor=\"let button of buttons; let i = index\"\n [variant]=\"button.variant\"\n [text]=\"button.label\"\n [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\"\n [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n [disabled]=\"button.disabled ?? false\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", 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", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
57
+ ErrorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ErrorModalComponent, selector: "cqa-error-modal", inputs: { isOpen: "isOpen", status: "status", title: "title", instructionalMessage: "instructionalMessage", errorMessage: "errorMessage", totalSteps: "totalSteps", completedSteps: "completedSteps", totalTime: "totalTime", appTime: "appTime", toolTime: "toolTime", buttons: "buttons", showLoading: "showLoading", loadingBadgeInlineStyles: "loadingBadgeInlineStyles", loadingBadgeLabel: "loadingBadgeLabel" }, outputs: { buttonClick: "buttonClick", closeModal: "closeModal" }, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[85vh] cqa-overflow-y-auto\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <div *ngIf=\"status === 'error'\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#F15F5F\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#FCD9D9\" stroke-width=\"8\"/>\n <path d=\"M32.3815 62.4437H60.619C63.5065 62.4437 65.3065 59.3125 63.8627 56.8188L49.744 32.425C48.3002 29.9313 44.7002 29.9313 43.2565 32.425L29.1377 56.8188C27.694 59.3125 29.494 62.4437 32.3815 62.4437ZM46.5002 49.3188C45.469 49.3188 44.6252 48.475 44.6252 47.4438V43.6938C44.6252 42.6625 45.469 41.8188 46.5002 41.8188C47.5315 41.8188 48.3752 42.6625 48.3752 43.6938V47.4438C48.3752 48.475 47.5315 49.3188 46.5002 49.3188ZM48.3752 56.8188H44.6252V53.0688H48.3752V56.8188Z\" fill=\"white\"/>\n </svg>\n </div>\n <div *ngIf=\"status === 'success'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#AEE9D4\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#CFF2E5\" stroke-width=\"8\"/>\n <path d=\"M75.25 43.8549V46.4999C75.2465 52.6996 73.2389 58.732 69.5268 63.6976C65.8147 68.6632 60.5969 72.2957 54.6517 74.0536C48.7064 75.8114 42.3521 75.6003 36.5366 73.4518C30.7211 71.3033 25.7559 67.3324 22.3815 62.1314C19.0071 56.9305 17.4044 50.778 17.8123 44.5918C18.2202 38.4055 20.617 32.5168 24.6451 27.8039C28.6731 23.0911 34.1168 19.8066 40.164 18.4403C46.2113 17.074 52.5383 17.6991 58.2013 20.2224M75.25 23.4999L46.5 52.2786L37.875 43.6536\" stroke=\"#0DBD7D\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n \n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ title }}\n </h2>\n\n <!-- Instructional Message -->\n <p *ngIf=\"instructionalMessage\" class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mt-2 cqa-text-center\">\n {{ instructionalMessage }}\n </p>\n </div>\n\n <!-- <div *ngIf=\"hasTimingData\" class=\"cqa-rounded-lg cqa-border cqa-p-[17px] cqa-my-4\" [ngClass]=\"stepsBackgroundClass\"\n style=\"border: 1px solid;\" [style.border-color]=\"stepsBorderClass\">\n <div\n class=\"cqa-grid sm:cqa-flex sm:cqa-justify-between sm:cqa-items-center cqa-grid-cols-2 sm:cqa-grid-cols-4 cqa-gap-4 sm:cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalSteps\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Steps</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ completedSteps }} / {{ totalSteps }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ totalTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"appTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">App Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ appTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"toolTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Tool Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ toolTime }}\n </span>\n </div>\n </div>\n </div> -->\n\n <!-- Error Message Section -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-2 cqa-font-medium\">\n {{ status === 'success' ? 'Details' : 'Error Message' }}\n </div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-semibold cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n\n <!-- Buttons (or loading badge when showLoading) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <cqa-badge\n *ngIf=\"showLoading\"\n [label]=\"loadingBadgeLabel\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\"\n [inlineStyles]=\"loadingBadgeInlineStyles\">\n </cqa-badge>\n <ng-container *ngIf=\"!showLoading\">\n <cqa-button\n *ngFor=\"let button of buttons; let i = index\"\n [variant]=\"button.variant\"\n [text]=\"button.label\"\n [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\"\n [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n [disabled]=\"button.disabled ?? false\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", 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", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
56
58
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ErrorModalComponent, decorators: [{
57
59
  type: Component,
58
- args: [{ selector: 'cqa-error-modal', template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[85vh] cqa-overflow-y-auto\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <div *ngIf=\"status === 'error'\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#F15F5F\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#FCD9D9\" stroke-width=\"8\"/>\n <path d=\"M32.3815 62.4437H60.619C63.5065 62.4437 65.3065 59.3125 63.8627 56.8188L49.744 32.425C48.3002 29.9313 44.7002 29.9313 43.2565 32.425L29.1377 56.8188C27.694 59.3125 29.494 62.4437 32.3815 62.4437ZM46.5002 49.3188C45.469 49.3188 44.6252 48.475 44.6252 47.4438V43.6938C44.6252 42.6625 45.469 41.8188 46.5002 41.8188C47.5315 41.8188 48.3752 42.6625 48.3752 43.6938V47.4438C48.3752 48.475 47.5315 49.3188 46.5002 49.3188ZM48.3752 56.8188H44.6252V53.0688H48.3752V56.8188Z\" fill=\"white\"/>\n </svg>\n </div>\n <div *ngIf=\"status === 'success'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#AEE9D4\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#CFF2E5\" stroke-width=\"8\"/>\n <path d=\"M75.25 43.8549V46.4999C75.2465 52.6996 73.2389 58.732 69.5268 63.6976C65.8147 68.6632 60.5969 72.2957 54.6517 74.0536C48.7064 75.8114 42.3521 75.6003 36.5366 73.4518C30.7211 71.3033 25.7559 67.3324 22.3815 62.1314C19.0071 56.9305 17.4044 50.778 17.8123 44.5918C18.2202 38.4055 20.617 32.5168 24.6451 27.8039C28.6731 23.0911 34.1168 19.8066 40.164 18.4403C46.2113 17.074 52.5383 17.6991 58.2013 20.2224M75.25 23.4999L46.5 52.2786L37.875 43.6536\" stroke=\"#0DBD7D\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n \n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ title }}\n </h2>\n\n <!-- Instructional Message -->\n <p *ngIf=\"instructionalMessage\" class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mt-2 cqa-text-center\">\n {{ instructionalMessage }}\n </p>\n </div>\n\n <!-- <div *ngIf=\"hasTimingData\" class=\"cqa-rounded-lg cqa-border cqa-p-[17px] cqa-my-4\" [ngClass]=\"stepsBackgroundClass\"\n style=\"border: 1px solid;\" [style.border-color]=\"stepsBorderClass\">\n <div\n class=\"cqa-grid sm:cqa-flex sm:cqa-justify-between sm:cqa-items-center cqa-grid-cols-2 sm:cqa-grid-cols-4 cqa-gap-4 sm:cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalSteps\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Steps</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ completedSteps }} / {{ totalSteps }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ totalTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"appTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">App Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ appTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"toolTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Tool Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ toolTime }}\n </span>\n </div>\n </div>\n </div> -->\n\n <!-- Error Message Section -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-2 cqa-font-medium\">\n {{ status === 'success' ? 'Details' : 'Error Message' }}\n </div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-semibold cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n <!-- Buttons (or loading badge when showLoading) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <cqa-badge\n *ngIf=\"showLoading\"\n label=\"Updating Steps..\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\"\n [inlineStyles]=\"loadingBadgeInlineStyles\">\n </cqa-badge>\n <ng-container *ngIf=\"!showLoading\">\n <cqa-button\n *ngFor=\"let button of buttons; let i = index\"\n [variant]=\"button.variant\"\n [text]=\"button.label\"\n [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\"\n [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n [disabled]=\"button.disabled ?? false\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", styles: [] }]
60
+ args: [{ selector: 'cqa-error-modal', template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[85vh] cqa-overflow-y-auto\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <div *ngIf=\"status === 'error'\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#F15F5F\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#FCD9D9\" stroke-width=\"8\"/>\n <path d=\"M32.3815 62.4437H60.619C63.5065 62.4437 65.3065 59.3125 63.8627 56.8188L49.744 32.425C48.3002 29.9313 44.7002 29.9313 43.2565 32.425L29.1377 56.8188C27.694 59.3125 29.494 62.4437 32.3815 62.4437ZM46.5002 49.3188C45.469 49.3188 44.6252 48.475 44.6252 47.4438V43.6938C44.6252 42.6625 45.469 41.8188 46.5002 41.8188C47.5315 41.8188 48.3752 42.6625 48.3752 43.6938V47.4438C48.3752 48.475 47.5315 49.3188 46.5002 49.3188ZM48.3752 56.8188H44.6252V53.0688H48.3752V56.8188Z\" fill=\"white\"/>\n </svg>\n </div>\n <div *ngIf=\"status === 'success'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#AEE9D4\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#CFF2E5\" stroke-width=\"8\"/>\n <path d=\"M75.25 43.8549V46.4999C75.2465 52.6996 73.2389 58.732 69.5268 63.6976C65.8147 68.6632 60.5969 72.2957 54.6517 74.0536C48.7064 75.8114 42.3521 75.6003 36.5366 73.4518C30.7211 71.3033 25.7559 67.3324 22.3815 62.1314C19.0071 56.9305 17.4044 50.778 17.8123 44.5918C18.2202 38.4055 20.617 32.5168 24.6451 27.8039C28.6731 23.0911 34.1168 19.8066 40.164 18.4403C46.2113 17.074 52.5383 17.6991 58.2013 20.2224M75.25 23.4999L46.5 52.2786L37.875 43.6536\" stroke=\"#0DBD7D\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n \n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ title }}\n </h2>\n\n <!-- Instructional Message -->\n <p *ngIf=\"instructionalMessage\" class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mt-2 cqa-text-center\">\n {{ instructionalMessage }}\n </p>\n </div>\n\n <!-- <div *ngIf=\"hasTimingData\" class=\"cqa-rounded-lg cqa-border cqa-p-[17px] cqa-my-4\" [ngClass]=\"stepsBackgroundClass\"\n style=\"border: 1px solid;\" [style.border-color]=\"stepsBorderClass\">\n <div\n class=\"cqa-grid sm:cqa-flex sm:cqa-justify-between sm:cqa-items-center cqa-grid-cols-2 sm:cqa-grid-cols-4 cqa-gap-4 sm:cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalSteps\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Steps</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ completedSteps }} / {{ totalSteps }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ totalTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"appTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">App Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ appTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"toolTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Tool Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ toolTime }}\n </span>\n </div>\n </div>\n </div> -->\n\n <!-- Error Message Section -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-2 cqa-font-medium\">\n {{ status === 'success' ? 'Details' : 'Error Message' }}\n </div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-semibold cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n\n <!-- Buttons (or loading badge when showLoading) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <cqa-badge\n *ngIf=\"showLoading\"\n [label]=\"loadingBadgeLabel\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\"\n [inlineStyles]=\"loadingBadgeInlineStyles\">\n </cqa-badge>\n <ng-container *ngIf=\"!showLoading\">\n <cqa-button\n *ngFor=\"let button of buttons; let i = index\"\n [variant]=\"button.variant\"\n [text]=\"button.label\"\n [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\"\n [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n [disabled]=\"button.disabled ?? false\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", styles: [] }]
59
61
  }], propDecorators: { isOpen: [{
60
62
  type: Input
61
63
  }], status: [{
@@ -82,9 +84,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
82
84
  type: Input
83
85
  }], loadingBadgeInlineStyles: [{
84
86
  type: Input
87
+ }], loadingBadgeLabel: [{
88
+ type: Input
85
89
  }], buttonClick: [{
86
90
  type: Output
87
91
  }], closeModal: [{
88
92
  type: Output
89
93
  }] } });
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lcnJvci1tb2RhbC9lcnJvci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Vycm9yLW1vZGFsL2Vycm9yLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBbUJ2RSxNQUFNLE9BQU8sbUJBQW1CO0lBTGhDO1FBTVcsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixXQUFNLEdBQXdCLE9BQU8sQ0FBQztRQUN0QyxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRXhCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUF1QixFQUFFLENBQUM7UUFDMUMsb0dBQW9HO1FBQzNGLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBSTVCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQXVDakQ7SUFyQ0MsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUE0QixDQUFDO1FBRXpELElBQUksTUFBTSxLQUFLLGFBQWEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzNFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsTUFBd0I7UUFDcEMsSUFBSSxNQUFNLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7O2dIQXhEVSxtQkFBbUI7b0dBQW5CLG1CQUFtQiwwZUNuQmhDLHV4TEEwR007MkZEdkZPLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OEJBS2xCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1vZGFsQnV0dG9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFyaWFudDogQnV0dG9uVmFyaWFudDtcbiAgaWNvbj86IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIGJ0blNpemU/OiAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIGZ1bGxXaWR0aD86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgZG9lcyBub3QgZW1pdCBjbGljayAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1lcnJvci1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lcnJvci1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRXJyb3JNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdGF0dXM6ICdlcnJvcicgfCAnc3VjY2VzcycgPSAnZXJyb3InO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0Vycm9yJztcbiAgQElucHV0KCkgaW5zdHJ1Y3Rpb25hbE1lc3NhZ2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRvdGFsU3RlcHM6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGNvbXBsZXRlZFN0ZXBzOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSB0b3RhbFRpbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBhcHBUaW1lOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdG9vbFRpbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBidXR0b25zOiBFcnJvck1vZGFsQnV0dG9uW10gPSBbXTtcbiAgLyoqIFdoZW4gdHJ1ZSwgc2hvd3MgYSBsb2FkaW5nIGJhZGdlIGluc3RlYWQgb2YgYnV0dG9ucyAoZS5nLiB3aGlsZSB3YWl0aW5nIGZvciBhc3luYyBjb21wbGV0aW9uKSAqL1xuICBASW5wdXQoKSBzaG93TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogSW5saW5lIHN0eWxlcyBmb3IgdGhlIGxvYWRpbmcgYmFkZ2UgKGUuZy4gbWluLWhlaWdodCB0byBtYXRjaCBidXR0b24pLiBQYXNzIGZyb20gcGFyZW50IGZvciByZXVzYWJpbGl0eS4gKi9cbiAgQElucHV0KCkgbG9hZGluZ0JhZGdlSW5saW5lU3R5bGVzPzogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgXG4gICAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdldCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbC1iYWNrZHJvcCcpKSB7XG4gICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogRXJyb3JNb2RhbEJ1dHRvbik6IHZvaWQge1xuICAgIGlmIChidXR0b24uZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoYnV0dG9uLmFjdGlvbik7XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNb2RhbC5lbWl0KCk7XG4gIH1cblxuICBnZXQgc3RlcHNCYWNrZ3JvdW5kQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2NxYS1iZy1bI0VFM0YzRjFBXSc7XG4gIH1cblxuICBnZXQgc3RlcHNCb3JkZXJDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnI0ZFQ0FDQSc7XG4gIH1cblxuICBnZXQgaGFzVGltaW5nRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy50b3RhbFN0ZXBzIHx8IHRoaXMudG90YWxUaW1lIHx8IHRoaXMuYXBwVGltZSB8fCB0aGlzLnRvb2xUaW1lKTtcbiAgfVxuXG4gIGdldE5vblRleHRCdXR0b25zKCk6IEVycm9yTW9kYWxCdXR0b25bXSB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9ucy5maWx0ZXIoYnV0dG9uID0+IGJ1dHRvbi52YXJpYW50ICE9PSAndGV4dCcpO1xuICB9XG5cbiAgZ2V0VGV4dEJ1dHRvbnMoKTogRXJyb3JNb2RhbEJ1dHRvbltdIHtcbiAgICByZXR1cm4gdGhpcy5idXR0b25zLmZpbHRlcihidXR0b24gPT4gYnV0dG9uLnZhcmlhbnQgPT09ICd0ZXh0Jyk7XG4gIH1cbn1cblxuIiwiPGRpdiAqbmdJZj1cImlzT3BlblwiXG4gIGNsYXNzPVwibW9kYWwtYmFja2Ryb3AgY3FhLWZpeGVkIGNxYS1pbnNldC0wIGNxYS1iZy1ibGFjayBjcWEtYmctb3BhY2l0eS01MCBjcWEtei1bOTk5OV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiXG4gIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy14bCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1tYXgtaC1bODV2aF0gY3FhLW92ZXJmbG93LXktYXV0b1wiXG4gICAgc3R5bGU9XCJib3gtc2hhZG93OiAwcHggOHB4IDhweCAtNHB4ICMxMDE4MjgwODtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzdGF0dXMgPT09ICdlcnJvcidcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjkzXCIgaGVpZ2h0PVwiOTNcIiB2aWV3Qm94PVwiMCAwIDkzIDkzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiODVcIiBoZWlnaHQ9XCI4NVwiIHJ4PVwiNDIuNVwiIGZpbGw9XCIjRjE1RjVGXCIvPlxuICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjg1XCIgaGVpZ2h0PVwiODVcIiByeD1cIjQyLjVcIiBzdHJva2U9XCIjRkNEOUQ5XCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMyLjM4MTUgNjIuNDQzN0g2MC42MTlDNjMuNTA2NSA2Mi40NDM3IDY1LjMwNjUgNTkuMzEyNSA2My44NjI3IDU2LjgxODhMNDkuNzQ0IDMyLjQyNUM0OC4zMDAyIDI5LjkzMTMgNDQuNzAwMiAyOS45MzEzIDQzLjI1NjUgMzIuNDI1TDI5LjEzNzcgNTYuODE4OEMyNy42OTQgNTkuMzEyNSAyOS40OTQgNjIuNDQzNyAzMi4zODE1IDYyLjQ0MzdaTTQ2LjUwMDIgNDkuMzE4OEM0NS40NjkgNDkuMzE4OCA0NC42MjUyIDQ4LjQ3NSA0NC42MjUyIDQ3LjQ0MzhWNDMuNjkzOEM0NC42MjUyIDQyLjY2MjUgNDUuNDY5IDQxLjgxODggNDYuNTAwMiA0MS44MTg4QzQ3LjUzMTUgNDEuODE4OCA0OC4zNzUyIDQyLjY2MjUgNDguMzc1MiA0My42OTM4VjQ3LjQ0MzhDNDguMzc1MiA0OC40NzUgNDcuNTMxNSA0OS4zMTg4IDQ2LjUwMDIgNDkuMzE4OFpNNDguMzc1MiA1Ni44MTg4SDQ0LjYyNTJWNTMuMDY4OEg0OC4zNzUyVjU2LjgxODhaXCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic3RhdHVzID09PSAnc3VjY2VzcydcIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI5M1wiIGhlaWdodD1cIjkzXCIgdmlld0JveD1cIjAgMCA5MyA5M1wiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiODVcIiBoZWlnaHQ9XCI4NVwiIHJ4PVwiNDIuNVwiIGZpbGw9XCIjQUVFOUQ0XCIvPlxuICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjg1XCIgaGVpZ2h0PVwiODVcIiByeD1cIjQyLjVcIiBzdHJva2U9XCIjQ0ZGMkU1XCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTc1LjI1IDQzLjg1NDlWNDYuNDk5OUM3NS4yNDY1IDUyLjY5OTYgNzMuMjM4OSA1OC43MzIgNjkuNTI2OCA2My42OTc2QzY1LjgxNDcgNjguNjYzMiA2MC41OTY5IDcyLjI5NTcgNTQuNjUxNyA3NC4wNTM2QzQ4LjcwNjQgNzUuODExNCA0Mi4zNTIxIDc1LjYwMDMgMzYuNTM2NiA3My40NTE4QzMwLjcyMTEgNzEuMzAzMyAyNS43NTU5IDY3LjMzMjQgMjIuMzgxNSA2Mi4xMzE0QzE5LjAwNzEgNTYuOTMwNSAxNy40MDQ0IDUwLjc3OCAxNy44MTIzIDQ0LjU5MThDMTguMjIwMiAzOC40MDU1IDIwLjYxNyAzMi41MTY4IDI0LjY0NTEgMjcuODAzOUMyOC42NzMxIDIzLjA5MTEgMzQuMTE2OCAxOS44MDY2IDQwLjE2NCAxOC40NDAzQzQ2LjIxMTMgMTcuMDc0IDUyLjUzODMgMTcuNjk5MSA1OC4yMDEzIDIwLjIyMjRNNzUuMjUgMjMuNDk5OUw0Ni41IDUyLjI3ODZMMzcuODc1IDQzLjY1MzZcIiBzdHJva2U9XCIjMERCRDdEXCIgc3Ryb2tlLXdpZHRoPVwiNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiBcbiAgICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsyMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzBCMEIwQ10gY3FhLW10LVsyMHB4XSBjcWEtbGVhZGluZy1bMjhweF1cIj5cbiAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgIDwvaDI+XG5cbiAgICAgIDwhLS0gSW5zdHJ1Y3Rpb25hbCBNZXNzYWdlIC0tPlxuICAgICAgPHAgKm5nSWY9XCJpbnN0cnVjdGlvbmFsTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tdC0yIGNxYS10ZXh0LWNlbnRlclwiPlxuICAgICAgICB7eyBpbnN0cnVjdGlvbmFsTWVzc2FnZSB9fVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaGFzVGltaW5nRGF0YVwiIGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtcC1bMTdweF0gY3FhLW15LTRcIiBbbmdDbGFzc109XCJzdGVwc0JhY2tncm91bmRDbGFzc1wiXG4gICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkO1wiIFtzdHlsZS5ib3JkZXItY29sb3JdPVwic3RlcHNCb3JkZXJDbGFzc1wiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNxYS1ncmlkIHNtOmNxYS1mbGV4IHNtOmNxYS1qdXN0aWZ5LWJldHdlZW4gc206Y3FhLWl0ZW1zLWNlbnRlciBjcWEtZ3JpZC1jb2xzLTIgc206Y3FhLWdyaWQtY29scy00IGNxYS1nYXAtNCBzbTpjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiICpuZ0lmPVwidG90YWxTdGVwc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG90YWwgU3RlcHM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgY29tcGxldGVkU3RlcHMgfX0gLyB7eyB0b3RhbFN0ZXBzIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b3RhbFRpbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtbWItMVwiPlRvdGFsIFRpbWU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgdG90YWxUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJhcHBUaW1lXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW1iLTFcIj5BcHAgVGltZTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMDE4MjhdXCI+XG4gICAgICAgICAgICB7eyBhcHBUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b29sVGltZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG9vbCBUaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzEwMTgyOF1cIj5cbiAgICAgICAgICAgIHt7IHRvb2xUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiAtLT5cblxuICAgIDwhLS0gRXJyb3IgTWVzc2FnZSBTZWN0aW9uIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cImNxYS1teS00IGNxYS1wLTQgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLXdoaXRlXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI0U1RTdFQjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLW1iLTIgY3FhLWZvbnQtbWVkaXVtXCI+XG4gICAgICAgIHt7IHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ0RldGFpbHMnIDogJ0Vycm9yIE1lc3NhZ2UnIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXdoaXRlc3BhY2Utbm9ybWFsIGNxYS1icmVhay1hbnl3aGVyZVwiXG4gICAgICAgIHN0eWxlPVwid29yZC1icmVhazogYnJlYWstd29yZDsgd2hpdGUtc3BhY2U6IHByZS1saW5lO1wiPlxuICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCdXR0b25zIChvciBsb2FkaW5nIGJhZGdlIHdoZW4gc2hvd0xvYWRpbmcpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMjBweF1cIj5cbiAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgKm5nSWY9XCJzaG93TG9hZGluZ1wiXG4gICAgICAgIGxhYmVsPVwiVXBkYXRpbmcgU3RlcHMuLlwiXG4gICAgICAgIGljb249XCJhdXRvcmVuZXdcIlxuICAgICAgICBbaXNMb2FkaW5nXT1cInRydWVcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbY2VudGVyQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgdmFyaWFudD1cImluZm9cIlxuICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgICAgW2lubGluZVN0eWxlc109XCJsb2FkaW5nQmFkZ2VJbmxpbmVTdHlsZXNcIj5cbiAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG93TG9hZGluZ1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYnV0dG9uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiYnV0dG9uLnZhcmlhbnRcIlxuICAgICAgICAgIFt0ZXh0XT1cImJ1dHRvbi5sYWJlbFwiXG4gICAgICAgICAgW2ljb25dPVwiYnV0dG9uLmljb25cIlxuICAgICAgICAgIFtidG5TaXplXT1cImJ1dHRvbi5idG5TaXplIHx8ICdsZydcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwiYnV0dG9uLmZ1bGxXaWR0aCAhPT0gdW5kZWZpbmVkID8gYnV0dG9uLmZ1bGxXaWR0aCA6IHRydWVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPz8gZmFsc2VcIlxuICAgICAgICAgIChjbGlja2VkKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lcnJvci1tb2RhbC9lcnJvci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Vycm9yLW1vZGFsL2Vycm9yLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBbUJ2RSxNQUFNLE9BQU8sbUJBQW1CO0lBTGhDO1FBTVcsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixXQUFNLEdBQXdCLE9BQU8sQ0FBQztRQUN0QyxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRXhCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUF1QixFQUFFLENBQUM7UUFDMUMsb0dBQW9HO1FBQzNGLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBR3RDLHFIQUFxSDtRQUM1RyxzQkFBaUIsR0FBVyxrQkFBa0IsQ0FBQztRQUU5QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDekMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0F1Q2pEO0lBckNDLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBNEIsQ0FBQztRQUV6RCxJQUFJLE1BQU0sS0FBSyxhQUFhLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUMzRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQXdCO1FBQ3BDLElBQUksTUFBTSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQztJQUNsRSxDQUFDOztnSEExRFUsbUJBQW1CO29HQUFuQixtQkFBbUIsa2hCQ25CaEMsNHhMQTJHTTsyRkR4Rk8sbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjs4QkFLbEIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1vZGFsQnV0dG9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFyaWFudDogQnV0dG9uVmFyaWFudDtcbiAgaWNvbj86IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIGJ0blNpemU/OiAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIGZ1bGxXaWR0aD86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgZG9lcyBub3QgZW1pdCBjbGljayAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1lcnJvci1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lcnJvci1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRXJyb3JNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdGF0dXM6ICdlcnJvcicgfCAnc3VjY2VzcycgPSAnZXJyb3InO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0Vycm9yJztcbiAgQElucHV0KCkgaW5zdHJ1Y3Rpb25hbE1lc3NhZ2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRvdGFsU3RlcHM6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGNvbXBsZXRlZFN0ZXBzOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSB0b3RhbFRpbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBhcHBUaW1lOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdG9vbFRpbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBidXR0b25zOiBFcnJvck1vZGFsQnV0dG9uW10gPSBbXTtcbiAgLyoqIFdoZW4gdHJ1ZSwgc2hvd3MgYSBsb2FkaW5nIGJhZGdlIGluc3RlYWQgb2YgYnV0dG9ucyAoZS5nLiB3aGlsZSB3YWl0aW5nIGZvciBhc3luYyBjb21wbGV0aW9uKSAqL1xuICBASW5wdXQoKSBzaG93TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogSW5saW5lIHN0eWxlcyBmb3IgdGhlIGxvYWRpbmcgYmFkZ2UgKGUuZy4gbWluLWhlaWdodCB0byBtYXRjaCBidXR0b24pLiBQYXNzIGZyb20gcGFyZW50IGZvciByZXVzYWJpbGl0eS4gKi9cbiAgQElucHV0KCkgbG9hZGluZ0JhZGdlSW5saW5lU3R5bGVzPzogc3RyaW5nO1xuICAvKiogTGFiZWwgc2hvd24gaW5zaWRlIHRoZSBsb2FkaW5nIGJhZGdlLiBPdmVycmlkZSBwZXIgY29udGV4dCAoZS5nLiBcIlJlc3RvcmluZyBTZXNzaW9uLi5cIiB2cyBcIlVwZGF0aW5nIFN0ZXBzLi5cIikuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdCYWRnZUxhYmVsOiBzdHJpbmcgPSAnVXBkYXRpbmcgU3RlcHMuLic7XG5cbiAgQE91dHB1dCgpIGJ1dHRvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZU1vZGFsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBcbiAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0IHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLWJhY2tkcm9wJykpIHtcbiAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQnV0dG9uQ2xpY2soYnV0dG9uOiBFcnJvck1vZGFsQnV0dG9uKTogdm9pZCB7XG4gICAgaWYgKGJ1dHRvbi5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdChidXR0b24uYWN0aW9uKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZU1vZGFsLmVtaXQoKTtcbiAgfVxuXG4gIGdldCBzdGVwc0JhY2tncm91bmRDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3FhLWJnLVsjRUUzRjNGMUFdJztcbiAgfVxuXG4gIGdldCBzdGVwc0JvcmRlckNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcjRkVDQUNBJztcbiAgfVxuXG4gIGdldCBoYXNUaW1pbmdEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnRvdGFsU3RlcHMgfHwgdGhpcy50b3RhbFRpbWUgfHwgdGhpcy5hcHBUaW1lIHx8IHRoaXMudG9vbFRpbWUpO1xuICB9XG5cbiAgZ2V0Tm9uVGV4dEJ1dHRvbnMoKTogRXJyb3JNb2RhbEJ1dHRvbltdIHtcbiAgICByZXR1cm4gdGhpcy5idXR0b25zLmZpbHRlcihidXR0b24gPT4gYnV0dG9uLnZhcmlhbnQgIT09ICd0ZXh0Jyk7XG4gIH1cblxuICBnZXRUZXh0QnV0dG9ucygpOiBFcnJvck1vZGFsQnV0dG9uW10ge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbnMuZmlsdGVyKGJ1dHRvbiA9PiBidXR0b24udmFyaWFudCA9PT0gJ3RleHQnKTtcbiAgfVxufVxuXG4iLCI8ZGl2ICpuZ0lmPVwiaXNPcGVuXCJcbiAgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcCBjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS16LVs5OTk5XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCJcbiAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1yb3VuZGVkLWxnIGNxYS1iZy13aGl0ZSBjcWEtc2hhZG93LXhsIGNxYS13LWZ1bGwgY3FhLW1heC13LVs1MDBweF0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtcC02IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1heC1oLVs4NXZoXSBjcWEtb3ZlcmZsb3cteS1hdXRvXCJcbiAgICBzdHlsZT1cImJveC1zaGFkb3c6IDBweCA4cHggOHB4IC00cHggIzEwMTgyODA4O1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiOTNcIiBoZWlnaHQ9XCI5M1wiIHZpZXdCb3g9XCIwIDAgOTMgOTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI4NVwiIGhlaWdodD1cIjg1XCIgcng9XCI0Mi41XCIgZmlsbD1cIiNGMTVGNUZcIi8+XG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiODVcIiBoZWlnaHQ9XCI4NVwiIHJ4PVwiNDIuNVwiIHN0cm9rZT1cIiNGQ0Q5RDlcIiBzdHJva2Utd2lkdGg9XCI4XCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMzIuMzgxNSA2Mi40NDM3SDYwLjYxOUM2My41MDY1IDYyLjQ0MzcgNjUuMzA2NSA1OS4zMTI1IDYzLjg2MjcgNTYuODE4OEw0OS43NDQgMzIuNDI1QzQ4LjMwMDIgMjkuOTMxMyA0NC43MDAyIDI5LjkzMTMgNDMuMjU2NSAzMi40MjVMMjkuMTM3NyA1Ni44MTg4QzI3LjY5NCA1OS4zMTI1IDI5LjQ5NCA2Mi40NDM3IDMyLjM4MTUgNjIuNDQzN1pNNDYuNTAwMiA0OS4zMTg4QzQ1LjQ2OSA0OS4zMTg4IDQ0LjYyNTIgNDguNDc1IDQ0LjYyNTIgNDcuNDQzOFY0My42OTM4QzQ0LjYyNTIgNDIuNjYyNSA0NS40NjkgNDEuODE4OCA0Ni41MDAyIDQxLjgxODhDNDcuNTMxNSA0MS44MTg4IDQ4LjM3NTIgNDIuNjYyNSA0OC4zNzUyIDQzLjY5MzhWNDcuNDQzOEM0OC4zNzUyIDQ4LjQ3NSA0Ny41MzE1IDQ5LjMxODggNDYuNTAwMiA0OS4zMTg4Wk00OC4zNzUyIDU2LjgxODhINDQuNjI1MlY1My4wNjg4SDQ4LjM3NTJWNTYuODE4OFpcIiBmaWxsPVwid2hpdGVcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzdGF0dXMgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjkzXCIgaGVpZ2h0PVwiOTNcIiB2aWV3Qm94PVwiMCAwIDkzIDkzXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI4NVwiIGhlaWdodD1cIjg1XCIgcng9XCI0Mi41XCIgZmlsbD1cIiNBRUU5RDRcIi8+XG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiODVcIiBoZWlnaHQ9XCI4NVwiIHJ4PVwiNDIuNVwiIHN0cm9rZT1cIiNDRkYyRTVcIiBzdHJva2Utd2lkdGg9XCI4XCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNzUuMjUgNDMuODU0OVY0Ni40OTk5Qzc1LjI0NjUgNTIuNjk5NiA3My4yMzg5IDU4LjczMiA2OS41MjY4IDYzLjY5NzZDNjUuODE0NyA2OC42NjMyIDYwLjU5NjkgNzIuMjk1NyA1NC42NTE3IDc0LjA1MzZDNDguNzA2NCA3NS44MTE0IDQyLjM1MjEgNzUuNjAwMyAzNi41MzY2IDczLjQ1MThDMzAuNzIxMSA3MS4zMDMzIDI1Ljc1NTkgNjcuMzMyNCAyMi4zODE1IDYyLjEzMTRDMTkuMDA3MSA1Ni45MzA1IDE3LjQwNDQgNTAuNzc4IDE3LjgxMjMgNDQuNTkxOEMxOC4yMjAyIDM4LjQwNTUgMjAuNjE3IDMyLjUxNjggMjQuNjQ1MSAyNy44MDM5QzI4LjY3MzEgMjMuMDkxMSAzNC4xMTY4IDE5LjgwNjYgNDAuMTY0IDE4LjQ0MDNDNDYuMjExMyAxNy4wNzQgNTIuNTM4MyAxNy42OTkxIDU4LjIwMTMgMjAuMjIyNE03NS4yNSAyMy40OTk5TDQ2LjUgNTIuMjc4NkwzNy44NzUgNDMuNjUzNlwiIHN0cm9rZT1cIiMwREJEN0RcIiBzdHJva2Utd2lkdGg9XCI0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuIFxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzIycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMEIwQjBDXSBjcWEtbXQtWzIwcHhdIGNxYS1sZWFkaW5nLVsyOHB4XVwiPlxuICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgPC9oMj5cblxuICAgICAgPCEtLSBJbnN0cnVjdGlvbmFsIE1lc3NhZ2UgLS0+XG4gICAgICA8cCAqbmdJZj1cImluc3RydWN0aW9uYWxNZXNzYWdlXCIgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW10LTIgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgIHt7IGluc3RydWN0aW9uYWxNZXNzYWdlIH19XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIDxkaXYgKm5nSWY9XCJoYXNUaW1pbmdEYXRhXCIgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1wLVsxN3B4XSBjcWEtbXktNFwiIFtuZ0NsYXNzXT1cInN0ZXBzQmFja2dyb3VuZENsYXNzXCJcbiAgICAgIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQ7XCIgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJzdGVwc0JvcmRlckNsYXNzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY3FhLWdyaWQgc206Y3FhLWZsZXggc206Y3FhLWp1c3RpZnktYmV0d2VlbiBzbTpjcWEtaXRlbXMtY2VudGVyIGNxYS1ncmlkLWNvbHMtMiBzbTpjcWEtZ3JpZC1jb2xzLTQgY3FhLWdhcC00IHNtOmNxYS1nYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b3RhbFN0ZXBzXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW1iLTFcIj5Ub3RhbCBTdGVwczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMDE4MjhdXCI+XG4gICAgICAgICAgICB7eyBjb21wbGV0ZWRTdGVwcyB9fSAvIHt7IHRvdGFsU3RlcHMgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiAqbmdJZj1cInRvdGFsVGltZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG90YWwgVGltZTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMDE4MjhdXCI+XG4gICAgICAgICAgICB7eyB0b3RhbFRpbWUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiAqbmdJZj1cImFwcFRpbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtbWItMVwiPkFwcCBUaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzEwMTgyOF1cIj5cbiAgICAgICAgICAgIHt7IGFwcFRpbWUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiAqbmdJZj1cInRvb2xUaW1lXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW1iLTFcIj5Ub29sIFRpbWU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgdG9vbFRpbWUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+IC0tPlxuXG4gICAgPCEtLSBFcnJvciBNZXNzYWdlIFNlY3Rpb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImVycm9yTWVzc2FnZVwiIGNsYXNzPVwiY3FhLW15LTQgY3FhLXAtNCBjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGVcIlxuICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtbWItMiBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAge3sgc3RhdHVzID09PSAnc3VjY2VzcycgPyAnRGV0YWlscycgOiAnRXJyb3IgTWVzc2FnZScgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtd2hpdGVzcGFjZS1ub3JtYWwgY3FhLWJyZWFrLWFueXdoZXJlXCJcbiAgICAgICAgc3R5bGU9XCJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDwhLS0gQnV0dG9ucyAob3IgbG9hZGluZyBiYWRnZSB3aGVuIHNob3dMb2FkaW5nKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzIwcHhdXCI+XG4gICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICpuZ0lmPVwic2hvd0xvYWRpbmdcIlxuICAgICAgICBbbGFiZWxdPVwibG9hZGluZ0JhZGdlTGFiZWxcIlxuICAgICAgICBpY29uPVwiYXV0b3JlbmV3XCJcbiAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgc2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIFtpbmxpbmVTdHlsZXNdPVwibG9hZGluZ0JhZGdlSW5saW5lU3R5bGVzXCI+XG4gICAgICA8L2NxYS1iYWRnZT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2hvd0xvYWRpbmdcIj5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIFt2YXJpYW50XT1cImJ1dHRvbi52YXJpYW50XCJcbiAgICAgICAgICBbdGV4dF09XCJidXR0b24ubGFiZWxcIlxuICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgICAgICBbYnRuU2l6ZV09XCJidXR0b24uYnRuU2l6ZSB8fCAnbGcnXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cImJ1dHRvbi5mdWxsV2lkdGggIT09IHVuZGVmaW5lZCA/IGJ1dHRvbi5mdWxsV2lkdGggOiB0cnVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8/IGZhbHNlXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJvbkJ1dHRvbkNsaWNrKGJ1dHRvbilcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,108 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../badge/badge.component";
4
+ import * as i2 from "../button/button.component";
5
+ import * as i3 from "@angular/common";
6
+ /**
7
+ * Dedicated dialog for the debug session-restoration flow. Replaces the
8
+ * overloaded `cqa-error-modal` usage for these specific states:
9
+ *
10
+ * 1. `restoring` — backend is restoring browser state (spinner only).
11
+ * 2. `session-expired` — validation failed; user must choose how to recover.
12
+ * 3. `restoration-failed` — restoration attempt failed; restart or stop.
13
+ *
14
+ * The component owns the action button set per state, so the consumer only
15
+ * passes data and reacts to the emitted action.
16
+ */
17
+ export class SessionRestorationDialogComponent {
18
+ constructor() {
19
+ this.isOpen = false;
20
+ this.state = null;
21
+ /** restoring: primary message inside the loader card. */
22
+ this.restoringMessage = 'Restoring browser session…';
23
+ /** restoring: small secondary line under the spinner. */
24
+ this.restoringSubMessage = 'This may take up to 30 seconds';
25
+ /**
26
+ * Action buttons rendered at the bottom of the dialog. Owned by the parent
27
+ * so each consumer decides which actions are appropriate (mirroring the
28
+ * pattern used by `cqa-error-modal`). Ignored when state === 'restoring'.
29
+ */
30
+ this.buttons = [];
31
+ this.actionClick = new EventEmitter();
32
+ this.closeModal = new EventEmitter();
33
+ }
34
+ get resolvedTitle() {
35
+ if (this.title)
36
+ return this.title;
37
+ switch (this.state) {
38
+ case 'restoring': return 'Restoring Session';
39
+ case 'session-expired': return 'Session Expired';
40
+ case 'restoration-failed': return 'Restoration Failed';
41
+ default: return '';
42
+ }
43
+ }
44
+ get resolvedInstructional() {
45
+ if (this.instructionalMessage != null)
46
+ return this.instructionalMessage;
47
+ switch (this.state) {
48
+ case 'restoring': return this.restoringSubMessage;
49
+ case 'session-expired': return 'Choose an option below to continue:';
50
+ case 'restoration-failed': return 'Please choose an option below:';
51
+ default: return '';
52
+ }
53
+ }
54
+ get isRestoring() { return this.state === 'restoring'; }
55
+ get isSessionExpired() { return this.state === 'session-expired'; }
56
+ get isRestorationFailed() { return this.state === 'restoration-failed'; }
57
+ get hasUrlMetadata() {
58
+ return !!(this.metadata && (this.metadata.actualUrl || this.metadata.expectedUrl));
59
+ }
60
+ onBackdropClick(event) {
61
+ // Never dismiss while the backend is restoring — the user must wait.
62
+ if (this.isRestoring)
63
+ return;
64
+ const target = event.target;
65
+ const currentTarget = event.currentTarget;
66
+ if (target === currentTarget || target.classList.contains('modal-backdrop')) {
67
+ this.closeModal.emit();
68
+ }
69
+ }
70
+ onButtonClick(button) {
71
+ if (button.disabled)
72
+ return;
73
+ this.actionClick.emit(button.action);
74
+ }
75
+ }
76
+ SessionRestorationDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SessionRestorationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
77
+ SessionRestorationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SessionRestorationDialogComponent, selector: "cqa-session-restoration-dialog", inputs: { isOpen: "isOpen", state: "state", title: "title", instructionalMessage: "instructionalMessage", errorMessage: "errorMessage", restoringMessage: "restoringMessage", restoringSubMessage: "restoringSubMessage", failedValidations: "failedValidations", warnings: "warnings", metadata: "metadata", buttons: "buttons" }, outputs: { actionClick: "actionClick", closeModal: "closeModal" }, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[85vh] cqa-overflow-y-auto\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <!-- Header (icon + title + sub-text) -->\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <!-- Restoring: spinner icon -->\n <div *ngIf=\"isRestoring\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#DBEAFE\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#EFF6FF\" stroke-width=\"8\"/>\n <path d=\"M46.5 26.5V35.5M46.5 57.5V66.5M28.5 46.5H37.5M55.5 46.5H64.5M33.79 33.79L40.15 40.15M52.85 52.85L59.21 59.21M33.79 59.21L40.15 52.85M52.85 40.15L59.21 33.79\"\n stroke=\"#2563EB\" stroke-width=\"4\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 46.5 46.5\" to=\"360 46.5 46.5\" dur=\"1.5s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </div>\n\n <!-- Session expired / restoration failed: warning icon -->\n <div *ngIf=\"isSessionExpired || isRestorationFailed\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#F15F5F\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#FCD9D9\" stroke-width=\"8\"/>\n <path d=\"M32.3815 62.4437H60.619C63.5065 62.4437 65.3065 59.3125 63.8627 56.8188L49.744 32.425C48.3002 29.9313 44.7002 29.9313 43.2565 32.425L29.1377 56.8188C27.694 59.3125 29.494 62.4437 32.3815 62.4437ZM46.5002 49.3188C45.469 49.3188 44.6252 48.475 44.6252 47.4438V43.6938C44.6252 42.6625 45.469 41.8188 46.5002 41.8188C47.5315 41.8188 48.3752 42.6625 48.3752 43.6938V47.4438C48.3752 48.475 47.5315 49.3188 46.5002 49.3188ZM48.3752 56.8188H44.6252V53.0688H48.3752V56.8188Z\" fill=\"white\"/>\n </svg>\n </div>\n\n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ resolvedTitle }}\n </h2>\n\n <p *ngIf=\"resolvedInstructional\"\n class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mt-2 cqa-text-center\">\n {{ resolvedInstructional }}\n </p>\n </div>\n\n <!-- Restoring: centered message body -->\n <div *ngIf=\"isRestoring\" class=\"cqa-my-2 cqa-p-4 cqa-rounded-lg cqa-bg-white cqa-text-center\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-medium\">\n {{ restoringMessage }}\n </div>\n </div>\n\n <!-- Restoration failed: error message -->\n <div *ngIf=\"isRestorationFailed && errorMessage\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-2 cqa-font-medium\">\n Error Message\n </div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-semibold cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n <!-- Failed validations (session-expired only) -->\n <div *ngIf=\"isSessionExpired && failedValidations && failedValidations.length > 0\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-3 cqa-font-medium\">\n Failed Validation Checks\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div *ngFor=\"let validation of failedValidations\" class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-flex cqa-items-start cqa-gap-2\">\n <svg *ngIf=\"!validation.passed\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-mt-[2px]\">\n <path d=\"M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM10 11C9.45 11 9 10.55 9 10V6C9 5.45 9.45 5 10 5C10.55 5 11 5.45 11 6V10C11 10.55 10.55 11 10 11ZM11 15H9V13H11V15Z\" fill=\"#EF4444\"/>\n </svg>\n <svg *ngIf=\"validation.passed\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-mt-[2px]\">\n <path d=\"M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM8 15L3 10L4.41 8.59L8 12.17L15.59 4.58L17 6L8 15Z\" fill=\"#10B981\"/>\n </svg>\n <div class=\"cqa-flex-1\">\n <div class=\"cqa-text-sm cqa-font-semibold cqa-text-[#111827]\">\n {{ validation.level }}\n </div>\n <div class=\"cqa-text-xs cqa-text-[#6B7280] cqa-mt-1\">\n {{ validation.message }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Warnings -->\n <div *ngIf=\"(isSessionExpired || isRestorationFailed) && warnings && warnings.length > 0\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-amber-50\"\n style=\"border: 1px solid #FCD34D;\">\n <div class=\"cqa-text-xs cqa-text-[#92400E] cqa-mb-2 cqa-font-medium\">\n Warnings\n </div>\n <ul class=\"cqa-list-disc cqa-list-inside cqa-space-y-1\">\n <li *ngFor=\"let warning of warnings\" class=\"cqa-text-sm cqa-text-[#78350F]\">\n {{ warning }}\n </li>\n </ul>\n </div>\n\n <!-- URL metadata (session-expired only) -->\n <div *ngIf=\"isSessionExpired && hasUrlMetadata\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngIf=\"metadata?.expectedUrl\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-font-medium\">Expected URL</div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-mt-1 cqa-break-all\">\n {{ metadata?.expectedUrl }}\n </div>\n </div>\n <div *ngIf=\"metadata?.actualUrl\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-font-medium\">Actual URL</div>\n <div class=\"cqa-text-sm cqa-text-[#EF4444] cqa-mt-1 cqa-break-all\">\n {{ metadata?.actualUrl }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <!-- Restoring: spinner badge, no buttons -->\n <cqa-badge\n *ngIf=\"isRestoring\"\n label=\"Restoring Session..\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\"\n inlineStyles=\"min-height: 44px;\">\n </cqa-badge>\n\n <!-- Caller-supplied action buttons (session-expired / restoration-failed) -->\n <ng-container *ngIf=\"!isRestoring\">\n <cqa-button\n *ngFor=\"let button of buttons\"\n [variant]=\"button.variant\"\n [text]=\"button.label\"\n [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\"\n [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n [disabled]=\"button.disabled ?? false\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\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", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SessionRestorationDialogComponent, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: 'cqa-session-restoration-dialog', template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2 cqa-max-h-[85vh] cqa-overflow-y-auto\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <!-- Header (icon + title + sub-text) -->\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <!-- Restoring: spinner icon -->\n <div *ngIf=\"isRestoring\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#DBEAFE\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#EFF6FF\" stroke-width=\"8\"/>\n <path d=\"M46.5 26.5V35.5M46.5 57.5V66.5M28.5 46.5H37.5M55.5 46.5H64.5M33.79 33.79L40.15 40.15M52.85 52.85L59.21 59.21M33.79 59.21L40.15 52.85M52.85 40.15L59.21 33.79\"\n stroke=\"#2563EB\" stroke-width=\"4\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 46.5 46.5\" to=\"360 46.5 46.5\" dur=\"1.5s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n </div>\n\n <!-- Session expired / restoration failed: warning icon -->\n <div *ngIf=\"isSessionExpired || isRestorationFailed\">\n <svg width=\"93\" height=\"93\" viewBox=\"0 0 93 93\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" fill=\"#F15F5F\"/>\n <rect x=\"4\" y=\"4\" width=\"85\" height=\"85\" rx=\"42.5\" stroke=\"#FCD9D9\" stroke-width=\"8\"/>\n <path d=\"M32.3815 62.4437H60.619C63.5065 62.4437 65.3065 59.3125 63.8627 56.8188L49.744 32.425C48.3002 29.9313 44.7002 29.9313 43.2565 32.425L29.1377 56.8188C27.694 59.3125 29.494 62.4437 32.3815 62.4437ZM46.5002 49.3188C45.469 49.3188 44.6252 48.475 44.6252 47.4438V43.6938C44.6252 42.6625 45.469 41.8188 46.5002 41.8188C47.5315 41.8188 48.3752 42.6625 48.3752 43.6938V47.4438C48.3752 48.475 47.5315 49.3188 46.5002 49.3188ZM48.3752 56.8188H44.6252V53.0688H48.3752V56.8188Z\" fill=\"white\"/>\n </svg>\n </div>\n\n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ resolvedTitle }}\n </h2>\n\n <p *ngIf=\"resolvedInstructional\"\n class=\"cqa-text-sm cqa-text-[#4A5565] cqa-mt-2 cqa-text-center\">\n {{ resolvedInstructional }}\n </p>\n </div>\n\n <!-- Restoring: centered message body -->\n <div *ngIf=\"isRestoring\" class=\"cqa-my-2 cqa-p-4 cqa-rounded-lg cqa-bg-white cqa-text-center\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-medium\">\n {{ restoringMessage }}\n </div>\n </div>\n\n <!-- Restoration failed: error message -->\n <div *ngIf=\"isRestorationFailed && errorMessage\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-2 cqa-font-medium\">\n Error Message\n </div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-font-semibold cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n <!-- Failed validations (session-expired only) -->\n <div *ngIf=\"isSessionExpired && failedValidations && failedValidations.length > 0\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-mb-3 cqa-font-medium\">\n Failed Validation Checks\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div *ngFor=\"let validation of failedValidations\" class=\"cqa-flex cqa-flex-col\">\n <div class=\"cqa-flex cqa-items-start cqa-gap-2\">\n <svg *ngIf=\"!validation.passed\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-mt-[2px]\">\n <path d=\"M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM10 11C9.45 11 9 10.55 9 10V6C9 5.45 9.45 5 10 5C10.55 5 11 5.45 11 6V10C11 10.55 10.55 11 10 11ZM11 15H9V13H11V15Z\" fill=\"#EF4444\"/>\n </svg>\n <svg *ngIf=\"validation.passed\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-mt-[2px]\">\n <path d=\"M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM8 15L3 10L4.41 8.59L8 12.17L15.59 4.58L17 6L8 15Z\" fill=\"#10B981\"/>\n </svg>\n <div class=\"cqa-flex-1\">\n <div class=\"cqa-text-sm cqa-font-semibold cqa-text-[#111827]\">\n {{ validation.level }}\n </div>\n <div class=\"cqa-text-xs cqa-text-[#6B7280] cqa-mt-1\">\n {{ validation.message }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Warnings -->\n <div *ngIf=\"(isSessionExpired || isRestorationFailed) && warnings && warnings.length > 0\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-amber-50\"\n style=\"border: 1px solid #FCD34D;\">\n <div class=\"cqa-text-xs cqa-text-[#92400E] cqa-mb-2 cqa-font-medium\">\n Warnings\n </div>\n <ul class=\"cqa-list-disc cqa-list-inside cqa-space-y-1\">\n <li *ngFor=\"let warning of warnings\" class=\"cqa-text-sm cqa-text-[#78350F]\">\n {{ warning }}\n </li>\n </ul>\n </div>\n\n <!-- URL metadata (session-expired only) -->\n <div *ngIf=\"isSessionExpired && hasUrlMetadata\"\n class=\"cqa-my-1 cqa-p-4 cqa-rounded-lg cqa-bg-white\"\n style=\"border: 1px solid #E5E7EB;\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngIf=\"metadata?.expectedUrl\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-font-medium\">Expected URL</div>\n <div class=\"cqa-text-sm cqa-text-[#111827] cqa-mt-1 cqa-break-all\">\n {{ metadata?.expectedUrl }}\n </div>\n </div>\n <div *ngIf=\"metadata?.actualUrl\">\n <div class=\"cqa-text-xs cqa-text-[#9CA3AF] cqa-font-medium\">Actual URL</div>\n <div class=\"cqa-text-sm cqa-text-[#EF4444] cqa-mt-1 cqa-break-all\">\n {{ metadata?.actualUrl }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <!-- Restoring: spinner badge, no buttons -->\n <cqa-badge\n *ngIf=\"isRestoring\"\n label=\"Restoring Session..\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\"\n inlineStyles=\"min-height: 44px;\">\n </cqa-badge>\n\n <!-- Caller-supplied action buttons (session-expired / restoration-failed) -->\n <ng-container *ngIf=\"!isRestoring\">\n <cqa-button\n *ngFor=\"let button of buttons\"\n [variant]=\"button.variant\"\n [text]=\"button.label\"\n [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\"\n [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n [disabled]=\"button.disabled ?? false\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [] }]
81
+ }], propDecorators: { isOpen: [{
82
+ type: Input
83
+ }], state: [{
84
+ type: Input
85
+ }], title: [{
86
+ type: Input
87
+ }], instructionalMessage: [{
88
+ type: Input
89
+ }], errorMessage: [{
90
+ type: Input
91
+ }], restoringMessage: [{
92
+ type: Input
93
+ }], restoringSubMessage: [{
94
+ type: Input
95
+ }], failedValidations: [{
96
+ type: Input
97
+ }], warnings: [{
98
+ type: Input
99
+ }], metadata: [{
100
+ type: Input
101
+ }], buttons: [{
102
+ type: Input
103
+ }], actionClick: [{
104
+ type: Output
105
+ }], closeModal: [{
106
+ type: Output
107
+ }] } });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1yZXN0b3JhdGlvbi1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXNzaW9uLXJlc3RvcmF0aW9uLWRpYWxvZy9zZXNzaW9uLXJlc3RvcmF0aW9uLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Nlc3Npb24tcmVzdG9yYXRpb24tZGlhbG9nL3Nlc3Npb24tcmVzdG9yYXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBNkJ2RTs7Ozs7Ozs7OztHQVVHO0FBTUgsTUFBTSxPQUFPLGlDQUFpQztJQUw5QztRQU1XLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsVUFBSyxHQUFtQyxJQUFJLENBQUM7UUFVdEQseURBQXlEO1FBQ2hELHFCQUFnQixHQUFXLDRCQUE0QixDQUFDO1FBQ2pFLHlEQUF5RDtRQUNoRCx3QkFBbUIsR0FBVyxnQ0FBZ0MsQ0FBQztRQVN4RTs7OztXQUlHO1FBQ00sWUFBTyxHQUFxQyxFQUFFLENBQUM7UUFFOUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBNENqRDtJQTFDQyxJQUFJLGFBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQixLQUFLLFdBQVcsQ0FBQyxDQUFDLE9BQU8sbUJBQW1CLENBQUM7WUFDN0MsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8saUJBQWlCLENBQUM7WUFDakQsS0FBSyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sb0JBQW9CLENBQUM7WUFDdkQsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3hFLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQixLQUFLLFdBQVcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ2xELEtBQUssaUJBQWlCLENBQUMsQ0FBQyxPQUFPLHFDQUFxQyxDQUFDO1lBQ3JFLEtBQUssb0JBQW9CLENBQUMsQ0FBQyxPQUFPLGdDQUFnQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELElBQUksV0FBVyxLQUFjLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLElBQUksZ0JBQWdCLEtBQWMsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM1RSxJQUFJLG1CQUFtQixLQUFjLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFFbEYsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLHFFQUFxRTtRQUNyRSxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUM3QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBNEIsQ0FBQztRQUN6RCxJQUFJLE1BQU0sS0FBSyxhQUFhLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUMzRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFzQztRQUNsRCxJQUFJLE1BQU0sQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQzs7OEhBM0VVLGlDQUFpQztrSEFBakMsaUNBQWlDLDZjQzdDOUMsODRQQTZKQTsyRkRoSGEsaUNBQWlDO2tCQUw3QyxTQUFTOytCQUNFLGdDQUFnQzs4QkFLakMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQU9HLE9BQU87c0JBQWYsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgU2Vzc2lvblJlc3RvcmF0aW9uU3RhdGUgPSAncmVzdG9yaW5nJyB8ICdzZXNzaW9uLWV4cGlyZWQnIHwgJ3Jlc3RvcmF0aW9uLWZhaWxlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblJlc3RvcmF0aW9uRGlhbG9nQnV0dG9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFyaWFudDogQnV0dG9uVmFyaWFudDtcbiAgLyoqIEFjdGlvbiBzdHJpbmcgZW1pdHRlZCB2aWEgYGFjdGlvbkNsaWNrYCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZC4gKi9cbiAgYWN0aW9uOiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIGJ0blNpemU/OiAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIGZ1bGxXaWR0aD86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uUmVzdG9yYXRpb25GYWlsZWRWYWxpZGF0aW9uIHtcbiAgbGV2ZWw6IHN0cmluZztcbiAgcGFzc2VkOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblJlc3RvcmF0aW9uTWV0YWRhdGEge1xuICBhY3R1YWxVcmw/OiBzdHJpbmc7XG4gIGV4cGVjdGVkVXJsPzogc3RyaW5nO1xuICB0YXJnZXRTdGVwSWQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHRhcmdldFN0ZXBVbmlxdWVJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWRpY2F0ZWQgZGlhbG9nIGZvciB0aGUgZGVidWcgc2Vzc2lvbi1yZXN0b3JhdGlvbiBmbG93LiBSZXBsYWNlcyB0aGVcbiAqIG92ZXJsb2FkZWQgYGNxYS1lcnJvci1tb2RhbGAgdXNhZ2UgZm9yIHRoZXNlIHNwZWNpZmljIHN0YXRlczpcbiAqXG4gKiAgIDEuIGByZXN0b3JpbmdgICAgICAgICAgICAg4oCUIGJhY2tlbmQgaXMgcmVzdG9yaW5nIGJyb3dzZXIgc3RhdGUgKHNwaW5uZXIgb25seSkuXG4gKiAgIDIuIGBzZXNzaW9uLWV4cGlyZWRgICAgICAg4oCUIHZhbGlkYXRpb24gZmFpbGVkOyB1c2VyIG11c3QgY2hvb3NlIGhvdyB0byByZWNvdmVyLlxuICogICAzLiBgcmVzdG9yYXRpb24tZmFpbGVkYCAgIOKAlCByZXN0b3JhdGlvbiBhdHRlbXB0IGZhaWxlZDsgcmVzdGFydCBvciBzdG9wLlxuICpcbiAqIFRoZSBjb21wb25lbnQgb3ducyB0aGUgYWN0aW9uIGJ1dHRvbiBzZXQgcGVyIHN0YXRlLCBzbyB0aGUgY29uc3VtZXIgb25seVxuICogcGFzc2VzIGRhdGEgYW5kIHJlYWN0cyB0byB0aGUgZW1pdHRlZCBhY3Rpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zZXNzaW9uLXJlc3RvcmF0aW9uLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZXNzaW9uLXJlc3RvcmF0aW9uLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgU2Vzc2lvblJlc3RvcmF0aW9uRGlhbG9nQ29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0YXRlOiBTZXNzaW9uUmVzdG9yYXRpb25TdGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBPcHRpb25hbCB0aXRsZSBvdmVycmlkZS4gRGVmYXVsdHMgYXJlIGRlcml2ZWQgZnJvbSBgc3RhdGVgLiAqL1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGluc3RydWN0aW9uYWwvc3ViIG1lc3NhZ2Ugb3ZlcnJpZGUuIERlZmF1bHRzIGFyZSBkZXJpdmVkIGZyb20gYHN0YXRlYC4gKi9cbiAgQElucHV0KCkgaW5zdHJ1Y3Rpb25hbE1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqIHJlc3RvcmF0aW9uLWZhaWxlZDogdGhlIHByaW1hcnkgZXJyb3IgdGV4dCBzaG93biB0byB0aGUgdXNlci4gKi9cbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKiByZXN0b3Jpbmc6IHByaW1hcnkgbWVzc2FnZSBpbnNpZGUgdGhlIGxvYWRlciBjYXJkLiAqL1xuICBASW5wdXQoKSByZXN0b3JpbmdNZXNzYWdlOiBzdHJpbmcgPSAnUmVzdG9yaW5nIGJyb3dzZXIgc2Vzc2lvbuKApic7XG4gIC8qKiByZXN0b3Jpbmc6IHNtYWxsIHNlY29uZGFyeSBsaW5lIHVuZGVyIHRoZSBzcGlubmVyLiAqL1xuICBASW5wdXQoKSByZXN0b3JpbmdTdWJNZXNzYWdlOiBzdHJpbmcgPSAnVGhpcyBtYXkgdGFrZSB1cCB0byAzMCBzZWNvbmRzJztcblxuICAvKiogc2Vzc2lvbi1leHBpcmVkOiBsaXN0IG9mIGZhaWxlZCB2YWxpZGF0aW9uIGNoZWNrcy4gKi9cbiAgQElucHV0KCkgZmFpbGVkVmFsaWRhdGlvbnM/OiBTZXNzaW9uUmVzdG9yYXRpb25GYWlsZWRWYWxpZGF0aW9uW107XG4gIC8qKiBzZXNzaW9uLWV4cGlyZWQgYW5kIHJlc3RvcmF0aW9uLWZhaWxlZDogd2FybmluZyBidWxsZXRzLiAqL1xuICBASW5wdXQoKSB3YXJuaW5ncz86IHN0cmluZ1tdO1xuICAvKiogc2Vzc2lvbi1leHBpcmVkOiBVUkwgY29tcGFyaXNvbiBibG9jay4gKi9cbiAgQElucHV0KCkgbWV0YWRhdGE/OiBTZXNzaW9uUmVzdG9yYXRpb25NZXRhZGF0YTtcblxuICAvKipcbiAgICogQWN0aW9uIGJ1dHRvbnMgcmVuZGVyZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZGlhbG9nLiBPd25lZCBieSB0aGUgcGFyZW50XG4gICAqIHNvIGVhY2ggY29uc3VtZXIgZGVjaWRlcyB3aGljaCBhY3Rpb25zIGFyZSBhcHByb3ByaWF0ZSAobWlycm9yaW5nIHRoZVxuICAgKiBwYXR0ZXJuIHVzZWQgYnkgYGNxYS1lcnJvci1tb2RhbGApLiBJZ25vcmVkIHdoZW4gc3RhdGUgPT09ICdyZXN0b3JpbmcnLlxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uczogU2Vzc2lvblJlc3RvcmF0aW9uRGlhbG9nQnV0dG9uW10gPSBbXTtcblxuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNsb3NlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZ2V0IHJlc29sdmVkVGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50aXRsZSkgcmV0dXJuIHRoaXMudGl0bGU7XG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlICdyZXN0b3JpbmcnOiByZXR1cm4gJ1Jlc3RvcmluZyBTZXNzaW9uJztcbiAgICAgIGNhc2UgJ3Nlc3Npb24tZXhwaXJlZCc6IHJldHVybiAnU2Vzc2lvbiBFeHBpcmVkJztcbiAgICAgIGNhc2UgJ3Jlc3RvcmF0aW9uLWZhaWxlZCc6IHJldHVybiAnUmVzdG9yYXRpb24gRmFpbGVkJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRJbnN0cnVjdGlvbmFsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaW5zdHJ1Y3Rpb25hbE1lc3NhZ2UgIT0gbnVsbCkgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb25hbE1lc3NhZ2U7XG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlICdyZXN0b3JpbmcnOiByZXR1cm4gdGhpcy5yZXN0b3JpbmdTdWJNZXNzYWdlO1xuICAgICAgY2FzZSAnc2Vzc2lvbi1leHBpcmVkJzogcmV0dXJuICdDaG9vc2UgYW4gb3B0aW9uIGJlbG93IHRvIGNvbnRpbnVlOic7XG4gICAgICBjYXNlICdyZXN0b3JhdGlvbi1mYWlsZWQnOiByZXR1cm4gJ1BsZWFzZSBjaG9vc2UgYW4gb3B0aW9uIGJlbG93Oic7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzUmVzdG9yaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gJ3Jlc3RvcmluZyc7IH1cbiAgZ2V0IGlzU2Vzc2lvbkV4cGlyZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnN0YXRlID09PSAnc2Vzc2lvbi1leHBpcmVkJzsgfVxuICBnZXQgaXNSZXN0b3JhdGlvbkZhaWxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdyZXN0b3JhdGlvbi1mYWlsZWQnOyB9XG5cbiAgZ2V0IGhhc1VybE1ldGFkYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLm1ldGFkYXRhICYmICh0aGlzLm1ldGFkYXRhLmFjdHVhbFVybCB8fCB0aGlzLm1ldGFkYXRhLmV4cGVjdGVkVXJsKSk7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBOZXZlciBkaXNtaXNzIHdoaWxlIHRoZSBiYWNrZW5kIGlzIHJlc3RvcmluZyDigJQgdGhlIHVzZXIgbXVzdCB3YWl0LlxuICAgIGlmICh0aGlzLmlzUmVzdG9yaW5nKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQgfHwgdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnbW9kYWwtYmFja2Ryb3AnKSkge1xuICAgICAgdGhpcy5jbG9zZU1vZGFsLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogU2Vzc2lvblJlc3RvcmF0aW9uRGlhbG9nQnV0dG9uKTogdm9pZCB7XG4gICAgaWYgKGJ1dHRvbi5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChidXR0b24uYWN0aW9uKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImlzT3BlblwiXG4gIGNsYXNzPVwibW9kYWwtYmFja2Ryb3AgY3FhLWZpeGVkIGNxYS1pbnNldC0wIGNxYS1iZy1ibGFjayBjcWEtYmctb3BhY2l0eS01MCBjcWEtei1bOTk5OV0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiXG4gIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy14bCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1tYXgtaC1bODV2aF0gY3FhLW92ZXJmbG93LXktYXV0b1wiXG4gICAgc3R5bGU9XCJib3gtc2hhZG93OiAwcHggOHB4IDhweCAtNHB4ICMxMDE4MjgwODtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICA8IS0tIEhlYWRlciAoaWNvbiArIHRpdGxlICsgc3ViLXRleHQpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPCEtLSBSZXN0b3Jpbmc6IHNwaW5uZXIgaWNvbiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc1Jlc3RvcmluZ1wiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiOTNcIiBoZWlnaHQ9XCI5M1wiIHZpZXdCb3g9XCIwIDAgOTMgOTNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI4NVwiIGhlaWdodD1cIjg1XCIgcng9XCI0Mi41XCIgZmlsbD1cIiNEQkVBRkVcIi8+XG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiODVcIiBoZWlnaHQ9XCI4NVwiIHJ4PVwiNDIuNVwiIHN0cm9rZT1cIiNFRkY2RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDYuNSAyNi41VjM1LjVNNDYuNSA1Ny41VjY2LjVNMjguNSA0Ni41SDM3LjVNNTUuNSA0Ni41SDY0LjVNMzMuNzkgMzMuNzlMNDAuMTUgNDAuMTVNNTIuODUgNTIuODVMNTkuMjEgNTkuMjFNMzMuNzkgNTkuMjFMNDAuMTUgNTIuODVNNTIuODUgNDAuMTVMNTkuMjEgMzMuNzlcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMyNTYzRUJcIiBzdHJva2Utd2lkdGg9XCI0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxuICAgICAgICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiBmcm9tPVwiMCA0Ni41IDQ2LjVcIiB0bz1cIjM2MCA0Ni41IDQ2LjVcIiBkdXI9XCIxLjVzXCIgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCIvPlxuICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZXNzaW9uIGV4cGlyZWQgLyByZXN0b3JhdGlvbiBmYWlsZWQ6IHdhcm5pbmcgaWNvbiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc1Nlc3Npb25FeHBpcmVkIHx8IGlzUmVzdG9yYXRpb25GYWlsZWRcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjkzXCIgaGVpZ2h0PVwiOTNcIiB2aWV3Qm94PVwiMCAwIDkzIDkzXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiODVcIiBoZWlnaHQ9XCI4NVwiIHJ4PVwiNDIuNVwiIGZpbGw9XCIjRjE1RjVGXCIvPlxuICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjg1XCIgaGVpZ2h0PVwiODVcIiByeD1cIjQyLjVcIiBzdHJva2U9XCIjRkNEOUQ5XCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMyLjM4MTUgNjIuNDQzN0g2MC42MTlDNjMuNTA2NSA2Mi40NDM3IDY1LjMwNjUgNTkuMzEyNSA2My44NjI3IDU2LjgxODhMNDkuNzQ0IDMyLjQyNUM0OC4zMDAyIDI5LjkzMTMgNDQuNzAwMiAyOS45MzEzIDQzLjI1NjUgMzIuNDI1TDI5LjEzNzcgNTYuODE4OEMyNy42OTQgNTkuMzEyNSAyOS40OTQgNjIuNDQzNyAzMi4zODE1IDYyLjQ0MzdaTTQ2LjUwMDIgNDkuMzE4OEM0NS40NjkgNDkuMzE4OCA0NC42MjUyIDQ4LjQ3NSA0NC42MjUyIDQ3LjQ0MzhWNDMuNjkzOEM0NC42MjUyIDQyLjY2MjUgNDUuNDY5IDQxLjgxODggNDYuNTAwMiA0MS44MTg4QzQ3LjUzMTUgNDEuODE4OCA0OC4zNzUyIDQyLjY2MjUgNDguMzc1MiA0My42OTM4VjQ3LjQ0MzhDNDguMzc1MiA0OC40NzUgNDcuNTMxNSA0OS4zMTg4IDQ2LjUwMDIgNDkuMzE4OFpNNDguMzc1MiA1Ni44MTg4SDQ0LjYyNTJWNTMuMDY4OEg0OC4zNzUyVjU2LjgxODhaXCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMjJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMwQjBCMENdIGNxYS1tdC1bMjBweF0gY3FhLWxlYWRpbmctWzI4cHhdXCI+XG4gICAgICAgIHt7IHJlc29sdmVkVGl0bGUgfX1cbiAgICAgIDwvaDI+XG5cbiAgICAgIDxwICpuZ0lmPVwicmVzb2x2ZWRJbnN0cnVjdGlvbmFsXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tdC0yIGNxYS10ZXh0LWNlbnRlclwiPlxuICAgICAgICB7eyByZXNvbHZlZEluc3RydWN0aW9uYWwgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUmVzdG9yaW5nOiBjZW50ZXJlZCBtZXNzYWdlIGJvZHkgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzUmVzdG9yaW5nXCIgY2xhc3M9XCJjcWEtbXktMiBjcWEtcC00IGNxYS1yb3VuZGVkLWxnIGNxYS1iZy13aGl0ZSBjcWEtdGV4dC1jZW50ZXJcIlxuICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAge3sgcmVzdG9yaW5nTWVzc2FnZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJlc3RvcmF0aW9uIGZhaWxlZDogZXJyb3IgbWVzc2FnZSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNSZXN0b3JhdGlvbkZhaWxlZCAmJiBlcnJvck1lc3NhZ2VcIlxuICAgICAgY2xhc3M9XCJjcWEtbXktMSBjcWEtcC00IGNxYS1yb3VuZGVkLWxnIGNxYS1iZy13aGl0ZVwiXG4gICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNFNUU3RUI7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS1tYi0yIGNxYS1mb250LW1lZGl1bVwiPlxuICAgICAgICBFcnJvciBNZXNzYWdlXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXdoaXRlc3BhY2Utbm9ybWFsIGNxYS1icmVhay1hbnl3aGVyZVwiXG4gICAgICAgIHN0eWxlPVwid29yZC1icmVhazogYnJlYWstd29yZDsgd2hpdGUtc3BhY2U6IHByZS1saW5lO1wiPlxuICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGYWlsZWQgdmFsaWRhdGlvbnMgKHNlc3Npb24tZXhwaXJlZCBvbmx5KSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNTZXNzaW9uRXhwaXJlZCAmJiBmYWlsZWRWYWxpZGF0aW9ucyAmJiBmYWlsZWRWYWxpZGF0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgIGNsYXNzPVwiY3FhLW15LTEgY3FhLXAtNCBjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGVcIlxuICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtbWItMyBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgRmFpbGVkIFZhbGlkYXRpb24gQ2hlY2tzXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbGlkYXRpb24gb2YgZmFpbGVkVmFsaWRhdGlvbnNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIXZhbGlkYXRpb24ucGFzc2VkXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLW10LVsycHhdXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgMEM0LjQ4IDAgMCA0LjQ4IDAgMTBDMCAxNS41MiA0LjQ4IDIwIDEwIDIwQzE1LjUyIDIwIDIwIDE1LjUyIDIwIDEwQzIwIDQuNDggMTUuNTIgMCAxMCAwWk0xMCAxMUM5LjQ1IDExIDkgMTAuNTUgOSAxMFY2QzkgNS40NSA5LjQ1IDUgMTAgNUMxMC41NSA1IDExIDUuNDUgMTEgNlYxMEMxMSAxMC41NSAxMC41NSAxMSAxMCAxMVpNMTEgMTVIOVYxM0gxMVYxNVpcIiBmaWxsPVwiI0VGNDQ0NFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInZhbGlkYXRpb24ucGFzc2VkXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLW10LVsycHhdXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgMEM0LjQ4IDAgMCA0LjQ4IDAgMTBDMCAxNS41MiA0LjQ4IDIwIDEwIDIwQzE1LjUyIDIwIDIwIDE1LjUyIDIwIDEwQzIwIDQuNDggMTUuNTIgMCAxMCAwWk04IDE1TDMgMTBMNC40MSA4LjU5TDggMTIuMTdMMTUuNTkgNC41OEwxNyA2TDggMTVaXCIgZmlsbD1cIiMxMEI5ODFcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5cbiAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uLmxldmVsIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tdC0xXCI+XG4gICAgICAgICAgICAgICAge3sgdmFsaWRhdGlvbi5tZXNzYWdlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFdhcm5pbmdzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIoaXNTZXNzaW9uRXhwaXJlZCB8fCBpc1Jlc3RvcmF0aW9uRmFpbGVkKSAmJiB3YXJuaW5ncyAmJiB3YXJuaW5ncy5sZW5ndGggPiAwXCJcbiAgICAgIGNsYXNzPVwiY3FhLW15LTEgY3FhLXAtNCBjcWEtcm91bmRlZC1sZyBjcWEtYmctYW1iZXItNTBcIlxuICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRkNEMzREO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjOTI0MDBFXSBjcWEtbWItMiBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgV2FybmluZ3NcbiAgICAgIDwvZGl2PlxuICAgICAgPHVsIGNsYXNzPVwiY3FhLWxpc3QtZGlzYyBjcWEtbGlzdC1pbnNpZGUgY3FhLXNwYWNlLXktMVwiPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHdhcm5pbmcgb2Ygd2FybmluZ3NcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjNzgzNTBGXVwiPlxuICAgICAgICAgIHt7IHdhcm5pbmcgfX1cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFVSTCBtZXRhZGF0YSAoc2Vzc2lvbi1leHBpcmVkIG9ubHkpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc1Nlc3Npb25FeHBpcmVkICYmIGhhc1VybE1ldGFkYXRhXCJcbiAgICAgIGNsYXNzPVwiY3FhLW15LTEgY3FhLXAtNCBjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGVcIlxuICAgICAgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRTVFN0VCO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1ldGFkYXRhPy5leHBlY3RlZFVybFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLWZvbnQtbWVkaXVtXCI+RXhwZWN0ZWQgVVJMPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbXQtMSBjcWEtYnJlYWstYWxsXCI+XG4gICAgICAgICAgICB7eyBtZXRhZGF0YT8uZXhwZWN0ZWRVcmwgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtZXRhZGF0YT8uYWN0dWFsVXJsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtZm9udC1tZWRpdW1cIj5BY3R1YWwgVVJMPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjRUY0NDQ0XSBjcWEtbXQtMSBjcWEtYnJlYWstYWxsXCI+XG4gICAgICAgICAgICB7eyBtZXRhZGF0YT8uYWN0dWFsVXJsIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsyMHB4XVwiPlxuICAgICAgPCEtLSBSZXN0b3Jpbmc6IHNwaW5uZXIgYmFkZ2UsIG5vIGJ1dHRvbnMgLS0+XG4gICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICpuZ0lmPVwiaXNSZXN0b3JpbmdcIlxuICAgICAgICBsYWJlbD1cIlJlc3RvcmluZyBTZXNzaW9uLi5cIlxuICAgICAgICBpY29uPVwiYXV0b3JlbmV3XCJcbiAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgc2l6ZT1cIm1lZGl1bVwiXG4gICAgICAgIGlubGluZVN0eWxlcz1cIm1pbi1oZWlnaHQ6IDQ0cHg7XCI+XG4gICAgICA8L2NxYS1iYWRnZT5cblxuICAgICAgPCEtLSBDYWxsZXItc3VwcGxpZWQgYWN0aW9uIGJ1dHRvbnMgKHNlc3Npb24tZXhwaXJlZCAvIHJlc3RvcmF0aW9uLWZhaWxlZCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzUmVzdG9yaW5nXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBidXR0b25zXCJcbiAgICAgICAgICBbdmFyaWFudF09XCJidXR0b24udmFyaWFudFwiXG4gICAgICAgICAgW3RleHRdPVwiYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICBbaWNvbl09XCJidXR0b24uaWNvblwiXG4gICAgICAgICAgW2J0blNpemVdPVwiYnV0dG9uLmJ0blNpemUgfHwgJ2xnJ1wiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJidXR0b24uZnVsbFdpZHRoICE9PSB1bmRlZmluZWQgPyBidXR0b24uZnVsbFdpZHRoIDogdHJ1ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbi5kaXNhYmxlZCA/PyBmYWxzZVwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwib25CdXR0b25DbGljayhidXR0b24pXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19