UNPKG

ngx-toasta

Version:

Simple and clean Angular Toast component that shows growl-style notifications and messages for your web app

218 lines 25.1 kB
import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { isString, isNumber, isFunction } from './toasta.utils'; import * as i0 from "@angular/core"; /** * Options to configure a new Toast */ export class ToastOptions { } ToastOptions.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastOptions, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); ToastOptions.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastOptions }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastOptions, decorators: [{ type: Injectable }] }); /** * Structrure of a created Toast */ export class ToastData { } ToastData.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastData, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); ToastData.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastData }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastData, decorators: [{ type: Injectable }] }); /** * Default configuration for all toasts and toasta container */ export class ToastaConfig { constructor() { // Maximum number of toasties to show at once this.limit = 5; // Whether to show the 'X' icon to close the toast this.showClose = true; // Whether to show a progress bar at the bottom of the notification this.showDuration = true; // The window position where the toast pops up this.position = 'bottom-right'; // How long (in miliseconds) the toasta shows before it's removed. Set to null/0 to turn off. this.timeout = 5000; // What theme to use this.theme = 'default'; } } ToastaConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); ToastaConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaConfig }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaConfig, decorators: [{ type: Injectable }] }); export var ToastaEventType; (function (ToastaEventType) { ToastaEventType[ToastaEventType["ADD"] = 0] = "ADD"; ToastaEventType[ToastaEventType["CLEAR"] = 1] = "CLEAR"; ToastaEventType[ToastaEventType["CLEAR_ALL"] = 2] = "CLEAR_ALL"; })(ToastaEventType || (ToastaEventType = {})); export class ToastaEvent { constructor(type, value) { this.type = type; this.value = value; } } export function toastaServiceFactory(config) { return new ToastaService(config); } /** * Toasta service helps create different kinds of Toasts */ export class ToastaService { constructor(config) { this.config = config; // Init the counter this.uniqueCounter = 0; // ToastData event emitter // private toastsEmitter: EventEmitter<ToastData> = new EventEmitter<ToastData>(); // Clear event emitter // private clearEmitter: EventEmitter<number> = new EventEmitter<number>(); this.eventSource = new Subject(); this.events = this.eventSource.asObservable(); } /** * Get list of toats */ // getToasts(): Observable<ToastData> { // return this.toastsEmitter.asObservable(); // } // getClear(): Observable<number> { // return this.clearEmitter.asObservable(); // } /** * Create Toast of a default type */ default(options) { this.add(options, 'default'); } /** * Create Toast of info type * @param options Individual toasta config overrides */ info(options) { this.add(options, 'info'); } /** * Create Toast of success type * @param options Individual toasta config overrides */ success(options) { this.add(options, 'success'); } /** * Create Toast of wait type * @param options Individual toasta config overrides */ wait(options) { this.add(options, 'wait'); } /** * Create Toast of error type * @param options Individual toasta config overrides */ error(options) { this.add(options, 'error'); } /** * Create Toast of warning type * @param options Individual toasta config overrides */ warning(options) { this.add(options, 'warning'); } // Add a new toast item add(options, type) { let toastaOptions; if (isString(options) && options !== '' || isNumber(options)) { toastaOptions = { title: options.toString() }; } else { toastaOptions = options; } if (!toastaOptions || !toastaOptions.title && !toastaOptions.msg) { throw new Error('ngx-toasta: No toast title or message specified!'); } type = type || 'default'; // Set a unique counter for an id this.uniqueCounter++; // Set the local vs global config items const showClose = this._checkConfigBooleanItem(this.config, toastaOptions, 'showClose'); // Set the local vs global config items const showDuration = this._checkConfigBooleanItem(this.config, toastaOptions, 'showDuration'); // If we have a theme set, make sure it's a valid one let theme; if (toastaOptions.theme) { theme = ToastaService.THEMES.indexOf(toastaOptions.theme) > -1 ? toastaOptions.theme : this.config.theme; } else { theme = this.config.theme; } const toast = { id: this.uniqueCounter, title: toastaOptions.title, msg: toastaOptions.msg, showClose, showDuration, type: 'toasta-type-' + type, theme: 'toasta-theme-' + theme, // If there's a timeout individually or globally, set the toast to timeout // Allows a caller to pass null/0 and override the default. Can also set the default to null/0 to turn off. timeout: toastaOptions.hasOwnProperty('timeout') ? toastaOptions.timeout ?? 0 : this.config.timeout, onAdd: toastaOptions.onAdd && isFunction(toastaOptions.onAdd) ? toastaOptions.onAdd : undefined, onRemove: toastaOptions.onRemove && isFunction(toastaOptions.onRemove) ? toastaOptions.onRemove : undefined }; // Push up a new toast item // this.toastsSubscriber.next(toast); // this.toastsEmitter.next(toast); this.emitEvent(new ToastaEvent(ToastaEventType.ADD, toast)); // If we have a onAdd function, call it here if (toastaOptions.onAdd && isFunction(toastaOptions.onAdd)) { toastaOptions.onAdd.call(this, toast); } } // Clear all toasts clearAll() { // this.clearEmitter.next(null); this.emitEvent(new ToastaEvent(ToastaEventType.CLEAR_ALL)); } // Clear the specific one clear(id) { // this.clearEmitter.next(id); this.emitEvent(new ToastaEvent(ToastaEventType.CLEAR, id)); } // Checks whether the local option is set, if not, // checks the global config _checkConfigBooleanItem(config, options, property) { if (options[property] === false) { return false; } else if (!options[property]) { return config[property]; } else { return true; } } emitEvent(event) { if (this.eventSource) { // Push up a new event this.eventSource.next(event); } } } // Allowed THEMES ToastaService.THEMES = ['default', 'material', 'bootstrap']; ToastaService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaService, deps: [{ token: ToastaConfig }], target: i0.ɵɵFactoryTarget.Injectable }); ToastaService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ToastaService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: ToastaConfig }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG9hc3RhL3NyYy9saWIvdG9hc3RhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUloRTs7R0FFRztBQUVILE1BQU0sT0FBTyxZQUFZOzt5R0FBWixZQUFZOzZHQUFaLFlBQVk7MkZBQVosWUFBWTtrQkFEeEIsVUFBVTs7QUFZWDs7R0FFRztBQUVILE1BQU0sT0FBTyxTQUFTOztzR0FBVCxTQUFTOzBHQUFULFNBQVM7MkZBQVQsU0FBUztrQkFEckIsVUFBVTs7QUFlWDs7R0FFRztBQUVILE1BQU0sT0FBTyxZQUFZO0lBRHpCO1FBR0UsNkNBQTZDO1FBQzdDLFVBQUssR0FBRyxDQUFDLENBQUM7UUFFVixrREFBa0Q7UUFDbEQsY0FBUyxHQUFHLElBQUksQ0FBQztRQUVqQixtRUFBbUU7UUFDbkUsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFcEIsOENBQThDO1FBQzlDLGFBQVEsR0FBd0osY0FBYyxDQUFDO1FBRS9LLDZGQUE2RjtRQUM3RixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsb0JBQW9CO1FBQ3BCLFVBQUssR0FBeUMsU0FBUyxDQUFDO0tBQ3pEOzt5R0FuQlksWUFBWTs2R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7O0FBc0JYLE1BQU0sQ0FBTixJQUFZLGVBSVg7QUFKRCxXQUFZLGVBQWU7SUFDekIsbURBQUcsQ0FBQTtJQUNILHVEQUFLLENBQUE7SUFDTCwrREFBUyxDQUFBO0FBQ1gsQ0FBQyxFQUpXLGVBQWUsS0FBZixlQUFlLFFB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b0JBQU0sR0FBa0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDOzBHQUZ6RCxhQUFhOzhHQUFiLGFBQWE7MkZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgaXNTdHJpbmcsIGlzTnVtYmVyLCBpc0Z1bmN0aW9uIH0gZnJvbSAnLi90b2FzdGEudXRpbHMnO1xyXG5cclxuXHJcblxyXG4vKipcclxuICogT3B0aW9ucyB0byBjb25maWd1cmUgYSBuZXcgVG9hc3RcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRvYXN0T3B0aW9ucyB7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgbXNnPzogc3RyaW5nO1xyXG4gIHNob3dDbG9zZT86IGJvb2xlYW47XHJcbiAgc2hvd0R1cmF0aW9uPzogYm9vbGVhbjtcclxuICB0aGVtZT86IHN0cmluZztcclxuICB0aW1lb3V0PzogbnVtYmVyO1xyXG4gIG9uQWRkPzogRnVuY3Rpb247XHJcbiAgb25SZW1vdmU/OiBGdW5jdGlvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFN0cnVjdHJ1cmUgb2YgYSBjcmVhdGVkIFRvYXN0XHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUb2FzdERhdGEge1xyXG4gIGlkITogbnVtYmVyO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIG1zZz86IHN0cmluZztcclxuICBzaG93Q2xvc2UhOiBib29sZWFuO1xyXG4gIHNob3dEdXJhdGlvbiE6IGJvb2xlYW47XHJcbiAgdHlwZSE6IHN0cmluZztcclxuICB0aGVtZSE6IHN0cmluZztcclxuICB0aW1lb3V0ITogbnVtYmVyO1xyXG4gIG9uQWRkPzogRnVuY3Rpb247XHJcbiAgb25SZW1vdmU/OiBGdW5jdGlvbjtcclxuICBvbkNsaWNrPzogRnVuY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGFsbCB0b2FzdHMgYW5kIHRvYXN0YSBjb250YWluZXJcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRvYXN0YUNvbmZpZyB7XHJcblxyXG4gIC8vIE1heGltdW0gbnVtYmVyIG9mIHRvYXN0aWVzIHRvIHNob3cgYXQgb25jZVxyXG4gIGxpbWl0ID0gNTtcclxuXHJcbiAgLy8gV2hldGhlciB0byBzaG93IHRoZSAnWCcgaWNvbiB0byBjbG9zZSB0aGUgdG9hc3RcclxuICBzaG93Q2xvc2UgPSB0cnVlO1xyXG5cclxuICAvLyBXaGV0aGVyIHRvIHNob3cgYSBwcm9ncmVzcyBiYXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbm90aWZpY2F0aW9uXHJcbiAgc2hvd0R1cmF0aW9uID0gdHJ1ZTtcclxuXHJcbiAgLy8gVGhlIHdpbmRvdyBwb3NpdGlvbiB3aGVyZSB0aGUgdG9hc3QgcG9wcyB1cFxyXG4gIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLWNlbnRlcicgfCAnYm90dG9tLWZ1bGx3aWR0aCcgfCAndG9wLXJpZ2h0JyB8ICd0b3AtbGVmdCcgfCAndG9wLWNlbnRlcicgfCAndG9wLWZ1bGx3aWR0aCcgfCAnY2VudGVyLWNlbnRlcicgPSAnYm90dG9tLXJpZ2h0JztcclxuXHJcbiAgLy8gSG93IGxvbmcgKGluIG1pbGlzZWNvbmRzKSB0aGUgdG9hc3RhIHNob3dzIGJlZm9yZSBpdCdzIHJlbW92ZWQuIFNldCB0byBudWxsLzAgdG8gdHVybiBvZmYuXHJcbiAgdGltZW91dCA9IDUwMDA7XHJcblxyXG4gIC8vIFdoYXQgdGhlbWUgdG8gdXNlXHJcbiAgdGhlbWU6ICdkZWZhdWx0JyB8ICdtYXRlcmlhbCcgfCAnYm9vdHN0cmFwJyA9ICdkZWZhdWx0JztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gVG9hc3RhRXZlbnRUeXBlIHtcclxuICBBREQsXHJcbiAgQ0xFQVIsXHJcbiAgQ0xFQVJfQUxMXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUb2FzdGFFdmVudCB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHR5cGU6IFRvYXN0YUV2ZW50VHlwZSwgcHVibGljIHZhbHVlPzogVG9hc3REYXRhIHwgbnVtYmVyKSB7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRvYXN0YVNlcnZpY2VGYWN0b3J5KGNvbmZpZzogVG9hc3RhQ29uZmlnKTogVG9hc3RhU2VydmljZSB7XHJcbiAgcmV0dXJuIG5ldyBUb2FzdGFTZXJ2aWNlKGNvbmZpZyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUb2FzdGEgc2VydmljZSBoZWxwcyBjcmVhdGUgZGlmZmVyZW50IGtpbmRzIG9mIFRvYXN0c1xyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVG9hc3RhU2VydmljZSB7XHJcbiAgLy8gQWxsb3dlZCBUSEVNRVNcclxuICBzdGF0aWMgVEhFTUVTOiBBcnJheTxzdHJpbmc+ID0gWydkZWZhdWx0JywgJ21hdGVyaWFsJywgJ2Jvb3RzdHJhcCddO1xyXG4gIC8vIEluaXQgdGhlIGNvdW50ZXJcclxuICB1bmlxdWVDb3VudGVyID0gMDtcclxuICAvLyBUb2FzdERhdGEgZXZlbnQgZW1pdHRlclxyXG4gIC8vIHByaXZhdGUgdG9hc3RzRW1pdHRlcjogRXZlbnRFbWl0dGVyPFRvYXN0RGF0YT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRvYXN0RGF0YT4oKTtcclxuICAvLyBDbGVhciBldmVudCBlbWl0dGVyXHJcbiAgLy8gcHJpdmF0ZSBjbGVhckVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIHByaXZhdGUgZXZlbnRTb3VyY2U6IFN1YmplY3Q8VG9hc3RhRXZlbnQ+ID0gbmV3IFN1YmplY3Q8VG9hc3RhRXZlbnQ+KCk7XHJcbiAgcHVibGljIGV2ZW50czogT2JzZXJ2YWJsZTxUb2FzdGFFdmVudD4gPSB0aGlzLmV2ZW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogVG9hc3RhQ29uZmlnKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGxpc3Qgb2YgdG9hdHNcclxuICAgKi9cclxuICAvLyBnZXRUb2FzdHMoKTogT2JzZXJ2YWJsZTxUb2FzdERhdGE+IHtcclxuICAvLyAgIHJldHVybiB0aGlzLnRvYXN0c0VtaXR0ZXIuYXNPYnNlcnZhYmxlKCk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBnZXRDbGVhcigpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuY2xlYXJFbWl0dGVyLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIC8vIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIFRvYXN0IG9mIGEgZGVmYXVsdCB0eXBlXHJcbiAgICovXHJcbiAgZGVmYXVsdChvcHRpb25zOiBUb2FzdE9wdGlvbnMgfCBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkKG9wdGlvbnMsICdkZWZhdWx0Jyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgVG9hc3Qgb2YgaW5mbyB0eXBlXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgSW5kaXZpZHVhbCB0b2FzdGEgY29uZmlnIG92ZXJyaWRlc1xyXG4gICAqL1xyXG4gIGluZm8ob3B0aW9uczogVG9hc3RPcHRpb25zIHwgc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZChvcHRpb25zLCAnaW5mbycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIFRvYXN0IG9mIHN1Y2Nlc3MgdHlwZVxyXG4gICAqIEBwYXJhbSBvcHRpb25zIEluZGl2aWR1YWwgdG9hc3RhIGNvbmZpZyBvdmVycmlkZXNcclxuICAgKi9cclxuICBzdWNjZXNzKG9wdGlvbnM6IFRvYXN0T3B0aW9ucyB8IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGQob3B0aW9ucywgJ3N1Y2Nlc3MnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBUb2FzdCBvZiB3YWl0IHR5cGVcclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbmRpdmlkdWFsIHRvYXN0YSBjb25maWcgb3ZlcnJpZGVzXHJcbiAgICovXHJcbiAgd2FpdChvcHRpb25zOiBUb2FzdE9wdGlvbnMgfCBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkKG9wdGlvbnMsICd3YWl0Jyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgVG9hc3Qgb2YgZXJyb3IgdHlwZVxyXG4gICAqIEBwYXJhbSBvcHRpb25zIEluZGl2aWR1YWwgdG9hc3RhIGNvbmZpZyBvdmVycmlkZXNcclxuICAgKi9cclxuICBlcnJvcihvcHRpb25zOiBUb2FzdE9wdGlvbnMgfCBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkKG9wdGlvbnMsICdlcnJvcicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIFRvYXN0IG9mIHdhcm5pbmcgdHlwZVxyXG4gICAqIEBwYXJhbSBvcHRpb25zIEluZGl2aWR1YWwgdG9hc3RhIGNvbmZpZyBvdmVycmlkZXNcclxuICAgKi9cclxuICB3YXJuaW5nKG9wdGlvbnM6IFRvYXN0T3B0aW9ucyB8IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5hZGQob3B0aW9ucywgJ3dhcm5pbmcnKTtcclxuICB9XHJcblxyXG5cclxuICAvLyBBZGQgYSBuZXcgdG9hc3QgaXRlbVxyXG4gIHByaXZhdGUgYWRkKG9wdGlvbnM6IFRvYXN0T3B0aW9ucyB8IHN0cmluZyB8IG51bWJlciwgdHlwZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgdG9hc3RhT3B0aW9uczogVG9hc3RPcHRpb25zO1xyXG5cclxuICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSAmJiBvcHRpb25zICE9PSAnJyB8fCBpc051bWJlcihvcHRpb25zKSkge1xyXG4gICAgICB0b2FzdGFPcHRpb25zID0ge1xyXG4gICAgICAgIHRpdGxlOiBvcHRpb25zLnRvU3RyaW5nKClcclxuICAgICAgfSBhcyBUb2FzdE9wdGlvbnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b2FzdGFPcHRpb25zID0gb3B0aW9ucyBhcyBUb2FzdE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0b2FzdGFPcHRpb25zIHx8ICF0b2FzdGFPcHRpb25zLnRpdGxlICYmICF0b2FzdGFPcHRpb25zLm1zZykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25neC10b2FzdGE6IE5vIHRvYXN0IHRpdGxlIG9yIG1lc3NhZ2Ugc3BlY2lmaWVkIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHR5cGUgPSB0eXBlIHx8ICdkZWZhdWx0JztcclxuXHJcbiAgICAvLyBTZXQgYSB1bmlxdWUgY291bnRlciBmb3IgYW4gaWRcclxuICAgIHRoaXMudW5pcXVlQ291bnRlcisrO1xyXG5cclxuICAgIC8vIFNldCB0aGUgbG9jYWwgdnMgZ2xvYmFsIGNvbmZpZyBpdGVtc1xyXG4gICAgY29uc3Qgc2hvd0Nsb3NlID0gdGhpcy5fY2hlY2tDb25maWdCb29sZWFuSXRlbSh0aGlzLmNvbmZpZywgdG9hc3RhT3B0aW9ucywgJ3Nob3dDbG9zZScpO1xyXG5cclxuICAgIC8vIFNldCB0aGUgbG9jYWwgdnMgZ2xvYmFsIGNvbmZpZyBpdGVtc1xyXG4gICAgY29uc3Qgc2hvd0R1cmF0aW9uID0gdGhpcy5fY2hlY2tDb25maWdCb29sZWFuSXRlbSh0aGlzLmNvbmZpZywgdG9hc3RhT3B0aW9ucywgJ3Nob3dEdXJhdGlvbicpO1xyXG5cclxuICAgIC8vIElmIHdlIGhhdmUgYSB0aGVtZSBzZXQsIG1ha2Ugc3VyZSBpdCdzIGEgdmFsaWQgb25lXHJcbiAgICBsZXQgdGhlbWU6IHN0cmluZztcclxuICAgIGlmICh0b2FzdGFPcHRpb25zLnRoZW1lKSB7XHJcbiAgICAgIHRoZW1lID0gVG9hc3RhU2VydmljZS5USEVNRVMuaW5kZXhPZih0b2FzdGFPcHRpb25zLnRoZW1lKSA+IC0xID8gdG9hc3RhT3B0aW9ucy50aGVtZSA6IHRoaXMuY29uZmlnLnRoZW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhlbWUgPSB0aGlzLmNvbmZpZy50aGVtZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b2FzdDogVG9hc3REYXRhID0ge1xyXG4gICAgICBpZDogdGhpcy51bmlxdWVDb3VudGVyLFxyXG4gICAgICB0aXRsZTogdG9hc3RhT3B0aW9ucy50aXRsZSxcclxuICAgICAgbXNnOiB0b2FzdGFPcHRpb25zLm1zZyxcclxuICAgICAgc2hvd0Nsb3NlLFxyXG4gICAgICBzaG93RHVyYXRpb24sXHJcbiAgICAgIHR5cGU6ICd0b2FzdGEtdHlwZS0nICsgdHlwZSxcclxuICAgICAgdGhlbWU6ICd0b2FzdGEtdGhlbWUtJyArIHRoZW1lLFxyXG4gICAgICAvLyBJZiB0aGVyZSdzIGEgdGltZW91dCBpbmRpdmlkdWFsbHkgb3IgZ2xvYmFsbHksIHNldCB0aGUgdG9hc3QgdG8gdGltZW91dFxyXG4gICAgICAvLyBBbGxvd3MgYSBjYWxsZXIgdG8gcGFzcyBudWxsLzAgYW5kIG92ZXJyaWRlIHRoZSBkZWZhdWx0LiBDYW4gYWxzbyBzZXQgdGhlIGRlZmF1bHQgdG8gbnVsbC8wIHRvIHR1cm4gb2ZmLlxyXG4gICAgICB0aW1lb3V0OiB0b2FzdGFPcHRpb25zLmhhc093blByb3BlcnR5KCd0aW1lb3V0JykgPyB0b2FzdGFPcHRpb25zLnRpbWVvdXQgPz8gMCA6IHRoaXMuY29uZmlnLnRpbWVvdXQsXHJcbiAgICAgIG9uQWRkOiB0b2FzdGFPcHRpb25zLm9uQWRkICYmIGlzRnVuY3Rpb24odG9hc3RhT3B0aW9ucy5vbkFkZCkgPyB0b2FzdGFPcHRpb25zLm9uQWRkIDogdW5kZWZpbmVkLFxyXG4gICAgICBvblJlbW92ZTogdG9hc3RhT3B0aW9ucy5vblJlbW92ZSAmJiBpc0Z1bmN0aW9uKHRvYXN0YU9wdGlvbnMub25SZW1vdmUpID8gdG9hc3RhT3B0aW9ucy5vblJlbW92ZSA6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBQdXNoIHVwIGEgbmV3IHRvYXN0IGl0ZW1cclxuICAgIC8vIHRoaXMudG9hc3RzU3Vic2NyaWJlci5uZXh0KHRvYXN0KTtcclxuICAgIC8vIHRoaXMudG9hc3RzRW1pdHRlci5uZXh0KHRvYXN0KTtcclxuICAgIHRoaXMuZW1pdEV2ZW50KG5ldyBUb2FzdGFFdmVudChUb2FzdGFFdmVudFR5cGUuQURELCB0b2FzdCkpO1xyXG4gICAgLy8gSWYgd2UgaGF2ZSBhIG9uQWRkIGZ1bmN0aW9uLCBjYWxsIGl0IGhlcmVcclxuICAgIGlmICh0b2FzdGFPcHRpb25zLm9uQWRkICYmIGlzRnVuY3Rpb24odG9hc3RhT3B0aW9ucy5vbkFkZCkpIHtcclxuICAgICAgdG9hc3RhT3B0aW9ucy5vbkFkZC5jYWxsKHRoaXMsIHRvYXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENsZWFyIGFsbCB0b2FzdHNcclxuICBjbGVhckFsbCgpIHtcclxuICAgIC8vIHRoaXMuY2xlYXJFbWl0dGVyLm5leHQobnVsbCk7XHJcbiAgICB0aGlzLmVtaXRFdmVudChuZXcgVG9hc3RhRXZlbnQoVG9hc3RhRXZlbnRUeXBlLkNMRUFSX0FMTCkpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xlYXIgdGhlIHNwZWNpZmljIG9uZVxyXG4gIGNsZWFyKGlkOiBudW1iZXIpIHtcclxuICAgIC8vIHRoaXMuY2xlYXJFbWl0dGVyLm5leHQoaWQpO1xyXG4gICAgdGhpcy5lbWl0RXZlbnQobmV3IFRvYXN0YUV2ZW50KFRvYXN0YUV2ZW50VHlwZS5DTEVBUiwgaWQpKTtcclxuICB9XHJcblxyXG4gIC8vIENoZWNrcyB3aGV0aGVyIHRoZSBsb2NhbCBvcHRpb24gaXMgc2V0LCBpZiBub3QsXHJcbiAgLy8gY2hlY2tzIHRoZSBnbG9iYWwgY29uZmlnXHJcbiAgcHJpdmF0ZSBfY2hlY2tDb25maWdCb29sZWFuSXRlbShjb25maWc6IGFueSwgb3B0aW9uczogYW55LCBwcm9wZXJ0eTogc3RyaW5nKSB7XHJcbiAgICBpZiAob3B0aW9uc1twcm9wZXJ0eV0gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnNbcHJvcGVydHldKSB7XHJcbiAgICAgIHJldHVybiBjb25maWdbcHJvcGVydHldIGFzIGJvb2xlYW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdEV2ZW50KGV2ZW50OiBUb2FzdGFFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZXZlbnRTb3VyY2UpIHtcclxuICAgICAgLy8gUHVzaCB1cCBhIG5ldyBldmVudFxyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLm5leHQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=