sa-modals
Version:
Angular Modal Library: A versatile and accessible modal component for Angular applications, designed to enhance user experience with smooth animations and responsive design. This library leverages Angular's CDK to create dynamic overlays, ensuring seamles
138 lines • 21.3 kB
JavaScript
import { trigger, transition, style, animate } from '@angular/animations';
import { Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
import { HeaderComponent } from './components/header/header.component';
import { OverlayConfig } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
import * as i2 from "./sa-modal.service";
import * as i3 from "@angular/cdk/a11y";
import * as i4 from "@angular/common";
const uReveal = trigger('uReveal', [
transition(':enter', [
style({ transform: 'translateY(-30%)', opacity: 0 }),
animate('300ms ease', style({ transform: 'translateY(0%)', opacity: 1 })),
]),
transition(':leave', [
style({ transform: 'translateY(0%)', opacity: 1 }),
animate('300ms ease', style({ transform: 'translateY(-30%)', opacity: 0 })),
]),
]);
export class SaModalComponent {
onPopState(event) {
if (this.visible) {
event.preventDefault();
this.close();
}
}
constructor(overlay, viewContainerRef, cdr, service, focusTrapFactory) {
this.overlay = overlay;
this.viewContainerRef = viewContainerRef;
this.cdr = cdr;
this.service = service;
this.focusTrapFactory = focusTrapFactory;
this.center = false;
this.extraClass = this.service.config.extraClass || '';
this.saWidth = this.service.config.saWidth || 600;
this.hasBackdrop = this.service.config.hasBackdrop || true;
this.staticBackdrop = false;
this.closeWithESC = this.service.config.closeWithESC || true;
this.onOpen = new EventEmitter();
this.onClose = new EventEmitter();
this.backdropClicked = new EventEmitter();
this.visible = false;
this.subscriptions = [];
}
ngAfterViewInit() {
this.subscriptions.push(this.header.status.subscribe((status) => {
this.close();
}));
}
open() {
const conf = new OverlayConfig({
hasBackdrop: this.hasBackdrop,
backdropClass: 'sa-modal-backdrop',
panelClass: 'sa-modal' + this.extraClass,
scrollStrategy: this.overlay.scrollStrategies.block(),
positionStrategy: this.overlay.position().global().centerHorizontally(),
});
if (this.center)
conf.positionStrategy = this.overlay
.position()
.global()
.centerHorizontally()
.centerVertically();
this.overlayRef = this.overlay.create(conf);
const modalPortal = new TemplatePortal(this.overlayTemplate, this.viewContainerRef);
this.visible = true;
history.pushState({ modalOpen: true }, '');
this.overlayRef.attach(modalPortal);
this.onOpen.emit();
this.cdr.detectChanges();
this.focusTrap = this.focusTrapFactory.create(this.contentRef.nativeElement);
this.contentRef.nativeElement.focus();
this.subscriptions.push(this.overlayRef.backdropClick().subscribe(() => {
this.backdropClicked.emit();
if (!this.staticBackdrop) {
this.close();
}
}));
this.subscriptions.push(this.overlayRef.keydownEvents().subscribe((e) => {
if (e.key == 'Escape' && this.closeWithESC) {
this.close();
}
}));
document.body.classList.add('modal-opened');
}
close() {
this.visible = false;
this.overlayRef.backdropElement?.classList.remove('cdk-overlay-backdrop-showing');
setTimeout(() => {
this.overlayRef.dispose();
document.body.classList.remove('modal-opened');
this.onClose.emit();
}, 300);
}
ngOnDestroy() {
this.subscriptions.forEach((e) => {
e.unsubscribe();
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: SaModalComponent, deps: [{ token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i2.SaModalService }, { token: i3.FocusTrapFactory }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: SaModalComponent, selector: "sa-modal", inputs: { center: "center", extraClass: "extraClass", saWidth: "saWidth", hasBackdrop: "hasBackdrop", staticBackdrop: "staticBackdrop", closeWithESC: "closeWithESC" }, outputs: { onOpen: "onOpen", onClose: "onClose", backdropClicked: "backdropClicked" }, host: { listeners: { "window:popstate": "onPopState($event)" } }, queries: [{ propertyName: "header", first: true, predicate: HeaderComponent, descendants: true }], viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["content"], descendants: true }, { propertyName: "overlayTemplate", first: true, predicate: ["overlayTemplate"], descendants: true }], ngImport: i0, template: "<ng-template #overlayTemplate>\r\n <div #content *ngIf=\"visible\" class=\"sa-modal-content\" [style]=\"'--sa-modal-width:'+saWidth+'px '\"\r\n [@uReveal]>\r\n <ng-content></ng-content>\r\n </div>\r\n</ng-template>", styles: [".sa-modal{--modal-bg-color: #fff;--modal-border-color: #e5e5e5;--neutral-50: #fafafa;--neutral-100: #f5f5f5;--modal-transition: .3s;--radius: 8px;height:fit-content;padding:0 8px}.sa-modal .sa-modal-content{background:var(--modal-bg-color);max-width:100%;width:var(--sa-modal-width);margin:16px auto;padding:0 16px;overflow:hidden;border-radius:var(--radius);overflow:auto}.sa-modal-backdrop{background-color:#00000040}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [uReveal], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: SaModalComponent, decorators: [{
type: Component,
args: [{ selector: 'sa-modal', encapsulation: ViewEncapsulation.None, animations: [uReveal], template: "<ng-template #overlayTemplate>\r\n <div #content *ngIf=\"visible\" class=\"sa-modal-content\" [style]=\"'--sa-modal-width:'+saWidth+'px '\"\r\n [@uReveal]>\r\n <ng-content></ng-content>\r\n </div>\r\n</ng-template>", styles: [".sa-modal{--modal-bg-color: #fff;--modal-border-color: #e5e5e5;--neutral-50: #fafafa;--neutral-100: #f5f5f5;--modal-transition: .3s;--radius: 8px;height:fit-content;padding:0 8px}.sa-modal .sa-modal-content{background:var(--modal-bg-color);max-width:100%;width:var(--sa-modal-width);margin:16px auto;padding:0 16px;overflow:hidden;border-radius:var(--radius);overflow:auto}.sa-modal-backdrop{background-color:#00000040}\n"] }]
}], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i2.SaModalService }, { type: i3.FocusTrapFactory }], propDecorators: { onPopState: [{
type: HostListener,
args: ['window:popstate', ['$event']]
}], center: [{
type: Input
}], extraClass: [{
type: Input
}], saWidth: [{
type: Input
}], hasBackdrop: [{
type: Input
}], staticBackdrop: [{
type: Input
}], closeWithESC: [{
type: Input
}], onOpen: [{
type: Output
}], onClose: [{
type: Output
}], backdropClicked: [{
type: Output
}], header: [{
type: ContentChild,
args: [HeaderComponent]
}], contentRef: [{
type: ViewChild,
args: ['content', { static: false }]
}], overlayTemplate: [{
type: ViewChild,
args: ['overlayTemplate']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2EtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2EtbW9kYWwvc3JjL2xpYi9zYS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zYS1tb2RhbC9zcmMvbGliL3NhLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUVULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFXLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBR3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUU7SUFDakMsVUFBVSxDQUFDLFFBQVEsRUFBRTtRQUNuQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzFFLENBQUM7SUFDRixVQUFVLENBQUMsUUFBUSxFQUFFO1FBQ25CLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbEQsT0FBTyxDQUFDLFlBQVksRUFBRSxL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RUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRXZDLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHN0eWxlLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2FNb2RhbFNlcnZpY2UgfSBmcm9tICcuL3NhLW1vZGFsLnNlcnZpY2UnO1xyXG5jb25zdCB1UmV2ZWFsID0gdHJpZ2dlcigndVJldmVhbCcsIFtcclxuICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbXHJcbiAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTMwJSknLCBvcGFjaXR5OiAwIH0pLFxyXG4gICAgYW5pbWF0ZSgnMzAwbXMgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwJSknLCBvcGFjaXR5OiAxIH0pKSxcclxuICBdKSxcclxuICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJywgb3BhY2l0eTogMSB9KSxcclxuICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTMwJSknLCBvcGFjaXR5OiAwIH0pKSxcclxuICBdKSxcclxuXSk7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2EtbW9kYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiBgLi9zYS1tb2RhbC5jb21wb25lbnQuaHRtbGAsXHJcbiAgc3R5bGVVcmxzOiBbYC4vc2EtbW9kYWwuY29tcG9uZW50LnNjc3NgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGFuaW1hdGlvbnM6IFt1UmV2ZWFsXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNhTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb3BzdGF0ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Qb3BTdGF0ZShldmVudDogUG9wU3RhdGVFdmVudCkge1xyXG4gICAgaWYgKHRoaXMudmlzaWJsZSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBjZW50ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBleHRyYUNsYXNzOiBzdHJpbmcgPSB0aGlzLnNlcnZpY2UuY29uZmlnLmV4dHJhQ2xhc3MgfHwgJyc7XHJcbiAgQElucHV0KCkgc2FXaWR0aDogbnVtYmVyID0gdGhpcy5zZXJ2aWNlLmNvbmZpZy5zYVdpZHRoIHx8IDYwMDtcclxuICBASW5wdXQoKSBoYXNCYWNrZHJvcDogYm9vbGVhbiA9IHRoaXMuc2VydmljZS5jb25maWcuaGFzQmFja2Ryb3AgfHwgdHJ1ZTtcclxuICBASW5wdXQoKSBzdGF0aWNCYWNrZHJvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNsb3NlV2l0aEVTQzogYm9vbGVhbiA9IHRoaXMuc2VydmljZS5jb25maWcuY2xvc2VXaXRoRVNDIHx8IHRydWU7XHJcblxyXG4gIEBPdXRwdXQoKSBvbk9wZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xyXG4gIEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcclxuICBAT3V0cHV0KCkgYmFja2Ryb3BDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChIZWFkZXJDb21wb25lbnQpIGhlYWRlciE6IEhlYWRlckNvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdjb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRlbnRSZWYhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlUZW1wbGF0ZScpXHJcbiAgb3ZlcmxheVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBvdmVybGF5UmVmITogT3ZlcmxheVJlZjtcclxuICBwcml2YXRlIGZvY3VzVHJhcCE6IEZvY3VzVHJhcDtcclxuICB2aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IFNhTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb2N1c1RyYXBGYWN0b3J5OiBGb2N1c1RyYXBGYWN0b3J5XHJcbiAgKSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgdGhpcy5oZWFkZXIuc3RhdHVzLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9wZW4oKSB7XHJcbiAgICBjb25zdCBjb25mID0gbmV3IE92ZXJsYXlDb25maWcoe1xyXG4gICAgICBoYXNCYWNrZHJvcDogdGhpcy5oYXNCYWNrZHJvcCxcclxuICAgICAgYmFja2Ryb3BDbGFzczogJ3NhLW1vZGFsLWJhY2tkcm9wJyxcclxuICAgICAgcGFuZWxDbGFzczogJ3NhLW1vZGFsJyArIHRoaXMuZXh0cmFDbGFzcyxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLmNlbnRlckhvcml6b250YWxseSgpLFxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5jZW50ZXIpXHJcbiAgICAgIGNvbmYucG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxyXG4gICAgICAgIC5wb3NpdGlvbigpXHJcbiAgICAgICAgLmdsb2JhbCgpXHJcbiAgICAgICAgLmNlbnRlckhvcml6b250YWxseSgpXHJcbiAgICAgICAgLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoY29uZik7XHJcbiAgICBjb25zdCBtb2RhbFBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcclxuICAgICAgdGhpcy5vdmVybGF5VGVtcGxhdGUsXHJcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZlxyXG4gICAgKTtcclxuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IG1vZGFsT3BlbjogdHJ1ZSB9LCAnJyk7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG1vZGFsUG9ydGFsKTtcclxuICAgIHRoaXMub25PcGVuLmVtaXQoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZShcclxuICAgICAgdGhpcy5jb250ZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICk7XHJcbiAgICB0aGlzLmNvbnRlbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmJhY2tkcm9wQ2xpY2tlZC5lbWl0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRpY0JhY2tkcm9wKSB7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlLmtleSA9PSAnRXNjYXBlJyAmJiB0aGlzLmNsb3NlV2l0aEVTQykge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW5lZCcpO1xyXG4gIH1cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZShcclxuICAgICAgJ2Nkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcnXHJcbiAgICApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbmVkJyk7XHJcbiAgICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgIGUudW5zdWJzY3JpYmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8bmctdGVtcGxhdGUgI292ZXJsYXlUZW1wbGF0ZT5cclxuICA8ZGl2ICNjb250ZW50ICpuZ0lmPVwidmlzaWJsZVwiIGNsYXNzPVwic2EtbW9kYWwtY29udGVudFwiICAgW3N0eWxlXT1cIictLXNhLW1vZGFsLXdpZHRoOicrc2FXaWR0aCsncHggJ1wiXHJcbiAgICBbQHVSZXZlYWxdPlxyXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==