com.phloxui
Version:
PhloxUI Ng2+ Framework
618 lines (617 loc) • 63.5 kB
JavaScript
/**
* @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