@cqa-lib/cqa-ui 1.1.121 → 1.1.123

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.
@@ -0,0 +1,71 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ import * as i2 from "../button/button.component";
5
+ import * as i3 from "@angular/common";
6
+ export class ErrorModalComponent {
7
+ constructor() {
8
+ this.isOpen = false;
9
+ this.title = 'Error';
10
+ this.errorMessage = '';
11
+ this.totalSteps = 0;
12
+ this.completedSteps = 0;
13
+ this.totalTime = '';
14
+ this.appTime = '';
15
+ this.toolTime = '';
16
+ this.buttons = [];
17
+ this.buttonClick = new EventEmitter();
18
+ this.closeModal = new EventEmitter();
19
+ }
20
+ onBackdropClick(event) {
21
+ const target = event.target;
22
+ const currentTarget = event.currentTarget;
23
+ if (target === currentTarget || target.classList.contains('modal-backdrop')) {
24
+ this.onClose();
25
+ }
26
+ }
27
+ onButtonClick(button) {
28
+ this.buttonClick.emit(button.action);
29
+ }
30
+ onClose() {
31
+ this.closeModal.emit();
32
+ }
33
+ get stepsBackgroundClass() {
34
+ return 'cqa-bg-[#EE3F3F1A]';
35
+ }
36
+ get stepsBorderClass() {
37
+ return '#FECACA';
38
+ }
39
+ get hasTimingData() {
40
+ return !!(this.totalSteps || this.totalTime || this.appTime || this.toolTime);
41
+ }
42
+ }
43
+ ErrorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
44
+ ErrorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ErrorModalComponent, selector: "cqa-error-modal", inputs: { isOpen: "isOpen", title: "title", errorMessage: "errorMessage", totalSteps: "totalSteps", completedSteps: "completedSteps", totalTime: "totalTime", appTime: "appTime", toolTime: "toolTime", buttons: "buttons" }, 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-50 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\"\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 class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-[93px] cqa-h-[93px] cqa-rounded-full cqa-bg-[#F9BFBF]\" style=\"border: 8px solid #FCD9D9;\">\n <mat-icon class=\"cqa-text-[#EE3F3F]\" style=\"font-size: 48px; width: 48px; height: 48px;\">\n error\n </mat-icon>\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 </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 -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-[17px] cqa-rounded-[10px] cqa-bg-[#FEF2F2]\"\n style=\"border: 1px solid #FECACA;\">\n <div class=\"cqa-text-[12px] cqa-text-[#B91C1C] 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 -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <ng-container *ngFor=\"let button of buttons; let i = index\">\n <cqa-button [variant]=\"button.variant\" [text]=\"button.label\" [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\" [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ErrorModalComponent, decorators: [{
46
+ type: Component,
47
+ 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-50 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\"\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 class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-[93px] cqa-h-[93px] cqa-rounded-full cqa-bg-[#F9BFBF]\" style=\"border: 8px solid #FCD9D9;\">\n <mat-icon class=\"cqa-text-[#EE3F3F]\" style=\"font-size: 48px; width: 48px; height: 48px;\">\n error\n </mat-icon>\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 </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 -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-[17px] cqa-rounded-[10px] cqa-bg-[#FEF2F2]\"\n style=\"border: 1px solid #FECACA;\">\n <div class=\"cqa-text-[12px] cqa-text-[#B91C1C] 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 -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <ng-container *ngFor=\"let button of buttons; let i = index\">\n <cqa-button [variant]=\"button.variant\" [text]=\"button.label\" [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\" [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", styles: [] }]
48
+ }], propDecorators: { isOpen: [{
49
+ type: Input
50
+ }], title: [{
51
+ type: Input
52
+ }], errorMessage: [{
53
+ type: Input
54
+ }], totalSteps: [{
55
+ type: Input
56
+ }], completedSteps: [{
57
+ type: Input
58
+ }], totalTime: [{
59
+ type: Input
60
+ }], appTime: [{
61
+ type: Input
62
+ }], toolTime: [{
63
+ type: Input
64
+ }], buttons: [{
65
+ type: Input
66
+ }], buttonClick: [{
67
+ type: Output
68
+ }], closeModal: [{
69
+ type: Output
70
+ }] } });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lcnJvci1tb2RhbC9lcnJvci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Vycm9yLW1vZGFsL2Vycm9yLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBaUJ2RSxNQUFNLE9BQU8sbUJBQW1CO0lBTGhDO1FBTVcsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixVQUFLLEdBQVcsT0FBTyxDQUFDO1FBQ3hCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUF1QixFQUFFLENBQUM7UUFFaEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBOEJqRDtJQTVCQyxlQUFlLENBQUMsS0FBaUI7UUFDL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQTRCLENBQUM7UUFFekQsSUFBSSxNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDM0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUF3QjtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEYsQ0FBQzs7Z0hBekNVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHdWQ2pCaEMsKzRHQXdFTTsyRkR2RE8sbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjs4QkFLbEIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1vZGFsQnV0dG9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFyaWFudDogQnV0dG9uVmFyaWFudDtcbiAgaWNvbj86IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIGJ0blNpemU/OiAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIGZ1bGxXaWR0aD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1lcnJvci1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lcnJvci1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRXJyb3JNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0Vycm9yJztcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdG90YWxTdGVwczogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgY29tcGxldGVkU3RlcHM6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHRvdGFsVGltZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGFwcFRpbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0b29sVGltZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJ1dHRvbnM6IEVycm9yTW9kYWxCdXR0b25bXSA9IFtdO1xuXG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgXG4gICAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdldCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbC1iYWNrZHJvcCcpKSB7XG4gICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogRXJyb3JNb2RhbEJ1dHRvbik6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdChidXR0b24uYWN0aW9uKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZU1vZGFsLmVtaXQoKTtcbiAgfVxuXG4gIGdldCBzdGVwc0JhY2tncm91bmRDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3FhLWJnLVsjRUUzRjNGMUFdJztcbiAgfVxuXG4gIGdldCBzdGVwc0JvcmRlckNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcjRkVDQUNBJztcbiAgfVxuXG4gIGdldCBoYXNUaW1pbmdEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnRvdGFsU3RlcHMgfHwgdGhpcy50b3RhbFRpbWUgfHwgdGhpcy5hcHBUaW1lIHx8IHRoaXMudG9vbFRpbWUpO1xuICB9XG59XG5cbiIsIjxkaXYgKm5nSWY9XCJpc09wZW5cIlxuICBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wIGNxYS1maXhlZCBjcWEtaW5zZXQtMCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLXotNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiXG4gIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy14bCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCJcbiAgICBzdHlsZT1cImJveC1zaGFkb3c6IDBweCA4cHggOHB4IC00cHggIzEwMTgyODA4O1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LVs5M3B4XSBjcWEtaC1bOTNweF0gY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGOUJGQkZdXCIgc3R5bGU9XCJib3JkZXI6IDhweCBzb2xpZCAjRkNEOUQ5O1wiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bI0VFM0YzRl1cIiBzdHlsZT1cImZvbnQtc2l6ZTogNDhweDsgd2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDtcIj5cbiAgICAgICAgICBlcnJvclxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsyMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzBCMEIwQ10gY3FhLW10LVsyMHB4XSBjcWEtbGVhZGluZy1bMjhweF1cIj5cbiAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgIDwvaDI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzVGltaW5nRGF0YVwiIGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtcC1bMTdweF0gY3FhLW15LTRcIiBbbmdDbGFzc109XCJzdGVwc0JhY2tncm91bmRDbGFzc1wiXG4gICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkO1wiIFtzdHlsZS5ib3JkZXItY29sb3JdPVwic3RlcHNCb3JkZXJDbGFzc1wiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNxYS1ncmlkIHNtOmNxYS1mbGV4IHNtOmNxYS1qdXN0aWZ5LWJldHdlZW4gc206Y3FhLWl0ZW1zLWNlbnRlciBjcWEtZ3JpZC1jb2xzLTIgc206Y3FhLWdyaWQtY29scy00IGNxYS1nYXAtNCBzbTpjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiICpuZ0lmPVwidG90YWxTdGVwc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG90YWwgU3RlcHM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgY29tcGxldGVkU3RlcHMgfX0gLyB7eyB0b3RhbFN0ZXBzIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b3RhbFRpbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtbWItMVwiPlRvdGFsIFRpbWU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgdG90YWxUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJhcHBUaW1lXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW1iLTFcIj5BcHAgVGltZTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMDE4MjhdXCI+XG4gICAgICAgICAgICB7eyBhcHBUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b29sVGltZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG9vbCBUaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzEwMTgyOF1cIj5cbiAgICAgICAgICAgIHt7IHRvb2xUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFcnJvciBNZXNzYWdlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cImNxYS1teS00IGNxYS1wLVsxN3B4XSBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJnLVsjRkVGMkYyXVwiXG4gICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNGRUNBQ0E7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjQjkxQzFDXSBjcWEtd2hpdGVzcGFjZS1ub3JtYWwgY3FhLWJyZWFrLWFueXdoZXJlXCJcbiAgICAgICAgc3R5bGU9XCJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsyMHB4XVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPGNxYS1idXR0b24gW3ZhcmlhbnRdPVwiYnV0dG9uLnZhcmlhbnRcIiBbdGV4dF09XCJidXR0b24ubGFiZWxcIiBbaWNvbl09XCJidXR0b24uaWNvblwiXG4gICAgICAgICAgW2J0blNpemVdPVwiYnV0dG9uLmJ0blNpemUgfHwgJ2xnJ1wiIFtmdWxsV2lkdGhdPVwiYnV0dG9uLmZ1bGxXaWR0aCAhPT0gdW5kZWZpbmVkID8gYnV0dG9uLmZ1bGxXaWR0aCA6IHRydWVcIlxuICAgICAgICAgIChjbGlja2VkKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -0,0 +1,181 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ export class LiveConversationComponent {
7
+ constructor() {
8
+ this.conversation = null;
9
+ this.executionStatus = '';
10
+ this.stepFrom = '';
11
+ this.mode = 'step-regular';
12
+ this.message = '';
13
+ this.circleCircumference = 2 * Math.PI * 52;
14
+ this.showUserInputField = false;
15
+ this.showUserInputFieldinDebug = false;
16
+ this.messageChange = new EventEmitter();
17
+ this.sendMessage = new EventEmitter();
18
+ this.stopAgent = new EventEmitter();
19
+ this.stepAction = new EventEmitter();
20
+ this.updateStepData = new EventEmitter();
21
+ this.redirectToCE = new EventEmitter();
22
+ this.showUserInputFieldChange = new EventEmitter();
23
+ this.showUserInputFieldinDebugChange = new EventEmitter();
24
+ this.internalRemainingTime$ = new BehaviorSubject(0);
25
+ this.timerSubscription = null;
26
+ }
27
+ ngOnInit() {
28
+ if (!this.remainingTime$) {
29
+ this.remainingTime$ = this.internalRemainingTime$;
30
+ }
31
+ }
32
+ ngOnDestroy() {
33
+ this.stopTimer();
34
+ }
35
+ onMessageChange(value) {
36
+ this.message = value;
37
+ this.messageChange.emit(value);
38
+ }
39
+ onSendMessage() {
40
+ // For test case group mode with timeout
41
+ if (this.isTestCaseGroupMode && this.isTimeout && this.message) {
42
+ const timeValue = parseInt(this.message, 10);
43
+ if (!isNaN(timeValue)) {
44
+ this.sendMessage.emit({
45
+ type: 'test_case_time_add',
46
+ data: { time: timeValue }
47
+ });
48
+ return;
49
+ }
50
+ }
51
+ // Default
52
+ this.sendMessage.emit();
53
+ }
54
+ onStopAgent() {
55
+ this.stopAgent.emit();
56
+ }
57
+ onStepAction(action) {
58
+ if (this.stepId) {
59
+ this.stepAction.emit({ action, stepId: this.stepId });
60
+ }
61
+ }
62
+ onUpdateStepData(action, type) {
63
+ if (this.stepId) {
64
+ this.updateStepData.emit({ action, type, stepId: this.stepId });
65
+ }
66
+ }
67
+ onRedirectToCE() {
68
+ this.redirectToCE.emit();
69
+ }
70
+ onShowUserInputFieldChange(value) {
71
+ this.showUserInputFieldChange.emit(value);
72
+ }
73
+ onShowUserInputFieldinDebugChange(value) {
74
+ this.showUserInputFieldinDebugChange.emit(value);
75
+ }
76
+ formatTime(seconds) {
77
+ const minutes = Math.floor(seconds / 60);
78
+ const remainingSeconds = seconds % 60;
79
+ return `${minutes}:${remainingSeconds.toString().padStart(2, "0")}`;
80
+ }
81
+ getDashOffset(remainingTime) {
82
+ const progress = 1 - remainingTime / (2 * 60);
83
+ return this.circleCircumference * progress;
84
+ }
85
+ stopTimer() {
86
+ if (this.timerSubscription) {
87
+ this.timerSubscription.unsubscribe();
88
+ this.timerSubscription = null;
89
+ }
90
+ }
91
+ // Helper getters for template
92
+ get isStepRegularMode() {
93
+ return this.mode === 'step-regular';
94
+ }
95
+ get isStepDebugMode() {
96
+ return this.mode === 'step-debug';
97
+ }
98
+ get isTestCaseGroupMode() {
99
+ return this.mode === 'test-case-group';
100
+ }
101
+ get shouldShowStepRegular() {
102
+ return !!(this.isStepRegularMode &&
103
+ this.conversation &&
104
+ this.conversation.id === this.stepId &&
105
+ this.conversation.stepStatus === 'CONVERSATION' &&
106
+ this.stepFrom !== 'DEBUGGE_WITH_AI');
107
+ }
108
+ get shouldShowStepDebug() {
109
+ return !!(this.isStepDebugMode &&
110
+ this.conversation &&
111
+ this.conversation.id === this.stepId &&
112
+ this.conversation.stepStatus === 'CONVERSATION' &&
113
+ this.stepFrom === 'DEBUGGE_WITH_AI');
114
+ }
115
+ get shouldShowTestCaseGroup() {
116
+ return !!(this.isTestCaseGroupMode &&
117
+ this.conversation &&
118
+ this.executionStatus !== 'COMPLETED');
119
+ }
120
+ get isLocatorNotDetect() {
121
+ return this.conversation?.stepStatus === 'LOCATOR_NOT_DETECT';
122
+ }
123
+ get isTimeout() {
124
+ return this.conversation?.stepStatus === 'TIMEOUT';
125
+ }
126
+ get inputPlaceholder() {
127
+ return this.isTimeout ? 'Enter Timeout in sec' : 'Enter Input';
128
+ }
129
+ get inputType() {
130
+ return this.isTimeout ? 'number' : 'text';
131
+ }
132
+ get isInputDisabled() {
133
+ return !this.conversation || !this.conversation?.replyBack_id;
134
+ }
135
+ get isResumeDisabled() {
136
+ return !this.isLocatorNotDetect && (!this.message || this.message.trim() === '');
137
+ }
138
+ }
139
+ LiveConversationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LiveConversationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
140
+ LiveConversationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LiveConversationComponent, selector: "cqa-live-conversation", inputs: { conversation: "conversation", executionStatus: "executionStatus", stepFrom: "stepFrom", mode: "mode", stepId: "stepId", message: "message", remainingTime$: "remainingTime$", circleCircumference: "circleCircumference", showUserInputField: "showUserInputField", showUserInputFieldinDebug: "showUserInputFieldinDebug" }, outputs: { messageChange: "messageChange", sendMessage: "sendMessage", stopAgent: "stopAgent", stepAction: "stepAction", updateStepData: "updateStepData", redirectToCE: "redirectToCE", showUserInputFieldChange: "showUserInputFieldChange", showUserInputFieldinDebugChange: "showUserInputFieldinDebugChange" }, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <!-- Step Regular Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepRegular\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputField\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStopAgent()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Stop\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputField\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n <button\n class=\"send-button\"\n [disabled]=\"!message\"\n (click)=\"onSendMessage()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer;\"\n >\n Send\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Step Debug Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepDebug\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputFieldinDebug\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldinDebugChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Skip Step\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip_delete')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Delete Step\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputFieldinDebug\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n </div>\n <div class=\"prompt-actions d-flex gap-2 mb-2\">\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('reRun', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Update and Rerun\n </button>\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('aiAgent', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Add New Steps and Rerun\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldinDebugChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Test Case Group Level Conversation Input Section -->\n <div\n *ngIf=\"shouldShowTestCaseGroup\"\n class=\"conversation-input-section mt-3 p-3\"\n style=\"background-color: #EFF6FF; border-radius: 8px; border: 1px solid #BEDBFF;\"\n>\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <div\n *ngIf=\"remainingTime$ | async as remainingTime\"\n class=\"mini-timer-container\"\n >\n <svg class=\"mini-progress-ring\" width=\"44\" height=\"44\">\n <circle\n class=\"mini-progress-ring__circle\"\n stroke=\"#3e98c7\"\n stroke-width=\"4\"\n fill=\"transparent\"\n r=\"20\"\n cx=\"22\"\n cy=\"22\"\n [style.strokeDasharray]=\"circleCircumference\"\n [style.strokeDashoffset.px]=\"getDashOffset(remainingTime)\"\n />\n </svg>\n <div class=\"mini-timer-text\" style=\"color: #374151; font-size: 12px; font-weight: 500;\">\n <span class=\"mini-time\">{{\n formatTime(remainingTime)\n }}</span>\n </div>\n </div>\n <input\n *ngIf=\"!isLocatorNotDetect\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n [disabled]=\"isInputDisabled\"\n [type]=\"inputType\"\n class=\"form-control\"\n style=\"\n height: 36px;\n flex: 1;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #0A0A0A;\n font-size: 14px;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n outline: none;\n \"\n [style.border-color]=\"isInputDisabled ? '#E5E7EB' : '#D1D5DB'\"\n [style.background-color]=\"isInputDisabled ? '#F9FAFB' : '#FFFFFF'\"\n [style.color]=\"isInputDisabled ? '#9CA3AF' : '#0A0A0A'\"\n [style.cursor]=\"isInputDisabled ? 'not-allowed' : 'text'\"\n [placeholder]=\"inputPlaceholder\"\n onfocus=\"if (!this.disabled) { this.style.borderColor='#1447E6'; this.style.boxShadow='0 0 0 3px rgba(63, 67, 238, 0.1)'; }\"\n onblur=\"this.style.borderColor='#D1D5DB'; this.style.boxShadow='none';\"\n />\n <div\n *ngIf=\"isLocatorNotDetect\"\n (click)=\"onRedirectToCE()\"\n style=\"cursor: pointer;\"\n >\n <button\n class=\"btn\"\n style=\"\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #374151;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n onmouseover=\"this.style.backgroundColor='#F9FAFB'\"\n onmouseout=\"this.style.backgroundColor='#FFFFFF'\"\n >\n Record\n </button>\n </div>\n <button\n [disabled]=\"isResumeDisabled\"\n class=\"btn\"\n (click)=\"onSendMessage()\"\n style=\"\n height: 36px;\n padding: 8px 16px;\n border-radius: 8px;\n border: none;\n background-color: #1447E6;\n color: #FFFFFF;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n [style.background-color]=\"isResumeDisabled ? '#E2E2E3' : '#1447E6'\"\n [style.color]=\"isResumeDisabled ? '#9CA3AF' : '#FFFFFF'\"\n [style.cursor]=\"isResumeDisabled ? 'not-allowed' : 'pointer'\"\n onmouseover=\"if (!this.disabled) this.style.backgroundColor='#0F3CBA'\"\n onmouseout=\"if (!this.disabled) this.style.backgroundColor='#1447E6'\"\n >\n Resume\n </button>\n </div>\n</div>\n</div>", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "async": i1.AsyncPipe } });
141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LiveConversationComponent, decorators: [{
142
+ type: Component,
143
+ args: [{ selector: 'cqa-live-conversation', template: "<div class=\"cqa-ui-root\">\n <!-- Step Regular Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepRegular\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputField\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStopAgent()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Stop\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputField\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n <button\n class=\"send-button\"\n [disabled]=\"!message\"\n (click)=\"onSendMessage()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer;\"\n >\n Send\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Step Debug Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepDebug\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputFieldinDebug\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldinDebugChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Skip Step\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip_delete')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Delete Step\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputFieldinDebug\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n </div>\n <div class=\"prompt-actions d-flex gap-2 mb-2\">\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('reRun', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Update and Rerun\n </button>\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('aiAgent', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Add New Steps and Rerun\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldinDebugChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Test Case Group Level Conversation Input Section -->\n <div\n *ngIf=\"shouldShowTestCaseGroup\"\n class=\"conversation-input-section mt-3 p-3\"\n style=\"background-color: #EFF6FF; border-radius: 8px; border: 1px solid #BEDBFF;\"\n>\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <div\n *ngIf=\"remainingTime$ | async as remainingTime\"\n class=\"mini-timer-container\"\n >\n <svg class=\"mini-progress-ring\" width=\"44\" height=\"44\">\n <circle\n class=\"mini-progress-ring__circle\"\n stroke=\"#3e98c7\"\n stroke-width=\"4\"\n fill=\"transparent\"\n r=\"20\"\n cx=\"22\"\n cy=\"22\"\n [style.strokeDasharray]=\"circleCircumference\"\n [style.strokeDashoffset.px]=\"getDashOffset(remainingTime)\"\n />\n </svg>\n <div class=\"mini-timer-text\" style=\"color: #374151; font-size: 12px; font-weight: 500;\">\n <span class=\"mini-time\">{{\n formatTime(remainingTime)\n }}</span>\n </div>\n </div>\n <input\n *ngIf=\"!isLocatorNotDetect\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n [disabled]=\"isInputDisabled\"\n [type]=\"inputType\"\n class=\"form-control\"\n style=\"\n height: 36px;\n flex: 1;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #0A0A0A;\n font-size: 14px;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n outline: none;\n \"\n [style.border-color]=\"isInputDisabled ? '#E5E7EB' : '#D1D5DB'\"\n [style.background-color]=\"isInputDisabled ? '#F9FAFB' : '#FFFFFF'\"\n [style.color]=\"isInputDisabled ? '#9CA3AF' : '#0A0A0A'\"\n [style.cursor]=\"isInputDisabled ? 'not-allowed' : 'text'\"\n [placeholder]=\"inputPlaceholder\"\n onfocus=\"if (!this.disabled) { this.style.borderColor='#1447E6'; this.style.boxShadow='0 0 0 3px rgba(63, 67, 238, 0.1)'; }\"\n onblur=\"this.style.borderColor='#D1D5DB'; this.style.boxShadow='none';\"\n />\n <div\n *ngIf=\"isLocatorNotDetect\"\n (click)=\"onRedirectToCE()\"\n style=\"cursor: pointer;\"\n >\n <button\n class=\"btn\"\n style=\"\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #374151;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n onmouseover=\"this.style.backgroundColor='#F9FAFB'\"\n onmouseout=\"this.style.backgroundColor='#FFFFFF'\"\n >\n Record\n </button>\n </div>\n <button\n [disabled]=\"isResumeDisabled\"\n class=\"btn\"\n (click)=\"onSendMessage()\"\n style=\"\n height: 36px;\n padding: 8px 16px;\n border-radius: 8px;\n border: none;\n background-color: #1447E6;\n color: #FFFFFF;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n [style.background-color]=\"isResumeDisabled ? '#E2E2E3' : '#1447E6'\"\n [style.color]=\"isResumeDisabled ? '#9CA3AF' : '#FFFFFF'\"\n [style.cursor]=\"isResumeDisabled ? 'not-allowed' : 'pointer'\"\n onmouseover=\"if (!this.disabled) this.style.backgroundColor='#0F3CBA'\"\n onmouseout=\"if (!this.disabled) this.style.backgroundColor='#1447E6'\"\n >\n Resume\n </button>\n </div>\n</div>\n</div>", styles: [] }]
144
+ }], propDecorators: { conversation: [{
145
+ type: Input
146
+ }], executionStatus: [{
147
+ type: Input
148
+ }], stepFrom: [{
149
+ type: Input
150
+ }], mode: [{
151
+ type: Input
152
+ }], stepId: [{
153
+ type: Input
154
+ }], message: [{
155
+ type: Input
156
+ }], remainingTime$: [{
157
+ type: Input
158
+ }], circleCircumference: [{
159
+ type: Input
160
+ }], showUserInputField: [{
161
+ type: Input
162
+ }], showUserInputFieldinDebug: [{
163
+ type: Input
164
+ }], messageChange: [{
165
+ type: Output
166
+ }], sendMessage: [{
167
+ type: Output
168
+ }], stopAgent: [{
169
+ type: Output
170
+ }], stepAction: [{
171
+ type: Output
172
+ }], updateStepData: [{
173
+ type: Output
174
+ }], redirectToCE: [{
175
+ type: Output
176
+ }], showUserInputFieldChange: [{
177
+ type: Output
178
+ }], showUserInputFieldinDebugChange: [{
179
+ type: Output
180
+ }] } });
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1jb252ZXJzYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9saXZlLWNvbnZlcnNhdGlvbi9saXZlLWNvbnZlcnNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2xpdmUtY29udmVyc2F0aW9uL2xpdmUtY29udmVyc2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBYyxlQUFlLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7O0FBZWpFLE1BQU0sT0FBTyx5QkFBeUI7SUFMdEM7UUFNVyxpQkFBWSxHQUE0QixJQUFJLENBQUM7UUFDN0Msb0JBQWUsR0FBVyxFQUFFLENBQUM7UUFDN0IsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixTQUFJLEdBQXFCLGNBQWMsQ0FBQztRQUV4QyxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBRXJCLHdCQUFtQixHQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUMvQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBRTFDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBQ2hFLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBK0MsQ0FBQztRQUM3RSxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUE2RSxDQUFDO1FBQy9HLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN4Qyw2QkFBd0IsR0FBRyxJQUFJLFlBQVksRUFB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QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFDRywrQkFBK0I7c0JBQXhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uRGF0YSB7XG4gIGlkPzogbnVtYmVyIHwgc3RyaW5nO1xuICByZXBseUJhY2tfaWQ/OiBzdHJpbmc7XG4gIHN0ZXBTdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbk1vZGUgPSAnc3RlcC1yZWd1bGFyJyB8ICdzdGVwLWRlYnVnJyB8ICd0ZXN0LWNhc2UtZ3JvdXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbGl2ZS1jb252ZXJzYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vbGl2ZS1jb252ZXJzYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIExpdmVDb252ZXJzYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uRGF0YSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleGVjdXRpb25TdGF0dXM6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzdGVwRnJvbTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG1vZGU6IENvbnZlcnNhdGlvbk1vZGUgPSAnc3RlcC1yZWd1bGFyJztcbiAgQElucHV0KCkgc3RlcElkPzogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcmVtYWluaW5nVGltZSQ/OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIEBJbnB1dCgpIGNpcmNsZUNpcmN1bWZlcmVuY2U6IG51bWJlciA9IDIgKiBNYXRoLlBJICogNTI7XG4gIEBJbnB1dCgpIHNob3dVc2VySW5wdXRGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93VXNlcklucHV0RmllbGRpbkRlYnVnOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIG1lc3NhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNlbmRNZXNzYWdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU/OiBzdHJpbmc7IGRhdGE/OiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIHN0b3BBZ2VudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHN0ZXBBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgYWN0aW9uOiBzdHJpbmc7IHN0ZXBJZDogbnVtYmVyIHwgc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVTdGVwRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IHN0cmluZzsgdHlwZTogJ2xvY2F0b3InIHwgJ21ldGFkYXRhJzsgc3RlcElkOiBudW1iZXIgfCBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9DRSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNob3dVc2VySW5wdXRGaWVsZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNob3dVc2VySW5wdXRGaWVsZGluRGVidWdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgaW50ZXJuYWxSZW1haW5pbmdUaW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSB0aW1lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbWFpbmluZ1RpbWUkKSB7XG4gICAgICB0aGlzLnJlbWFpbmluZ1RpbWUkID0gdGhpcy5pbnRlcm5hbFJlbWFpbmluZ1RpbWUkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gIH1cblxuICBvbk1lc3NhZ2VDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICAgIHRoaXMubWVzc2FnZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU2VuZE1lc3NhZ2UoKTogdm9pZCB7XG4gICAgLy8gRm9yIHRlc3QgY2FzZSBncm91cCBtb2RlIHdpdGggdGltZW91dFxuICAgIGlmICh0aGlzLmlzVGVzdENhc2VHcm91cE1vZGUgJiYgdGhpcy5pc1RpbWVvdXQgJiYgdGhpcy5tZXNzYWdlKSB7XG4gICAgICBjb25zdCB0aW1lVmFsdWUgPSBwYXJzZUludCh0aGlzLm1lc3NhZ2UsIDEwKTtcbiAgICAgIGlmICghaXNOYU4odGltZVZhbHVlKSkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlLmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICd0ZXN0X2Nhc2VfdGltZV9hZGQnLFxuICAgICAgICAgIGRhdGE6IHsgdGltZTogdGltZVZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVmYXVsdFxuICAgIHRoaXMuc2VuZE1lc3NhZ2UuZW1pdCgpO1xuICB9XG5cbiAgb25TdG9wQWdlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wQWdlbnQuZW1pdCgpO1xuICB9XG5cbiAgb25TdGVwQWN0aW9uKGFjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcElkKSB7XG4gICAgICB0aGlzLnN0ZXBBY3Rpb24uZW1pdCh7IGFjdGlvbiwgc3RlcElkOiB0aGlzLnN0ZXBJZCB9KTtcbiAgICB9XG4gIH1cblxuICBvblVwZGF0ZVN0ZXBEYXRhKGFjdGlvbjogc3RyaW5nLCB0eXBlOiAnbG9jYXRvcicgfCAnbWV0YWRhdGEnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcElkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0ZXBEYXRhLmVtaXQoeyBhY3Rpb24sIHR5cGUsIHN0ZXBJZDogdGhpcy5zdGVwSWQgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZWRpcmVjdFRvQ0UoKTogdm9pZCB7XG4gICAgdGhpcy5yZWRpcmVjdFRvQ0UuZW1pdCgpO1xuICB9XG5cbiAgb25TaG93VXNlcklucHV0RmllbGRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNob3dVc2VySW5wdXRGaWVsZENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU2hvd1VzZXJJbnB1dEZpZWxkaW5EZWJ1Z0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd1VzZXJJbnB1dEZpZWxkaW5EZWJ1Z0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9OiR7cmVtYWluaW5nU2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1gO1xuICB9XG5cbiAgZ2V0RGFzaE9mZnNldChyZW1haW5pbmdUaW1lOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2dyZXNzID0gMSAtIHJlbWFpbmluZ1RpbWUgLyAoMiAqIDYwKTtcbiAgICByZXR1cm4gdGhpcy5jaXJjbGVDaXJjdW1mZXJlbmNlICogcHJvZ3Jlc3M7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIGdldHRlcnMgZm9yIHRlbXBsYXRlXG4gIGdldCBpc1N0ZXBSZWd1bGFyTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc3RlcC1yZWd1bGFyJztcbiAgfVxuXG4gIGdldCBpc1N0ZXBEZWJ1Z01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3N0ZXAtZGVidWcnO1xuICB9XG5cbiAgZ2V0IGlzVGVzdENhc2VHcm91cE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3Rlc3QtY2FzZS1ncm91cCc7XG4gIH1cblxuICBnZXQgc2hvdWxkU2hvd1N0ZXBSZWd1bGFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmlzU3RlcFJlZ3VsYXJNb2RlICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbiAmJlxuICAgICAgdGhpcy5jb252ZXJzYXRpb24uaWQgPT09IHRoaXMuc3RlcElkICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbi5zdGVwU3RhdHVzID09PSAnQ09OVkVSU0FUSU9OJyAmJlxuICAgICAgdGhpcy5zdGVwRnJvbSAhPT0gJ0RFQlVHR0VfV0lUSF9BSScpO1xuICB9XG5cbiAgZ2V0IHNob3VsZFNob3dTdGVwRGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuaXNTdGVwRGVidWdNb2RlICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbiAmJlxuICAgICAgdGhpcy5jb252ZXJzYXRpb24uaWQgPT09IHRoaXMuc3RlcElkICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbi5zdGVwU3RhdHVzID09PSAnQ09OVkVSU0FUSU9OJyAmJlxuICAgICAgdGhpcy5zdGVwRnJvbSA9PT0gJ0RFQlVHR0VfV0lUSF9BSScpO1xuICB9XG5cbiAgZ2V0IHNob3VsZFNob3dUZXN0Q2FzZUdyb3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmlzVGVzdENhc2VHcm91cE1vZGUgJiZcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uICYmXG4gICAgICB0aGlzLmV4ZWN1dGlvblN0YXR1cyAhPT0gJ0NPTVBMRVRFRCcpO1xuICB9XG5cbiAgZ2V0IGlzTG9jYXRvck5vdERldGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJzYXRpb24/LnN0ZXBTdGF0dXMgPT09ICdMT0NBVE9SX05PVF9ERVRFQ1QnO1xuICB9XG5cbiAgZ2V0IGlzVGltZW91dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJzYXRpb24/LnN0ZXBTdGF0dXMgPT09ICdUSU1FT1VUJztcbiAgfVxuXG4gIGdldCBpbnB1dFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lb3V0ID8gJ0VudGVyIFRpbWVvdXQgaW4gc2VjJyA6ICdFbnRlciBJbnB1dCc7XG4gIH1cblxuICBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lb3V0ID8gJ251bWJlcicgOiAndGV4dCc7XG4gIH1cblxuICBnZXQgaXNJbnB1dERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jb252ZXJzYXRpb24gfHwgIXRoaXMuY29udmVyc2F0aW9uPy5yZXBseUJhY2tfaWQ7XG4gIH1cblxuICBnZXQgaXNSZXN1bWVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNMb2NhdG9yTm90RGV0ZWN0ICYmICghdGhpcy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZS50cmltKCkgPT09ICcnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDwhLS0gU3RlcCBSZWd1bGFyIE1vZGUgQ29udmVyc2F0aW9uIFNlY3Rpb24gLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3VsZFNob3dTdGVwUmVndWxhclwiXG4gICAgY2xhc3M9XCJjb252ZXJzYXRpb24tc2VjdGlvbiBtdC0yIHAtM1wiXG4gICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRkVGM0M3OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICNGQ0QzNEQ7XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWFjdGlvbi1wcm9tcHRcIiAqbmdJZj1cIiFzaG93VXNlcklucHV0RmllbGRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9tcHQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWItMlwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTggMTRBNiA2IDAgMSAwIDggMmE2IDYgMCAwIDAgMCAxMnpcIiBzdHJva2U9XCIjOTI0MDBFXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCAxMVY4XCIgc3Ryb2tlPVwiIzkyNDAwRVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTggNUg4LjAxXCIgc3Ryb2tlPVwiIzkyNDAwRVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICM5MjQwMEU7XCI+VXNlciBpbnB1dCByZXF1aXJlZCB0byBwcm9jZWVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvbXB0LWFjdGlvbnMgZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2hvd1VzZXJJbnB1dEZpZWxkQ2hhbmdlKHRydWUpXCJcbiAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzNGNDNFRTsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgRW50ZXIgbW9yZSBkZXRhaWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3RvcEFnZW50KClcIlxuICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxNHB4O1wiXG4gICAgICAgID5cbiAgICAgICAgICBTdG9wXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbnB1dC1zZWN0aW9uXCIgKm5nSWY9XCJzaG93VXNlcklucHV0RmllbGRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZC1mbGV4IGdhcC0yIG1iLTJcIj5cbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHlvdXIgcmVzcG9uc2UuLi5cIlxuICAgICAgICAgIFtuZ01vZGVsXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWVzc2FnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25TZW5kTWVzc2FnZSgpXCJcbiAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgYXV0b2ZvY3VzXG4gICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgY29sb3I6ICMwQTBBMEE7IHJlc2l6ZTogbm9uZTtcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwic2VuZC1idXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VuZE1lc3NhZ2UoKVwiXG4gICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICMzRjQzRUU7IGNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyO1wiXG4gICAgICAgID5cbiAgICAgICAgICBTZW5kXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblNob3dVc2VySW5wdXRGaWVsZENoYW5nZShmYWxzZSlcIlxuICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkICNEMUQ1REI7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgPlxuICAgICAgICBCYWNrXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIERlYnVnIE1vZGUgQ29udmVyc2F0aW9uIFNlY3Rpb24gLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3VsZFNob3dTdGVwRGVidWdcIlxuICAgIGNsYXNzPVwiY29udmVyc2F0aW9uLXNlY3Rpb24gbXQtMiBwLTNcIlxuICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0ZFRjNDNzsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCAjRkNEMzREO1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1hY3Rpb24tcHJvbXB0XCIgKm5nSWY9XCIhc2hvd1VzZXJJbnB1dEZpZWxkaW5EZWJ1Z1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInByb21wdC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0yXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCAxNEE2IDYgMCAxIDAgOCAyYTYgNiAwIDAgMCAwIDEyelwiIHN0cm9rZT1cIiM5MjQwMEVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk04IDExVjhcIiBzdHJva2U9XCIjOTI0MDBFXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCA1SDguMDFcIiBzdHJva2U9XCIjOTI0MDBFXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzkyNDAwRTtcIj5Vc2VyIGlucHV0IHJlcXVpcmVkIHRvIHByb2NlZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9tcHQtYWN0aW9ucyBkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TaG93VXNlcklucHV0RmllbGRpbkRlYnVnQ2hhbmdlKHRydWUpXCJcbiAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzNGNDNFRTsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgRW50ZXIgbW9yZSBkZXRhaWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3RlcEFjdGlvbignc2tpcCcpXCJcbiAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkICNEMUQ1REI7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgU2tpcCBTdGVwXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3RlcEFjdGlvbignc2tpcF9kZWxldGUnKVwiXG4gICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCAjRDFENURCOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7XCJcbiAgICAgICAgPlxuICAgICAgICAgIERlbGV0ZSBTdGVwXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbnB1dC1zZWN0aW9uXCIgKm5nSWY9XCJzaG93VXNlcklucHV0RmllbGRpbkRlYnVnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGQtZmxleCBnYXAtMiBtYi0yXCI+XG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGRcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB5b3VyIHJlc3BvbnNlLi4uXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJtZXNzYWdlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1lc3NhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uU2VuZE1lc3NhZ2UoKVwiXG4gICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkICNEMUQ1REI7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IGNvbG9yOiAjMEEwQTBBOyByZXNpemU6IG5vbmU7XCJcbiAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9tcHQtYWN0aW9ucyBkLWZsZXggZ2FwLTIgbWItMlwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlU3RlcERhdGEoJ3JlUnVuJywgJ21ldGFkYXRhJylcIlxuICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiAjM0Y0M0VFOyBjb2xvcjogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxNHB4O1wiXG4gICAgICAgID5cbiAgICAgICAgICBVcGRhdGUgYW5kIFJlcnVuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlU3RlcERhdGEoJ2FpQWdlbnQnLCAnbWV0YWRhdGEnKVwiXG4gICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICMzRjQzRUU7IGNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7XCJcbiAgICAgICAgPlxuICAgICAgICAgIEFkZCBOZXcgU3RlcHMgYW5kIFJlcnVuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblNob3dVc2VySW5wdXRGaWVsZGluRGVidWdDaGFuZ2UoZmFsc2UpXCJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCAjRDFENURCOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7XCJcbiAgICAgID5cbiAgICAgICAgQmFja1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVGVzdCBDYXNlIEdyb3VwIExldmVsIENvbnZlcnNhdGlvbiBJbnB1dCBTZWN0aW9uIC0tPlxuICA8ZGl2XG4gICpuZ0lmPVwic2hvdWxkU2hvd1Rlc3RDYXNlR3JvdXBcIlxuICBjbGFzcz1cImNvbnZlcnNhdGlvbi1pbnB1dC1zZWN0aW9uIG10LTMgcC0zXCJcbiAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRUZGNkZGOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICNCRURCRkY7XCJcbj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInJlbWFpbmluZ1RpbWUkIHwgYXN5bmMgYXMgcmVtYWluaW5nVGltZVwiXG4gICAgICBjbGFzcz1cIm1pbmktdGltZXItY29udGFpbmVyXCJcbiAgICA+XG4gICAgICA8c3ZnIGNsYXNzPVwibWluaS1wcm9ncmVzcy1yaW5nXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCI+XG4gICAgICAgIDxjaXJjbGVcbiAgICAgICAgICBjbGFzcz1cIm1pbmktcHJvZ3Jlc3MtcmluZ19fY2lyY2xlXCJcbiAgICAgICAgICBzdHJva2U9XCIjM2U5OGM3XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCJcbiAgICAgICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgIHI9XCIyMFwiXG4gICAgICAgICAgY3g9XCIyMlwiXG4gICAgICAgICAgY3k9XCIyMlwiXG4gICAgICAgICAgW3N0eWxlLnN0cm9rZURhc2hhcnJheV09XCJjaXJjbGVDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICBbc3R5bGUuc3Ryb2tlRGFzaG9mZnNldC5weF09XCJnZXREYXNoT2Zmc2V0KHJlbWFpbmluZ1RpbWUpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvc3ZnPlxuICAgICAgPGRpdiBjbGFzcz1cIm1pbmktdGltZXItdGV4dFwiIHN0eWxlPVwiY29sb3I6ICMzNzQxNTE7IGZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLXRpbWVcIj57e1xuICAgICAgICAgIGZvcm1hdFRpbWUocmVtYWluaW5nVGltZSlcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8aW5wdXRcbiAgICAgICpuZ0lmPVwiIWlzTG9jYXRvck5vdERldGVjdFwiXG4gICAgICBbbmdNb2RlbF09XCJtZXNzYWdlXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWVzc2FnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpc0lucHV0RGlzYWJsZWRcIlxuICAgICAgW3R5cGVdPVwiaW5wdXRUeXBlXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIHN0eWxlPVwiXG4gICAgICAgIGhlaWdodDogMzZweDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtcbiAgICAgICAgY29sb3I6ICMwQTBBMEE7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnMgZWFzZSwgYm94LXNoYWRvdyAwLjJzIGVhc2U7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBcIlxuICAgICAgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJpc0lucHV0RGlzYWJsZWQgPyAnI0U1RTdFQicgOiAnI0QxRDVEQidcIlxuICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXNJbnB1dERpc2FibGVkID8gJyNGOUZBRkInIDogJyNGRkZGRkYnXCJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJpc0lucHV0RGlzYWJsZWQgPyAnIzlDQTNBRicgOiAnIzBBMEEwQSdcIlxuICAgICAgW3N0eWxlLmN1cnNvcl09XCJpc0lucHV0RGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3RleHQnXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJpbnB1dFBsYWNlaG9sZGVyXCJcbiAgICAgIG9uZm9jdXM9XCJpZiAoIXRoaXMuZGlzYWJsZWQpIHsgdGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0nIzE0NDdFNic7IHRoaXMuc3R5bGUuYm94U2hhZG93PScwIDAgMCAzcHggcmdiYSg2MywgNjcsIDIzOCwgMC4xKSc7IH1cIlxuICAgICAgb25ibHVyPVwidGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0nI0QxRDVEQic7IHRoaXMuc3R5bGUuYm94U2hhZG93PSdub25lJztcIlxuICAgIC8+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJpc0xvY2F0b3JOb3REZXRlY3RcIlxuICAgICAgKGNsaWNrKT1cIm9uUmVkaXJlY3RUb0NFKClcIlxuICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xuICAgICAgICAgIGNvbG9yOiAjMzc0MTUxO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgZWFzZTtcbiAgICAgICAgXCJcbiAgICAgICAgb25tb3VzZW92ZXI9XCJ0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0nI0Y5RkFGQidcIlxuICAgICAgICBvbm1vdXNlb3V0PVwidGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9JyNGRkZGRkYnXCJcbiAgICAgID5cbiAgICAgICAgUmVjb3JkXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwiaXNSZXN1bWVEaXNhYmxlZFwiXG4gICAgICBjbGFzcz1cImJ0blwiXG4gICAgICAoY2xpY2spPVwib25TZW5kTWVzc2FnZSgpXCJcbiAgICAgIHN0eWxlPVwiXG4gICAgICAgIGhlaWdodDogMzZweDtcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ0N0U2O1xuICAgICAgICBjb2xvcjogI0ZGRkZGRjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlO1xuICAgICAgXCJcbiAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImlzUmVzdW1lRGlzYWJsZWQgPyAnI0UyRTJFMycgOiAnIzE0NDdFNidcIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cImlzUmVzdW1lRGlzYWJsZWQgPyAnIzlDQTNBRicgOiAnI0ZGRkZGRidcIlxuICAgICAgW3N0eWxlLmN1cnNvcl09XCJpc1Jlc3VtZURpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJ1wiXG4gICAgICBvbm1vdXNlb3Zlcj1cImlmICghdGhpcy5kaXNhYmxlZCkgdGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9JyMwRjNDQkEnXCJcbiAgICAgIG9ubW91c2VvdXQ9XCJpZiAoIXRoaXMuZGlzYWJsZWQpIHRoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yPScjMTQ0N0U2J1wiXG4gICAgPlxuICAgICAgUmVzdW1lXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG48L2Rpdj4iXX0=