UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

94 lines 16.5 kB
import { Input, Component, Output, EventEmitter, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../../progressbar/progressbar"; import * as i3 from "../../icons/icons"; export class TlToaster { constructor(renderer) { this.renderer = renderer; this.toasterID = ''; this.title = 'Title !'; this.message = 'Message Description'; this.position = ''; this.time = 3000; this.progressBar = 0; this.color = 'primary'; this.width = '400px'; this.height = 'auto'; this.progress = true; this.showIcon = true; this.afterClose = new EventEmitter(); this.closeEvent = new EventEmitter(); } ngOnInit() { this.interval = setInterval(() => { this.progressBar += 100; }, 100); } animationDone(event) { if (event.animationName.includes('toasterOut')) { this.closeEvent.emit(this.toasterID); } } handleClose() { this.timeout = setTimeout(() => { this.close(); }, this.time); } getMessageKeys() { return Object.keys(this.message); } isMessageObject() { return typeof this.message === 'object'; } close() { this.renderer.addClass(this.container.nativeElement, 'ui-toaster-out'); } ngOnChanges(changes) { if (changes['time']) { this.handleClose(); } } ngOnDestroy() { clearInterval(this.interval); clearTimeout(this.timeout); } } /** @nocollapse */ TlToaster.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlToaster, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlToaster.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlToaster, selector: "tl-toaster", inputs: { toasterID: "toasterID", title: "title", icon: "icon", message: "message", position: "position", time: "time", progressBar: "progressBar", color: "color", width: "width", height: "height", progress: "progress", showIcon: "showIcon" }, outputs: { afterClose: "afterClose", closeEvent: "closeEvent" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [class]=\"'ui-toaster-wrapper ' + color\"\n (animationend)=\"animationDone($event)\"\n (click)=\"close()\"\n #container\n [ngStyle]=\"{\n 'border-bottom-left-radius': !progress ? '3px' : '0',\n 'border-bottom-right-radius': !progress ? '3px' : '0',\n 'width': width,\n 'height': height}\">\n <div class=\"ui-toaster-content\"\n [ngStyle]=\"{'grid-template-columns': showIcon ? '50px 1fr' : '1fr', 'padding': ( showIcon && (height !== 'auto') ) ? '0' : '20px' }\">\n <div *ngIf=\"showIcon\" class=\"ui-toaster-icon\"><tl-icon [size]=\"'1.2em'\">{{ icon }}</tl-icon></div>\n <div class=\"ui-toaster-description\">\n <p><b>{{title}}</b></p>\n <p *ngIf=\"!isMessageObject()\" [innerHTML]=\"message\"></p>\n <ng-container *ngIf=\"isMessageObject()\">\n <p *ngFor=\"let item of getMessageKeys()\">\n {{ item }} {{ message[item] }}\n </p>\n </ng-container>\n </div>\n </div>\n <tl-progressbar\n *ngIf=\"progress\"\n [mode]=\"'determinate'\"\n [color]=\"color\"\n [height]=\"'5px'\"\n [progressInfo]=\"'none'\"\n [max]=\"time\"\n [min]=\"0\"\n [position]=\"progressBar\">\n </tl-progressbar>\n</div>\n", styles: [".ui-toaster-wrapper{margin:10px;height:auto;width:300px;border-radius:3px;-webkit-user-select:none;user-select:none;box-sizing:border-box;animation:toasterIn .3s}.ui-toaster-wrapper.ui-toaster-out{animation:toasterOut .3s}.ui-toaster-wrapper:hover{cursor:pointer}.ui-toaster-wrapper .ui-close-button{position:absolute;right:0;top:0;padding:5px;font-size:.8em}.ui-toaster-wrapper .ui-close-button:hover{cursor:pointer}.ui-toaster-wrapper .ui-toaster-content{display:grid;align-items:center;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1.1em;height:100%;box-sizing:border-box;justify-content:center}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-icon{text-align:center;font-size:1.2em}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-description{word-break:break-word;text-align:justify;font-family:Segoe UI,Lato,\"sans-serif\",Arial;white-space:pre-wrap}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-description:first-child{font-size:16px}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-description:last-child{font-size:14px}.ui-toaster-wrapper p{margin:0}.bottom-left{bottom:0;left:0}.bottom-center{bottom:0;left:calc(50% - 150px)}.bottom-right{bottom:0;right:0}.top-left{top:0;left:0}.top-center{top:0;left:calc(50% - 150px)}.top-right{top:0;right:0}@keyframes toasterIn{0%{transform:translateY(-100px);opacity:0}to{opacity:1}}@keyframes toasterOut{to{transform:translateY(-100px);opacity:0}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.TlProgressBar, selector: "tl-progressbar", inputs: ["min", "max", "position", "unit", "height", "shape", "progressInfo", "mode", "color"] }, { kind: "component", type: i3.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlToaster, decorators: [{ type: Component, args: [{ selector: 'tl-toaster', template: "<div [class]=\"'ui-toaster-wrapper ' + color\"\n (animationend)=\"animationDone($event)\"\n (click)=\"close()\"\n #container\n [ngStyle]=\"{\n 'border-bottom-left-radius': !progress ? '3px' : '0',\n 'border-bottom-right-radius': !progress ? '3px' : '0',\n 'width': width,\n 'height': height}\">\n <div class=\"ui-toaster-content\"\n [ngStyle]=\"{'grid-template-columns': showIcon ? '50px 1fr' : '1fr', 'padding': ( showIcon && (height !== 'auto') ) ? '0' : '20px' }\">\n <div *ngIf=\"showIcon\" class=\"ui-toaster-icon\"><tl-icon [size]=\"'1.2em'\">{{ icon }}</tl-icon></div>\n <div class=\"ui-toaster-description\">\n <p><b>{{title}}</b></p>\n <p *ngIf=\"!isMessageObject()\" [innerHTML]=\"message\"></p>\n <ng-container *ngIf=\"isMessageObject()\">\n <p *ngFor=\"let item of getMessageKeys()\">\n {{ item }} {{ message[item] }}\n </p>\n </ng-container>\n </div>\n </div>\n <tl-progressbar\n *ngIf=\"progress\"\n [mode]=\"'determinate'\"\n [color]=\"color\"\n [height]=\"'5px'\"\n [progressInfo]=\"'none'\"\n [max]=\"time\"\n [min]=\"0\"\n [position]=\"progressBar\">\n </tl-progressbar>\n</div>\n", styles: [".ui-toaster-wrapper{margin:10px;height:auto;width:300px;border-radius:3px;-webkit-user-select:none;user-select:none;box-sizing:border-box;animation:toasterIn .3s}.ui-toaster-wrapper.ui-toaster-out{animation:toasterOut .3s}.ui-toaster-wrapper:hover{cursor:pointer}.ui-toaster-wrapper .ui-close-button{position:absolute;right:0;top:0;padding:5px;font-size:.8em}.ui-toaster-wrapper .ui-close-button:hover{cursor:pointer}.ui-toaster-wrapper .ui-toaster-content{display:grid;align-items:center;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1.1em;height:100%;box-sizing:border-box;justify-content:center}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-icon{text-align:center;font-size:1.2em}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-description{word-break:break-word;text-align:justify;font-family:Segoe UI,Lato,\"sans-serif\",Arial;white-space:pre-wrap}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-description:first-child{font-size:16px}.ui-toaster-wrapper .ui-toaster-content>.ui-toaster-description:last-child{font-size:14px}.ui-toaster-wrapper p{margin:0}.bottom-left{bottom:0;left:0}.bottom-center{bottom:0;left:calc(50% - 150px)}.bottom-right{bottom:0;right:0}.top-left{top:0;left:0}.top-center{top:0;left:calc(50% - 150px)}.top-right{top:0;right:0}@keyframes toasterIn{0%{transform:translateY(-100px);opacity:0}to{opacity:1}}@keyframes toasterOut{to{transform:translateY(-100px);opacity:0}}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { toasterID: [{ type: Input }], title: [{ type: Input }], icon: [{ type: Input }], message: [{ type: Input }], position: [{ type: Input }], time: [{ type: Input }], progressBar: [{ type: Input }], color: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], progress: [{ type: Input }], showIcon: [{ type: Input }], afterClose: [{ type: Output }], closeEvent: [{ type: Output }], container: [{ type: ViewChild, args: ['container', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3RvYXN0ZXIvcGFydHMvdG9hc3Rlci50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3RvYXN0ZXIvcGFydHMvdG9hc3Rlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxLQUFLLEVBQUUsU0FBUyxFQUFnQyxNQUFNLEVBQUUsWUFBWSxFQUFjLFNBQVMsRUFFNUYsTUFBTSxlQUFlLENBQUM7Ozs7O0FBT3ZCLE1BQU0sT0FBTyxTQUFTO0lBb0NwQixZQUFzQixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbENoQyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRWYsVUFBSyxHQUFHLFNBQVMsQ0FBQztRQUlsQixZQUFPLEdBQUcscUJBQXFCLENBQUM7UUFFaEMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVkLFNBQUksR0FBRyxJQUFJLENBQUM7UUFFWixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVoQixVQUFLLEdBQUcsU0FBUyxDQUFDO1FBRWxCLFVBQUssR0FBRyxPQUFPLENBQUM7UUFFaEIsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUVoQixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBRWhCLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFFZixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQVFHLENBQUM7SUFFOUMsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFFLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQztRQUMxQixDQUFDLEVBQUUsR0FBRyxDQUFFLENBQUM7SUFDWCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQXFCO1FBQ2pDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1NBQ3JDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBRSxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBTztRQUNqQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDOzswSEE3RVUsU0FBUzs4R0FBVCxTQUFTLGtmQ1Z0Qiw2ckNBaUNBOzRGRHZCYSxTQUFTO2tCQUxyQixTQUFTOytCQUNFLFlBQVk7Z0dBTWIsU0FBUztzQkFBakIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRWlDLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElucHV0LCBDb21wb25lbnQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCgge1xuICBzZWxlY3RvcjogJ3RsLXRvYXN0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9hc3Rlci5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL3RvYXN0ZXIuc2NzcycgXSxcbn0gKVxuZXhwb3J0IGNsYXNzIFRsVG9hc3RlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHRvYXN0ZXJJRCA9ICcnO1xuXG4gIEBJbnB1dCgpIHRpdGxlID0gJ1RpdGxlICEnO1xuXG4gIEBJbnB1dCgpIGljb247XG5cbiAgQElucHV0KCkgbWVzc2FnZSA9ICdNZXNzYWdlIERlc2NyaXB0aW9uJztcblxuICBASW5wdXQoKSBwb3NpdGlvbiA9ICcnO1xuXG4gIEBJbnB1dCgpIHRpbWUgPSAzMDAwO1xuXG4gIEBJbnB1dCgpIHByb2dyZXNzQmFyID0gMDtcblxuICBASW5wdXQoKSBjb2xvciA9ICdwcmltYXJ5JztcblxuICBASW5wdXQoKSB3aWR0aCA9ICc0MDBweCc7XG5cbiAgQElucHV0KCkgaGVpZ2h0ID0gJ2F1dG8nO1xuXG4gIEBJbnB1dCgpIHByb2dyZXNzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzaG93SWNvbiA9IHRydWU7XG5cbiAgQE91dHB1dCgpIGFmdGVyQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0pIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgaW50ZXJ2YWw7XG5cbiAgcHVibGljIHRpbWVvdXQ7XG5cbiAgY29uc3RydWN0b3IoICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCggKCkgPT4ge1xuICAgICAgdGhpcy5wcm9ncmVzc0JhciArPSAxMDA7XG4gICAgfSwgMTAwICk7XG4gIH1cblxuICBhbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCkge1xuICAgIGlmIChldmVudC5hbmltYXRpb25OYW1lLmluY2x1ZGVzKCd0b2FzdGVyT3V0JykpIHtcbiAgICAgIHRoaXMuY2xvc2VFdmVudC5lbWl0KHRoaXMudG9hc3RlcklEKVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNsb3NlKCkge1xuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoICgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9LCB0aGlzLnRpbWUgKTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VLZXlzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyggdGhpcy5tZXNzYWdlICk7XG4gIH1cblxuICBpc01lc3NhZ2VPYmplY3QoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1lc3NhZ2UgPT09ICdvYmplY3QnO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndWktdG9hc3Rlci1vdXQnKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sndGltZSddKSB7XG4gICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgfVxuXG59XG4iLCI8ZGl2IFtjbGFzc109XCIndWktdG9hc3Rlci13cmFwcGVyICcgKyBjb2xvclwiXG4gICAgIChhbmltYXRpb25lbmQpPVwiYW5pbWF0aW9uRG9uZSgkZXZlbnQpXCJcbiAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgICAjY29udGFpbmVyXG4gICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgJ2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnOiAhcHJvZ3Jlc3MgPyAnM3B4JyA6ICcwJyxcbiAgICAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzogIXByb2dyZXNzID8gJzNweCcgOiAnMCcsXG4gICAgICd3aWR0aCc6IHdpZHRoLFxuICAgICAnaGVpZ2h0JzogaGVpZ2h0fVwiPlxuICA8ZGl2IGNsYXNzPVwidWktdG9hc3Rlci1jb250ZW50XCJcbiAgW25nU3R5bGVdPVwieydncmlkLXRlbXBsYXRlLWNvbHVtbnMnOiBzaG93SWNvbiA/ICc1MHB4IDFmcicgOiAnMWZyJywgJ3BhZGRpbmcnOiAoIHNob3dJY29uICYmIChoZWlnaHQgIT09ICdhdXRvJykgKSA/ICcwJyA6ICcyMHB4JyB9XCI+XG4gICAgPGRpdiAqbmdJZj1cInNob3dJY29uXCIgY2xhc3M9XCJ1aS10b2FzdGVyLWljb25cIj48dGwtaWNvbiBbc2l6ZV09XCInMS4yZW0nXCI+e3sgaWNvbiB9fTwvdGwtaWNvbj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidWktdG9hc3Rlci1kZXNjcmlwdGlvblwiPlxuICAgICAgPHA+PGI+e3t0aXRsZX19PC9iPjwvcD5cbiAgICAgIDxwICpuZ0lmPVwiIWlzTWVzc2FnZU9iamVjdCgpXCIgW2lubmVySFRNTF09XCJtZXNzYWdlXCI+PC9wPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTWVzc2FnZU9iamVjdCgpXCI+XG4gICAgICAgIDxwICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1lc3NhZ2VLZXlzKClcIj5cbiAgICAgICAgICB7eyBpdGVtIH19IHt7IG1lc3NhZ2VbaXRlbV0gfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8dGwtcHJvZ3Jlc3NiYXJcbiAgICAqbmdJZj1cInByb2dyZXNzXCJcbiAgICBbbW9kZV09XCInZGV0ZXJtaW5hdGUnXCJcbiAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgIFtoZWlnaHRdPVwiJzVweCdcIlxuICAgIFtwcm9ncmVzc0luZm9dPVwiJ25vbmUnXCJcbiAgICBbbWF4XT1cInRpbWVcIlxuICAgIFttaW5dPVwiMFwiXG4gICAgW3Bvc2l0aW9uXT1cInByb2dyZXNzQmFyXCI+XG4gIDwvdGwtcHJvZ3Jlc3NiYXI+XG48L2Rpdj5cbiJdfQ==