UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

750 lines (749 loc) 67.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, Input, ViewContainerRef, ComponentFactoryResolver, ElementRef } from '@angular/core'; import { DataUtils } from '../share/utils/DataUtils'; import { AbstractPage } from './AbstractPage'; import { BackgroundProcessManager } from '../service/BackgroundProcessManager.service'; import { PhloxAppInfo } from '../component/model/PhloxAppInfo'; var /** @type {?} */ TYPE_NAME = "phx-component-wrapper"; var ComponentWrapper = /** @class */ (function () { function ComponentWrapper(target, componentFactoryResolver, elementRef, bgProcessMgr) { this.PAGE_LOOP_TIMEOUT = 5; this.target = target; this.componentFactoryResolver = componentFactoryResolver; this.dataChildren = []; this.elementRef = elementRef; this.bgProcessMgr = bgProcessMgr; } /** * @return {?} */ ComponentWrapper.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @param {?} changes * @return {?} */ ComponentWrapper.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes['type'] !== null && typeof changes['type'] !== 'undefined') { var /** @type {?} */ oldType = changes['type'].previousValue; var /** @type {?} */ newType = changes['type'].currentValue; if (oldType !== newType) { this.render(); } } if (this.componentRef !== null && typeof this.componentRef !== 'undefined') { if (changes['class'] !== null && typeof changes['class'] !== 'undefined') { var /** @type {?} */ oldClass = changes['class'].previousValue; var /** @type {?} */ newClass = changes['class'].currentValue; if (oldClass !== newClass) { $(this.componentRef.location.nativeElement).attr('class', newClass); } } } }; /** * @return {?} */ ComponentWrapper.prototype.render = /** * @return {?} */ function () { var _this = this; // remove old dom if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { if (this.componentRef !== null && typeof this.componentRef !== 'undefined') { if (typeof this.componentRef.instance.setData === 'function') { this.componentRef.instance.setData(null); } if (typeof this.componentRef.instance.setDataParent === 'function') { this.componentRef.instance.setDataParent(null); } this.componentRef.destroy(); } } // check if component type or typestring reslove if (this.type !== null && (typeof this.type !== 'undefined')) { var /** @type {?} */ simpleCompoFactory = this.componentFactoryResolver.resolveComponentFactory(this.type); var /** @type {?} */ compRef = this.target.createComponent(simpleCompoFactory); this.componentRef = compRef; // Add css class into component element if (this.cssClass !== null && typeof this.cssClass === 'string') { $(compRef.location.nativeElement).attr('class', this.cssClass); } // Set options first this.setOptions(this.options); // Overwrite this values (if specified) this.setIgnoreParentData(this.ignoreParentData); this.setIgnoreParentDisabled(this.ignoreParentDisabled); this.setSetting(this.setting); this.setModel(this.model); this.setOnEnabled(this.onEnabled); this.setOnDisabled(this.onDisabled); this.setDelegateHistory(this.delegateHistory); this.setI18NKey(this.i18nKey); this.setBypassKey(this.bypass); // Set data parent then this.setDataParent(this.dataParent); this.setData(this.data); // Apply i18n lastly this.applyI18N(this.i18n); if (this.handler !== null && typeof this.handler === 'function') { this.handler({ data: this.data, instance: compRef.instance, setting: this.setting, model: this.model, options: this.options, i18n: this.i18n, ignoreParentData: this.ignoreParentData, ignoreParentDisabled: this.ignoreParentDisabled, onEnabled: this.onEnabled, onDisabled: this.onDisabled, delegateHistory: this.delegateHistory, i18nKey: this.i18nKey, bypass: this.bypass, dataParent: this.dataParent }); } if (compRef.instance !== null && typeof compRef.instance !== 'undefined') { var /** @type {?} */ anyInstance_1 = compRef.instance; // start loader if (!(anyInstance_1 instanceof AbstractPage)) { if (typeof anyInstance_1.isPageLoaded === 'function') { // page load activate or end if (this.bgProcessMgr !== null && typeof this.bgProcessMgr !== 'undefined') { this.bgProcessMgr.execute(function () { return new Promise(function (resolve, reject) { var /** @type {?} */ timeout = PhloxAppInfo.DEFAULT_PAGE_LOAD_TIMEOUT; if (_this.phloxAppInfo !== null && typeof _this.phloxAppInfo !== 'undefined' && _this.phloxAppInfo.settings.PAGE_LOAD_TIMEOUT !== null && typeof _this.phloxAppInfo.settings.PAGE_LOAD_TIMEOUT !== 'undefined') { timeout = _this.phloxAppInfo.settings.PAGE_LOAD_TIMEOUT; } var /** @type {?} */ startTime = null; var /** @type {?} */ handler = function () { if (startTime === null) { startTime = (new Date()).getTime(); } var /** @type {?} */ currentTime = (new Date()).getTime(); if (anyInstance_1.isPageLoaded()) { resolve(); } else if ((currentTime - startTime) >= timeout) { reject(); } else { setTimeout(handler, _this.PAGE_LOOP_TIMEOUT); } }; handler(); }); }, { type: "connection.page" }); } } } // end loader } } }; /** * @return {?} */ ComponentWrapper.prototype.getData = /** * @return {?} */ function () { return this.data; }; /** * @param {?} data * @return {?} */ ComponentWrapper.prototype.setData = /** * @param {?} data * @return {?} */ function (data) { this.data = data; if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setData === 'function') { this.componentRef.instance.setData(this.data); } } }; /** * @return {?} */ ComponentWrapper.prototype.getSetting = /** * @return {?} */ function () { return this.setting; }; /** * @param {?} setting * @return {?} */ ComponentWrapper.prototype.setSetting = /** * @param {?} setting * @return {?} */ function (setting) { this.setting = setting; if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setSetting === 'function') { this.componentRef.instance.setSetting(this.setting); } } }; /** * @return {?} */ ComponentWrapper.prototype.getModel = /** * @return {?} */ function () { return this.model; }; /** * @param {?} model * @return {?} */ ComponentWrapper.prototype.setModel = /** * @param {?} model * @return {?} */ function (model) { this.model = model; if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setModel === 'function') { this.componentRef.instance.setModel(this.model); } } }; /** * @return {?} */ ComponentWrapper.prototype.getDataParent = /** * @return {?} */ function () { return this.dataParent; }; /** * @param {?} dataParent * @return {?} */ ComponentWrapper.prototype.setDataParent = /** * @param {?} dataParent * @return {?} */ function (dataParent) { this.dataParent = dataParent; if (this.dataParent !== undefined && this.componentRef !== null && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setDataParent === 'function') { this.componentRef.instance.setDataParent(this.dataParent); } } }; /** * @param {?} child * @return {?} */ ComponentWrapper.prototype.addDataChild = /** * @param {?} child * @return {?} */ function (child) { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.addDataChild === 'function') { this.componentRef.instance.addDataChild(child); } } }; /** * @param {?} child * @return {?} */ ComponentWrapper.prototype.removeDataChild = /** * @param {?} child * @return {?} */ function (child) { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.removeDataChild === 'function') { this.componentRef.instance.removeDataChild(child); } } }; /** * @return {?} */ ComponentWrapper.prototype.getDataChildren = /** * @return {?} */ function () { return this.dataChildren; }; /** * @return {?} */ ComponentWrapper.prototype.getChangeEvent = /** * @return {?} */ function () { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.getChangeEvent === 'function') { this.componentRef.instance.getChangeEvent(); } } return null; }; /** * @return {?} */ ComponentWrapper.prototype.isDataDirty = /** * @return {?} */ function () { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.isDataDirty === 'function') { this.componentRef.instance.isDataDirty(); } } return false; }; /** * @param {?=} data * @return {?} */ ComponentWrapper.prototype.saveData = /** * @param {?=} data * @return {?} */ function (data) { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.saveData === 'function') { this.componentRef.instance.saveData(data); } } }; /** * @return {?} */ ComponentWrapper.prototype.resetData = /** * @return {?} */ function () { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.resetData === 'function') { this.componentRef.instance.resetData(); } } }; /** * @return {?} */ ComponentWrapper.prototype.isIgnoreParentData = /** * @return {?} */ function () { return this.ignoreParentData; }; /** * @param {?} ignore * @return {?} */ ComponentWrapper.prototype.setIgnoreParentData = /** * @param {?} ignore * @return {?} */ function (ignore) { this.ignoreParentData = ignore; if (this.ignoreParentData !== undefined && this.componentRef !== null && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setIgnoreParentData === 'function') { this.componentRef.instance.setIgnoreParentData(this.ignoreParentData); } } }; /** * @return {?} */ ComponentWrapper.prototype.isIgnoreParentDisabled = /** * @return {?} */ function () { return this.ignoreParentDisabled; }; /** * @param {?} ignore * @return {?} */ ComponentWrapper.prototype.setIgnoreParentDisabled = /** * @param {?} ignore * @return {?} */ function (ignore) { this.ignoreParentDisabled = ignore; if (this.ignoreParentDisabled !== undefined && this.componentRef !== null && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setIgnoreParentDisabled === 'function') { this.componentRef.instance.setIgnoreParentDisabled(this.ignoreParentDisabled); } } }; /** * @return {?} */ ComponentWrapper.prototype.isDelegateHistory = /** * @return {?} */ function () { return this.delegateHistory; }; /** * @param {?} delegate * @return {?} */ ComponentWrapper.prototype.setDelegateHistory = /** * @param {?} delegate * @return {?} */ function (delegate) { this.delegateHistory = delegate; if (this.delegateHistory !== undefined && this.componentRef !== null && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setDelegateHistory === 'function') { this.componentRef.instance.setDelegateHistory(this.delegateHistory); } } }; /** * @return {?} */ ComponentWrapper.prototype.getOptions = /** * @return {?} */ function () { return this.options; }; /** * @param {?} options * @return {?} */ ComponentWrapper.prototype.setOptions = /** * @param {?} options * @return {?} */ function (options) { this.options = options; if (this.options !== undefined && this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setOptions === 'function') { this.componentRef.instance.setOptions(this.options); } } }; /** * @return {?} */ ComponentWrapper.prototype.getOnEnabled = /** * @return {?} */ function () { return this.onEnabled; }; /** * @param {?} handler * @return {?} */ ComponentWrapper.prototype.setOnEnabled = /** * @param {?} handler * @return {?} */ function (handler) { this.onEnabled = handler; if (this.onEnabled !== undefined && this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setOnEnabled === 'function') { this.componentRef.instance.setOnEnabled(this.onEnabled); } } }; /** * @return {?} */ ComponentWrapper.prototype.getOnDisabled = /** * @return {?} */ function () { return this.onDisabled; }; /** * @param {?} handler * @return {?} */ ComponentWrapper.prototype.setOnDisabled = /** * @param {?} handler * @return {?} */ function (handler) { this.onDisabled = handler; if (this.onDisabled !== undefined && this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setOnDisabled === 'function') { this.componentRef.instance.setOnDisabled(this.onDisabled); } } }; /** * @return {?} */ ComponentWrapper.prototype.getComponentRef = /** * @return {?} */ function () { return this.componentRef; }; /** * @return {?} */ ComponentWrapper.prototype.getComponentInstance = /** * @return {?} */ function () { var /** @type {?} */ compRef = this.getComponentRef(); if (compRef === null || typeof compRef === 'undefined') { return null; } return compRef.instance; }; /** * @param {?} value * @return {?} */ ComponentWrapper.prototype.applyI18N = /** * @param {?} value * @return {?} */ function (value) { if (typeof value === 'undefined') { return; } this.i18n = value; var /** @type {?} */ compInst = this.getComponentInstance(); if (compInst === null || typeof compInst.applyI18N !== 'function') { return; } if (value === null) { compInst.applyI18N(null); } else { if (this.isBypassKey()) { compInst.applyI18N(value); } else { var /** @type {?} */ i18nKey = this.getI18NKey(); if (i18nKey !== null && typeof i18nKey !== 'undefined') { // We use DataUtils.getDataValue() here to support i18nKey in dot notation (.) format: // foo.bar ... if (DataUtils.containsDataKey(i18nKey, value)) { compInst.applyI18N(DataUtils.getDataValue(i18nKey, value)); } else { compInst.applyI18N(undefined); } } else { compInst.applyI18N(value); } } } }; /** * @return {?} */ ComponentWrapper.prototype.getI18NKey = /** * @return {?} */ function () { if (this.i18nKey !== undefined) { return this.i18nKey; } var /** @type {?} */ compInst = this.getComponentInstance(); if (compInst === null || typeof compInst.getI18NKey !== 'function') { return null; } return compInst.getI18NKey(); }; /** * @param {?} i18nKey * @return {?} */ ComponentWrapper.prototype.setI18NKey = /** * @param {?} i18nKey * @return {?} */ function (i18nKey) { this.i18nKey = i18nKey; if (this.i18nKey !== undefined && this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setI18NKey === 'function') { this.componentRef.instance.setI18NKey(this.i18nKey); } } }; /** * @return {?} */ ComponentWrapper.prototype.isBypassKey = /** * @return {?} */ function () { if (this.bypass !== undefined) { return this.bypass; } var /** @type {?} */ compInst = this.getComponentInstance(); if (compInst === null || typeof compInst.isBypassKey !== 'function') { return false; } return compInst.isBypassKey(); }; /** * @param {?} bypass * @return {?} */ ComponentWrapper.prototype.setBypassKey = /** * @param {?} bypass * @return {?} */ function (bypass) { this.bypass = bypass; if (this.bypass !== undefined && this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.setBypassKey === 'function') { this.componentRef.instance.setBypassKey(this.bypass); } } }; /** * @return {?} */ ComponentWrapper.prototype.getCSSClass = /** * @return {?} */ function () { return this.cssClass; }; /** * @param {?} clazz * @return {?} */ ComponentWrapper.prototype.setCSSClass = /** * @param {?} clazz * @return {?} */ function (clazz) { this.cssClass = clazz; }; ComponentWrapper.TYPE_NAME = TYPE_NAME; ComponentWrapper.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "" },] }, ]; /** @nocollapse */ ComponentWrapper.ctorParameters = function () { return [ { type: ViewContainerRef, }, { type: ComponentFactoryResolver, }, { type: ElementRef, }, { type: BackgroundProcessManager, }, ]; }; ComponentWrapper.propDecorators = { "dataParent": [{ type: Input },], "type": [{ type: Input },], "ignoreParentData": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "handler": [{ type: Input },], "setting": [{ type: Input },], "model": [{ type: Input },], "onEnabled": [{ type: Input },], "onDisabled": [{ type: Input },], "data": [{ type: Input },], "i18n": [{ type: Input },], "options": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "cssClass": [{ type: Input, args: ['class',] },], }; return ComponentWrapper; }()); export { ComponentWrapper }; function ComponentWrapper_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ComponentWrapper.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ComponentWrapper.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ComponentWrapper.propDecorators; /** @type {?} */ ComponentWrapper.TYPE_NAME; /** @type {?} */ ComponentWrapper.prototype.PAGE_LOOP_TIMEOUT; /** @type {?} */ ComponentWrapper.prototype.dataParent; /** @type {?} */ ComponentWrapper.prototype.type; /** @type {?} */ ComponentWrapper.prototype.ignoreParentData; /** @type {?} */ ComponentWrapper.prototype.ignoreParentDisabled; /** @type {?} */ ComponentWrapper.prototype.delegateHistory; /** @type {?} */ ComponentWrapper.prototype.handler; /** @type {?} */ ComponentWrapper.prototype.setting; /** @type {?} */ ComponentWrapper.prototype.model; /** @type {?} */ ComponentWrapper.prototype.onEnabled; /** @type {?} */ ComponentWrapper.prototype.onDisabled; /** @type {?} */ ComponentWrapper.prototype.data; /** @type {?} */ ComponentWrapper.prototype.i18n; /** @type {?} */ ComponentWrapper.prototype.options; /** @type {?} */ ComponentWrapper.prototype.i18nKey; /** @type {?} */ ComponentWrapper.prototype.bypass; /** @type {?} */ ComponentWrapper.prototype.cssClass; /** @type {?} */ ComponentWrapper.prototype.componentRef; /** @type {?} */ ComponentWrapper.prototype.elementRef; /** @type {?} */ ComponentWrapper.prototype.bgProcessMgr; /** @type {?} */ ComponentWrapper.prototype.phloxAppInfo; /** @type {?} */ ComponentWrapper.prototype.dataChildren; /** @type {?} */ ComponentWrapper.prototype.componentFactoryResolver; /** @type {?} */ ComponentWrapper.prototype.target; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50V3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvQ29tcG9uZW50V3JhcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxnQkFBZ0IsRUFBUSx3QkFBd0IsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBU2hKLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSy9ELHFCQUFNLFNBQVMsR0FBVyx1QkFBdUIsQ0FBQzs7SUFzRGhELDBCQUFZLE1BQXdCLEVBQUUsd0JBQWtELEVBQUUsVUFBc0IsRUFBRSxZQUFzQztpQ0EzQ3BILENBQUM7UUE0Q25DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztLQUNsQzs7OztJQUVNLG1DQUFROzs7Ozs7Ozs7SUFJUixzQ0FBVzs7OztjQUFDLE9BQVk7UUFDN0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLHFCQUFJLE9BQU8sR0FBRyxPQUFP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QUFLLENBQUM7O2lDQTlkbUIsU0FBUzs7Z0JBUHJELFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ25CLFFBQVEsRUFBRSxTQUFTO29CQUNuQixRQUFRLEVBQUUsRUFBRTtpQkFDYjs7OztnQkF2QjZDLGdCQUFnQjtnQkFBUSx3QkFBd0I7Z0JBQWdCLFVBQVU7Z0JBVy9HLHdCQUF3Qjs7OytCQW1COUIsS0FBSzt5QkFFTCxLQUFLO3FDQUVMLEtBQUs7eUNBRUwsS0FBSztvQ0FFTCxLQUFLOzRCQUVMLEtBQUs7NEJBRUwsS0FBSzswQkFFTCxLQUFLOzhCQUVMLEtBQUs7K0JBRUwsS0FBSzt5QkFFTCxLQUFLO3lCQUVMLEtBQUs7NEJBRUwsS0FBSzs0QkFFTCxLQUFLOzJCQUVMLEtBQUssU0FBQyxZQUFZOzZCQUVsQixLQUFLLFNBQUMsT0FBTzs7MkJBNURoQjs7U0F3QmEsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uQ2hhbmdlcywgSW5wdXQsIFZpZXdDb250YWluZXJSZWYsIFR5cGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi9JSGFzTW9kZWwnO1xuaW1wb3J0IHsgSUhhc1NldHRpbmcgfSBmcm9tICcuL0lIYXNTZXR0aW5nJztcbmltcG9ydCB7IElDaGFuZ2VhYmxlIH0gZnJvbSAnLi9JQ2hhbmdlYWJsZSc7XG5cbmltcG9ydCB7IElJMThOQXBwbGljYWJsZSB9IGZyb20gJy4uL3NoYXJlL0lJMThOQXBwbGljYWJsZSc7XG5pbXBvcnQgeyBJSGFzT3B0aW9ucyB9IGZyb20gJy4uL3NoYXJlL0lIYXNPcHRpb25zJztcblxuaW1wb3J0IHsgRGF0YVV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRGF0YVV0aWxzJztcbmltcG9ydCB7IEFic3RyYWN0UGFnZSB9IGZyb20gJy4vQWJzdHJhY3RQYWdlJztcbmltcG9ydCB7IEJhY2tncm91bmRQcm9jZXNzTWFuYWdlciB9IGZyb20gJy4uL3NlcnZpY2UvQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBQaGxveEFwcFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL1BobG94QXBwU2VydmljZS5zZXJ2aWNlJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LWNvbXBvbmVudC13cmFwcGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYGBcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50V3JhcHBlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBJSGFzRGF0YSwgSUhhc1NldHRpbmcsIElIYXNNb2RlbCwgSUNoYW5nZWFibGUsIElJMThOQXBwbGljYWJsZSwgSUhhc09wdGlvbnMge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgcHJpdmF0ZSBQQUdFX0xPT1BfVElNRU9VVDogbnVtYmVyID0gNTtcblxuICBASW5wdXQoKVxuICBwcml2YXRlIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHR5cGU6IGFueTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBoYW5kbGVyOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzZXR0aW5nOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbW9kZWw6IGFueTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBwcml2YXRlIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGRhdGE6IGFueTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBpMThuOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgb3B0aW9uczogYW55O1xuICBASW5wdXQoKVxuICBwcml2YXRlIGkxOG5LZXk6IGFueTtcbiAgQElucHV0KCdpMThuQnlwYXNzJylcbiAgcHJpdmF0ZSBieXBhc3M6IGFueTtcbiAgQElucHV0KCdjbGFzcycpXG4gIHByaXZhdGUgY3NzQ2xhc3M6IHN0cmluZztcblxuICBwcml2YXRlIGNvbXBvbmVudFJlZjogYW55O1xuICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgYmdQcm9jZXNzTWdyOiBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXI7XG4gIHByaXZhdGUgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XG4gIHByaXZhdGUgZGF0YUNoaWxkcmVuOiBJSGFzRGF0YVtdO1xuICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICBwcml2YXRlIHRhcmdldDogVmlld0NvbnRhaW5lclJlZjtcblxuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IFZpZXdDb250YWluZXJSZWYsIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBiZ1Byb2Nlc3NNZ3I6IEJhY2tncm91bmRQcm9jZXNzTWFuYWdlcikge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgIHRoaXMuZGF0YUNoaWxkcmVuID0gW107XG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB0aGlzLmJnUHJvY2Vzc01nciA9IGJnUHJvY2Vzc01ncjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgIGlmIChjaGFuZ2VzWyd0eXBlJ10gIT09IG51bGwgJiYgdHlwZW9mIGNoYW5nZXNbJ3R5cGUnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBvbGRUeXBlID0gY2hhbmdlc1sndHlwZSddLnByZXZpb3VzVmFsdWU7XG4gICAgICBsZXQgbmV3VHlwZTogYW55ID0gY2hhbmdlc1sndHlwZSddLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKG9sZFR5cGUgIT09IG5ld1R5cGUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGNoYW5nZXNbJ2NsYXNzJ10gIT09IG51bGwgJiYgdHlwZW9mIGNoYW5nZXNbJ2NsYXNzJ10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCBvbGRDbGFzcyA9IGNoYW5nZXNbJ2NsYXNzJ10ucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgbGV0IG5ld0NsYXNzOiBhbnkgPSBjaGFuZ2VzWydjbGFzcyddLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICBpZiAob2xkQ2xhc3MgIT09IG5ld0NsYXNzKSB7XG4gICAgICAgICAgJCh0aGlzLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KS5hdHRyKCdjbGFzcycsIG5ld0NsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKTogdm9pZCB7XG4gICAgLy8gcmVtb3ZlIG9sZCBkb21cbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLnNldERhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXREYXRhKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXREYXRhUGFyZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0RGF0YVBhcmVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtc