UNPKG

@hxui/angular

Version:

* * *

471 lines 37.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Inject, Injectable, Injector, NgZone, SecurityContext } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { Overlay } from './overlay/overlay'; import { ComponentPortal } from './portal/portal'; import { ToastrInjector, ToastrRef } from './toastr-injector'; import { ToastPackage, TOAST_CONFIG } from './toastr-config'; import * as i0 from "@angular/core"; import * as i1 from "./toastr-config"; import * as i2 from "./overlay/overlay"; import * as i3 from "@angular/platform-browser"; /** * @record * @template C */ export function ActiveToast() { } if (false) { /** * Your Toast ID. Use this to close it individually * @type {?} */ ActiveToast.prototype.toastId; /** * the message of your toast. Stored to prevent duplicates * @type {?} */ ActiveToast.prototype.message; /** * a reference to the component see portal.ts * @type {?} */ ActiveToast.prototype.portal; /** * a reference to your toast * @type {?} */ ActiveToast.prototype.toastRef; /** * triggered when toast is active * @type {?} */ ActiveToast.prototype.onShown; /** * triggered when toast is destroyed * @type {?} */ ActiveToast.prototype.onHidden; /** * triggered on toast click * @type {?} */ ActiveToast.prototype.onTap; /** * available for your use in custom toast * @type {?} */ ActiveToast.prototype.onAction; } var ToastrService = /** @class */ (function () { function ToastrService(token, overlay, _injector, sanitizer, ngZone) { this.overlay = overlay; this._injector = _injector; this.sanitizer = sanitizer; this.ngZone = ngZone; this.currentlyActive = 0; this.toasts = []; this.index = 0; this.toastrConfig = tslib_1.__assign({}, token.default, token.config); if (token.config.iconClasses) { this.toastrConfig.iconClasses = tslib_1.__assign({}, token.default.iconClasses, token.config.iconClasses); } } /** show toast */ /** * show toast * @param {?=} message * @param {?=} title * @param {?=} override * @param {?=} type * @return {?} */ ToastrService.prototype.show = /** * show toast * @param {?=} message * @param {?=} title * @param {?=} override * @param {?=} type * @return {?} */ function (message, title, override, type) { if (override === void 0) { override = {}; } if (type === void 0) { type = ''; } return this._preBuildNotification(type, message, title, this.applyConfig(override)); }; /** show successful toast */ /** * show successful toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ ToastrService.prototype.success = /** * show successful toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ function (message, title, override) { if (override === void 0) { override = {}; } /** @type {?} */ var type = this.toastrConfig.iconClasses.success || ''; return this._preBuildNotification(type, message, title, this.applyConfig(override)); }; /** show error toast */ /** * show error toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ ToastrService.prototype.error = /** * show error toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ function (message, title, override) { if (override === void 0) { override = {}; } /** @type {?} */ var type = this.toastrConfig.iconClasses.error || ''; return this._preBuildNotification(type, message, title, this.applyConfig(override)); }; /** show info toast */ /** * show info toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ ToastrService.prototype.info = /** * show info toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ function (message, title, override) { if (override === void 0) { override = {}; } /** @type {?} */ var type = this.toastrConfig.iconClasses.info || ''; return this._preBuildNotification(type, message, title, this.applyConfig(override)); }; /** show warning toast */ /** * show warning toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ ToastrService.prototype.warning = /** * show warning toast * @param {?=} message * @param {?=} title * @param {?=} override * @return {?} */ function (message, title, override) { if (override === void 0) { override = {}; } /** @type {?} */ var type = this.toastrConfig.iconClasses.warning || ''; return this._preBuildNotification(type, message, title, this.applyConfig(override)); }; /** * Remove all or a single toast by id */ /** * Remove all or a single toast by id * @param {?=} toastId * @return {?} */ ToastrService.prototype.clear = /** * Remove all or a single toast by id * @param {?=} toastId * @return {?} */ function (toastId) { var e_1, _a; try { // Call every toastRef manualClose function for (var _b = tslib_1.__values(this.toasts), _c = _b.next(); !_c.done; _c = _b.next()) { var toast = _c.value; if (toastId !== undefined) { if (toast.toastId === toastId) { toast.toastRef.manualClose(); return; } } else { toast.toastRef.manualClose(); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** * Remove and destroy a single toast by id */ /** * Remove and destroy a single toast by id * @param {?} toastId * @return {?} */ ToastrService.prototype.remove = /** * Remove and destroy a single toast by id * @param {?} toastId * @return {?} */ function (toastId) { /** @type {?} */ var found = this._findToast(toastId); if (!found) { return false; } found.activeToast.toastRef.close(); this.toasts.splice(found.index, 1); this.currentlyActive = this.currentlyActive - 1; if (!this.toastrConfig.maxOpened || !this.toasts.length) { return false; } if (this.currentlyActive < this.toastrConfig.maxOpened && this.toasts[this.currentlyActive]) { /** @type {?} */ var p = this.toasts[this.currentlyActive].toastRef; if (!p.isInactive()) { this.currentlyActive = this.currentlyActive + 1; p.activate(); } } return true; }; /** * Finds a duplicate toast if one exists */ /** * Finds a duplicate toast if one exists * @param {?} message * @param {?} resetOnDuplicate * @return {?} */ ToastrService.prototype.findDuplicate = /** * Finds a duplicate toast if one exists * @param {?} message * @param {?} resetOnDuplicate * @return {?} */ function (message, resetOnDuplicate) { for (var i = 0; i < this.toasts.length; i++) { /** @type {?} */ var toast = this.toasts[i]; if (toast.message === message) { if (resetOnDuplicate && toast.toastRef.componentInstance.resetTimeout) { toast.toastRef.resetTimeout(); } return toast; } } return null; }; /** create a clone of global config and apply individual settings */ /** * create a clone of global config and apply individual settings * @param {?=} override * @return {?} */ ToastrService.prototype.applyConfig = /** * create a clone of global config and apply individual settings * @param {?=} override * @return {?} */ function (override) { if (override === void 0) { override = {}; } return tslib_1.__assign({}, this.toastrConfig, override); }; /** * Find toast object by id */ /** * Find toast object by id * @param {?} toastId * @return {?} */ ToastrService.prototype._findToast = /** * Find toast object by id * @param {?} toastId * @return {?} */ function (toastId) { for (var i = 0; i < this.toasts.length; i++) { if (this.toasts[i].toastId === toastId) { return { index: i, activeToast: this.toasts[i] }; } } return null; }; /** * Determines the need to run inside angular's zone then builds the toast */ /** * Determines the need to run inside angular's zone then builds the toast * @param {?} toastType * @param {?} message * @param {?} title * @param {?} config * @return {?} */ ToastrService.prototype._preBuildNotification = /** * Determines the need to run inside angular's zone then builds the toast * @param {?} toastType * @param {?} message * @param {?} title * @param {?} config * @return {?} */ function (toastType, message, title, config) { var _this = this; if (config.onActivateTick) { return this.ngZone.run(function () { return _this._buildNotification(toastType, message, title, config); }); } return this._buildNotification(toastType, message, title, config); }; /** * Creates and attaches toast data to component * returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast. */ /** * Creates and attaches toast data to component * returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast. * @param {?} toastType * @param {?} message * @param {?} title * @param {?} config * @return {?} */ ToastrService.prototype._buildNotification = /** * Creates and attaches toast data to component * returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast. * @param {?} toastType * @param {?} message * @param {?} title * @param {?} config * @return {?} */ function (toastType, message, title, config) { var _this = this; if (!config.toastComponent) { throw new Error('toastComponent required'); } // max opened and auto dismiss = true if (message && this.toastrConfig.preventDuplicates) { /** @type {?} */ var duplicate = this.findDuplicate(message, this.toastrConfig.resetTimeoutOnDuplicate); if (duplicate !== null) { return duplicate; } } this.previousToastMessage = message; /** @type {?} */ var keepInactive = false; if (this.toastrConfig.maxOpened && this.currentlyActive >= this.toastrConfig.maxOpened) { keepInactive = true; if (this.toastrConfig.autoDismiss) { this.clear(this.toasts[0].toastId); } } /** @type {?} */ var overlayRef = this.overlay.create(config.position, this.overlayContainer); this.index = this.index + 1; /** @type {?} */ var sanitizedMessage = message; if (message && config.enableHtml) { sanitizedMessage = this.sanitizer.sanitize(SecurityContext.HTML, message); } /** @type {?} */ var toastRef = new ToastrRef(overlayRef); /** @type {?} */ var toastPackage = new ToastPackage(this.index, config, sanitizedMessage, title, toastType, toastRef); /** @type {?} */ var toastInjector = new ToastrInjector(toastPackage, this._injector); /** @type {?} */ var component = new ComponentPortal(config.toastComponent, toastInjector); /** @type {?} */ var portal = overlayRef.attach(component, this.toastrConfig.newestOnTop); toastRef.componentInstance = ((/** @type {?} */ (portal)))._component; /** @type {?} */ var ins = { toastId: this.index, message: message || '', toastRef: toastRef, onShown: toastRef.afterActivate(), onHidden: toastRef.afterClosed(), onTap: toastPackage.onTap(), onAction: toastPackage.onAction(), portal: portal }; if (!keepInactive) { setTimeout(function () { ins.toastRef.activate(); _this.currentlyActive = _this.currentlyActive + 1; }); } this.toasts.push(ins); return ins; }; ToastrService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ ToastrService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [TOAST_CONFIG,] }] }, { type: Overlay }, { type: Injector }, { type: DomSanitizer }, { type: NgZone } ]; }; /** @nocollapse */ ToastrService.ngInjectableDef = i0.defineInjectable({ factory: function ToastrService_Factory() { return new ToastrService(i0.inject(i1.TOAST_CONFIG), i0.inject(i2.Overlay), i0.inject(i0.INJECTOR), i0.inject(i3.DomSanitizer), i0.inject(i0.NgZone)); }, token: ToastrService, providedIn: "root" }); return ToastrService; }()); export { ToastrService }; if (false) { /** @type {?} */ ToastrService.prototype.toastrConfig; /** @type {?} */ ToastrService.prototype.currentlyActive; /** @type {?} */ ToastrService.prototype.toasts; /** @type {?} */ ToastrService.prototype.overlayContainer; /** @type {?} */ ToastrService.prototype.previousToastMessage; /** @type {?} */ ToastrService.prototype.index; /** @type {?} */ ToastrService.prototype.overlay; /** @type {?} */ ToastrService.prototype._injector; /** @type {?} */ ToastrService.prototype.sanitizer; /** @type {?} */ ToastrService.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3RvYXN0ci90b2FzdHIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFFTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixNQUFNLEVBQ04sZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFJbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlELE9BQU8sRUFBa0MsWUFBWSxFQUFlLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFFMUcsaUNBaUJDOzs7Ozs7SUFmQyw4QkFBZ0I7Ozs7O0lBRWhCLDhCQUFnQjs7Ozs7SUFFaEIsNkJBQXdCOzs7OztJQUV4QiwrQkFBdUI7Ozs7O0lBRXZCLDhCQUF5Qjs7Ozs7SUFFekIsK0JBQTBCOzs7OztJQUUxQiw0QkFBdUI7Ozs7O0lBRXZCLCtCQUEwQjs7QUFHNUI7SUFTRSx1QkFDd0IsS0FBa0IsRUFDaEMsT0FBZ0IsRUFDaEIsU0FBbUIsRUFDbkIsU0FBdUIsRUFDdkIsTUFBYztRQUhkLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFYeEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUF1QixFQUFFLENBQUM7UUFHeEIsVUFBSyxHQUFHLENBQUMsQ0FBQztRQVNoQixJQUFJLENBQUMsWUFBWSx3QkFD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bkIsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO1lBQ3RCLFFBQVEsVUFBQTtZQUNSLE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFO1lBQ2pDLFFBQVEsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFO1lBQ2hDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQ2pDLE1BQU0sUUFBQTtTQUNQO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixVQUFVLENBQUM7Z0JBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsS0FBSSxDQUFDLGVBQWUsR0FBRyxLQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztnQkE1UUYsVUFBVSxTQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7OztnREFVN0IsTUFBTSxTQUFDLFlBQVk7Z0JBbkNmLE9BQU87Z0JBUmQsUUFBUTtnQkFJRCxZQUFZO2dCQUhuQixNQUFNOzs7d0JBTFI7Q0FrVEMsQUE3UUQsSUE2UUM7U0E1UVksYUFBYTs7O0lBQ3hCLHFDQUEyQjs7SUFDM0Isd0NBQW9COztJQUNwQiwrQkFBZ0M7O0lBQ2hDLHlDQUEyQzs7SUFDM0MsNkNBQXlDOztJQUN6Qyw4QkFBa0I7O0lBSWhCLGdDQUF3Qjs7SUFDeEIsa0NBQTJCOztJQUMzQixrQ0FBK0I7O0lBQy9CLCtCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIE5nWm9uZSxcclxuICBTZWN1cml0eUNvbnRleHRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJy4vb3ZlcmxheS9vdmVybGF5JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnLi9wb3J0YWwvcG9ydGFsJztcclxuaW1wb3J0IHsgVG9hc3RySW5qZWN0b3IsIFRvYXN0clJlZiB9IGZyb20gJy4vdG9hc3RyLWluamVjdG9yJztcclxuaW1wb3J0IHsgVG9hc3RyQ29udGFpbmVyRGlyZWN0aXZlIH0gZnJvbSAnLi90b2FzdHIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR2xvYmFsQ29uZmlnLCBJbmRpdmlkdWFsQ29uZmlnLCBUb2FzdFBhY2thZ2UsIFRvYXN0clRva2VuLCBUT0FTVF9DT05GSUcgfSBmcm9tICcuL3RvYXN0ci1jb25maWcnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVUb2FzdDxDPiB7XHJcbiAgLyoqIFlvdXIgVG9hc3QgSUQuIFVzZSB0aGlzIHRvIGNsb3NlIGl0IGluZGl2aWR1YWxseSAqL1xyXG4gIHRvYXN0SWQ6IG51bWJlcjtcclxuICAvKiogdGhlIG1lc3NhZ2Ugb2YgeW91ciB0b2FzdC4gU3RvcmVkIHRvIHByZXZlbnQgZHVwbGljYXRlcyAqL1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICAvKiogYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBzZWUgcG9ydGFsLnRzICovXHJcbiAgcG9ydGFsOiBDb21wb25lbnRSZWY8Qz47XHJcbiAgLyoqIGEgcmVmZXJlbmNlIHRvIHlvdXIgdG9hc3QgKi9cclxuICB0b2FzdFJlZjogVG9hc3RyUmVmPEM+O1xyXG4gIC8qKiB0cmlnZ2VyZWQgd2hlbiB0b2FzdCBpcyBhY3RpdmUgKi9cclxuICBvblNob3duOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgLyoqIHRyaWdnZXJlZCB3aGVuIHRvYXN0IGlzIGRlc3Ryb3llZCAqL1xyXG4gIG9uSGlkZGVuOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgLyoqIHRyaWdnZXJlZCBvbiB0b2FzdCBjbGljayAqL1xyXG4gIG9uVGFwOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgLyoqIGF2YWlsYWJsZSBmb3IgeW91ciB1c2UgaW4gY3VzdG9tIHRvYXN0ICovXHJcbiAgb25BY3Rpb246IE9ic2VydmFibGU8YW55PjtcclxufVxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRvYXN0clNlcnZpY2Uge1xyXG4gIHRvYXN0ckNvbmZpZzogR2xvYmFsQ29uZmlnO1xyXG4gIGN1cnJlbnRseUFjdGl2ZSA9IDA7XHJcbiAgdG9hc3RzOiBBY3RpdmVUb2FzdDxhbnk+W10gPSBbXTtcclxuICBvdmVybGF5Q29udGFpbmVyOiBUb2FzdHJDb250YWluZXJEaXJlY3RpdmU7XHJcbiAgcHJldmlvdXNUb2FzdE1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGluZGV4ID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KFRPQVNUX0NPTkZJRykgdG9rZW46IFRvYXN0clRva2VuLFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICApIHtcclxuICAgIHRoaXMudG9hc3RyQ29uZmlnID0ge1xyXG4gICAgICAuLi50b2tlbi5kZWZhdWx0LFxyXG4gICAgICAuLi50b2tlbi5jb25maWcsXHJcbiAgICB9O1xyXG4gICAgaWYgKHRva2VuLmNvbmZpZy5pY29uQ2xhc3Nlcykge1xyXG4gICAgICB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3NlcyA9IHtcclxuICAgICAgICAuLi50b2tlbi5kZWZhdWx0Lmljb25DbGFzc2VzLFxyXG4gICAgICAgIC4uLnRva2VuLmNvbmZpZy5pY29uQ2xhc3NlcyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqIHNob3cgdG9hc3QgKi9cclxuICBzaG93KFxyXG4gICAgbWVzc2FnZT86IHN0cmluZyxcclxuICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgb3ZlcnJpZGU6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fSxcclxuICAgIHR5cGUgPSAnJ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgICB0eXBlLFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgdGhpcy5hcHBseUNvbmZpZyhvdmVycmlkZSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKiBzaG93IHN1Y2Nlc3NmdWwgdG9hc3QgKi9cclxuICBzdWNjZXNzKFxyXG4gICAgbWVzc2FnZT86IHN0cmluZyxcclxuICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgb3ZlcnJpZGU6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fVxyXG4gICkge1xyXG4gICAgY29uc3QgdHlwZSA9IHRoaXMudG9hc3RyQ29uZmlnLmljb25DbGFzc2VzLnN1Y2Nlc3MgfHwgJyc7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICB0aGlzLmFwcGx5Q29uZmlnKG92ZXJyaWRlKVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqIHNob3cgZXJyb3IgdG9hc3QgKi9cclxuICBlcnJvcihcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge31cclxuICApIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlcy5lcnJvciB8fCAnJztcclxuICAgIHJldHVybiB0aGlzLl9wcmVCdWlsZE5vdGlmaWNhdGlvbihcclxuICAgICAgdHlwZSxcclxuICAgICAgbWVzc2FnZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIHRoaXMuYXBwbHlDb25maWcob3ZlcnJpZGUpXHJcbiAgICApO1xyXG4gIH1cclxuICAvKiogc2hvdyBpbmZvIHRvYXN0ICovXHJcbiAgaW5mbyhcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge31cclxuICApIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlcy5pbmZvIHx8ICcnO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgICB0eXBlLFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgdGhpcy5hcHBseUNvbmZpZyhvdmVycmlkZSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKiBzaG93IHdhcm5pbmcgdG9hc3QgKi9cclxuICB3YXJuaW5nKFxyXG4gICAgbWVzc2FnZT86IHN0cmluZyxcclxuICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgb3ZlcnJpZGU6IFBhcnRpYWw8SW5kaXZpZHVhbENvbmZpZz4gPSB7fVxyXG4gICkge1xyXG4gICAgY29uc3QgdHlwZSA9IHRoaXMudG9hc3RyQ29uZmlnLmljb25DbGFzc2VzLndhcm5pbmcgfHwgJyc7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICB0aGlzLmFwcGx5Q29uZmlnKG92ZXJyaWRlKVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFsbCBvciBhIHNpbmdsZSB0b2FzdCBieSBpZFxyXG4gICAqL1xyXG4gIGNsZWFyKHRvYXN0SWQ/OiBudW1iZXIpIHtcclxuICAgIC8vIENhbGwgZXZlcnkgdG9hc3RSZWYgbWFudWFsQ2xvc2UgZnVuY3Rpb25cclxuICAgIGZvciAoY29uc3QgdG9hc3Qgb2YgdGhpcy50b2FzdHMpIHtcclxuICAgICAgaWYgKHRvYXN0SWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0b2FzdC50b2FzdElkID09PSB0b2FzdElkKSB7XHJcbiAgICAgICAgICB0b2FzdC50b2FzdFJlZi5tYW51YWxDbG9zZSgpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b2FzdC50b2FzdFJlZi5tYW51YWxDbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbmQgZGVzdHJveSBhIHNpbmdsZSB0b2FzdCBieSBpZFxyXG4gICAqL1xyXG4gIHJlbW92ZSh0b2FzdElkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fZmluZFRvYXN0KHRvYXN0SWQpO1xyXG4gICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3VuZC5hY3RpdmVUb2FzdC50b2FzdFJlZi5jbG9zZSgpO1xyXG4gICAgdGhpcy50b2FzdHMuc3BsaWNlKGZvdW5kLmluZGV4LCAxKTtcclxuICAgIHRoaXMuY3VycmVudGx5QWN0aXZlID0gdGhpcy5jdXJyZW50bHlBY3RpdmUgLSAxO1xyXG4gICAgaWYgKCF0aGlzLnRvYXN0ckNvbmZpZy5tYXhPcGVuZWQgfHwgIXRoaXMudG9hc3RzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY3VycmVudGx5QWN0aXZlIDwgdGhpcy50b2FzdHJDb25maWcubWF4T3BlbmVkICYmXHJcbiAgICAgIHRoaXMudG9hc3RzW3RoaXMuY3VycmVudGx5QWN0aXZlXVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnRvYXN0c1t0aGlzLmN1cnJlbnRseUFjdGl2ZV0udG9hc3RSZWY7XHJcbiAgICAgIGlmICghcC5pc0luYWN0aXZlKCkpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRseUFjdGl2ZSA9IHRoaXMuY3VycmVudGx5QWN0aXZlICsgMTtcclxuICAgICAgICBwLmFjdGl2YXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluZHMgYSBkdXBsaWNhdGUgdG9hc3QgaWYgb25lIGV4aXN0c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZER1cGxpY2F0ZShtZXNzYWdlOiBzdHJpbmcsIHJlc2V0T25EdXBsaWNhdGU6IGJvb2xlYW4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b2FzdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgdG9hc3QgPSB0aGlzLnRvYXN0c1tpXTtcclxuICAgICAgaWYgKHRvYXN0Lm1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAocmVzZXRPbkR1cGxpY2F0ZSAmJiB0b2FzdC50b2FzdFJlZi5jb21wb25lbnRJbnN0YW5jZS5yZXNldFRpbWVvdXQpIHtcclxuICAgICAgICAgIHRvYXN0LnRvYXN0UmVmLnJlc2V0VGltZW91dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG9hc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIGNyZWF0ZSBhIGNsb25lIG9mIGdsb2JhbCBjb25maWcgYW5kIGFwcGx5IGluZGl2aWR1YWwgc2V0dGluZ3MgKi9cclxuICBwcml2YXRlIGFwcGx5Q29uZmlnKG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge30pOiBHbG9iYWxDb25maWcge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy50b2FzdHJDb25maWcsIC4uLm92ZXJyaWRlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIHRvYXN0IG9iamVjdCBieSBpZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2ZpbmRUb2FzdChcclxuICAgIHRvYXN0SWQ6IG51bWJlclxyXG4gICk6IHsgaW5kZXg6IG51bWJlcjsgYWN0aXZlVG9hc3Q6IEFjdGl2ZVRvYXN0PGFueT4gfSB8IG51bGwge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvYXN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy50b2FzdHNbaV0udG9hc3RJZCA9PT0gdG9hc3RJZCkge1xyXG4gICAgICAgIHJldHVybiB7IGluZGV4OiBpLCBhY3RpdmVUb2FzdDogdGhpcy50b2FzdHNbaV0gfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBuZWVkIHRvIHJ1biBpbnNpZGUgYW5ndWxhcidzIHpvbmUgdGhlbiBidWlsZHMgdGhlIHRvYXN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICB0b2FzdFR5cGU6IHN0cmluZyxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IEdsb2JhbENvbmZpZ1xyXG4gICk6IEFjdGl2ZVRvYXN0PGFueT4gfCBudWxsIHtcclxuICAgIGlmIChjb25maWcub25BY3RpdmF0ZVRpY2spIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bigoKSA9PlxyXG4gICAgICAgIHRoaXMuX2J1aWxkTm90aWZpY2F0aW9uKHRvYXN0VHlwZSwgbWVzc2FnZSwgdGl0bGUsIGNvbmZpZylcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9idWlsZE5vdGlmaWNhdGlvbih0b2FzdFR5cGUsIG1lc3NhZ2UsIHRpdGxlLCBjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbmQgYXR0YWNoZXMgdG9hc3QgZGF0YSB0byBjb21wb25lbnRcclxuICAgKiByZXR1cm5zIHRoZSBhY3RpdmUgdG9hc3QsIG9yIGluIGNhc2UgcHJldmVudER1cGxpY2F0ZXMgaXMgZW5hYmxlZCB0aGUgb3JpZ2luYWwvbm9uLWR1cGxpY2F0ZSBhY3RpdmUgdG9hc3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfYnVpbGROb3RpZmljYXRpb24oXHJcbiAgICB0b2FzdFR5cGU6IHN0cmluZyxcclxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IEdsb2JhbENvbmZpZ1xyXG4gICk6IEFjdGl2ZVRvYXN0PGFueT4gfCBudWxsIHtcclxuICAgIGlmICghY29uZmlnLnRvYXN0Q29tcG9uZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG9hc3RDb21wb25lbnQgcmVxdWlyZWQnKTtcclxuICAgIH1cclxuICAgIC8vIG1heCBvcGVuZWQgYW5kIGF1dG8gZGlzbWlzcyA9IHRydWVcclxuICAgIGlmIChcclxuICAgICAgbWVzc2FnZSAmJlxyXG4gICAgICB0aGlzLnRvYXN0ckNvbmZpZy5wcmV2ZW50RHVwbGljYXRlc1xyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHRoaXMuZmluZER1cGxpY2F0ZShtZXNzYWdlLCB0aGlzLnRvYXN0ckNvbmZpZy5yZXNldFRpbWVvdXRPbkR1cGxpY2F0ZSk7XHJcbiAgICAgIGlmIChkdXBsaWNhdGUgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZHVwbGljYXRlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZpb3VzVG9hc3RNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgIGxldCBrZWVwSW5hY3RpdmUgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy50b2FzdHJDb25maWcubWF4T3BlbmVkICYmXHJcbiAgICAgIHRoaXMuY3VycmVudGx5QWN0aXZlID49IHRoaXMudG9hc3RyQ29uZmlnLm1heE9wZW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIGtlZXBJbmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgIGlmICh0aGlzLnRvYXN0ckNvbmZpZy5hdXRvRGlzbWlzcykge1xyXG4gICAgICAgIHRoaXMuY2xlYXIodGhpcy50b2FzdHNbMF0udG9hc3RJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxyXG4gICAgICBjb25maWcucG9zaXRpb24sXHJcbiAgICAgIHRoaXMub3ZlcmxheUNvbnRhaW5lclxyXG4gICAgKTtcclxuICAgIHRoaXMuaW5kZXggPSB0aGlzLmluZGV4ICsgMTtcclxuICAgIGxldCBzYW5pdGl6ZWRNZXNzYWdlOiBzdHJpbmcgfCBTYWZlSHRtbCB8IHVuZGVmaW5lZCB8IG51bGwgPSBtZXNzYWdlO1xyXG4gICAgaWYgKG1lc3NhZ2UgJiYgY29uZmlnLmVuYWJsZUh0bWwpIHtcclxuICAgICAgc2FuaXRpemVkTWVzc2FnZSA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBtZXNzYWdlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRvYXN0UmVmID0gbmV3IFRvYXN0clJlZihvdmVybGF5UmVmKTtcclxuICAgIGNvbnN0IHRvYXN0UGFja2FnZSA9IG5ldyBUb2FzdFBhY2thZ2UoXHJcbiAgICAgIHRoaXMuaW5kZXgsXHJcbiAgICAgIGNvbmZpZyxcclxuICAgICAgc2FuaXRpemVkTWVzc2FnZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIHRvYXN0VHlwZSxcclxuICAgICAgdG9hc3RSZWZcclxuICAgICk7XHJcbiAgICBjb25zdCB0b2FzdEluamVjdG9yID0gbmV3IFRvYXN0ckluamVjdG9yKHRvYXN0UGFja2FnZSwgdGhpcy5faW5qZWN0b3IpO1xyXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudFBvcnRhbChjb25maWcudG9hc3RDb21wb25lbnQsIHRvYXN0SW5qZWN0b3IpO1xyXG4gICAgY29uc3QgcG9ydGFsID0gb3ZlcmxheVJlZi5hdHRhY2goY29tcG9uZW50LCB0aGlzLnRvYXN0ckNvbmZpZy5uZXdlc3RPblRvcCk7XHJcbiAgICB0b2FzdFJlZi5jb21wb25lbnRJbnN0YW5jZSA9ICg8YW55PnBvcnRhbCkuX2NvbXBvbmVudDtcclxuICAgIGNvbnN0IGluczogQWN0aXZlVG9hc3Q8YW55PiA9IHtcclxuICAgICAgdG9hc3RJZDogdGhpcy5pbmRleCxcclxuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnJyxcclxuICAgICAgdG9hc3RSZWYsXHJcbiAgICAgIG9uU2hvd246IHRvYXN0UmVmLmFmdGVyQWN0aXZhdGUoKSxcclxuICAgICAgb25IaWRkZW46IHRvYXN0UmVmLmFmdGVyQ2xvc2VkKCksXHJcbiAgICAgIG9uVGFwOiB0b2FzdFBhY2thZ2Uub25UYXAoKSxcclxuICAgICAgb25BY3Rpb246IHRvYXN0UGFja2FnZS5vbkFjdGlvbigpLFxyXG4gICAgICBwb3J0YWxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCFrZWVwSW5hY3RpdmUpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaW5zLnRvYXN0UmVmLmFjdGl2YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50bHlBY3RpdmUgPSB0aGlzLmN1cnJlbnRseUFjdGl2ZSArIDE7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9hc3RzLnB1c2goaW5zKTtcclxuICAgIHJldHVybiBpbnM7XHJcbiAgfVxyXG59XHJcbiJdfQ==