com.phloxui
Version:
PhloxUI Ng2+ Framework
370 lines (369 loc) • 31.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core';
import { ActionModel, ActionModelMenu } from '../model/models';
import { ContextMenu } from '../ContextMenu.component';
import { DefaultActionModelMenuFactory } from './DefaultActionModelMenuFactory';
import { Option } from '../../decorator/Option.decorator';
import { I18N } from '../../decorator/I18N.decorator';
import { AbstractI18NApplicable } from '../../share/AbstractI18NApplicable';
import { NeedFocusService } from '../../service/NeedFocusService.service';
const /** @type {?} */ TYPE_NAME = "phx-action-btn";
export class ActionButton extends AbstractI18NApplicable {
/**
* @param {?} elementRef
* @param {?} needFocusService
*/
constructor(elementRef, needFocusService) {
super();
this.ACTION_CONTEXT_MENU_TOP_REDUCE = 5;
this.clickEvent = new EventEmitter();
this.elementRef = elementRef;
this.needFocusService = needFocusService;
}
/**
* @return {?}
*/
ngOnInit() {
if (!this.model && this.options && this.options['model']) {
this.model = new ActionModel();
this.model.setOptions(this.options['model']);
}
this.init();
}
/**
* @return {?}
*/
init() {
if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.setContext(this);
}
if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') {
this.menuModel = this.menuFactory.createMenuModel(this);
}
else {
this.menuFactory = new DefaultActionModelMenuFactory();
this.menuModel = this.menuFactory.createMenuModel(this);
}
}
/**
* @param {?} $event
* @return {?}
*/
doFocus($event) {
$(this.elementRef.nativeElement).find("div > button").focus();
}
/**
* @param {?} $event
* @return {?}
*/
doBlur($event) {
$(this.elementRef.nativeElement).find("div > button").blur();
}
/**
* @param {?} $event
* @return {?}
*/
onActionBtnClicked($event) {
if (this.model === null || typeof this.model === 'undefined') {
return;
}
this.doFocus($event);
if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.hide();
}
if (this.model.actionPerformedHandler !== null && typeof this.model.actionPerformedHandler !== 'undefined') {
this.model.actionPerformedHandler.call(null, $event);
}
else {
this.onMoreBtnClicked($event);
}
this.clickEvent.emit($event);
}
/**
* @param {?} $event
* @return {?}
*/
onMoreBtnClicked($event) {
if (this.model === null || typeof this.model === 'undefined') {
return;
}
this.doFocus($event);
if (this.model.constructor.name === 'ActionModelMenu') {
$event.stopPropagation();
if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') {
this.menuModel = this.menuFactory.createMenuModel(this);
}
if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') {
if (this.contextMenu.isShow()) {
this.contextMenu.hide();
}
else {
let /** @type {?} */ scrollTop = $(this.elementRef.nativeElement).scrollTop();
let /** @type {?} */ top = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height();
let /** @type {?} */ left = $(this.elementRef.nativeElement).offset().left;
top = top - this.ACTION_CONTEXT_MENU_TOP_REDUCE;
this.contextMenu.showAt(top, left);
}
}
}
}
/**
* @return {?}
*/
_isShowMoreBtn() {
if (this.model === null || typeof this.model === 'undefined') {
return false;
}
if (this.model instanceof ActionModelMenu) {
return true;
}
return false;
}
/**
* @return {?}
*/
_hasIcon() {
if (this.model !== null && this.model != undefined) {
if (this.model.iconURL !== null && this.model.iconURL != undefined) {
return true;
}
}
return false;
}
/**
* @return {?}
*/
getClickEvent() {
return this.clickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setClickedEvent(event) {
this.clickEvent = event;
}
/**
* @param {?} context
* @return {?}
*/
isShow(context) {
if (this.model.isShow === null) {
return false;
}
if (typeof this.model.isShow !== 'function') {
return false;
}
return this.model.isShow(context);
}
/**
* @param {?} context
* @return {?}
*/
isEnabled(context) {
if (this.model.isEnabled === null) {
return false;
}
if (typeof this.model.isEnabled !== 'function') {
return false;
}
return this.model.isEnabled(context);
}
/**
* @return {?}
*/
getContextMenu() {
return this.contextMenu;
}
/**
* @param {?} menu
* @return {?}
*/
setContextMenu(menu) {
this.contextMenu = menu;
if (this.contextMenu) {
if (this.options && this.options['menu']) {
this.contextMenu.setOptions(this.options['menu']);
}
if (this.i18nValue && this.i18nValue['menu']) {
this.contextMenu.applyI18N(this.i18nValue['menu']);
}
}
}
/**
* @return {?}
*/
getMenuModelFactory() {
return this.menuFactory;
}
/**
* @param {?} menuFactory
* @return {?}
*/
setMenuModelFactory(menuFactory) {
this.menuFactory = menuFactory;
}
/**
* @return {?}
*/
hasModel() {
if (this.model !== null && this.model != undefined) {
return true;
}
return false;
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') {
this.menuModel = this.menuFactory.createMenuModel(this);
}
}
/**
* @return {?}
*/
getMenuModel() {
return this.menuModel;
}
/**
* @param {?} $event
* @return {?}
*/
focusing($event) {
this.needFocusService.setFocusingComponent(this, $event);
}
/**
* @param {?} $event
* @return {?}
*/
onLostFocusing($event) {
if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') {
clearTimeout(this._itemLostFocusingTimeout);
this._itemLostFocusingTimeout = null;
}
this._itemLostFocusingTimeout = setTimeout(() => {
this.doBlur($event);
this.needFocusService.resetFocusingComponent($event);
}, 150);
}
/**
* @param {?} event
* @return {?}
*/
onLostFocus(event) {
if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') {
this.contextMenu.hide();
}
}
/**
* @param {?} event
* @return {?}
*/
onFocus(event) {
}
}
ActionButton.TYPE_NAME = TYPE_NAME;
ActionButton.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-action-button" *ngIf="hasModel()">
<div class="group" [class.more]="_isShowMoreBtn()" *ngIf="!_isShowMoreBtn()">
<button (focusin)="focusing($event)" (blur)="onLostFocusing($event)" (click)="onActionBtnClicked($event)">
<img *ngIf="_hasIcon()" src="{{getModel().iconURL}}" title="{{getModel().label}}">
{{getModel().label}}
</button>
</div>
<div class="more-menu" *ngIf="_isShowMoreBtn()">
<button (focusin)="focusing($event)" (blur)="onLostFocusing($event)" (click)="onMoreBtnClicked($event)">
<div class="wrapper">
<div>
{{getModel().label}}
</div>
<div>
<div class="icon-arrow-down"></div>
</div>
</div>
</button>
</div>
</div>
<phx-context-menu *ngIf="getMenuModel() !== null" [model]="getMenuModel()" [context]="this" class="vertical"></phx-context-menu>
`
},] },
];
/** @nocollapse */
ActionButton.ctorParameters = () => [
{ type: ElementRef, },
{ type: NeedFocusService, },
];
ActionButton.propDecorators = {
"menuFactory": [{ type: Input },],
"model": [{ type: Input },],
"options": [{ type: Input },],
"clickEvent": [{ type: Output, args: ['phxClick',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ActionButton.prototype, "menuFactory", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", ActionModel)
], ActionButton.prototype, "model", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], ActionButton.prototype, "clickEvent", void 0);
tslib_1.__decorate([
I18N('menu'),
Option('menu'),
tslib_1.__metadata("design:type", ContextMenu)
], ActionButton.prototype, "contextMenu", void 0);
function ActionButton_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ActionButton.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ActionButton.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ActionButton.propDecorators;
/** @type {?} */
ActionButton.TYPE_NAME;
/** @type {?} */
ActionButton.prototype.ACTION_CONTEXT_MENU_TOP_REDUCE;
/** @type {?} */
ActionButton.prototype.menuFactory;
/** @type {?} */
ActionButton.prototype.model;
/** @type {?} */
ActionButton.prototype.options;
/** @type {?} */
ActionButton.prototype.clickEvent;
/** @type {?} */
ActionButton.prototype.contextMenu;
/** @type {?} */
ActionButton.prototype.menuModel;
/** @type {?} */
ActionButton.prototype.elementRef;
/** @type {?} */
ActionButton.prototype.needFocusService;
/** @type {?} */
ActionButton.prototype._itemLostFocusingTimeout;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWN0aW9uQnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFJMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJMUUsdUJBQU0sU0FBUyxHQUFXLGdCQUFnQixDQUFDO0FBNEIzQyxNQUFNLG1CQUFvQixTQUFRLHNCQUFzQjs7Ozs7SUE0QnRELFlBQVksVUFBc0IsRUFBRSxnQkFBa0M7UUFDcEUsS0FBSyxFQUFFLENBQUM7OENBekJ1QyxDQUFDO1FBMEJoRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0tBQzFDOzs7O0lBRU0sUUFBUTtRQUNiLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsT0FB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RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0RCxFQUFFLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7SUFHSCxXQUFXLENBQUMsS0FBVTtRQUMzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3pCOzs7Ozs7SUFHSSxPQUFPLENBQUMsS0FBVTs7O3lCQXZPa0IsU0FBUzs7WUE1QnJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFCWDthQUNBOzs7O1lBMUN3RCxVQUFVO1lBVzFELGdCQUFnQjs7OzRCQXFDdEIsS0FBSztzQkFHTCxLQUFLO3dCQUlMLEtBQUs7MkJBR0wsTUFBTSxTQUFDLFVBQVU7OztJQVRqQixNQUFNLEVBQUU7Ozs7SUFHUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7c0NBQ00sV0FBVzs7O0lBR3pCLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBRUksWUFBWTs7O0lBRy9CLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDWixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb25Nb2RlbCwgQWN0aW9uTW9kZWxNZW51LCBNZW51TW9kZWwgfSBmcm9tICcuLi9tb2RlbC9tb2RlbHMnO1xuaW1wb3J0IHsgSUNvbnRleHQgfSBmcm9tICcuLi9JQ29udGV4dCc7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi9JSGFzTW9kZWwnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICcuLi9Db250ZXh0TWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuLi9JTWVudU1vZGVsRmFjdG9yeSc7XG5pbXBvcnQgeyBEZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSB9IGZyb20gJy4vRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnknO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIH0gZnJvbSAnLi4vLi4vc2hhcmUvQWJzdHJhY3RJMThOQXBwbGljYWJsZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtYWN0aW9uLWJ0blwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWFjdGlvbi1idXR0b25cIiAqbmdJZj1cImhhc01vZGVsKClcIj5cblx0PGRpdiBjbGFzcz1cImdyb3VwXCIgW2NsYXNzLm1vcmVdPVwiX2lzU2hvd01vcmVCdG4oKVwiICpuZ0lmPVwiIV9pc1Nob3dNb3JlQnRuKClcIj5cblx0XHQ8YnV0dG9uIChmb2N1c2luKT1cImZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCIgKGNsaWNrKT1cIm9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQpXCI+XG5cdFx0XHQ8aW1nICpuZ0lmPVwiX2hhc0ljb24oKVwiIHNyYz1cInt7Z2V0TW9kZWwoKS5pY29uVVJMfX1cIiB0aXRsZT1cInt7Z2V0TW9kZWwoKS5sYWJlbH19XCI+XG5cdFx0XHR7e2dldE1vZGVsKCkubGFiZWx9fVxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cIm1vcmUtbWVudVwiICpuZ0lmPVwiX2lzU2hvd01vcmVCdG4oKVwiPlxuXHRcdDxidXR0b24gKGZvY3VzaW4pPVwiZm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIiAoY2xpY2spPVwib25Nb3JlQnRuQ2xpY2tlZCgkZXZlbnQpXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdHt7Z2V0TW9kZWwoKS5sYWJlbH19XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpY29uLWFycm93LWRvd25cIj48L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2J1dHRvbj5cblx0PC9kaXY+XG48L2Rpdj5cbjxwaHgtY29udGV4dC1tZW51ICpuZ0lmPVwiZ2V0TWVudU1vZGVsKCkgIT09IG51bGxcIiBbbW9kZWxdPVwiZ2V0TWVudU1vZGVsKClcIiBbY29udGV4dF09XCJ0aGlzXCIgY2xhc3M9XCJ2ZXJ0aWNhbFwiPjwvcGh4LWNvbnRleHQtbWVudT5cbmBcbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uQnV0dG9uIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgSUNvbnRleHQsIElIYXNNb2RlbCwgSU5lZWRGb2N1cyB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcblxuICBwcml2YXRlIEFDVElPTl9DT05URVhUX01FTlVfVE9QX1JFRFVDRTogbnVtYmVyID0gNTsgLy8gYXMgcGl4ZWxcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbWVudUZhY3Rvcnk6IElNZW51TW9kZWxGYWN0b3J5O1xuICBASW5wdXQoKVxuICBASTE4TigpXG4gIEBPcHRpb24oKVxuICBwcml2YXRlIG1vZGVsOiBBY3Rpb25Nb2RlbDtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQE9wdGlvbignY2xpY2snKVxuICBAT3V0cHV0KCdwaHhDbGljaycpXG4gIHByaXZhdGUgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIGNvbnRleHRNZW51ICYgbWVudU1vZGVsIGlzIGR5bmFtaWNhbGx5IGNyZWF0ZWQuXG4gIC8vICEgVE9ETyBXaHkgXCJjb250ZXh0TWVudVwiIGlzIG5vdCBib3VuZCB0eSBAVmlld0NoaWxkP1xuICBASTE4TignbWVudScpXG4gIEBPcHRpb24oJ21lbnUnKVxuICBwcml2YXRlIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgcHJpdmF0ZSBtZW51TW9kZWw6IE1lbnVNb2RlbDtcblxuICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcbiAgcHJpdmF0ZSBfaXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tb2RlbCAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtb2RlbCddKSB7XG4gICAgICB0aGlzLm1vZGVsID0gbmV3IEFjdGlvbk1vZGVsKCk7XG5cbiAgICAgIHRoaXMubW9kZWwuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnNbJ21vZGVsJ10pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0Q29udGV4dCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbmV3IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5KCk7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiZGl2ID4gYnV0dG9uXCIpLmZvY3VzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9CbHVyKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKFwiZGl2ID4gYnV0dG9uXCIpLmJsdXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkJ0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZWwuYWN0aW9uUGVyZm9ybWVkSGFuZGxlciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyLmNhbGwobnVsbCwgJGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk1vcmVCdG5DbGlja2VkKCRldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1vcmVCdG5DbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRvRm9jdXMoJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBY3Rpb25Nb2RlbE1lbnUnKSB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCkpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgc2Nyb2xsVG9wID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuc2Nyb2xsVG9wKCk7XG4gICAgICAgICAgbGV0IHRvcCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9mZnNldCgpLnRvcCArICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmhlaWdodCgpO1xuICAgICAgICAgIGxldCBsZWZ0ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICB0b3AgPSB0b3AgLSB0aGlzLkFDVElPTl9DT05URVhUX01FTlVfVE9QX1JFRFVDRTtcblxuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2hvd0F0KHRvcCwgbGVmdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgX2lzU2hvd01vcmVCdG4oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMubW9kZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZWwgaW5zdGFuY2VvZiBBY3Rpb25Nb2RlbE1lbnUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBfaGFzSWNvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMubW9kZWwuaWNvblVSTCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsLmljb25VUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGlja0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrZWRFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBpc1Nob3coY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbC5pc1Nob3cgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLmlzU2hvdyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmlzU2hvdyhjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0VuYWJsZWQoY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbC5pc0VuYWJsZWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLmlzRW5hYmxlZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmlzRW5hYmxlZChjb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250ZXh0TWVudSgpOiBDb250ZXh0TWVudSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnU7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29udGV4dE1lbnUobWVudTogQ29udGV4dE1lbnUpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHRNZW51ID0gbWVudTtcblxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51KSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1snbWVudSddKSB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnNbJ21lbnUnXSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pMThuVmFsdWUgJiYgdGhpcy5pMThuVmFsdWVbJ21lbnUnXSkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LmFwcGx5STE4Tih0aGlzLmkxOG5WYWx1ZVsnbWVudSddKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TWVudU1vZGVsRmFjdG9yeSgpOiBJTWVudU1vZGVsRmFjdG9yeSB7XG4gICAgcmV0dXJuIHRoaXMubWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgc2V0TWVudU1vZGVsRmFjdG9yeShtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3RvcnkpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVGYWN0b3J5ID0gbWVudUZhY3Rvcnk7XG4gIH1cblxuICBwdWJsaWMgaGFzTW9kZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdGhpcy5tb2RlbCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNZW51TW9kZWwoKTogTWVudU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tZW51TW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kb0JsdXIoJGV2ZW50KTtcbiAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XG4gICAgfSwgMTUwKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkxvc3RGb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG5cbiAgfVxufVxuIl19