UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

618 lines (617 loc) 63.5 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'; const /** @type {?} */ TYPE_NAME = "phx-component-wrapper"; export class ComponentWrapper { /** * @param {?} target * @param {?} componentFactoryResolver * @param {?} elementRef * @param {?} bgProcessMgr */ constructor(target, componentFactoryResolver, elementRef, bgProcessMgr) { this.PAGE_LOOP_TIMEOUT = 5; this.target = target; this.componentFactoryResolver = componentFactoryResolver; this.dataChildren = []; this.elementRef = elementRef; this.bgProcessMgr = bgProcessMgr; } /** * @return {?} */ ngOnInit() { } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes['type'] !== null && typeof changes['type'] !== 'undefined') { let /** @type {?} */ oldType = changes['type'].previousValue; let /** @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') { let /** @type {?} */ oldClass = changes['class'].previousValue; let /** @type {?} */ newClass = changes['class'].currentValue; if (oldClass !== newClass) { $(this.componentRef.location.nativeElement).attr('class', newClass); } } } } /** * @return {?} */ render() { // 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')) { const /** @type {?} */ simpleCompoFactory = this.componentFactoryResolver.resolveComponentFactory(this.type); let /** @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') { let /** @type {?} */ anyInstance = compRef.instance; // start loader if (!(anyInstance instanceof AbstractPage)) { if (typeof anyInstance.isPageLoaded === 'function') { // page load activate or end if (this.bgProcessMgr !== null && typeof this.bgProcessMgr !== 'undefined') { this.bgProcessMgr.execute(() => { return new Promise((resolve, reject) => { let /** @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; } let /** @type {?} */ startTime = null; let /** @type {?} */ handler = () => { if (startTime === null) { startTime = (new Date()).getTime(); } let /** @type {?} */ currentTime = (new Date()).getTime(); if (anyInstance.isPageLoaded()) { resolve(); } else if ((currentTime - startTime) >= timeout) { reject(); } else { setTimeout(handler, this.PAGE_LOOP_TIMEOUT); } }; handler(); }); }, { type: "connection.page" }); } } } // end loader } } } /** * @return {?} */ getData() { return this.data; } /** * @param {?} data * @return {?} */ setData(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 {?} */ getSetting() { return this.setting; } /** * @param {?} setting * @return {?} */ setSetting(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 {?} */ getModel() { return this.model; } /** * @param {?} model * @return {?} */ setModel(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 {?} */ getDataParent() { return this.dataParent; } /** * @param {?} dataParent * @return {?} */ setDataParent(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 {?} */ addDataChild(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 {?} */ removeDataChild(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 {?} */ getDataChildren() { return this.dataChildren; } /** * @return {?} */ getChangeEvent() { 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 {?} */ isDataDirty() { 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 {?} */ saveData(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 {?} */ resetData() { if (this.componentRef !== null && this.componentRef !== undefined && this.componentRef.instance !== null) { if (typeof this.componentRef.instance.resetData === 'function') { this.componentRef.instance.resetData(); } } } /** * @return {?} */ isIgnoreParentData() { return this.ignoreParentData; } /** * @param {?} ignore * @return {?} */ setIgnoreParentData(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 {?} */ isIgnoreParentDisabled() { return this.ignoreParentDisabled; } /** * @param {?} ignore * @return {?} */ setIgnoreParentDisabled(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 {?} */ isDelegateHistory() { return this.delegateHistory; } /** * @param {?} delegate * @return {?} */ setDelegateHistory(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 {?} */ getOptions() { return this.options; } /** * @param {?} options * @return {?} */ setOptions(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 {?} */ getOnEnabled() { return this.onEnabled; } /** * @param {?} handler * @return {?} */ setOnEnabled(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 {?} */ getOnDisabled() { return this.onDisabled; } /** * @param {?} handler * @return {?} */ setOnDisabled(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 {?} */ getComponentRef() { return this.componentRef; } /** * @return {?} */ getComponentInstance() { let /** @type {?} */ compRef = this.getComponentRef(); if (compRef === null || typeof compRef === 'undefined') { return null; } return compRef.instance; } /** * @param {?} value * @return {?} */ applyI18N(value) { if (typeof value === 'undefined') { return; } this.i18n = value; let /** @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 { let /** @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 {?} */ getI18NKey() { if (this.i18nKey !== undefined) { return this.i18nKey; } let /** @type {?} */ compInst = this.getComponentInstance(); if (compInst === null || typeof compInst.getI18NKey !== 'function') { return null; } return compInst.getI18NKey(); } /** * @param {?} i18nKey * @return {?} */ setI18NKey(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 {?} */ isBypassKey() { if (this.bypass !== undefined) { return this.bypass; } let /** @type {?} */ compInst = this.getComponentInstance(); if (compInst === null || typeof compInst.isBypassKey !== 'function') { return false; } return compInst.isBypassKey(); } /** * @param {?} bypass * @return {?} */ setBypassKey(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 {?} */ getCSSClass() { return this.cssClass; } /** * @param {?} clazz * @return {?} */ setCSSClass(clazz) { this.cssClass = clazz; } } ComponentWrapper.TYPE_NAME = TYPE_NAME; ComponentWrapper.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `` },] }, ]; /** @nocollapse */ ComponentWrapper.ctorParameters = () => [ { 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',] },], }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50V3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvQ29tcG9uZW50V3JhcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLEtBQUssRUFBRSxnQkFBZ0IsRUFBUSx3QkFBd0IsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBU2hKLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSy9ELHVCQUFNLFNBQVMsR0FBVyx1QkFBdUIsQ0FBQztBQU9sRCxNQUFNOzs7Ozs7O0lBK0NKLFlBQVksTUFBd0IsRUFBRSx3QkFBa0QsRUFBRSxVQUFzQixFQUFFLFlBQXNDO2lDQTNDcEgsQ0FBQztRQTRDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDO1FBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0tBQ2xDOzs7O0lBRU0sUUFBUTs7Ozs7O0lBSVIsV0FBVyxDQUFDLE9BQVk7UUFDN0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLHFCQUFJLE9BQU8sR0FB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RUFBRSxFQUFFO2FBQ2I7Ozs7WUF2QjZDLGdCQUFnQjtZQUFRLHdCQUF3QjtZQUFnQixVQUFVO1lBVy9HLHdCQUF3Qjs7OzJCQW1COUIsS0FBSztxQkFFTCxLQUFLO2lDQUVMLEtBQUs7cUNBRUwsS0FBSztnQ0FFTCxLQUFLO3dCQUVMLEtBQUs7d0JBRUwsS0FBSztzQkFFTCxLQUFLOzBCQUVMLEtBQUs7MkJBRUwsS0FBSztxQkFFTCxLQUFLO3FCQUVMLEtBQUs7d0JBRUwsS0FBSzt3QkFFTCxLQUFLO3VCQUVMLEtBQUssU0FBQyxZQUFZO3lCQUVsQixLQUFLLFNBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIElucHV0LCBWaWV3Q29udGFpbmVyUmVmLCBUeXBlLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuL0lIYXNEYXRhJztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4vSUhhc01vZGVsJztcbmltcG9ydCB7IElIYXNTZXR0aW5nIH0gZnJvbSAnLi9JSGFzU2V0dGluZyc7XG5pbXBvcnQgeyBJQ2hhbmdlYWJsZSB9IGZyb20gJy4vSUNoYW5nZWFibGUnO1xuXG5pbXBvcnQgeyBJSTE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi9zaGFyZS9JSTE4TkFwcGxpY2FibGUnO1xuaW1wb3J0IHsgSUhhc09wdGlvbnMgfSBmcm9tICcuLi9zaGFyZS9JSGFzT3B0aW9ucyc7XG5cbmltcG9ydCB7IERhdGFVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0RhdGFVdGlscyc7XG5pbXBvcnQgeyBBYnN0cmFjdFBhZ2UgfSBmcm9tICcuL0Fic3RyYWN0UGFnZSc7XG5pbXBvcnQgeyBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIgfSBmcm9tICcuLi9zZXJ2aWNlL0JhY2tncm91bmRQcm9jZXNzTWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBobG94QXBwSW5mbyB9IGZyb20gJy4uL2NvbXBvbmVudC9tb2RlbC9QaGxveEFwcEluZm8nO1xuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1jb21wb25lbnQtd3JhcHBlclwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGBgXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudFdyYXBwZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgSUhhc0RhdGEsIElIYXNTZXR0aW5nLCBJSGFzTW9kZWwsIElDaGFuZ2VhYmxlLCBJSTE4TkFwcGxpY2FibGUsIElIYXNPcHRpb25zIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgUEFHRV9MT09QX1RJTUVPVVQ6IG51bWJlciA9IDU7XG5cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBkYXRhUGFyZW50OiBJSGFzRGF0YTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSB0eXBlOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgaGFuZGxlcjogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgc2V0dGluZzogYW55O1xuICBASW5wdXQoKVxuICBwcml2YXRlIG1vZGVsOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgb25FbmFibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBvbkRpc2FibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgaTE4bjogYW55O1xuICBASW5wdXQoKVxuICBwcml2YXRlIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBpMThuS2V5OiBhbnk7XG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXG4gIHByaXZhdGUgYnlwYXNzOiBhbnk7XG4gIEBJbnB1dCgnY2xhc3MnKVxuICBwcml2YXRlIGNzc0NsYXNzOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IGFueTtcbiAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICBwcml2YXRlIGJnUHJvY2Vzc01ncjogQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyO1xuICBwcml2YXRlIHBobG94QXBwSW5mbzogUGhsb3hBcHBJbmZvO1xuICBwcml2YXRlIGRhdGFDaGlsZHJlbjogSUhhc0RhdGFbXTtcbiAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjtcbiAgcHJpdmF0ZSB0YXJnZXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgY29uc3RydWN0b3IodGFyZ2V0OiBWaWV3Q29udGFpbmVyUmVmLCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgYmdQcm9jZXNzTWdyOiBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjtcbiAgICB0aGlzLmRhdGFDaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy5iZ1Byb2Nlc3NNZ3IgPSBiZ1Byb2Nlc3NNZ3I7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcbiAgICBpZiAoY2hhbmdlc1sndHlwZSddICE9PSBudWxsICYmIHR5cGVvZiBjaGFuZ2VzWyd0eXBlJ10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgb2xkVHlwZSA9IGNoYW5nZXNbJ3R5cGUnXS5wcmV2aW91c1ZhbHVlO1xuICAgICAgbGV0IG5ld1R5cGU6IGFueSA9IGNoYW5nZXNbJ3R5cGUnXS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGlmIChvbGRUeXBlICE9PSBuZXdUeXBlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvbmVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChjaGFuZ2VzWydjbGFzcyddICE9PSBudWxsICYmIHR5cGVvZiBjaGFuZ2VzWydjbGFzcyddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgb2xkQ2xhc3MgPSBjaGFuZ2VzWydjbGFzcyddLnByZXZpb3VzVmFsdWU7XG4gICAgICAgIGxldCBuZXdDbGFzczogYW55ID0gY2hhbmdlc1snY2xhc3MnXS5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgaWYgKG9sZENsYXNzICE9PSBuZXdDbGFzcykge1xuICAgICAgICAgICQodGhpcy5jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCkuYXR0cignY2xhc3MnLCBuZXdDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCk6IHZvaWQge1xuICAgIC8vIHJlbW92ZSBvbGQgZG9tXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5lbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvbmVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXREYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0RGF0YShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0RGF0YVBhcmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLnNldERhdGFQYXJlbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgY29tcG9uZW50IHR5cGUgb3IgdHlwZXN0cmluZyByZXNsb3ZlXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gbnVsbCAmJiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICBjb25zdCBzaW1wbGVDb21wb0ZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0aGlzLnR5cGUpO1xuICAgICAgbGV0IGNvbXBSZWYgPSB0aGlzLnRhcmdldC5jcmVhdGVDb21wb25lbnQoc2ltcGxlQ29tcG9GYWN0b3J5KTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gY29tcFJlZjtcblxuICAgICAgLy8gQWRkIGNzcyBjbGFzcyBpbnRvIGNvbXBvbmVudCBlbGVtZW50XG4gICAgICBpZiAodGhpcy5jc3NDbGFzcyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jc3NDbGFzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgJChjb21wUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpLmF0dHIoJ2NsYXNzJywgdGhpcy5jc3NDbGFzcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBvcHRpb25zIGZpcnN0XG4gICAgICB0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKTtcblxuICAgICAgLy8gT3ZlcndyaXRlIHRoaXMgdmFsdWVzIChpZiBzcGVjaWZpZWQpXG4gICAgICB0aGlzLnNldElnbm9yZVBhcmVudERhdGEodGhpcy5pZ25vcmVQYXJlbnREYXRhKTtcbiAgICAgIHRoaXMuc2V0SWdub3JlUGFyZW50RGlzYWJsZWQodGhpcy5pZ25vcmVQYXJlbnREaXNhYmxlZCk7XG4gICAgICB0aGlzLnNldFNldHRpbmcodGhpcy5zZXR0aW5nKTtcbiAgICAgIHRoaXMuc2V0TW9kZWwodGhpcy5tb2RlbCk7XG4gICAgICB0aGlzLnNldE9uRW5hYmxlZCh0aGlzLm9uRW5hYmxlZCk7XG4gICAgICB0aGlzLnNldE9uRGlzYWJsZWQodGhpcy5vbkRpc2FibGVkKTtcbiAgICAgIHRoaXMuc2V0RGVsZWdhdGVIaXN0b3J5KHRoaXMuZGVsZWdhdGVIaXN0b3J5KTtcbiAgICAgIHRoaXMuc2V0STE4TktleSh0aGlzLmkxOG5LZXkpO1xuICAgICAgdGhpcy5zZXRCeXBhc3NLZXkodGhpcy5ieXBhc3MpO1xuXG4gICAgICAvLyBTZXQgZGF0YSBwYXJlbnQgdGhlblxuICAgICAgdGhpcy5zZXREYXRhUGFyZW50KHRoaXMuZGF0YVBhcmVudCk7XG4gICAgICB0aGlzLnNldERhdGEodGhpcy5kYXRhKTtcblxuICAgICAgLy8gQXBwbHkgaTE4biBsYXN0bHlcbiAgICAgIHRoaXMuYXBwbHlJMThOKHRoaXMuaTE4bik7XG5cbiAgICAgIGlmICh0aGlzLmhhbmRsZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmhhbmRsZXIoe1xuICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICBpbnN0YW5jZTogY29tcFJlZi5pbnN0YW5jZSxcbiAgICAgICAgICBzZXR0aW5nOiB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGkxOG46IHRoaXMuaTE4bixcclxuICAgICAgICAgIGlnbm9yZVBhcmVudERhdGE6IHRoaXMuaWdub3JlUGFyZW50RGF0YSxcclxuICAgICAgICAgIGlnbm9yZVBhcmVudERpc2FibGVkOiB0aGlzLmlnbm9yZVBhcmVudERpc2FibGVkLFxyXG4gICAgICAgICAgb25FbmFibGVkOiB0aGlzLm9uRW5hYmxlZCxcclxuICAgICAgICAgIG9uRGlzYWJsZWQ6IHRoaXMub25EaXNhYmxlZCxcclxuICAgICAgICAgIGRlbGVnYXRlSGlzdG9yeTogdGhpcy5kZWxlZ2F0ZUhpc3RvcnksXHJcbiAgICAgICAgICBpMThuS2V5OiB0aGlzLmkxOG5LZXksXHJcbiAgICAgICAgICBieXBhc3M6IHRoaXMuYnlwYXNzLFxyXG4gICAgICAgICAgZGF0YVBhcmVudDogdGhpcy5kYXRhUGFyZW50XHJcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wUmVmLmluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBjb21wUmVmLmluc3RhbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgYW55SW5zdGFuY2U6IGFueSA9IGNvbXBSZWYuaW5zdGFuY2U7XG5cbiAgICAgICAgLy8gc3RhcnQgbG9hZGVyXG4gICAgICAgIGlmICghKGFueUluc3RhbmNlIGluc3RhbmNlb2YgQWJzdHJhY3RQYWdlKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgYW55SW5zdGFuY2UuaXNQYWdlTG9hZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBwYWdlIGxvYWQgYWN0aXZhdGUgb3IgZW5kXG4gICAgICAgICAgICBpZiAodGhpcy5iZ1Byb2Nlc3NNZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuYmdQcm9jZXNzTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICB0aGlzLmJnUHJvY2Vzc01nci5leGVjdXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICBsZXQgdGltZW91dCA9IFBobG94QXBwSW5mby5ERUZBVUxUX1BBR0VfTE9BRF9USU1FT1VUO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBobG94QXBwSW5mbyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5waGxveEFwcEluZm8uc2V0dGluZ3MuUEFHRV9MT0FEX1RJTUVPVVQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLlBBR0VfTE9BRF9USU1FT1VUICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gdGh