UNPKG

ems-web-app-messages

Version:

This angular.io module includes a component and service that can be used to render "Growl" or "Snackbar" style in-app messages.

134 lines 20.7 kB
import { Component, Input, HostListener, HostBinding } from '@angular/core'; import { MessageType, MessagePosition } from "./messages.enums"; import * as i0 from "@angular/core"; import * as i1 from "./messages.service"; import * as i2 from "@angular/platform-browser"; import * as i3 from "@angular/common"; export class MessagesComponent { constructor(service, sanitizer) { this.service = service; this.sanitizer = sanitizer; this.render = false; this.classes = ""; this.background = "rgba(0,0,0,0.75)"; this.color = "#fff"; this.zIndex = 1000; this.speed = 0.5; this.queue = []; this.timeout = 0; this.onContainerClick = (element) => { this.processMessageQueue(true); }; } ngOnInit() { this.service.currentMessage.subscribe(message => { if (!message && !this.currentMessage) return; if (!message) this.processMessageQueue(true); if (!this.validateMessage(message)) return; this.queue.push(message); this.processMessageQueue(); }); } initializeStyles() { if (!this.currentMessage) return; const duration = this.currentMessage.duration ?? 1; const output = `messages { background: ${this.background}; color: ${this.color}; transition-duration: ${this.speed}s; z-index: ${this.zIndex}; } messages.render { transition-duration: ${this.speed}s; }`; this.styles = this.sanitizer.bypassSecurityTrustHtml(`<style>${output}</style>`); } async processMessageQueue(force = false) { if (this.currentMessage && !force) return; await this.removeCurrentMessage(); this.currentMessage = this.queue.shift(); this.classes = `${this.currentMessage?.position} ${this.currentMessage?.type} ${this.currentMessage?.classes ?? ''}`; await this.tick(); this.initializeStyles(); this.showNextMessage(); } removeCurrentMessage() { clearTimeout(this.timeout); return new Promise((resolve) => { if (!this.currentMessage) { setTimeout(() => resolve()); } else { this.render = false; setTimeout(() => resolve(), this.speed * 1000); } }); } tick() { return new Promise((resolve) => { setTimeout(() => resolve(), this.speed * 1000); }); } showNextMessage() { if (!this.currentMessage) return; setTimeout(() => this.render = true); this.timeout = window.setTimeout(() => this.processMessageQueue(true), this.currentMessage.duration * 1000); } validateMessage(message) { const growlPositions = [MessagePosition.BottomLeft, MessagePosition.BottomRight, MessagePosition.TopLeft, MessagePosition.TopRight]; const snackbarPositions = [MessagePosition.TopCenter, MessagePosition.BottomCenter]; if (!message) return false; if (message.type === MessageType.Growl && growlPositions.indexOf(message.position) === -1) { throw new Error("Growl messages must use one of the following positions: MessagePosition.BottomLeft, MessagePosition.BottomRight, MessagePosition.TopLeft, MessagePosition.TopRight"); return false; } if (message.type === MessageType.Snackbar && snackbarPositions.indexOf(message.position) === -1) { throw new Error("Snackbar messages must use one of the following positions: MessagePosition.TopCenter, MessagePosition.BottomCenter"); return false; } return true; } } MessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesComponent, deps: [{ token: i1.MessagesService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); MessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: MessagesComponent, selector: "messages", inputs: { background: "background", color: "color", zIndex: ["z-index", "zIndex"], speed: ["transition-speed", "speed"] }, host: { listeners: { "click": "onContainerClick($event.target)" }, properties: { "class.render": "this.render", "class": "this.classes" } }, ngImport: i0, template: ` <ng-container *ngTemplateOutlet="currentMessage?.template ?? null"></ng-container> <div *ngIf="!currentMessage?.template" [attr.role]="currentMessage ? 'alert':'generic'" class="message-text" [innerHtml]="sanitizer.bypassSecurityTrustHtml(currentMessage?.message || ' ')"></div> <div class="style-container" [innerHtml]="styles"></div> `, isInline: true, styles: [":host{position:fixed;transition-property:all;border-radius:.5rem;box-sizing:border-box;padding:1rem;opacity:0;pointer-events:none}:host.growl{width:20rem}:host.snackbar{width:20rem}@media only screen and (min-width: 768px){:host.snackbar{width:40rem}}:host.growl.top.right{top:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem))}:host.growl.top.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.top.left{top:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.top.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.left{bottom:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.bottom.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.right{bottom:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem));opacity:0}:host.growl.bottom.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.top.center{top:2rem;box-sizing:border-box;transform:translateY(calc(-100% - 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.top.center{left:calc(50% - 20rem)}}:host.snackbar.top.center.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.bottom.center{bottom:2rem;box-sizing:border-box;transform:translateY(calc(100% + 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.bottom.center{left:calc(50% - 20rem)}}:host.snackbar.bottom.center.render{opacity:1;transform:translate(0);pointer-events:auto}\n"], directives: [{ type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: MessagesComponent, decorators: [{ type: Component, args: [{ selector: 'messages', template: ` <ng-container *ngTemplateOutlet="currentMessage?.template ?? null"></ng-container> <div *ngIf="!currentMessage?.template" [attr.role]="currentMessage ? 'alert':'generic'" class="message-text" [innerHtml]="sanitizer.bypassSecurityTrustHtml(currentMessage?.message || ' ')"></div> <div class="style-container" [innerHtml]="styles"></div> `, styles: [":host{position:fixed;transition-property:all;border-radius:.5rem;box-sizing:border-box;padding:1rem;opacity:0;pointer-events:none}:host.growl{width:20rem}:host.snackbar{width:20rem}@media only screen and (min-width: 768px){:host.snackbar{width:40rem}}:host.growl.top.right{top:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem))}:host.growl.top.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.top.left{top:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.top.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.left{bottom:2rem;left:2rem;box-sizing:border-box;transform:translate(calc(-100% - 2rem));opacity:0}:host.growl.bottom.left.render{opacity:1;transform:translate(0);pointer-events:auto}:host.growl.bottom.right{bottom:2rem;right:2rem;box-sizing:border-box;transform:translate(calc(100% + 2rem));opacity:0}:host.growl.bottom.right.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.top.center{top:2rem;box-sizing:border-box;transform:translateY(calc(-100% - 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.top.center{left:calc(50% - 20rem)}}:host.snackbar.top.center.render{opacity:1;transform:translate(0);pointer-events:auto}:host.snackbar.bottom.center{bottom:2rem;box-sizing:border-box;transform:translateY(calc(100% + 2rem));opacity:0;border-radius:1rem;left:calc(50% - 10rem)}@media only screen and (min-width: 768px){:host.snackbar.bottom.center{left:calc(50% - 20rem)}}:host.snackbar.bottom.center.render{opacity:1;transform:translate(0);pointer-events:auto}\n"] }] }], ctorParameters: function () { return [{ type: i1.MessagesService }, { type: i2.DomSanitizer }]; }, propDecorators: { render: [{ type: HostBinding, args: ['class.render'] }], classes: [{ type: HostBinding, args: ['class'] }], background: [{ type: Input, args: ["background"] }], color: [{ type: Input, args: ["color"] }], zIndex: [{ type: Input, args: ["z-index"] }], speed: [{ type: Input, args: ["transition-speed"] }], onContainerClick: [{ type: HostListener, args: ['click', ['$event.target']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZXNzYWdlcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQWFoRSxNQUFNLE9BQU8saUJBQWlCO0lBZ0I1QixZQUFvQixPQUF3QixFQUFTLFNBQXVCO1FBQXhELFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQVMsY0FBUyxHQUFULFNBQVMsQ0FBYztRQWQvQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBQy9CLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDdEIsZUFBVSxHQUFXLGtCQUFrQixDQUFDO1FBQzdDLFVBQUssR0FBVyxNQUFNLENBQUM7UUFDckIsV0FBTSxHQUFXLElBQUksQ0FBQztRQUNiLFVBQUssR0FBVyxHQUFHLENBQUM7UUFLeEMsVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUV0QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBZTVCLHFCQUFnQixHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUE7SUFmK0UsQ0FBQztJQUVqRixRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzlDLElBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBQzVDLElBQUcsQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFHLENBQUMsSUFBSSxD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QUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBIb3N0TGlzdGVuZXIsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSwgTWVzc2FnZVBvc2l0aW9uIH0gZnJvbSBcIi4vbWVzc2FnZXMuZW51bXNcIjtcbmltcG9ydCB7IElNZXNzYWdlIH0gZnJvbSBcIi4vbWVzc2FnZXMuaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTWVzc2FnZXNTZXJ2aWNlIH0gZnJvbSBcIi4vbWVzc2FnZXMuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZXNzYWdlcycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1cnJlbnRNZXNzYWdlPy50ZW1wbGF0ZSA/PyBudWxsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cIiFjdXJyZW50TWVzc2FnZT8udGVtcGxhdGVcIiBbYXR0ci5yb2xlXT1cImN1cnJlbnRNZXNzYWdlID8gJ2FsZXJ0JzonZ2VuZXJpYydcIiBjbGFzcz1cIm1lc3NhZ2UtdGV4dFwiIFtpbm5lckh0bWxdPVwic2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGN1cnJlbnRNZXNzYWdlPy5tZXNzYWdlIHx8ICcgJylcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic3R5bGUtY29udGFpbmVyXCIgW2lubmVySHRtbF09XCJzdHlsZXNcIj48L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbICcuL21lc3NhZ2VzLmNvbXBvbmVudC5sZXNzJyBdXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0ICB7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5yZW5kZXInKSByZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNsYXNzZXM6IHN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dChcImJhY2tncm91bmRcIikgYmFja2dyb3VuZDogc3RyaW5nID0gXCJyZ2JhKDAsMCwwLDAuNzUpXCI7XG4gIEBJbnB1dChcImNvbG9yXCIpIGNvbG9yOiBzdHJpbmcgPSBcIiNmZmZcIjtcbiAgQElucHV0KFwiei1pbmRleFwiKSB6SW5kZXg6IG51bWJlciA9IDEwMDA7XG4gIEBJbnB1dChcInRyYW5zaXRpb24tc3BlZWRcIikgc3BlZWQ6IG51bWJlciA9IDAuNTtcblxuXG4gIHB1YmxpYyBzdHlsZXMhOiBTYWZlSHRtbDtcbiAgcHVibGljIGN1cnJlbnRNZXNzYWdlPzogSU1lc3NhZ2U7XG4gIHB1YmxpYyBxdWV1ZTogSU1lc3NhZ2VbXSA9IFtdO1xuXG4gIHByaXZhdGUgdGltZW91dDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IE1lc3NhZ2VzU2VydmljZSwgcHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UuY3VycmVudE1lc3NhZ2Uuc3Vic2NyaWJlKG1lc3NhZ2UgPT4ge1xuICAgICAgaWYoIW1lc3NhZ2UgJiYgIXRoaXMuY3VycmVudE1lc3NhZ2UpIHJldHVybjtcbiAgICAgIGlmKCFtZXNzYWdlKSB0aGlzLnByb2Nlc3NNZXNzYWdlUXVldWUodHJ1ZSk7XG4gICAgICBpZighdGhpcy52YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSEpKSByZXR1cm47XG4gICAgICB0aGlzLnF1ZXVlLnB1c2gobWVzc2FnZSEpO1xuICAgICAgdGhpcy5wcm9jZXNzTWVzc2FnZVF1ZXVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICBvbkNvbnRhaW5lckNsaWNrID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgdGhpcy5wcm9jZXNzTWVzc2FnZVF1ZXVlKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU3R5bGVzKCkge1xuICAgIGlmKCF0aGlzLmN1cnJlbnRNZXNzYWdlKSByZXR1cm47XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmN1cnJlbnRNZXNzYWdlLmR1cmF0aW9uID8/IDE7XG4gICAgY29uc3Qgb3V0cHV0ID0gYG1lc3NhZ2VzIHsgXG4gICAgICBiYWNrZ3JvdW5kOiAke3RoaXMuYmFja2dyb3VuZH07IFxuICAgICAgY29sb3I6ICR7dGhpcy5jb2xvcn07IFxuICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJHt0aGlzLnNwZWVkfXM7IFxuICAgICAgei1pbmRleDogJHt0aGlzLnpJbmRleH07XG4gICAgfSBcbiAgICBtZXNzYWdlcy5yZW5kZXIge1xuICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogJHt0aGlzLnNwZWVkfXM7XG4gICAgfWA7XG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChgPHN0eWxlPiR7b3V0cHV0fTwvc3R5bGU+YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NNZXNzYWdlUXVldWUoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmKHRoaXMuY3VycmVudE1lc3NhZ2UgJiYgIWZvcmNlKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5yZW1vdmVDdXJyZW50TWVzc2FnZSgpO1xuICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgdGhpcy5jbGFzc2VzID0gYCR7dGhpcy5jdXJyZW50TWVzc2FnZT8ucG9zaXRpb259ICR7dGhpcy5jdXJyZW50TWVzc2FnZT8udHlwZX0gJHt0aGlzLmN1cnJlbnRNZXNzYWdlPy5jbGFzc2VzID8/ICcnfWA7XG4gICAgYXdhaXQgdGhpcy50aWNrKCk7XG4gICAgdGhpcy5pbml0aWFsaXplU3R5bGVzKCk7XG4gICAgdGhpcy5zaG93TmV4dE1lc3NhZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ3VycmVudE1lc3NhZ2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IChtZXNzYWdlPzogSU1lc3NhZ2UpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmKCF0aGlzLmN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCB0aGlzLnNwZWVkICogMTAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRpY2soKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiAobWVzc2FnZT86IElNZXNzYWdlKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCB0aGlzLnNwZWVkICogMTAwMCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dOZXh0TWVzc2FnZSgpIHtcbiAgICBpZighdGhpcy5jdXJyZW50TWVzc2FnZSkgcmV0dXJuO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZW5kZXIgPSB0cnVlKTtcbiAgICB0aGlzLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnByb2Nlc3NNZXNzYWdlUXVldWUodHJ1ZSksIHRoaXMuY3VycmVudE1lc3NhZ2UuZHVyYXRpb24gKiAxMDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVNZXNzYWdlKG1lc3NhZ2U6IElNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3Jvd2xQb3NpdGlvbnMgPSBbTWVzc2FnZVBvc2l0aW9uLkJvdHRvbUxlZnQsIE1lc3NhZ2VQb3NpdGlvbi5Cb3R0b21SaWdodCwgTWVzc2FnZVBvc2l0aW9uLlRvcExlZnQsIE1lc3NhZ2VQb3NpdGlvbi5Ub3BSaWdodF07XG4gICAgY29uc3Qgc25hY2tiYXJQb3NpdGlvbnMgPSBbTWVzc2FnZVBvc2l0aW9uLlRvcENlbnRlciwgTWVzc2FnZVBvc2l0aW9uLkJvdHRvbUNlbnRlcl07XG4gICAgaWYoIW1lc3NhZ2UpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBpZihtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLkdyb3dsICYmIGdyb3dsUG9zaXRpb25zLmluZGV4T2YobWVzc2FnZS5wb3NpdGlvbikgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHcm93bCBtZXNzYWdlcyBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6IE1lc3NhZ2VQb3NpdGlvbi5Cb3R0b21MZWZ0LCBNZXNzYWdlUG9zaXRpb24uQm90dG9tUmlnaHQsIE1lc3NhZ2VQb3NpdGlvbi5Ub3BMZWZ0LCBNZXNzYWdlUG9zaXRpb24uVG9wUmlnaHRcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZihtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLlNuYWNrYmFyICYmIHNuYWNrYmFyUG9zaXRpb25zLmluZGV4T2YobWVzc2FnZS5wb3NpdGlvbikgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTbmFja2JhciBtZXNzYWdlcyBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb3NpdGlvbnM6IE1lc3NhZ2VQb3NpdGlvbi5Ub3BDZW50ZXIsIE1lc3NhZ2VQb3NpdGlvbi5Cb3R0b21DZW50ZXJcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19