@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
105 lines • 15 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { IconButtonComponent } from '../icon-button/icon-button.component';
import { IconComponent } from '../icon/icon.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "@angular/common";
export class ToastComponent {
constructor(sanitize, el, cdr) {
this.sanitize = sanitize;
this.el = el;
this.cdr = cdr;
/**
* Whether toast has a close icon or not
*/
this.hasCloseIcon = true;
/**
* Time in ms to dismiss after
*/
this.dismissAfter = 5000;
/**
* Gauge accessible hidden label.
* @example "The toast will be automatically closed in 10s"
*/
this.gaugeLabel = 'Time left until toast is closed';
/**
* Outputs event when toast is closed
*/
this.closed = new EventEmitter();
/**
* Outputs event when toast is dismissed
*/
this.dismissed = new EventEmitter();
}
ngOnInit() {
if (this.shouldDismiss) {
// @ts-ignore
this._dismissTimeoutId = setTimeout(() => {
this.removeToast();
this.dismissed.emit();
}, this.dismissAfter);
}
}
ngOnDestroy() {
this.clearDismissTimeout();
}
/**
* @ignore
*/
getGaugeAnimationStyles() {
if (!this.dismissAfter) {
return null;
}
return this.sanitize.bypassSecurityTrustStyle(`
animation-duration: ${this.dismissAfter}ms
`);
}
/**
* Close toast
*/
close(event) {
event?.preventDefault();
event?.stopImmediatePropagation();
this.removeToast();
this.closed.emit(event);
this.cdr.markForCheck();
}
/**
* @ignore
*/
clearDismissTimeout() {
if (this._dismissTimeoutId) {
clearTimeout(this._dismissTimeoutId);
}
}
removeToast() {
this.el?.nativeElement?.remove();
this.clearDismissTimeout();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ToastComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ToastComponent, isStandalone: true, selector: "nj-toast", inputs: { toastId: "toastId", isInverse: "isInverse", hasCloseIcon: "hasCloseIcon", iconName: "iconName", dismissAfter: "dismissAfter", gaugeLabel: "gaugeLabel", shouldDismiss: "shouldDismiss" }, outputs: { closed: "closed", dismissed: "dismissed" }, ngImport: i0, template: "<div class=\"nj-toast\" [ngClass]=\"{'nj-toast--inverse': isInverse}\">\n <div class=\"nj-toast__body\">\n <nj-icon *ngIf=\"iconName\" [name]=\"iconName\" class=\"nj-toast__icon\" variant=\"inherit\"></nj-icon>\n <div class=\"nj-toast__content\">\n <p class=\"nj-toast__title\" [attr.id]=\"toastId\">\n <ng-content></ng-content>\n </p>\n <p class=\"nj-toast__text\">\n <ng-content select=\"[njToastBody]\"></ng-content>\n </p>\n </div>\n </div>\n <div class=\"nj-toast__action\" *ngIf=\"hasCloseIcon\">\n <nj-icon-button\n icon=\"close\"\n label=\"Close notification\"\n size=\"sm\"\n [variant]=\"isInverse ? 'primary' : 'inverse'\"\n [ariaDescribedby]=\"toastId\"\n (buttonClick)=\"close($event)\"\n >\n </nj-icon-button>\n </div>\n <div class=\"nj-toast__gauge\" *ngIf=\"shouldDismiss\">\n <div class=\"nj-toast__gauge-bar\" [style]=\"getGaugeAnimationStyles()\">\n <p class=\"nj-sr-only\">{{ gaugeLabel }}</p>\n </div>\n </div>\n</div>\n", styles: [".nj-toast__text:empty{display:none}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "nj-icon", inputs: ["size", "variant"] }, { kind: "component", type: IconButtonComponent, selector: "nj-icon-button", inputs: ["type", "ariaPressed", "ariaDescribedby", "isDisabled", "tabIndex", "variant", "size", "hasCustomIcon", "icon", "label", "additionalClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ToastComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-toast', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [IconComponent, IconButtonComponent, CommonModule], template: "<div class=\"nj-toast\" [ngClass]=\"{'nj-toast--inverse': isInverse}\">\n <div class=\"nj-toast__body\">\n <nj-icon *ngIf=\"iconName\" [name]=\"iconName\" class=\"nj-toast__icon\" variant=\"inherit\"></nj-icon>\n <div class=\"nj-toast__content\">\n <p class=\"nj-toast__title\" [attr.id]=\"toastId\">\n <ng-content></ng-content>\n </p>\n <p class=\"nj-toast__text\">\n <ng-content select=\"[njToastBody]\"></ng-content>\n </p>\n </div>\n </div>\n <div class=\"nj-toast__action\" *ngIf=\"hasCloseIcon\">\n <nj-icon-button\n icon=\"close\"\n label=\"Close notification\"\n size=\"sm\"\n [variant]=\"isInverse ? 'primary' : 'inverse'\"\n [ariaDescribedby]=\"toastId\"\n (buttonClick)=\"close($event)\"\n >\n </nj-icon-button>\n </div>\n <div class=\"nj-toast__gauge\" *ngIf=\"shouldDismiss\">\n <div class=\"nj-toast__gauge-bar\" [style]=\"getGaugeAnimationStyles()\">\n <p class=\"nj-sr-only\">{{ gaugeLabel }}</p>\n </div>\n </div>\n</div>\n", styles: [".nj-toast__text:empty{display:none}\n"] }]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { toastId: [{
type: Input
}], isInverse: [{
type: Input
}], hasCloseIcon: [{
type: Input
}], iconName: [{
type: Input
}], dismissAfter: [{
type: Input
}], gaugeLabel: [{
type: Input
}], shouldDismiss: [{
type: Input
}], closed: [{
type: Output
}], dismissed: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdG9hc3QvdG9hc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdG9hc3QvdG9hc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQVVyRCxNQUFNLE9BQU8sY0FBYztJQWlEekIsWUFBb0IsUUFBc0IsRUFBVSxFQUFjLEVBQVUsR0FBc0I7UUFBOUUsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUFVLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXJDbEc7O1dBRUc7UUFDTSxpQkFBWSxHQUFHLElBQUksQ0FBQztRQVE3Qjs7V0FFRztRQUNNLGlCQUFZLEdBQUksSUFBSSxDQUFDO1FBRTlCOzs7V0FHRztRQUNNLGVBQVUsR0FBRyxpQ0FBaUMsQ0FBQztRQU94RDs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBRTdDOztXQUVHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFHL0MsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsYUFBYTtZQUNiLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7NkJBQ3JCLElBQUksQ0FBQyxZQUFZO0tBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFrQjtRQUN0QixLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDeEIsS0FBSyxFQUFFLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQzsrR0FyR1UsY0FBYzttR0FBZCxjQUFjLCtUQ3hCM0Isa2hDQTZCQSwrRkRQWSxhQUFhLGlGQUFFLG1CQUFtQiwwT0FBRSxZQUFZOzs0RkFFL0MsY0FBYztrQkFSMUIsU0FBUzsrQkFDRSxVQUFVLG1CQUdILHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFFLFlBQVksQ0FBQzs0SkFRbEQsT0FBTztzQkFBZixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFNRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtJLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlU3R5bGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtJY29uQnV0dG9uQ29tcG9uZW50fSBmcm9tICcuLi9pY29uLWJ1dHRvbi9pY29uLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtJY29uQ29tcG9uZW50fSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmotdG9hc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9hc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90b2FzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0ljb25Db21wb25lbnQsIEljb25CdXR0b25Db21wb25lbnQsIENvbW1vbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBfZGlzbWlzc1RpbWVvdXRJZDogbnVtYmVyO1xuICAvKipcbiAgICogVG9hc3QgdW5pcXVlIGlkIHVzZWQgdG8gbGluayBkZXNjcmlwdGlvbiB0byBjbG9zZSBidXR0b25cbiAgICovXG4gIEBJbnB1dCgpIHRvYXN0SWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG9hc3QgaXMgaW52ZXJzZSBvciBub3RcbiAgICovXG4gIEBJbnB1dCgpIGlzSW52ZXJzZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0b2FzdCBoYXMgYSBjbG9zZSBpY29uIG9yIG5vdFxuICAgKi9cbiAgQElucHV0KCkgaGFzQ2xvc2VJY29uID0gdHJ1ZTtcblxuICAvKipcbiAgICogSWNvbiA6PGJyPlxuICAgKiA8YSBocmVmPVwiaHR0cHM6Ly9tYXRlcmlhbC5pby9yZXNvdXJjZXMvaWNvbnMvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+TWF0ZXJpYWwgaWNvbnM8L2E+XG4gICAqL1xuICBASW5wdXQoKSBpY29uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSBpbiBtcyB0byBkaXNtaXNzIGFmdGVyXG4gICAqL1xuICBASW5wdXQoKSBkaXNtaXNzQWZ0ZXI/ID0gNTAwMDtcblxuICAvKipcbiAgICogR2F1Z2UgYWNjZXNzaWJsZSBoaWRkZW4gbGFiZWwuXG4gICAqIEBleGFtcGxlIFwiVGhlIHRvYXN0IHdpbGwgYmUgYXV0b21hdGljYWxseSBjbG9zZWQgaW4gMTBzXCJcbiAgICovXG4gIEBJbnB1dCgpIGdhdWdlTGFiZWwgPSAnVGltZSBsZWZ0IHVudGlsIHRvYXN0IGlzIGNsb3NlZCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG9hc3Qgc2hvdWxkIGRpc21pc3MgYWZ0ZXIgc29tZSB0aW1lIGVsYXBzZWRcbiAgICovXG4gIEBJbnB1dCgpIHNob3VsZERpc21pc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPdXRwdXRzIGV2ZW50IHdoZW4gdG9hc3QgaXMgY2xvc2VkXG4gICAqL1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICAvKipcbiAgICogT3V0cHV0cyBldmVudCB3aGVuIHRvYXN0IGlzIGRpc21pc3NlZFxuICAgKi9cbiAgQE91dHB1dCgpIGRpc21pc3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplOiBEb21TYW5pdGl6ZXIsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYodGhpcy5zaG91bGREaXNtaXNzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLl9kaXNtaXNzVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlVG9hc3QoKTtcbiAgICAgICAgdGhpcy5kaXNtaXNzZWQuZW1pdCgpO1xuICAgICAgfSwgdGhpcy5kaXNtaXNzQWZ0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuY2xlYXJEaXNtaXNzVGltZW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldEdhdWdlQW5pbWF0aW9uU3R5bGVzKCk6IFNhZmVTdHlsZSB7XG4gICAgaWYgKCF0aGlzLmRpc21pc3NBZnRlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNhbml0aXplLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgXG4gICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAke3RoaXMuZGlzbWlzc0FmdGVyfW1zXG4gICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdG9hc3RcbiAgICovXG4gIGNsb3NlKGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50Py5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlbW92ZVRvYXN0KCk7XG4gICAgdGhpcy5jbG9zZWQuZW1pdChldmVudCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xlYXJEaXNtaXNzVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy5fZGlzbWlzc1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Rpc21pc3NUaW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVRvYXN0KCkge1xuICAgIHRoaXMuZWw/Lm5hdGl2ZUVsZW1lbnQ/LnJlbW92ZSgpO1xuICAgIHRoaXMuY2xlYXJEaXNtaXNzVGltZW91dCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibmotdG9hc3RcIiBbbmdDbGFzc109XCJ7J25qLXRvYXN0LS1pbnZlcnNlJzogaXNJbnZlcnNlfVwiPlxuICA8ZGl2IGNsYXNzPVwibmotdG9hc3RfX2JvZHlcIj5cbiAgICA8bmotaWNvbiAqbmdJZj1cImljb25OYW1lXCIgW25hbWVdPVwiaWNvbk5hbWVcIiBjbGFzcz1cIm5qLXRvYXN0X19pY29uXCIgdmFyaWFudD1cImluaGVyaXRcIj48L25qLWljb24+XG4gICAgPGRpdiBjbGFzcz1cIm5qLXRvYXN0X19jb250ZW50XCI+XG4gICAgICA8cCBjbGFzcz1cIm5qLXRvYXN0X190aXRsZVwiIFthdHRyLmlkXT1cInRvYXN0SWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9wPlxuICAgICAgPHAgY2xhc3M9XCJuai10b2FzdF9fdGV4dFwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbmpUb2FzdEJvZHldXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm5qLXRvYXN0X19hY3Rpb25cIiAqbmdJZj1cImhhc0Nsb3NlSWNvblwiPlxuICAgIDxuai1pY29uLWJ1dHRvblxuICAgICAgaWNvbj1cImNsb3NlXCJcbiAgICAgIGxhYmVsPVwiQ2xvc2Ugbm90aWZpY2F0aW9uXCJcbiAgICAgIHNpemU9XCJzbVwiXG4gICAgICBbdmFyaWFudF09XCJpc0ludmVyc2UgPyAgJ3ByaW1hcnknIDogJ2ludmVyc2UnXCJcbiAgICAgIFthcmlhRGVzY3JpYmVkYnldPVwidG9hc3RJZFwiXG4gICAgICAoYnV0dG9uQ2xpY2spPVwiY2xvc2UoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvbmotaWNvbi1idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibmotdG9hc3RfX2dhdWdlXCIgKm5nSWY9XCJzaG91bGREaXNtaXNzXCI+XG4gICAgPGRpdiBjbGFzcz1cIm5qLXRvYXN0X19nYXVnZS1iYXJcIiBbc3R5bGVdPVwiZ2V0R2F1Z2VBbmltYXRpb25TdHlsZXMoKVwiPlxuICAgICAgPHAgY2xhc3M9XCJuai1zci1vbmx5XCI+e3sgZ2F1Z2VMYWJlbCB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==