UNPKG

@engie-group/fluid-design-system-angular

Version:

Fluid Design System Angular

105 lines 15 kB
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==