com.phloxui
Version:
PhloxUI Ng2+ Framework
440 lines (439 loc) • 30.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input } from '@angular/core';
import { TabModel } from '../../model/TabModel';
import { AbstractHasDataHelp } from '../../AbstractHasDataHelp';
import { AbstractDataView } from '../../dataview/AbstractDataView';
import { Option } from '../../../decorator/Option.decorator';
import { I18N } from '../../../decorator/I18N.decorator';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
var /** @type {?} */ TYPE_NAME = "phx-tab";
var Tab = /** @class */ (function (_super) {
tslib_1.__extends(Tab, _super);
function Tab(elementRef, needFocusService) {
var _this = _super.call(this, elementRef) || this;
_this.showMoreMenu = false;
_this.needFocusService = needFocusService;
return _this;
}
/**
* @return {?}
*/
Tab.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.tabPane !== null && typeof this.tabPane !== 'undefined') {
this.tabPane.addTabHeader(this);
}
if (this.model !== null && typeof this.model !== 'undefined') {
if (this.model.data !== null && typeof this.model.data !== 'undefined') {
this.data = this.model.data;
}
}
};
/**
* @return {?}
*/
Tab.prototype.getTabLabel = /**
* @return {?}
*/
function () {
if (this.model !== null && typeof this.model !== 'undefined') {
var /** @type {?} */ defaultLabel = (this.model.label === null || typeof this.model.label === 'undefined') ? '' : this.model.label;
var /** @type {?} */ resolveLabel = null;
if (this.model.labelField !== null && typeof this.model.labelField !== 'undefined' && this.model.labelField !== '') {
resolveLabel = AbstractDataView.resolveMappedData(this.model.labelField, this.data);
}
if (resolveLabel !== null && typeof resolveLabel === 'string' && resolveLabel !== '') {
return resolveLabel;
}
else {
return defaultLabel;
}
}
return '';
};
/**
* @return {?}
*/
Tab.prototype.init = /**
* @return {?}
*/
function () {
if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.setContext(this);
}
};
/**
* @param {?} $event
* @return {?}
*/
Tab.prototype.onMoreButtonClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
$event.stopPropagation();
if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') {
if (this.contextMenu.isShow()) {
if (this.needFocusService !== null && this.needFocusService !== undefined) {
this.needFocusService.resetFocusingComponent(this);
}
}
else {
var /** @type {?} */ top_1 = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height();
var /** @type {?} */ left = $(this.elementRef.nativeElement).offset().left - 1;
var /** @type {?} */ width = $(this.elementRef.nativeElement).width() + 2;
this.contextMenu.showAt(top_1, left, width);
if (this.needFocusService !== null && this.needFocusService !== undefined) {
this.needFocusService.setFocusingComponent(this);
}
}
}
};
/**
* @return {?}
*/
Tab.prototype.hideMenu = /**
* @return {?}
*/
function () {
if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.hide();
}
};
/**
* @return {?}
*/
Tab.prototype.getIndex = /**
* @return {?}
*/
function () {
if (this.tabPane !== null && typeof this.tabPane !== 'undefined') {
return this.tabPane.getTabModelIndex(this.model);
}
return -1;
};
/**
* @param {?} selected
* @return {?}
*/
Tab.prototype.setSelected = /**
* @param {?} selected
* @return {?}
*/
function (selected) {
this.selected = selected;
};
/**
* @return {?}
*/
Tab.prototype.getContextMenu = /**
* @return {?}
*/
function () {
return this.contextMenu;
};
/**
* @param {?} menu
* @return {?}
*/
Tab.prototype.setContextMenu = /**
* @param {?} menu
* @return {?}
*/
function (menu) {
this.contextMenu = menu;
};
/**
* @return {?}
*/
Tab.prototype.getMenuModelFactory = /**
* @return {?}
*/
function () {
return this.menuFactory;
};
/**
* @param {?} menuFactory
* @return {?}
*/
Tab.prototype.setMenuModelFactory = /**
* @param {?} menuFactory
* @return {?}
*/
function (menuFactory) {
this.menuFactory = menuFactory;
};
/**
* @return {?}
*/
Tab.prototype.getModel = /**
* @return {?}
*/
function () {
return this.model;
};
/**
* @return {?}
*/
Tab.prototype.isSelfDataDirty = /**
* @return {?}
*/
function () {
return false;
};
/**
* @param {?} data
* @return {?}
*/
Tab.prototype.selfSaveData = /**
* @param {?} data
* @return {?}
*/
function (data) {
};
/**
* @return {?}
*/
Tab.prototype.selfResetData = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
Tab.prototype.getTabBody = /**
* @return {?}
*/
function () {
if (this.tabPane !== null && typeof this.tabPane !== 'undefined') {
var /** @type {?} */ index = this.tabPane.getTabHeaderIndex(this);
return this.tabPane.getTabBody(index);
}
return null;
};
/**
* @return {?}
*/
Tab.prototype.isShowMoreMenu = /**
* @return {?}
*/
function () {
return this.showMoreMenu;
};
/**
* @return {?}
*/
Tab.prototype.doPreload = /**
* @return {?}
*/
function () {
return Promise.resolve(null);
};
/**
* @return {?}
*/
Tab.prototype.doLoaded = /**
* @return {?}
*/
function () {
};
/**
* @param {?} $event
* @return {?}
*/
Tab.prototype._doFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
// do something when focus
};
/**
* @param {?} $event
* @return {?}
*/
Tab.prototype._doLostFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.needFocusService !== null) {
this.needFocusService.resetFocusingComponent(this);
}
};
/**
* @param {?} event
* @return {?}
*/
Tab.prototype.onFocus = /**
* @param {?} event
* @return {?}
*/
function (event) {
$(this.elementRef.nativeElement).find(".fake").focus();
};
/**
* @param {?} event
* @return {?}
*/
Tab.prototype.onLostFocus = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.lostFocusTimeout !== null && this.lostFocusTimeout !== undefined) {
clearTimeout(this.lostFocusTimeout);
}
this.lostFocusTimeout = setTimeout(function () {
_this.hideMenu();
$(_this.elementRef.nativeElement).find(".fake").blur();
}, 320);
};
Tab.TYPE_NAME = TYPE_NAME;
Tab.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: "<div class=\"table-wrapper\">\n\t<div class=\"table-cell-wrapper middle\">\n\t\t<div *ngIf=\"getModel() != null\" class=\"phx-tab\" [class.dirty]=\"isDataDirty()\" [ngClass]=\"getModel().styleClass\">\n\t\t\t<div class=\"tab-name\">{{getTabLabel()}}</div> <div *ngIf=\"isShowMoreMenu()\" class=\"tab-vertical-ellipsis\" (click)=\"onMoreButtonClick($event)\"></div>\n\t\t\t<phx-context-menu [model]=\"getModel().menuModel\" [dataParent]=\"this\" [context]=\"this\" class=\"vertical\" [autoFocus]=\"false\"></phx-context-menu>\n\t\t</div>\n\t</div>\n\t<button type=\"button\" class=\"fake\" (focusin)=\"_doFocus($event)\" (blur)=\"_doLostFocus($event)\"></button>\n</div>\n"
},] },
];
/** @nocollapse */
Tab.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: NeedFocusService, },
]; };
Tab.propDecorators = {
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"help": [{ type: Input },],
"model": [{ type: Input },],
"tabPane": [{ type: Input },],
"menuFactory": [{ type: Input },],
"showMoreMenu": [{ type: Input },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], Tab.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], Tab.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], Tab.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], Tab.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], Tab.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], Tab.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], Tab.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], Tab.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], Tab.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], Tab.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], Tab.prototype, "disabled", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], Tab.prototype, "help", void 0);
return Tab;
}(AbstractHasDataHelp));
export { Tab };
function Tab_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
Tab.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
Tab.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
Tab.propDecorators;
/** @type {?} */
Tab.TYPE_NAME;
/** @type {?} */
Tab.prototype.dataParent;
/** @type {?} */
Tab.prototype.ignoreParentData;
/** @type {?} */
Tab.prototype.data;
/** @type {?} */
Tab.prototype.ignoreParentDisabled;
/** @type {?} */
Tab.prototype.delegateHistory;
/** @type {?} */
Tab.prototype.onDisabled;
/** @type {?} */
Tab.prototype.onEnabled;
/** @type {?} */
Tab.prototype.loadingEnabled;
/** @type {?} */
Tab.prototype.i18nKey;
/** @type {?} */
Tab.prototype.bypass;
/** @type {?} */
Tab.prototype.options;
/** @type {?} */
Tab.prototype.disabled;
/** @type {?} */
Tab.prototype.help;
/** @type {?} */
Tab.prototype.model;
/** @type {?} */
Tab.prototype.tabPane;
/** @type {?} */
Tab.prototype.contextMenu;
/** @type {?} */
Tab.prototype.menuFactory;
/** @type {?} */
Tab.prototype.selected;
/** @type {?} */
Tab.prototype.showMoreMenu;
/** @type {?} */
Tab.prototype.lostFocusTimeout;
/** @type {?} */
Tab.prototype.needFocusService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy90YWIuaW50ZXJuYWwvVGFiLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFNaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUk3RSxxQkFBTSxTQUFTLEdBQVcsU0FBUyxDQUFDOztJQWdCWCwrQkFBbUI7SUE2RDFDLGFBQVksVUFBc0IsRUFBRSxnQkFBa0M7UUFBdEUsWUFDRSxrQkFBTSxVQUFVLENBQUMsU0FHbEI7UUFGQyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7O0tBQzFDOzs7O0lBRU0sc0JBQVE7Ozs7UUFDYixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJ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QUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7Ozs7UUFHUixNQUFNLEVBQUU7MENBQ2EsUUFBUTs7O1FBRTdCLE1BQU0sRUFBRTswQ0FDWSxRQUFROzs7UUFFNUIsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxFQUFFOzs7O1FBR1IsTUFBTSxDQUFDLFlBQVksQ0FBQzs7OztRQUtwQixNQUFNLEVBQUU7Ozs7UUFJUixJQUFJLEVBQUU7UUFDTixNQUFNLEVBQUU7OztjQTNFWDtFQStCeUIsbUJBQW1CO1NBQS9CLEdBQUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9UYWJNb2RlbCc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJy4uLy4uL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4uLy4uL0lDb250ZXh0JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuLi8uLi9JTWVudU1vZGVsRmFjdG9yeSc7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGFIZWxwIH0gZnJvbSAnLi4vLi4vQWJzdHJhY3RIYXNEYXRhSGVscCc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFWaWV3IH0gZnJvbSAnLi4vLi4vZGF0YXZpZXcvQWJzdHJhY3REYXRhVmlldyc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC10YWJcIjtcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHQ8ZGl2ICpuZ0lmPVwiZ2V0TW9kZWwoKSAhPSBudWxsXCIgY2xhc3M9XCJwaHgtdGFiXCIgW2NsYXNzLmRpcnR5XT1cImlzRGF0YURpcnR5KClcIiBbbmdDbGFzc109XCJnZXRNb2RlbCgpLnN0eWxlQ2xhc3NcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWItbmFtZVwiPnt7Z2V0VGFiTGFiZWwoKX19PC9kaXY+IDxkaXYgKm5nSWY9XCJpc1Nob3dNb3JlTWVudSgpXCIgY2xhc3M9XCJ0YWItdmVydGljYWwtZWxsaXBzaXNcIiAoY2xpY2spPVwib25Nb3JlQnV0dG9uQ2xpY2soJGV2ZW50KVwiPjwvZGl2PlxuXHRcdFx0PHBoeC1jb250ZXh0LW1lbnUgW21vZGVsXT1cImdldE1vZGVsKCkubWVudU1vZGVsXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCIgW2F1dG9Gb2N1c109XCJmYWxzZVwiPjwvcGh4LWNvbnRleHQtbWVudT5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmFrZVwiIChmb2N1c2luKT1cIl9kb0ZvY3VzKCRldmVudClcIiAoYmx1cik9XCJfZG9Mb3N0Rm9jdXMoJGV2ZW50KVwiPjwvYnV0dG9uPlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFRhYiBleHRlbmRzIEFic3RyYWN0SGFzRGF0YUhlbHAgaW1wbGVtZW50cyBPbkluaXQsIElDb250ZXh0LCBJTmVlZEZvY3VzIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcbiAgQElucHV0KCdpMThuQnlwYXNzJylcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YUhlbHBcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcblxuICAvLyAtLS0gZnJvbSBzZWxmXG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbW9kZWw6IFRhYk1vZGVsO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHRhYlBhbmU6IGFueTtcbiAgcHJpdmF0ZSBjb250ZXh0TWVudTogQ29udGV4dE1lbnU7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgbWVudUZhY3Rvcnk6IElNZW51TW9kZWxGYWN0b3J5O1xuICBwcml2YXRlIHNlbGVjdGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBwcml2YXRlIHNob3dNb3JlTWVudTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb3N0Rm9jdXNUaW1lb3V0OiBhbnk7XG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcbiAgICB0aGlzLnNob3dNb3JlTWVudSA9IGZhbHNlO1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFiUGFuZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy50YWJQYW5lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy50YWJQYW5lLmFkZFRhYkhlYWRlcih0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMubW9kZWwuZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFiTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBkZWZhdWx0TGFiZWwgPSAodGhpcy5tb2RlbC5sYWJlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbC5sYWJlbCA9PT0gJ3VuZGVmaW5lZCcpID8gJycgOiB0aGlzLm1vZGVsLmxhYmVsO1xuICAgICAgbGV0IHJlc29sdmVMYWJlbCA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tb2RlbC5sYWJlbEZpZWxkICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmxhYmVsRmllbGQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubW9kZWwubGFiZWxGaWVsZCAhPT0gJycpIHtcbiAgICAgICAgcmVzb2x2ZUxhYmVsID0gQWJzdHJhY3REYXRhVmlldy5yZXNvbHZlTWFwcGVkRGF0YSh0aGlzLm1vZGVsLmxhYmVsRmllbGQsIHRoaXMuZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZlTGFiZWwgIT09IG51bGwgJiYgdHlwZW9mIHJlc29sdmVMYWJlbCA9PT0gJ3N0cmluZycgJiYgcmVzb2x2ZUxhYmVsICE9PSAnJykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUxhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMYWJlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbk1vcmVCdXR0b25DbGljaygkZXZlbnQ6IEV2ZW50KSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudS5pc1Nob3coKSkge1xuICAgICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9PSBudWxsICYmIHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0b3AgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS50b3AgKyAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5oZWlnaHQoKTtcbiAgICAgICAgbGV0IGxlZnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0IC0gMTtcbiAgICAgICAgbGV0IHdpZHRoID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkud2lkdGgoKSArIDI7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93QXQodG9wLCBsZWZ0LCB3aWR0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gbnVsbCAmJiB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlTWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudGFiUGFuZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy50YWJQYW5lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMudGFiUGFuZS5nZXRUYWJNb2RlbEluZGV4KHRoaXMubW9kZWwpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0ZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGV4dE1lbnUoKTogQ29udGV4dE1lbnUge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIHNldENvbnRleHRNZW51KG1lbnU6IENvbnRleHRNZW51KTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0TWVudSA9IG1lbnU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWVudU1vZGVsRmFjdG9yeSgpOiBJTWVudU1vZGVsRmFjdG9yeSB7XG4gICAgcmV0dXJuIHRoaXMubWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgc2V0TWVudU1vZGVsRmFjdG9yeShtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3RvcnkpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogVGFiTW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIGlzU2VsZkRhdGFEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2VsZlNhdmVEYXRhKGRhdGE6IGFueSk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIGdldFRhYkJvZHkoKTogYW55IHtcbiAgICBpZiAodGhpcy50YWJQYW5lICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnRhYlBhbmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgaW5kZXggPSB0aGlzLnRhYlBhbmUuZ2V0VGFiSGVhZGVySW5kZXgodGhpcyk7XG4gICAgICByZXR1cm4gdGhpcy50YWJQYW5lLmdldFRhYkJvZHkoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBpc1Nob3dNb3JlTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93TW9yZU1lbnU7XG4gIH1cblxuICBwdWJsaWMgZG9QcmVsb2FkKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBkb0xvYWRlZCgpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIF9kb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBkbyBzb21ldGhpbmcgd2hlbiBmb2N1c1xuICB9XG5cbiAgcHVibGljIF9kb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCIuZmFrZVwiKS5mb2N1cygpXG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmKHRoaXMubG9zdEZvY3VzVGltZW91dCAhPT0gbnVsbCAmJiB0aGlzLmxvc3RGb2N1c1RpbWVvdXQgIT09IHVuZGVmaW5lZCl7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5sb3N0Rm9jdXNUaW1lb3V0KTtcbiAgICB9XG5cbiAgICB0aGlzLmxvc3RGb2N1c1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpPT57XG4gICAgICB0aGlzLmhpZGVNZW51KCk7XG5cbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCIuZmFrZVwiKS5ibHVyKCk7XG4gICAgfSwgMzIwKTtcbiAgfVxufVxuIl19