UNPKG

angular-ng-popup-modal

Version:

A lightweight, configurable, and developer-friendly popup modal for Angular applications. Built using **Angular CLI v15.1.0**, this modal component helps you plug clean confirmation dialogs into your app without any hassle.

123 lines 30.9 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { ButtonModule } from 'primeng/button'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "@angular/common"; import * as i3 from "primeng/button"; import * as i4 from "@angular/forms"; export class NgPopupModalComponent { constructor(sanitizer) { this.sanitizer = sanitizer; this.popupHead = ''; this.confrmText = 'Please confirm to moving forward.'; this.showHTML = 'N'; this.confirmLable = 'Yes'; this.cancelLable = 'No'; this.confirmIcon = 'pi pi-check'; this.cancelIcon = 'pi pi-times'; this.contentIcon = 'pi pi-info-circle'; this.isVisible = true; this.iconColor = '#007567ce'; this.showConfirmation = true; this.showCancel = true; this.addressList = []; this.showRemarks = false; this.showRemarksBtn = false; this.showDropDown = false; this.dropdownname = ''; this.dropDownValues = []; this.isDropDownDisabled = true; this.selectedValue = ''; this.popupWidth = 'small'; this.getConfirmStatus = new EventEmitter(); this.getAddress = new EventEmitter(); this.remarks = ''; } ngOnChanges(simpleChange) { if (simpleChange['textHTML']) { this.textHTML = simpleChange['textHTML'].currentValue; this.safeHtml(this.textHTML); } } safeHtml(html) { this.textHTML = this.sanitizer.bypassSecurityTrustHtml(html); } getSafeHtml(html) { return this.sanitizer.bypassSecurityTrustHtml(html); } confirmNameChange(status) { if (status == 'Y') { this.getConfirmStatus.emit('Y'); } else if (status == 'Rem') { this.getConfirmStatus.emit({ status: 'Y', remark: this.remarks, KRALifeCycle: this.selectedValue }); } else { this.getConfirmStatus.emit('N'); } this.isVisible = false; } setAddress(address) { if (address) { this.getAddress.emit(address); this.isVisible = false; } } } NgPopupModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgPopupModalComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); NgPopupModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: NgPopupModalComponent, isStandalone: true, selector: "lib-ng-popup-modal", inputs: { popupHead: "popupHead", confrmText: "confrmText", textHTML: "textHTML", showHTML: "showHTML", confirmLable: "confirmLable", cancelLable: "cancelLable", confirmIcon: "confirmIcon", cancelIcon: "cancelIcon", contentIcon: "contentIcon", isVisible: "isVisible", iconColor: "iconColor", showConfirmation: "showConfirmation", showCancel: "showCancel", addressList: "addressList", showRemarks: "showRemarks", showRemarksBtn: "showRemarksBtn", showDropDown: "showDropDown", dropdownname: "dropdownname", dropDownValues: "dropDownValues", isDropDownDisabled: "isDropDownDisabled", selectedValue: "selectedValue", popupWidth: "popupWidth" }, outputs: { getConfirmStatus: "getConfirmStatus", getAddress: "getAddress" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"popup-overlay\" *ngIf=\"isVisible\">\r\n <div class=\"pop-content\">\r\n <div [class]=\"popupWidth\">\r\n <div class=\"popup-head\">\r\n <span class=\"pop-head-text\">{{popupHead}}</span>\r\n </div>\r\n <div class=\"confirm-text\" *ngIf=\"addressList?.length\">\r\n <span style=\"font-size: 12px;\">{{confrmText}}</span>\r\n </div>\r\n\r\n <div class=\"popup-text\" *ngIf=\"!addressList.length\">\r\n <div>\r\n <span><i [class]=\"contentIcon\" [ngStyle]=\"{ 'color': iconColor }\"></i></span>\r\n </div>\r\n <div class=\"mt-2 confirm-text\" *ngIf=\"showHTML == 'N'; else htmlContent\">\r\n <span style=\"font-size: 12px;\">{{confrmText}}</span>\r\n </div>\r\n <ng-template #htmlContent>\r\n <div [innerHTML]=\"textHTML\"></div>\r\n </ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"showDropDown\" class=\"mt-2\">\r\n <div class=\"col-6\" style=\"margin-left: 14px;\">\r\n <div class=\"row dropDownHead\">\r\n {{dropdownname}}\r\n </div>\r\n <div class=\"row\" style=\"padding-top: 3px;\">\r\n <select id=\"drop1\" name=\"Drop1\" class=\"dropDownCls\" [(ngModel)]=\"selectedValue\"\r\n [disabled]=\"isDropDownDisabled\" style=\"width: 100%;cursor:pointer;padding-left: 0px;\">\r\n <option *ngFor=\"let item of dropDownValues\" [ngValue]=\"item.Code\">\r\n {{item.Description}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showRemarks\" class=\"remarks-section mt-1\">\r\n <textarea id=\"remarks\" [(ngModel)]=\"remarks\" rows=\"3\" class=\"form-control\"\r\n placeholder=\"Enter remarks here...\"></textarea>\r\n </div>\r\n\r\n <div *ngIf=\"addressList?.length\" class=\"addList\">\r\n <div *ngFor=\"let add of addressList\">\r\n <div class=\"p-8 add-card\" (click)=\"setAddress(add)\">\r\n <div id=\"addressList\" class=\"p-0 overflow-y-auto flex-grow\">\r\n <div\r\n class=\"address-option p-3 border-b border-gray-100 cursor-pointer rounded-lg mb-2 last:mb-0 last:border-b-0\">\r\n <h4 class=\"font-sm text-gray-600 mb-0\">{{add.City ? add.City :\r\n add.District}}</h4>\r\n <p class=\"text-sm text-gray-400 mb-0\">{{add.City ? add.District +\r\n ',' :\r\n ''}} {{add.StateName}}</p>\r\n <p class=\"text-xs text-gray-300 mb-0\">{{add.CountryName ||\r\n ''}}</p>\r\n <p class=\"text-xs text-gray-300 mb-0\">{{add.PinCode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"popup-footer\">\r\n <p-button *ngIf=\"showConfirmation\" class=\"primaryButton\" [icon]=\"confirmIcon\" [label]=\"confirmLable\"\r\n (onClick)=\"confirmNameChange('Y')\"></p-button>\r\n <p-button *ngIf=\"showRemarks && showRemarksBtn\" class=\"active-btn\" [icon]=\"confirmIcon\"\r\n [label]=\"confirmLable\" (onClick)=\"confirmNameChange('Rem')\" [disabled]=\"!remarks\"></p-button>\r\n <p-button *ngIf=\"showCancel\" class=\"secondaryButtons ms-2\" [icon]=\"cancelIcon\" [label]=\"cancelLable\"\r\n (onClick)=\"confirmNameChange('N')\"></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".popup-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:9998}.pop-content{border-radius:20px;background-color:#fff;min-height:200px;z-index:9999;position:relative;overflow-wrap:break-word;white-space:normal;padding:10px}.small{width:345px}.medium{width:500px}.large{width:800px}.popup-text{display:flex;align-items:center;gap:.5rem;flex-direction:column}.popup-text .pi{font-size:3.5rem!important}.popup-head{display:flex!important;align-items:center!important;justify-content:space-between!important;flex-shrink:0!important;padding:.5rem!important}.pop-head-text{font-weight:600;font-size:15px}.popup-footer{display:flex;justify-self:flex-end;margin-right:8px;margin-top:25px}.confirm-text{padding:0 10px;text-align:justify;word-wrap:break-word;overflow-wrap:break-word;white-space:normal}.header{font-weight:700;margin-bottom:.5rem}.address-option:hover{background-color:#c9cbd2cc}.addList{max-height:350px;overflow-y:auto}.add-card{cursor:pointer}:host ::ng-deep .remarks-section textarea::placeholder{color:#ddd!important;font-size:11px!important}:host ::ng-deep .remarks-section textarea{color:#495057!important;font-size:12px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgPopupModalComponent, decorators: [{ type: Component, args: [{ selector: 'lib-ng-popup-modal', standalone: true, imports: [CommonModule, ButtonModule, FormsModule], template: "<div class=\"popup-overlay\" *ngIf=\"isVisible\">\r\n <div class=\"pop-content\">\r\n <div [class]=\"popupWidth\">\r\n <div class=\"popup-head\">\r\n <span class=\"pop-head-text\">{{popupHead}}</span>\r\n </div>\r\n <div class=\"confirm-text\" *ngIf=\"addressList?.length\">\r\n <span style=\"font-size: 12px;\">{{confrmText}}</span>\r\n </div>\r\n\r\n <div class=\"popup-text\" *ngIf=\"!addressList.length\">\r\n <div>\r\n <span><i [class]=\"contentIcon\" [ngStyle]=\"{ 'color': iconColor }\"></i></span>\r\n </div>\r\n <div class=\"mt-2 confirm-text\" *ngIf=\"showHTML == 'N'; else htmlContent\">\r\n <span style=\"font-size: 12px;\">{{confrmText}}</span>\r\n </div>\r\n <ng-template #htmlContent>\r\n <div [innerHTML]=\"textHTML\"></div>\r\n </ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"showDropDown\" class=\"mt-2\">\r\n <div class=\"col-6\" style=\"margin-left: 14px;\">\r\n <div class=\"row dropDownHead\">\r\n {{dropdownname}}\r\n </div>\r\n <div class=\"row\" style=\"padding-top: 3px;\">\r\n <select id=\"drop1\" name=\"Drop1\" class=\"dropDownCls\" [(ngModel)]=\"selectedValue\"\r\n [disabled]=\"isDropDownDisabled\" style=\"width: 100%;cursor:pointer;padding-left: 0px;\">\r\n <option *ngFor=\"let item of dropDownValues\" [ngValue]=\"item.Code\">\r\n {{item.Description}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showRemarks\" class=\"remarks-section mt-1\">\r\n <textarea id=\"remarks\" [(ngModel)]=\"remarks\" rows=\"3\" class=\"form-control\"\r\n placeholder=\"Enter remarks here...\"></textarea>\r\n </div>\r\n\r\n <div *ngIf=\"addressList?.length\" class=\"addList\">\r\n <div *ngFor=\"let add of addressList\">\r\n <div class=\"p-8 add-card\" (click)=\"setAddress(add)\">\r\n <div id=\"addressList\" class=\"p-0 overflow-y-auto flex-grow\">\r\n <div\r\n class=\"address-option p-3 border-b border-gray-100 cursor-pointer rounded-lg mb-2 last:mb-0 last:border-b-0\">\r\n <h4 class=\"font-sm text-gray-600 mb-0\">{{add.City ? add.City :\r\n add.District}}</h4>\r\n <p class=\"text-sm text-gray-400 mb-0\">{{add.City ? add.District +\r\n ',' :\r\n ''}} {{add.StateName}}</p>\r\n <p class=\"text-xs text-gray-300 mb-0\">{{add.CountryName ||\r\n ''}}</p>\r\n <p class=\"text-xs text-gray-300 mb-0\">{{add.PinCode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"popup-footer\">\r\n <p-button *ngIf=\"showConfirmation\" class=\"primaryButton\" [icon]=\"confirmIcon\" [label]=\"confirmLable\"\r\n (onClick)=\"confirmNameChange('Y')\"></p-button>\r\n <p-button *ngIf=\"showRemarks && showRemarksBtn\" class=\"active-btn\" [icon]=\"confirmIcon\"\r\n [label]=\"confirmLable\" (onClick)=\"confirmNameChange('Rem')\" [disabled]=\"!remarks\"></p-button>\r\n <p-button *ngIf=\"showCancel\" class=\"secondaryButtons ms-2\" [icon]=\"cancelIcon\" [label]=\"cancelLable\"\r\n (onClick)=\"confirmNameChange('N')\"></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".popup-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:9998}.pop-content{border-radius:20px;background-color:#fff;min-height:200px;z-index:9999;position:relative;overflow-wrap:break-word;white-space:normal;padding:10px}.small{width:345px}.medium{width:500px}.large{width:800px}.popup-text{display:flex;align-items:center;gap:.5rem;flex-direction:column}.popup-text .pi{font-size:3.5rem!important}.popup-head{display:flex!important;align-items:center!important;justify-content:space-between!important;flex-shrink:0!important;padding:.5rem!important}.pop-head-text{font-weight:600;font-size:15px}.popup-footer{display:flex;justify-self:flex-end;margin-right:8px;margin-top:25px}.confirm-text{padding:0 10px;text-align:justify;word-wrap:break-word;overflow-wrap:break-word;white-space:normal}.header{font-weight:700;margin-bottom:.5rem}.address-option:hover{background-color:#c9cbd2cc}.addList{max-height:350px;overflow-y:auto}.add-card{cursor:pointer}:host ::ng-deep .remarks-section textarea::placeholder{color:#ddd!important;font-size:11px!important}:host ::ng-deep .remarks-section textarea{color:#495057!important;font-size:12px!important}\n"] }] }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { popupHead: [{ type: Input }], confrmText: [{ type: Input }], textHTML: [{ type: Input }], showHTML: [{ type: Input }], confirmLable: [{ type: Input }], cancelLable: [{ type: Input }], confirmIcon: [{ type: Input }], cancelIcon: [{ type: Input }], contentIcon: [{ type: Input }], isVisible: [{ type: Input }], iconColor: [{ type: Input }], showConfirmation: [{ type: Input }], showCancel: [{ type: Input }], addressList: [{ type: Input }], showRemarks: [{ type: Input }], showRemarksBtn: [{ type: Input }], showDropDown: [{ type: Input }], dropdownname: [{ type: Input }], dropDownValues: [{ type: Input }], isDropDownDisabled: [{ type: Input }], selectedValue: [{ type: Input }], popupWidth: [{ type: Input }], getConfirmStatus: [{ type: Output }], getAddress: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcG9wdXAtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcG9wdXAtbW9kYWwvc3JjL2xpYi9uZy1wb3B1cC1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wb3B1cC1tb2RhbC9zcmMvbGliL25nLXBvcHVwLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFTOUMsTUFBTSxPQUFPLHFCQUFxQjtJQStCaEMsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTdCbEMsY0FBUyxHQUFRLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQVEsbUNBQW1DLENBQUM7UUFFdEQsYUFBUSxHQUFRLEdBQUcsQ0FBQztRQUNwQixpQkFBWSxHQUFRLEtBQUssQ0FBQTtRQUN6QixnQkFBVyxHQUFRLElBQUksQ0FBQTtRQUN2QixnQkFBVyxHQUFRLGFBQWEsQ0FBQTtRQUNoQyxlQUFVLEdBQVEsYUFBYSxDQUFBO1FBQy9CLGdCQUFXLEdBQVEsbUJBQW1CLENBQUE7UUFDdEMsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixjQUFTLEdBQVEsV0FBVyxDQUFBO1FBQzVCLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUNqQyxlQUFVLEdBQVksSUFBSSxDQUFDO1FBQzNCLGdCQUFXLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLGdCQUFXLEdBQVksS0FBSyxDQUFD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O2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1uZy1wb3B1cC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctcG9wdXAtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZy1wb3B1cC1tb2RhbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5nUG9wdXBNb2RhbENvbXBvbmVudCB7XG5cbiAgQElucHV0KCkgcG9wdXBIZWFkOiBhbnkgPSAnJztcbiAgQElucHV0KCkgY29uZnJtVGV4dDogYW55ID0gJ1BsZWFzZSBjb25maXJtIHRvIG1vdmluZyBmb3J3YXJkLic7XG4gIEBJbnB1dCgpIHRleHRIVE1MITogU2FmZUh0bWw7XG4gIEBJbnB1dCgpIHNob3dIVE1MOiBhbnkgPSAnTic7XG4gIEBJbnB1dCgpIGNvbmZpcm1MYWJsZTogYW55ID0gJ1llcydcbiAgQElucHV0KCkgY2FuY2VsTGFibGU6IGFueSA9ICdObydcbiAgQElucHV0KCkgY29uZmlybUljb246IGFueSA9ICdwaSBwaS1jaGVjaydcbiAgQElucHV0KCkgY2FuY2VsSWNvbjogYW55ID0gJ3BpIHBpLXRpbWVzJ1xuICBASW5wdXQoKSBjb250ZW50SWNvbjogYW55ID0gJ3BpIHBpLWluZm8tY2lyY2xlJ1xuICBASW5wdXQoKSBpc1Zpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpY29uQ29sb3I6IGFueSA9ICcjMDA3NTY3Y2UnXG4gIEBJbnB1dCgpIHNob3dDb25maXJtYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q2FuY2VsOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWRkcmVzc0xpc3Q6IGFueSA9IFtdO1xuICBASW5wdXQoKSBzaG93UmVtYXJrczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93UmVtYXJrc0J0bjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNob3dEcm9wRG93bjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkcm9wZG93bm5hbWU6IGFueSA9ICcnO1xuICBASW5wdXQoKSBkcm9wRG93blZhbHVlczogYW55ID0gW107XG4gIEBJbnB1dCgpIGlzRHJvcERvd25EaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU6IGFueSA9ICcnO1xuICBASW5wdXQoKSBwb3B1cFdpZHRoOiAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnID0gJ3NtYWxsJztcblxuICBAT3V0cHV0KCkgZ2V0Q29uZmlybVN0YXR1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdldEFkZHJlc3MgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVtYXJrczogYW55ID0gJyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikgeyB9XG4gIFxuICBuZ09uQ2hhbmdlcyhzaW1wbGVDaGFuZ2U6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoc2ltcGxlQ2hhbmdlWyd0ZXh0SFRNTCddKSB7XG4gICAgICB0aGlzLnRleHRIVE1MID0gc2ltcGxlQ2hhbmdlWyd0ZXh0SFRNTCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuc2FmZUh0bWwodGhpcy50ZXh0SFRNTCk7XG4gICAgfVxuICB9XG5cbiAgc2FmZUh0bWwoaHRtbDogYW55KSB7XG4gICAgdGhpcy50ZXh0SFRNTCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xuICB9XG5cbiAgZ2V0U2FmZUh0bWwoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcbiAgfVxuXG4gIGNvbmZpcm1OYW1lQ2hhbmdlKHN0YXR1czogYW55KSB7XG4gICAgaWYgKHN0YXR1cyA9PSAnWScpIHtcbiAgICAgIHRoaXMuZ2V0Q29uZmlybVN0YXR1cy5lbWl0KCdZJyk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gJ1JlbScpIHtcbiAgICAgIHRoaXMuZ2V0Q29uZmlybVN0YXR1cy5lbWl0KHtzdGF0dXMgOiAnWScsIHJlbWFyayA6IHRoaXMucmVtYXJrcywgS1JBTGlmZUN5Y2xlOiB0aGlzLnNlbGVjdGVkVmFsdWV9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmdldENvbmZpcm1TdGF0dXMuZW1pdCgnTicpO1xuXG4gICAgfVxuICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XG4gIH0gXG5cbiAgc2V0QWRkcmVzcyhhZGRyZXNzOiBhbnkpIHtcbiAgICBpZiAoYWRkcmVzcykge1xuICAgICAgdGhpcy5nZXRBZGRyZXNzLmVtaXQoYWRkcmVzcyk7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBvcHVwLW92ZXJsYXlcIiAqbmdJZj1cImlzVmlzaWJsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBvcC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicG9wdXBXaWR0aFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtaGVhZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3AtaGVhZC10ZXh0XCI+e3twb3B1cEhlYWR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLXRleHRcIiAqbmdJZj1cImFkZHJlc3NMaXN0Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1wiPnt7Y29uZnJtVGV4dH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC10ZXh0XCIgKm5nSWY9XCIhYWRkcmVzc0xpc3QubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIFtjbGFzc109XCJjb250ZW50SWNvblwiIFtuZ1N0eWxlXT1cInsgJ2NvbG9yJzogaWNvbkNvbG9yIH1cIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBjb25maXJtLXRleHRcIiAqbmdJZj1cInNob3dIVE1MID09ICdOJzsgZWxzZSBodG1sQ29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1wiPnt7Y29uZnJtVGV4dH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2h0bWxDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJ0ZXh0SFRNTFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0Ryb3BEb3duXCIgY2xhc3M9XCJtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxNHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZHJvcERvd25IZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ZHJvcGRvd25uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogM3B4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwiZHJvcDFcIiBuYW1lPVwiRHJvcDFcIiBjbGFzcz1cImRyb3BEb3duQ2xzXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Ryb3BEb3duRGlzYWJsZWRcIiBzdHlsZT1cIndpZHRoOiAxMDAlO2N1cnNvcjpwb2ludGVyO3BhZGRpbmctbGVmdDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkcm9wRG93blZhbHVlc1wiIFtuZ1ZhbHVlXT1cIml0ZW0uQ29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5EZXNjcmlwdGlvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1JlbWFya3NcIiBjbGFzcz1cInJlbWFya3Mtc2VjdGlvbiBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJyZW1hcmtzXCIgWyhuZ01vZGVsKV09XCJyZW1hcmtzXCIgcm93cz1cIjNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciByZW1hcmtzIGhlcmUuLi5cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhZGRyZXNzTGlzdD8ubGVuZ3RoXCIgY2xhc3M9XCJhZGRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhZGQgb2YgYWRkcmVzc0xpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC04IGFkZC1jYXJkXCIgKGNsaWNrKT1cInNldEFkZHJlc3MoYWRkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYWRkcmVzc0xpc3RcIiBjbGFzcz1cInAtMCBvdmVyZmxvdy15LWF1dG8gZmxleC1ncm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGRyZXNzLW9wdGlvbiBwLTMgYm9yZGVyLWIgYm9yZGVyLWdyYXktMTAwIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtbGcgbWItMiBsYXN0Om1iLTAgbGFzdDpib3JkZXItYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiZm9udC1zbSB0ZXh0LWdyYXktNjAwIG1iLTBcIj57e2FkZC5DaXR5ID8gYWRkLkNpdHkgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQuRGlzdHJpY3R9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS00MDAgbWItMFwiPnt7YWRkLkNpdHkgPyBhZGQuRGlzdHJpY3QgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ319IHt7YWRkLlN0YXRlTmFtZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyB0ZXh0LWdyYXktMzAwIG1iLTBcIj57e2FkZC5Db3VudHJ5TmFtZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ319PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyB0ZXh0LWdyYXktMzAwIG1iLTBcIj57e2FkZC5QaW5Db2RlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiAqbmdJZj1cInNob3dDb25maXJtYXRpb25cIiBjbGFzcz1cInByaW1hcnlCdXR0b25cIiBbaWNvbl09XCJjb25maXJtSWNvblwiIFtsYWJlbF09XCJjb25maXJtTGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNvbmZpcm1OYW1lQ2hhbmdlKCdZJylcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPHAtYnV0dG9uICpuZ0lmPVwic2hvd1JlbWFya3MgJiYgc2hvd1JlbWFya3NCdG5cIiBjbGFzcz1cImFjdGl2ZS1idG5cIiBbaWNvbl09XCJjb25maXJtSWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpcm1MYWJsZVwiIChvbkNsaWNrKT1cImNvbmZpcm1OYW1lQ2hhbmdlKCdSZW0nKVwiIFtkaXNhYmxlZF09XCIhcmVtYXJrc1wiPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8cC1idXR0b24gKm5nSWY9XCJzaG93Q2FuY2VsXCIgY2xhc3M9XCJzZWNvbmRhcnlCdXR0b25zIG1zLTJcIiBbaWNvbl09XCJjYW5jZWxJY29uXCIgW2xhYmVsXT1cImNhbmNlbExhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjb25maXJtTmFtZUNoYW5nZSgnTicpXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19