UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

246 lines (245 loc) 26.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Injectable } from '@angular/core'; import { BackgroundProcess } from '../share/model/BackgroundProcess'; import { ObservableManager } from './ObservableManager.service'; const /** @type {?} */ PROCESS_START_TOPIC_NAME = 'bg-proc-mgr.process.start'; const /** @type {?} */ PROCESS_END_TOPIC_NAME = 'bg-proc-mgr.process.end'; const /** @type {?} */ PROCESS_ERROR_TOPIC_NAME = 'bg-proc-mgr.process.error'; /** * <p style="text-indent: 2em;"> * A <code>ng</code> service class providing <code>background process</code> execution machanism. This class is an implementation of * [[IBackgroundProcessManager]]. So, please see [[IBackgroundProcessManager]] for more information. * </p> * * @see [[IBackgroundProcessManager]] * @see [[BackgroundProcess]] * * @author shiorin, tee4cute */ export class BackgroundProcessManager { /** * @param {?} obsvMgr */ constructor(obsvMgr) { this.processesPool = []; this.obsvMgr = obsvMgr; } /** * @param {?} processFunc * @param {?=} processType * @param {?=} name * @param {?=} option * @return {?} */ getWrapperProcess(processFunc, processType, name, option) { let /** @type {?} */ processProm = Promise.resolve(null); if (processFunc !== null && typeof processFunc === 'function') { let /** @type {?} */ returnVal = processFunc.call(null, null); if (typeof returnVal === 'undefined') { // function with no return processProm = Promise.resolve(returnVal); } else if (typeof returnVal === 'object') { if (returnVal instanceof Promise) { processProm = returnVal; } else { processProm = Promise.resolve(returnVal); } } else { processProm = Promise.resolve(returnVal); } } let /** @type {?} */ result = new BackgroundProcess(processProm, processType, name, undefined, option); return result; } /** * @param {?} bgProcess * @param {?} options * @return {?} */ isMatchAllOptions(bgProcess, options) { let /** @type {?} */ isMatchAll = true; if (bgProcess !== null && bgProcess !== undefined) { if (options !== null && options !== undefined) { for (let /** @type {?} */ key in options) { let /** @type {?} */ optVal = options[key]; if (bgProcess.options !== null && bgProcess.options !== undefined) { let /** @type {?} */ bgProcVal = bgProcess.options[key]; if (optVal !== bgProcVal) { isMatchAll = false; break; } } else { isMatchAll = false; break; } } } } else { if (options !== null && options !== undefined) { isMatchAll = false; } } return isMatchAll; } /** * <p style="text-indent: 1em;"> * Please see [[IBackgroundProcessManager.execute]] for more information. * </p> * * @see [[IBackgroundProcessManager.execute]] * @param {?} processFunc * @param {?=} options * @return {?} */ execute(processFunc, options) { if (processFunc === null || typeof processFunc === 'undefined') { return null; } let /** @type {?} */ processType = null; let /** @type {?} */ name = null; if (options !== null && typeof options !== 'undefined') { processType = options.type; name = options.name; } // return wrapper promise let /** @type {?} */ bgProcess = this.getWrapperProcess(processFunc, processType, name, options); if (bgProcess !== null && bgProcess.process !== null) { this.processesPool.push(bgProcess); // start onprocess adding if (this.obsvMgr !== null && typeof this.obsvMgr !== 'undefined') { this.obsvMgr.publish(BackgroundProcessManager.PROCESS_START_TOPIC_NAME, bgProcess); } let /** @type {?} */ wrapBgProcess = new Promise((resolve, reject) => { bgProcess.process.then((result) => { bgProcess.result = result; resolve(result); let /** @type {?} */ index = this.processesPool.indexOf(bgProcess); if (index >= 0) { this.processesPool.splice(index, 1); } if (this.obsvMgr !== null && typeof this.obsvMgr !== 'undefined') { this.obsvMgr.publish(BackgroundProcessManager.PROCESS_END_TOPIC_NAME, bgProcess); } }, (error) => { bgProcess.error = error; reject(error); let /** @type {?} */ index = this.processesPool.indexOf(bgProcess); if (index >= 0) { this.processesPool.splice(index, 1); } if (this.obsvMgr !== null && typeof this.obsvMgr !== 'undefined') { this.obsvMgr.publish(BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME, bgProcess); } }); }); return wrapBgProcess; } return null; } /** * <p style="text-indent: 1em;"> * Please see [[IBackgroundProcessManager.getRunningProcessesCount]] for more information. * </p> * * @see [[IBackgroundProcessManager.getRunningProcessesCount]] * @param {?} typeName * @param {?} name * @param {?=} options * @return {?} */ getRunningProcessesCount(typeName, name, options) { return this.getRunningProcesses(typeName, name, options).length; } /** * <p style="text-indent: 1em;"> * Please see [[IBackgroundProcessManager.getRunningProcesses]] for more information. This method returns * an array of process model class [[BackgroundProcess]]. * </p> * * @see [[IBackgroundProcessManager.getRunningProcesses]] * @param {?} typeName * @param {?} name * @param {?=} options * @return {?} */ getRunningProcesses(typeName, name, options) { if (typeName === null && name === null) { return this.processesPool; } let /** @type {?} */ result = []; for (let /** @type {?} */ process of this.processesPool) { let /** @type {?} */ pType = process.type; let /** @type {?} */ pName = process.name; let /** @type {?} */ pUserAction = process.userAction; let /** @type {?} */ allMatch = true; if (typeName !== null && typeName !== undefined) { if (typeName !== pType) { allMatch = false; } } if (name !== null && name !== undefined) { if (name !== pName) { allMatch = false; } } // check more is allMatch if (allMatch && options !== null && typeof options !== 'undefined') { if (options.userAction !== null && typeof options.userAction !== 'undefined') { if (pUserAction !== options.userAction) { allMatch = false; } } // check more is allMatch if (allMatch) { let /** @type {?} */ isMatchAllOpt = this.isMatchAllOptions(process, options); if (!isMatchAllOpt) { allMatch = false; } } } // check more is allMatch if (allMatch) { result.push(process); } } return result; } } BackgroundProcessManager.PROCESS_START_TOPIC_NAME = PROCESS_START_TOPIC_NAME; BackgroundProcessManager.PROCESS_END_TOPIC_NAME = PROCESS_END_TOPIC_NAME; BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME = PROCESS_ERROR_TOPIC_NAME; BackgroundProcessManager.decorators = [ { type: Injectable }, ]; /** @nocollapse */ BackgroundProcessManager.ctorParameters = () => [ { type: ObservableManager, }, ]; function BackgroundProcessManager_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ BackgroundProcessManager.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ BackgroundProcessManager.ctorParameters; /** @type {?} */ BackgroundProcessManager.PROCESS_START_TOPIC_NAME; /** @type {?} */ BackgroundProcessManager.PROCESS_END_TOPIC_NAME; /** @type {?} */ BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME; /** @type {?} */ BackgroundProcessManager.prototype.processesPool; /** @type {?} */ BackgroundProcessManager.prototype.obsvMgr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL0JhY2tncm91bmRQcm9jZXNzTWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWhFLHVCQUFNLHdCQUF3QixHQUFXLDJCQUEyQixDQUFDO0FBQ3JFLHVCQUFNLHNCQUFzQixHQUFXLHlCQUF5QixDQUFDO0FBQ2pFLHVCQUFNLHdCQUF3QixHQUFXLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7QUFjckUsTUFBTTs7OztJQVNKLFlBQVksT0FBMEI7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7S0FDeEI7Ozs7Ozs7O0lBRU8saUJBQWlCLENBQUMsV0FBcUIsRUFBRSxXQUFvQixFQUFFLElBQWEsRUFBRSxNQUFZO1FBQ2hHLHFCQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksT0FBTyxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM5RCxxQkFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXJDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FB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cUJBQ2xCO2lCQUNGO2FBQ0Y7O1lBR0QsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Y7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDOzs7b0RBdk0wQyx3QkFBd0I7a0RBQzFCLHNCQUFzQjtvREFDcEIsd0JBQXdCOztZQUxuRixVQUFVOzs7O1lBakJGLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIgfSBmcm9tICcuLi9zaGFyZS9JQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyJztcbmltcG9ydCB7IEJhY2tncm91bmRQcm9jZXNzIH0gZnJvbSAnLi4vc2hhcmUvbW9kZWwvQmFja2dyb3VuZFByb2Nlc3MnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU1hbmFnZXIgfSBmcm9tICcuL09ic2VydmFibGVNYW5hZ2VyLnNlcnZpY2UnO1xuXG5jb25zdCBQUk9DRVNTX1NUQVJUX1RPUElDX05BTUU6IHN0cmluZyA9ICdiZy1wcm9jLW1nci5wcm9jZXNzLnN0YXJ0JztcbmNvbnN0IFBST0NFU1NfRU5EX1RPUElDX05BTUU6IHN0cmluZyA9ICdiZy1wcm9jLW1nci5wcm9jZXNzLmVuZCc7XG5jb25zdCBQUk9DRVNTX0VSUk9SX1RPUElDX05BTUU6IHN0cmluZyA9ICdiZy1wcm9jLW1nci5wcm9jZXNzLmVycm9yJztcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBIDxjb2RlPm5nPC9jb2RlPiBzZXJ2aWNlIGNsYXNzIHByb3ZpZGluZyA8Y29kZT5iYWNrZ3JvdW5kIHByb2Nlc3M8L2NvZGU+IGV4ZWN1dGlvbiBtYWNoYW5pc20uIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2ZcbiAqIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlcl1dLiBTbywgcGxlYXNlIHNlZSBbW0lCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXJdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIDwvcD5cbiAqXG4gKiBAc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlcl1dXG4gKiBAc2VlIFtbQmFja2dyb3VuZFByb2Nlc3NdXVxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRQcm9jZXNzTWFuYWdlciBpbXBsZW1lbnRzIElCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPQ0VTU19TVEFSVF9UT1BJQ19OQU1FOiBzdHJpbmcgPSBQUk9DRVNTX1NUQVJUX1RPUElDX05BTUU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPQ0VTU19FTkRfVE9QSUNfTkFNRTogc3RyaW5nID0gUFJPQ0VTU19FTkRfVE9QSUNfTkFNRTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9DRVNTX0VSUk9SX1RPUElDX05BTUU6IHN0cmluZyA9IFBST0NFU1NfRVJST1JfVE9QSUNfTkFNRTtcblxuICBwcml2YXRlIHByb2Nlc3Nlc1Bvb2w6IEJhY2tncm91bmRQcm9jZXNzW107XG4gIHByaXZhdGUgb2Jzdk1ncjogT2JzZXJ2YWJsZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3Iob2Jzdk1ncjogT2JzZXJ2YWJsZU1hbmFnZXIpIHtcbiAgICB0aGlzLnByb2Nlc3Nlc1Bvb2wgPSBbXTtcbiAgICB0aGlzLm9ic3ZNZ3IgPSBvYnN2TWdyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXcmFwcGVyUHJvY2Vzcyhwcm9jZXNzRnVuYzogRnVuY3Rpb24sIHByb2Nlc3NUeXBlPzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBvcHRpb24/OiBhbnkpOiBCYWNrZ3JvdW5kUHJvY2VzcyB7XG4gICAgbGV0IHByb2Nlc3NQcm9tID0gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXG4gICAgaWYgKHByb2Nlc3NGdW5jICE9PSBudWxsICYmIHR5cGVvZiBwcm9jZXNzRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IHJldHVyblZhbCA9IHByb2Nlc3NGdW5jLmNhbGwobnVsbCwgbnVsbCk7XG4gICAgICBpZiAodHlwZW9mIHJldHVyblZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZnVuY3Rpb24gd2l0aCBubyByZXR1cm5cbiAgICAgICAgcHJvY2Vzc1Byb20gPSBQcm9taXNlLnJlc29sdmUocmV0dXJuVmFsKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJldHVyblZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHJldHVyblZhbCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICBwcm9jZXNzUHJvbSA9IHJldHVyblZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzUHJvbSA9IFByb21pc2UucmVzb2x2ZShyZXR1cm5WYWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzUHJvbSA9IFByb21pc2UucmVzb2x2ZShyZXR1cm5WYWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IEJhY2tncm91bmRQcm9jZXNzID0gbmV3IEJhY2tncm91bmRQcm9jZXNzKHByb2Nlc3NQcm9tLCBwcm9jZXNzVHlwZSwgbmFtZSwgdW5kZWZpbmVkLCBvcHRpb24pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgaXNNYXRjaEFsbE9wdGlvbnMoYmdQcm9jZXNzOiBCYWNrZ3JvdW5kUHJvY2Vzcywgb3B0aW9uczogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGlzTWF0Y2hBbGwgPSB0cnVlO1xuXG4gICAgaWYgKGJnUHJvY2VzcyAhPT0gbnVsbCAmJiBiZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgbGV0IG9wdFZhbCA9IG9wdGlvbnNba2V5XTtcblxuICAgICAgICAgIGlmIChiZ1Byb2Nlc3Mub3B0aW9ucyAhPT0gbnVsbCAmJiBiZ1Byb2Nlc3Mub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYmdQcm9jVmFsID0gYmdQcm9jZXNzLm9wdGlvbnNba2V5XTtcblxuICAgICAgICAgICAgaWYgKG9wdFZhbCAhPT0gYmdQcm9jVmFsKSB7XG4gICAgICAgICAgICAgIGlzTWF0Y2hBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzTWF0Y2hBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXNNYXRjaEFsbCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc01hdGNoQWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogUGxlYXNlIHNlZSBbW0lCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIuZXhlY3V0ZV1dIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiA8L3A+XG4gICAqXG4gICAqIEBzZWUgW1tJQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLmV4ZWN1dGVdXVxuICAgKi9cbiAgcHVibGljIGV4ZWN1dGUocHJvY2Vzc0Z1bmM6IEZ1bmN0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocHJvY2Vzc0Z1bmMgPT09IG51bGwgfHwgdHlwZW9mIHByb2Nlc3NGdW5jID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHByb2Nlc3NUeXBlID0gbnVsbDtcbiAgICBsZXQgbmFtZSA9IG51bGw7XG4gICAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwcm9jZXNzVHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICAgIG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHdyYXBwZXIgcHJvbWlzZVxuICAgIGxldCBiZ1Byb2Nlc3MgPSB0aGlzLmdldFdyYXBwZXJQcm9jZXNzKHByb2Nlc3NGdW5jLCBwcm9jZXNzVHlwZSwgbmFtZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoYmdQcm9jZXNzICE9PSBudWxsICYmIGJnUHJvY2Vzcy5wcm9jZXNzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnByb2Nlc3Nlc1Bvb2wucHVzaChiZ1Byb2Nlc3MpO1xuXG4gICAgICAvLyBzdGFydCBvbnByb2Nlc3MgYWRkaW5nXG4gICAgICBpZiAodGhpcy5vYnN2TWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9ic3ZNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMub2Jzdk1nci5wdWJsaXNoKEJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5QUk9DRVNTX1NUQVJUX1RPUElDX05BTUUsIGJnUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIGxldCB3cmFwQmdQcm9jZXNzID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBiZ1Byb2Nlc3MucHJvY2Vzcy50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBiZ1Byb2Nlc3MucmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5wcm9jZXNzZXNQb29sLmluZGV4T2YoYmdQcm9jZXNzKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZXNQb29sLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMub2Jzdk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5vYnN2TWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5vYnN2TWdyLnB1Ymxpc2goQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLlBST0NFU1NfRU5EX1RPUElDX05BTUUsIGJnUHJvY2Vzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBiZ1Byb2Nlc3MuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG5cbiAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnByb2Nlc3Nlc1Bvb2wuaW5kZXhPZihiZ1Byb2Nlc3MpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3Nlc1Bvb2wuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5vYnN2TWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9ic3ZNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLm9ic3ZNZ3IucHVibGlzaChCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIuUFJPQ0VTU19FUlJPUl9UT1BJQ19OQU1FLCBiZ1Byb2Nlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHdyYXBCZ1Byb2Nlc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBQbGVhc2Ugc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5nZXRSdW5uaW5nUHJvY2Vzc2VzQ291bnRdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogPC9wPlxuICAgKlxuICAgKiBAc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5nZXRSdW5uaW5nUHJvY2Vzc2VzQ291bnRdXVxuICAgKi9cbiAgcHVibGljIGdldFJ1bm5pbmdQcm9jZXNzZXNDb3VudCh0eXBlTmFtZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFJ1bm5pbmdQcm9jZXNzZXModHlwZU5hbWUsIG5hbWUsIG9wdGlvbnMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAqIFBsZWFzZSBzZWUgW1tJQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLmdldFJ1bm5pbmdQcm9jZXNzZXNdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgcmV0dXJuc1xuICAgKiBhbiBhcnJheSBvZiBwcm9jZXNzIG1vZGVsIGNsYXNzIFtbQmFja2dyb3VuZFByb2Nlc3NdXS5cbiAgICogPC9wPlxuICAgKlxuICAgKiBAc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5nZXRSdW5uaW5nUHJvY2Vzc2VzXV1cbiAgICovXG4gIHB1YmxpYyBnZXRSdW5uaW5nUHJvY2Vzc2VzKHR5cGVOYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IEJhY2tncm91bmRQcm9jZXNzW10ge1xuICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCAmJiBuYW1lID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZXNQb29sO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBwcm9jZXNzIG9mIHRoaXMucHJvY2Vzc2VzUG9vbCkge1xuICAgICAgbGV0IHBUeXBlOiBzdHJpbmcgPSBwcm9jZXNzLnR5cGU7XG4gICAgICBsZXQgcE5hbWU6IHN0cmluZyA9IHByb2Nlc3MubmFtZTtcbiAgICAgIGxldCBwVXNlckFjdGlvbjogYm9vbGVhbiA9IHByb2Nlc3MudXNlckFjdGlvbjtcbiAgICAgIGxldCBhbGxNYXRjaDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlTmFtZSAhPT0gbnVsbCAmJiB0eXBlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlTmFtZSAhPT0gcFR5cGUpIHtcbiAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobmFtZSAhPT0gcE5hbWUpIHtcbiAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG1vcmUgaXMgYWxsTWF0Y2hcbiAgICAgIGlmIChhbGxNYXRjaCAmJiBvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAob3B0aW9ucy51c2VyQWN0aW9uICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zLnVzZXJBY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHBVc2VyQWN0aW9uICE9PSBvcHRpb25zLnVzZXJBY3Rpb24pIHtcbiAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgbW9yZSBpcyBhbGxNYXRjaFxuICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICBsZXQgaXNNYXRjaEFsbE9wdCA9IHRoaXMuaXNNYXRjaEFsbE9wdGlvbnMocHJvY2Vzcywgb3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoIWlzTWF0Y2hBbGxPcHQpIHtcbiAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG1vcmUgaXMgYWxsTWF0Y2hcbiAgICAgIGlmIChhbGxNYXRjaCkge1xuICAgICAgICByZXN1bHQucHVzaChwcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=