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
JavaScript
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=