| /** |
| * @fileoverview added by tsickle |
| * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc |
| */ |
| import * as tslib_1 from "tslib"; |
| import { Injectable, SkipSelf, Optional } from '@angular/core'; |
| import { LoadingMode, LoadingStrategy, LoadingType } from '../loading.component'; |
| import { TdLoadingFactory } from './loading.factory'; |
| /** |
| * @record |
| */ |
| export function ITdLoadingConfig() { } |
| if (false) { |
| /** @type {?} */ |
| ITdLoadingConfig.prototype.name; |
| /** @type {?|undefined} */ |
| ITdLoadingConfig.prototype.type; |
| /** @type {?|undefined} */ |
| ITdLoadingConfig.prototype.mode; |
| /** @type {?|undefined} */ |
| ITdLoadingConfig.prototype.color; |
| } |
| var TdLoadingConfig = /** @class */ (function () { |
| function TdLoadingConfig(config) { |
| this.name = config.name; |
| if (!this.name) { |
| throw Error('Name is required for [TdLoading] configuration.'); |
| } |
| this.mode = config.mode ? config.mode : LoadingMode.Indeterminate; |
| this.type = config.type ? config.type : LoadingType.Circular; |
| this.color = config.color ? config.color : 'primary'; |
| } |
| return TdLoadingConfig; |
| }()); |
| export { TdLoadingConfig }; |
| if (false) { |
| /** @type {?} */ |
| TdLoadingConfig.prototype.name; |
| /** @type {?} */ |
| TdLoadingConfig.prototype.type; |
| /** @type {?} */ |
| TdLoadingConfig.prototype.mode; |
| /** @type {?} */ |
| TdLoadingConfig.prototype.color; |
| } |
| /** |
| * @record |
| */ |
| export function ITdLoadingDirectiveConfig() { } |
| if (false) { |
| /** @type {?|undefined} */ |
| ITdLoadingDirectiveConfig.prototype.strategy; |
| } |
| var TdLoadingDirectiveConfig = /** @class */ (function (_super) { |
| tslib_1.__extends(TdLoadingDirectiveConfig, _super); |
| function TdLoadingDirectiveConfig(config) { |
| var _this = _super.call(this, config) || this; |
| _this.strategy = config.strategy ? config.strategy : LoadingStrategy.Replace; |
| return _this; |
| } |
| return TdLoadingDirectiveConfig; |
| }(TdLoadingConfig)); |
| export { TdLoadingDirectiveConfig }; |
| if (false) { |
| /** @type {?} */ |
| TdLoadingDirectiveConfig.prototype.name; |
| /** @type {?} */ |
| TdLoadingDirectiveConfig.prototype.type; |
| /** @type {?} */ |
| TdLoadingDirectiveConfig.prototype.mode; |
| /** @type {?} */ |
| TdLoadingDirectiveConfig.prototype.strategy; |
| } |
| var TdLoadingService = /** @class */ (function () { |
| function TdLoadingService(_loadingFactory) { |
| this._loadingFactory = _loadingFactory; |
| this._context = {}; |
| this._timeouts = {}; |
| this.create({ |
| name: 'td-loading-main', |
| }); |
| } |
| /** |
| * params: |
| * - config: ILoadingDirectiveConfig |
| * - viewContainerRef: ViewContainerRef |
| * - templateRef: TemplateRef<Object> |
| * |
| * Creates an replace loading mask and attaches it to the viewContainerRef. |
| * Replaces the templateRef with the mask when a request is registered on it. |
| * |
| * NOTE: @internal usage only. |
| */ |
| /** |
| * params: |
| * - config: ILoadingDirectiveConfig |
| * - viewContainerRef: ViewContainerRef |
| * - templateRef: TemplateRef<Object> |
| * |
| * Creates an replace loading mask and attaches it to the viewContainerRef. |
| * Replaces the templateRef with the mask when a request is registered on it. |
| * |
| * NOTE: \@internal usage only. |
| * @param {?} config |
| * @param {?} viewContainerRef |
| * @param {?} templateRef |
| * @param {?} context |
| * @return {?} |
| */ |
| TdLoadingService.prototype.createComponent = /** |
| * params: |
| * - config: ILoadingDirectiveConfig |
| * - viewContainerRef: ViewContainerRef |
| * - templateRef: TemplateRef<Object> |
| * |
| * Creates an replace loading mask and attaches it to the viewContainerRef. |
| * Replaces the templateRef with the mask when a request is registered on it. |
| * |
| * NOTE: \@internal usage only. |
| * @param {?} config |
| * @param {?} viewContainerRef |
| * @param {?} templateRef |
| * @param {?} context |
| * @return {?} |
| */ |
| function (config, viewContainerRef, templateRef, context) { |
| /** @type {?} */ |
| var directiveConfig = new TdLoadingDirectiveConfig(config); |
| if (this._context[directiveConfig.name]) { |
| throw Error("Name duplication: [TdLoading] directive has a name conflict with " + directiveConfig.name + "."); |
| } |
| if (directiveConfig.strategy === LoadingStrategy.Overlay) { |
| this._context[directiveConfig.name] = this._loadingFactory.createOverlayComponent(directiveConfig, viewContainerRef, templateRef); |
| } |
| else { |
| this._context[directiveConfig.name] = this._loadingFactory.createReplaceComponent(directiveConfig, viewContainerRef, templateRef, context); |
| } |
| return this._context[directiveConfig.name]; |
| }; |
| /** |
| * params: |
| * - config: ITdLoadingConfig |
| * |
| * Creates a fullscreen loading mask and attaches it to the DOM with the given configuration. |
| * Only displayed when the mask has a request registered on it. |
| */ |
| /** |
| * params: |
| * - config: ITdLoadingConfig |
| * |
| * Creates a fullscreen loading mask and attaches it to the DOM with the given configuration. |
| * Only displayed when the mask has a request registered on it. |
| * @param {?} config |
| * @return {?} |
| */ |
| TdLoadingService.prototype.create = /** |
| * params: |
| * - config: ITdLoadingConfig |
| * |
| * Creates a fullscreen loading mask and attaches it to the DOM with the given configuration. |
| * Only displayed when the mask has a request registered on it. |
| * @param {?} config |
| * @return {?} |
| */ |
| function (config) { |
| /** @type {?} */ |
| var fullscreenConfig = new TdLoadingConfig(config); |
| this.removeComponent(fullscreenConfig.name); |
| this._context[fullscreenConfig.name] = this._loadingFactory.createFullScreenComponent(fullscreenConfig); |
| }; |
| /** |
| * params: |
| * - name: string |
| * |
| * Removes `loading` component from service context. |
| */ |
| /** |
| * params: |
| * - name: string |
| * |
| * Removes `loading` component from service context. |
| * @param {?} name |
| * @return {?} |
| */ |
| TdLoadingService.prototype.removeComponent = /** |
| * params: |
| * - name: string |
| * |
| * Removes `loading` component from service context. |
| * @param {?} name |
| * @return {?} |
| */ |
| function (name) { |
| if (this._context[name]) { |
| this._context[name].subject.unsubscribe(); |
| if (this._context[name].componentRef) { |
| this._context[name].componentRef.destroy(); |
| } |
| this._context[name] = undefined; |
| delete this._context[name]; |
| } |
| }; |
| /** |
| * params: |
| * - name: string |
| * - registers?: number |
| * returns: true if successful |
| * |
| * Resolves a request for the loading mask referenced by the name parameter. |
| * Can optionally pass registers argument to set a number of register calls. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.register() |
| */ |
| /** |
| * params: |
| * - name: string |
| * - registers?: number |
| * returns: true if successful |
| * |
| * Resolves a request for the loading mask referenced by the name parameter. |
| * Can optionally pass registers argument to set a number of register calls. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.register() |
| * @param {?=} name |
| * @param {?=} registers |
| * @return {?} |
| */ |
| TdLoadingService.prototype.register = /** |
| * params: |
| * - name: string |
| * - registers?: number |
| * returns: true if successful |
| * |
| * Resolves a request for the loading mask referenced by the name parameter. |
| * Can optionally pass registers argument to set a number of register calls. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.register() |
| * @param {?=} name |
| * @param {?=} registers |
| * @return {?} |
| */ |
| function (name, registers) { |
| var _this = this; |
| if (name === void 0) { name = 'td-loading-main'; } |
| if (registers === void 0) { registers = 1; } |
| // try registering into the service if the loading component has been instanciated or if it exists. |
| if (this._context[name]) { |
| registers = registers < 1 ? 1 : registers; |
| this._context[name].times += registers; |
| this._context[name].subject.next(this._context[name].times); |
| return true; |
| } |
| else { |
| // if it doesnt exist, set a timeout so its registered after change detection happens |
| // this in case "register" occured on the `ngOnInit` lifehook cycle. |
| if (!this._timeouts[name]) { |
| this._timeouts[name] = setTimeout(function () { |
| _this.register(name, registers); |
| }); |
| } |
| else { |
| // if it timeout occured and still doesnt exist, it means the tiemout wasnt needed so we clear it. |
| this._clearTimeout(name); |
| } |
| } |
| return false; |
| }; |
| /** |
| * params: |
| * - name: string |
| * - resolves?: number |
| * returns: true if successful |
| * |
| * Resolves a request for the loading mask referenced by the name parameter. |
| * Can optionally pass resolves argument to set a number of resolve calls. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.resolve() |
| */ |
| /** |
| * params: |
| * - name: string |
| * - resolves?: number |
| * returns: true if successful |
| * |
| * Resolves a request for the loading mask referenced by the name parameter. |
| * Can optionally pass resolves argument to set a number of resolve calls. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.resolve() |
| * @param {?=} name |
| * @param {?=} resolves |
| * @return {?} |
| */ |
| TdLoadingService.prototype.resolve = /** |
| * params: |
| * - name: string |
| * - resolves?: number |
| * returns: true if successful |
| * |
| * Resolves a request for the loading mask referenced by the name parameter. |
| * Can optionally pass resolves argument to set a number of resolve calls. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.resolve() |
| * @param {?=} name |
| * @param {?=} resolves |
| * @return {?} |
| */ |
| function (name, resolves) { |
| if (name === void 0) { name = 'td-loading-main'; } |
| if (resolves === void 0) { resolves = 1; } |
| // clear timeout if the loading component is "resolved" before its "registered" |
| this._clearTimeout(name); |
| if (this._context[name]) { |
| resolves = resolves < 1 ? 1 : resolves; |
| if (this._context[name].times > 0) { |
| /** @type {?} */ |
| var times = this._context[name].times; |
| times -= resolves; |
| this._context[name].times = times < 0 ? 0 : times; |
| } |
| this._context[name].subject.next(this._context[name].times); |
| return true; |
| } |
| return false; |
| }; |
| /** |
| * params: |
| * - name: string |
| * returns: true if successful |
| * |
| * Resolves all request for the loading mask referenced by the name parameter. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.resolveAll() |
| */ |
| /** |
| * params: |
| * - name: string |
| * returns: true if successful |
| * |
| * Resolves all request for the loading mask referenced by the name parameter. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.resolveAll() |
| * @param {?=} name |
| * @return {?} |
| */ |
| TdLoadingService.prototype.resolveAll = /** |
| * params: |
| * - name: string |
| * returns: true if successful |
| * |
| * Resolves all request for the loading mask referenced by the name parameter. |
| * |
| * If no paramemeters are used, then default main mask will be used. |
| * |
| * e.g. loadingService.resolveAll() |
| * @param {?=} name |
| * @return {?} |
| */ |
| function (name) { |
| if (name === void 0) { name = 'td-loading-main'; } |
| // clear timeout if the loading component is "resolved" before its "registered" |
| this._clearTimeout(name); |
| if (this._context[name]) { |
| this._context[name].times = 0; |
| this._context[name].subject.next(this._context[name].times); |
| return true; |
| } |
| return false; |
| }; |
| /** |
| * params: |
| * - name: string |
| * - value: number |
| * returns: true if successful |
| * |
| * Set value on a loading mask referenced by the name parameter. |
| * Usage only available if its mode is 'determinate' and if loading is showing. |
| */ |
| /** |
| * params: |
| * - name: string |
| * - value: number |
| * returns: true if successful |
| * |
| * Set value on a loading mask referenced by the name parameter. |
| * Usage only available if its mode is 'determinate' and if loading is showing. |
| * @param {?} name |
| * @param {?} value |
| * @return {?} |
| */ |
| TdLoadingService.prototype.setValue = /** |
| * params: |
| * - name: string |
| * - value: number |
| * returns: true if successful |
| * |
| * Set value on a loading mask referenced by the name parameter. |
| * Usage only available if its mode is 'determinate' and if loading is showing. |
| * @param {?} name |
| * @param {?} value |
| * @return {?} |
| */ |
| function (name, value) { |
| if (this._context[name]) { |
| /** @type {?} */ |
| var instance = this._context[name].componentRef.instance; |
| if (instance.mode === LoadingMode.Determinate && instance.animation) { |
| instance.value = value; |
| return true; |
| } |
| } |
| return false; |
| }; |
| /** |
| * Clears timeout linked to the name. |
| * @param name Name of the loading component to be cleared |
| */ |
| /** |
| * Clears timeout linked to the name. |
| * @param {?} name Name of the loading component to be cleared |
| * @return {?} |
| */ |
| TdLoadingService.prototype._clearTimeout = /** |
| * Clears timeout linked to the name. |
| * @param {?} name Name of the loading component to be cleared |
| * @return {?} |
| */ |
| function (name) { |
| clearTimeout(this._timeouts[name]); |
| delete this._timeouts[name]; |
| }; |
| TdLoadingService.decorators = [ |
| { type: Injectable } |
| ]; |
| /** @nocollapse */ |
| TdLoadingService.ctorParameters = function () { return [ |
| { type: TdLoadingFactory } |
| ]; }; |
| return TdLoadingService; |
| }()); |
| export { TdLoadingService }; |
| if (false) { |
| /** @type {?} */ |
| TdLoadingService.prototype._context; |
| /** @type {?} */ |
| TdLoadingService.prototype._timeouts; |
| /** @type {?} */ |
| TdLoadingService.prototype._loadingFactory; |
| } |
| /** |
| * @param {?} parent |
| * @param {?} loadingFactory |
| * @return {?} |
| */ |
| export function LOADING_PROVIDER_FACTORY(parent, loadingFactory) { |
| return parent || new TdLoadingService(loadingFactory); |
| } |
| /** @type {?} */ |
| export var LOADING_PROVIDER = { |
| // If there is already a service available, use that. Otherwise, provide a new one. |
| provide: TdLoadingService, |
| deps: [[new Optional(), new SkipSelf(), TdLoadingService], TdLoadingFactory], |
| useFactory: LOADING_PROVIDER_FACTORY, |
| }; |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvdmFsZW50L2NvcmUvbG9hZGluZy8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL2xvYWRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUt6RSxPQUFPLEVBQXNCLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckcsT0FBTyxFQUFFLGdCQUFnQixFQUFlLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFFbEUsc0NBS0M7OztJQUpDLGdDQUFhOztJQUNiLGdDQUFtQjs7SUFDbkIsZ0NBQW1COztJQUNuQixpQ0FBc0M7O0FBR3hDO0lBTUUseUJBQVksTUFBd0I7UUFDbEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2QsTUFBTSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztTQUNoRTtRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDN0QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdkQsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxBQWZELElBZUM7Ozs7SUFkQywr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THZELE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsTUFBd0IsRUFBRSxjQUFnQztJQUM1RCxPQUFPLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7O0FBRUQsTUFBTSxLQUFPLGdCQUFnQixHQUFhOztJQUV4QyxPQUFPLEVBQUUsZ0JBQWdCO0lBQ3pCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDNUUsVUFBVSxFQUFFLHdCQUF3QjtDQUNyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFByb3ZpZGVyLCBTa2lwU2VsZiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpZXdDb250YWluZXJSZWYsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVGRMb2FkaW5nQ29udGV4dCB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvbG9hZGluZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVGRMb2FkaW5nQ29tcG9uZW50LCBMb2FkaW5nTW9kZSwgTG9hZGluZ1N0cmF0ZWd5LCBMb2FkaW5nVHlwZSB9IGZyb20gJy4uL2xvYWRpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IFRkTG9hZGluZ0ZhY3RvcnksIElMb2FkaW5nUmVmIH0gZnJvbSAnLi9sb2FkaW5nLmZhY3RvcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUZExvYWRpbmdDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU/OiBMb2FkaW5nVHlwZTtcbiAgbW9kZT86IExvYWRpbmdNb2RlO1xuICBjb2xvcj86ICdwcmltYXJ5JyB8ICdhY2NlbnQnIHwgJ3dhcm4nO1xufVxuXG5leHBvcnQgY2xhc3MgVGRMb2FkaW5nQ29uZmlnIGltcGxlbWVudHMgSVRkTG9hZGluZ0NvbmZpZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZT86IExvYWRpbmdUeXBlO1xuICBtb2RlPzogTG9hZGluZ01vZGU7XG4gIGNvbG9yPzogJ3ByaW1hcnknIHwgJ2FjY2VudCcgfCAnd2Fybic7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJVGRMb2FkaW5nQ29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgaWYgKCF0aGlzLm5hbWUpIHtcbiAgICAgIHRocm93IEVycm9yKCdOYW1lIGlzIHJlcXVpcmVkIGZvciBbVGRMb2FkaW5nXSBjb25maWd1cmF0aW9uLicpO1xuICAgIH1cbiAgICB0aGlzLm1vZGUgPSBjb25maWcubW9kZSA/IGNvbmZpZy5tb2RlIDogTG9hZGluZ01vZGUuSW5kZXRlcm1pbmF0ZTtcbiAgICB0aGlzLnR5cGUgPSBjb25maWcudHlwZSA/IGNvbmZpZy50eXBlIDogTG9hZGluZ1R5cGUuQ2lyY3VsYXI7XG4gICAgdGhpcy5jb2xvciA9IGNvbmZpZy5jb2xvciA/IGNvbmZpZy5jb2xvciA6ICdwcmltYXJ5JztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUZExvYWRpbmdEaXJlY3RpdmVDb25maWcgZXh0ZW5kcyBJVGRMb2FkaW5nQ29uZmlnIHtcbiAgc3RyYXRlZ3k/OiBMb2FkaW5nU3RyYXRlZ3k7XG59XG5cbmV4cG9ydCBjbGFzcyBUZExvYWRpbmdEaXJlY3RpdmVDb25maWcgZXh0ZW5kcyBUZExvYWRpbmdDb25maWcgaW1wbGVtZW50cyBJVGRMb2FkaW5nRGlyZWN0aXZlQ29uZmlnIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBMb2FkaW5nVHlwZTtcbiAgbW9kZTogTG9hZGluZ01vZGU7XG4gIHN0cmF0ZWd5OiBMb2FkaW5nU3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJVGRMb2FkaW5nRGlyZWN0aXZlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLnN0cmF0ZWd5ID0gY29uZmlnLnN0cmF0ZWd5ID8gY29uZmlnLnN0cmF0ZWd5IDogTG9hZGluZ1N0cmF0ZWd5LlJlcGxhY2U7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRkTG9hZGluZ1NlcnZpY2Uge1xuXG4gIHByaXZhdGUgX2NvbnRleHQ6IHtba2V5OiBzdHJpbmddOiBJTG9hZGluZ1JlZn0gPSB7fTtcbiAgcHJpdmF0ZSBfdGltZW91dHM6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9hZGluZ0ZhY3Rvcnk6IFRkTG9hZGluZ0ZhY3RvcnkpIHtcbiAgICB0aGlzLmNyZWF0ZSh7XG4gICAgICBuYW1lOiAndGQtbG9hZGluZy1tYWluJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJhbXM6XG4gICAqIC0gY29uZmlnOiBJTG9hZGluZ0RpcmVjdGl2ZUNvbmZpZ1xuICAgKiAtIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWZcbiAgICogLSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8T2JqZWN0PlxuICAgKlxuICAgKiBDcmVhdGVzIGFuIHJlcGxhY2UgbG9hZGluZyBtYXNrIGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgdmlld0NvbnRhaW5lclJlZi5cbiAgICogUmVwbGFjZXMgdGhlIHRlbXBsYXRlUmVmIHdpdGggdGhlIG1hc2sgd2hlbiBhIHJlcXVlc3QgaXMgcmVnaXN0ZXJlZCBvbiBpdC5cbiAgICpcbiAgICogTk9URTogQGludGVybmFsIHVzYWdlIG9ubHkuXG4gICAqL1xuICBjcmVhdGVDb21wb25lbnQoY29uZmlnOiBJVGRMb2FkaW5nRGlyZWN0aXZlQ29uZmlnLCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPE9iamVjdD4sIGNvbnRleHQ6IFRkTG9hZGluZ0NvbnRleHQpOiBJTG9hZGluZ1JlZiB7XG4gICAgbGV0IGRpcmVjdGl2ZUNvbmZpZzogVGRMb2FkaW5nRGlyZWN0aXZlQ29uZmlnID0gbmV3IFRkTG9hZGluZ0RpcmVjdGl2ZUNvbmZpZyhjb25maWcpO1xuICAgIGlmICh0aGlzLl9jb250ZXh0W2RpcmVjdGl2ZUNvbmZpZy5uYW1lXSkge1xuICAgICAgdGhyb3cgRXJyb3IoYE5hbWUgZHVwbGljYXRpb246IFtUZExvYWRpbmddIGRpcmVjdGl2ZSBoYXMgYSBuYW1lIGNvbmZsaWN0IHdpdGggJHtkaXJlY3RpdmVDb25maWcubmFtZX0uYCk7XG4gICAgfVxuICAgIGlmIChkaXJlY3RpdmVDb25maWcuc3RyYXRlZ3kgPT09IExvYWRpbmdTdHJhdGVneS5PdmVybGF5KSB7XG4gICAgICB0aGlzLl9jb250ZXh0W2RpcmVjdGl2ZUNvbmZpZy5uYW1lXSA9IHRoaXMuX2xvYWRpbmdGYWN0b3J5LmNyZWF0ZU92ZXJsYXlDb21wb25lbnQoZGlyZWN0aXZlQ29uZmlnLCB2aWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnRleHRbZGlyZWN0aXZlQ29uZmlnLm5hbWVdID0gdGhpcy5fbG9hZGluZ0ZhY3RvcnkuY3JlYXRlUmVwbGFjZUNvbXBvbmVudChkaXJlY3RpdmVDb25maWcsIHZpZXdDb250YWluZXJSZWYsIHRlbXBsYXRlUmVmLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHRbZGlyZWN0aXZlQ29uZmlnLm5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIHBhcmFtczpcbiAgICogLSBjb25maWc6IElUZExvYWRpbmdDb25maWdcbiAgICpcbiAgICogQ3JlYXRlcyBhIGZ1bGxzY3JlZW4gbG9hZGluZyBtYXNrIGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgRE9NIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqIE9ubHkgZGlzcGxheWVkIHdoZW4gdGhlIG1hc2sgaGFzIGEgcmVxdWVzdCByZWdpc3RlcmVkIG9uIGl0LlxuICAgKi9cbiAgcHVibGljIGNyZWF0ZShjb25maWc6IElUZExvYWRpbmdDb25maWcpOiB2b2lkIHtcbiAgICBsZXQgZnVsbHNjcmVlbkNvbmZpZzogVGRMb2FkaW5nQ29uZmlnID0gbmV3IFRkTG9hZGluZ0NvbmZpZyhjb25maWcpO1xuICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGZ1bGxzY3JlZW5Db25maWcubmFtZSk7XG4gICAgdGhpcy5fY29udGV4dFtmdWxsc2NyZWVuQ29uZmlnLm5hbWVdID0gdGhpcy5fbG9hZGluZ0ZhY3RvcnkuY3JlYXRlRnVsbFNjcmVlbkNvbXBvbmVudChmdWxsc2NyZWVuQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJhbXM6XG4gICAqIC0gbmFtZTogc3RyaW5nXG4gICAqXG4gICAqIFJlbW92ZXMgYGxvYWRpbmdgIGNvbXBvbmVudCBmcm9tIHNlcnZpY2UgY29udGV4dC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVDb21wb25lbnQobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbnRleHRbbmFtZV0pIHtcbiAgICAgIHRoaXMuX2NvbnRleHRbbmFtZV0uc3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgICAgaWYgKHRoaXMuX2NvbnRleHRbbmFtZV0uY29tcG9uZW50UmVmKSB7XG4gICAgICAgIHRoaXMuX2NvbnRleHRbbmFtZV0uY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnRleHRbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICBkZWxldGUgdGhpcy5fY29udGV4dFtuYW1lXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcGFyYW1zOlxuICAgKiAtIG5hbWU6IHN0cmluZ1xuICAgKiAtIHJlZ2lzdGVycz86IG51bWJlclxuICAgKiByZXR1cm5zOiB0cnVlIGlmIHN1Y2Nlc3NmdWxcbiAgICpcbiAgICogUmVzb2x2ZXMgYSByZXF1ZXN0IGZvciB0aGUgbG9hZGluZyBtYXNrIHJlZmVyZW5jZWQgYnkgdGhlIG5hbWUgcGFyYW1ldGVyLlxuICAgKiBDYW4gb3B0aW9uYWxseSBwYXNzIHJlZ2lzdGVycyBhcmd1bWVudCB0byBzZXQgYSBudW1iZXIgb2YgcmVnaXN0ZXIgY2FsbHMuXG4gICAqXG4gICAqIElmIG5vIHBhcmFtZW1ldGVycyBhcmUgdXNlZCwgdGhlbiBkZWZhdWx0IG1haW4gbWFzayB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIGUuZy4gbG9hZGluZ1NlcnZpY2UucmVnaXN0ZXIoKVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICd0ZC1sb2FkaW5nLW1haW4nLCByZWdpc3RlcnM6IG51bWJlciA9IDEpOiBib29sZWFuIHtcbiAgICAvLyB0cnkgcmVnaXN0ZXJpbmcgaW50byB0aGUgc2VydmljZSBpZiB0aGUgbG9hZGluZyBjb21wb25lbnQgaGFzIGJlZW4gaW5zdGFuY2lhdGVkIG9yIGlmIGl0IGV4aXN0cy5cbiAgICBpZiAodGhpcy5fY29udGV4dFtuYW1lXSkge1xuICAgICAgcmVnaXN0ZXJzID0gcmVnaXN0ZXJzIDwgMSA/IDEgOiByZWdpc3RlcnM7XG4gICAgICB0aGlzLl9jb250ZXh0W25hbWVdLnRpbWVzICs9IHJlZ2lzdGVycztcbiAgICAgIHRoaXMuX2NvbnRleHRbbmFtZV0uc3ViamVjdC5uZXh0KHRoaXMuX2NvbnRleHRbbmFtZV0udGltZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIGl0IGRvZXNudCBleGlzdCwgc2V0IGEgdGltZW91dCBzbyBpdHMgcmVnaXN0ZXJlZCBhZnRlciBjaGFuZ2UgZGV0ZWN0aW9uIGhhcHBlbnNcbiAgICAgIC8vIHRoaXMgaW4gY2FzZSBcInJlZ2lzdGVyXCIgb2NjdXJlZCBvbiB0aGUgYG5nT25Jbml0YCBsaWZlaG9vayBjeWNsZS5cbiAgICAgIGlmICghdGhpcy5fdGltZW91dHNbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5fdGltZW91dHNbbmFtZV0gPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKG5hbWUsIHJlZ2lzdGVycyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgaXQgdGltZW91dCBvY2N1cmVkIGFuZCBzdGlsbCBkb2VzbnQgZXhpc3QsIGl0IG1lYW5zIHRoZSB0aWVtb3V0IHdhc250IG5lZWRlZCBzbyB3ZSBjbGVhciBpdC5cbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lb3V0KG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogcGFyYW1zOlxuICAgKiAtIG5hbWU6IHN0cmluZ1xuICAgKiAtIHJlc29sdmVzPzogbnVtYmVyXG4gICAqIHJldHVybnM6IHRydWUgaWYgc3VjY2Vzc2Z1bFxuICAgKlxuICAgKiBSZXNvbHZlcyBhIHJlcXVlc3QgZm9yIHRoZSBsb2FkaW5nIG1hc2sgcmVmZXJlbmNlZCBieSB0aGUgbmFtZSBwYXJhbWV0ZXIuXG4gICAqIENhbiBvcHRpb25hbGx5IHBhc3MgcmVzb2x2ZXMgYXJndW1lbnQgdG8gc2V0IGEgbnVtYmVyIG9mIHJlc29sdmUgY2FsbHMuXG4gICAqXG4gICAqIElmIG5vIHBhcmFtZW1ldGVycyBhcmUgdXNlZCwgdGhlbiBkZWZhdWx0IG1haW4gbWFzayB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIGUuZy4gbG9hZGluZ1NlcnZpY2UucmVzb2x2ZSgpXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZShuYW1lOiBzdHJpbmcgPSAndGQtbG9hZGluZy1tYWluJywgcmVzb2x2ZXM6IG51bWJlciA9IDEpOiBib29sZWFuIHtcbiAgICAvLyBjbGVhciB0aW1lb3V0IGlmIHRoZSBsb2FkaW5nIGNvbXBvbmVudCBpcyBcInJlc29sdmVkXCIgYmVmb3JlIGl0cyBcInJlZ2lzdGVyZWRcIlxuICAgIHRoaXMuX2NsZWFyVGltZW91dChuYW1lKTtcbiAgICBpZiAodGhpcy5fY29udGV4dFtuYW1lXSkge1xuICAgICAgcmVzb2x2ZXMgPSByZXNvbHZlcyA8IDEgPyAxIDogcmVzb2x2ZXM7XG4gICAgICBpZiAodGhpcy5fY29udGV4dFtuYW1lXS50aW1lcyA+IDApIHtcbiAgICAgICAgbGV0IHRpbWVzOiBudW1iZXIgPSB0aGlzLl9jb250ZXh0W25hbWVdLnRpbWVzO1xuICAgICAgICB0aW1lcyAtPSByZXNvbHZlcztcbiAgICAgICAgdGhpcy5fY29udGV4dFtuYW1lXS50aW1lcyA9IHRpbWVzIDwgMCA/IDAgOiB0aW1lcztcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnRleHRbbmFtZV0uc3ViamVjdC5uZXh0KHRoaXMuX2NvbnRleHRbbmFtZV0udGltZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJhbXM6XG4gICAqIC0gbmFtZTogc3RyaW5nXG4gICAqIHJldHVybnM6IHRydWUgaWYgc3VjY2Vzc2Z1bFxuICAgKlxuICAgKiBSZXNvbHZlcyBhbGwgcmVxdWVzdCBmb3IgdGhlIGxvYWRpbmcgbWFzayByZWZlcmVuY2VkIGJ5IHRoZSBuYW1lIHBhcmFtZXRlci5cbiAgICpcbiAgICogSWYgbm8gcGFyYW1lbWV0ZXJzIGFyZSB1c2VkLCB0aGVuIGRlZmF1bHQgbWFpbiBtYXNrIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogZS5nLiBsb2FkaW5nU2VydmljZS5yZXNvbHZlQWxsKClcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlQWxsKG5hbWU6IHN0cmluZyA9ICd0ZC1sb2FkaW5nLW1haW4nKTogYm9vbGVhbiB7XG4gICAgLy8gY2xlYXIgdGltZW91dCBpZiB0aGUgbG9hZGluZyBjb21wb25lbnQgaXMgXCJyZXNvbHZlZFwiIGJlZm9yZSBpdHMgXCJyZWdpc3RlcmVkXCJcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQobmFtZSk7XG4gICAgaWYgKHRoaXMuX2NvbnRleHRbbmFtZV0pIHtcbiAgICAgIHRoaXMuX2NvbnRleHRbbmFtZV0udGltZXMgPSAwO1xuICAgICAgdGhpcy5fY29udGV4dFtuYW1lXS5zdWJqZWN0Lm5leHQodGhpcy5fY29udGV4dFtuYW1lXS50aW1lcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIHBhcmFtczpcbiAgICogLSBuYW1lOiBzdHJpbmdcbiAgICogLSB2YWx1ZTogbnVtYmVyXG4gICAqIHJldHVybnM6IHRydWUgaWYgc3VjY2Vzc2Z1bFxuICAgKlxuICAgKiBTZXQgdmFsdWUgb24gYSBsb2FkaW5nIG1hc2sgcmVmZXJlbmNlZCBieSB0aGUgbmFtZSBwYXJhbWV0ZXIuXG4gICAqIFVzYWdlIG9ubHkgYXZhaWxhYmxlIGlmIGl0cyBtb2RlIGlzICdkZXRlcm1pbmF0ZScgYW5kIGlmIGxvYWRpbmcgaXMgc2hvd2luZy5cbiAgICovXG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY29udGV4dFtuYW1lXSkge1xuICAgICAgbGV0IGluc3RhbmNlOiBUZExvYWRpbmdDb21wb25lbnQgPSB0aGlzLl9jb250ZXh0W25hbWVdLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIGlmIChpbnN0YW5jZS5tb2RlID09PSBMb2FkaW5nTW9kZS5EZXRlcm1pbmF0ZSAmJiBpbnN0YW5jZS5hbmltYXRpb24pIHtcbiAgICAgICAgaW5zdGFuY2UudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGltZW91dCBsaW5rZWQgdG8gdGhlIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGxvYWRpbmcgY29tcG9uZW50IHRvIGJlIGNsZWFyZWRcbiAgICovXG4gIHByaXZhdGUgX2NsZWFyVGltZW91dChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dHNbbmFtZV0pO1xuICAgIGRlbGV0ZSB0aGlzLl90aW1lb3V0c1tuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTE9BRElOR19QUk9WSURFUl9GQUNUT1JZKFxuICAgIHBhcmVudDogVGRMb2FkaW5nU2VydmljZSwgbG9hZGluZ0ZhY3Rvcnk6IFRkTG9hZGluZ0ZhY3RvcnkpOiBUZExvYWRpbmdTZXJ2aWNlIHtcbiAgcmV0dXJuIHBhcmVudCB8fCBuZXcgVGRMb2FkaW5nU2VydmljZShsb2FkaW5nRmFjdG9yeSk7XG59XG5cbmV4cG9ydCBjb25zdCBMT0FESU5HX1BST1ZJREVSOiBQcm92aWRlciA9IHtcbiAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlcnZpY2UgYXZhaWxhYmxlLCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBwcm92aWRlIGEgbmV3IG9uZS5cbiAgcHJvdmlkZTogVGRMb2FkaW5nU2VydmljZSxcbiAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIFRkTG9hZGluZ1NlcnZpY2VdLCBUZExvYWRpbmdGYWN0b3J5XSxcbiAgdXNlRmFjdG9yeTogTE9BRElOR19QUk9WSURFUl9GQUNUT1JZLFxufTtcbiJdfQ== |