UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

401 lines (400 loc) 29.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import { MenuModel } from './model/models'; import { AbstractHasData } from './AbstractHasData'; import { Option } from '../decorator/Option.decorator'; import { I18N } from '../decorator/I18N.decorator'; import { NeedFocusService } from '../service/NeedFocusService.service'; const /** @type {?} */ TYPE_NAME = "phx-context-menu-btn"; const /** @type {?} */ TYPE_PARENT = "parent"; const /** @type {?} */ TYPE_CHILDREN = "children"; const /** @type {?} */ TYPE_DISTANCE = "distance"; export class ContextMenuButton extends AbstractHasData { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(elementRef); this.needFocusService = needFocusService; this.autoFocus = true; } /** * @return {?} */ ngOnInit() { this.init(); } /** * @return {?} */ ngOnDestroy() { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(null); } } /** * @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); } } /** * @return {?} */ recreateMenuModel() { this.menuModel = this.menuFactory.createMenuModel(this); } /** * @param {?} $event * @return {?} */ onMoreButtonClick($event) { if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { if (this.contextMenu.isShow()) { setTimeout(() => { this.hideMenu(); }, 50); } else { let /** @type {?} */ anchorEl = this.elementRef.nativeElement; if (this.anchorComponent !== null && this.anchorComponent !== undefined) { anchorEl = this.anchorComponent.elementRef.nativeElement; } else if (this.anchorSelector !== null && typeof this.anchorSelector === 'string') { let /** @type {?} */ selector = $(this.anchorSelector); if (selector.length > 0) { anchorEl = selector[0]; } } let /** @type {?} */ offsetTop = 0; let /** @type {?} */ offsetLeft = 0; if (this.menuOffsetTop !== null && typeof this.menuOffsetTop === 'number') { offsetTop = this.menuOffsetTop; } if (this.menuOffsetLeft !== null && typeof this.menuOffsetLeft === 'number') { offsetLeft = this.menuOffsetLeft; } let /** @type {?} */ top = $(anchorEl).offset().top + $(anchorEl).height() + offsetTop; let /** @type {?} */ leftEllipsisButton = $(this.elementRef.nativeElement).offset().left + offsetLeft; let /** @type {?} */ widthEllipsisButton = $(this.elementRef.nativeElement).outerWidth(); let /** @type {?} */ setLeft = leftEllipsisButton + widthEllipsisButton; this.contextMenu.showAt(top, setLeft); } } } /** * @return {?} */ getContextMenu() { return this.contextMenu; } /** * @param {?} menu * @return {?} */ setContextMenu(menu) { this.contextMenu = menu; } /** * @return {?} */ getMenuModelFactory() { return this.menuFactory; } /** * @param {?} menuFactory * @return {?} */ setMenuModelFactory(menuFactory) { this.menuFactory = menuFactory; } /** * @return {?} */ getMenuModel() { return this.menuModel; } /** * @return {?} */ isSelfDataDirty() { return false; } /** * @param {?} data * @return {?} */ selfSaveData(data) { } /** * @return {?} */ selfResetData() { } /** * @return {?} */ doPreload() { return new Promise((resolve, reject) => { resolve(null); }); } /** * @return {?} */ doLoaded() { } /** * @return {?} */ isIconURLEmpty() { if (this.iconURL == null || this.iconURL === undefined) { return true; } return false; } /** * @return {?} */ getIconURL() { return this.iconURL; } /** * @return {?} */ getStyleClasses() { return this.styleClasses; } /** * @return {?} */ hideMenu() { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } } /** * @return {?} */ isShowMenu() { return this.contextMenu.isShow(); } /** * @return {?} */ isAutoFocus() { return this.autoFocus; } /** * @param {?} event * @return {?} */ onFocus(event) { } /** * @param {?} event * @return {?} */ onLostFocus(event) { this.hideMenu(); } /** * @param {?} $event * @return {?} */ _doFocus($event) { // do something when focus } /** * @param {?} $event * @return {?} */ _doLostFocus($event) { if (this.needFocusService !== null) { this.needFocusService.resetFocusingComponent(this); } } } ContextMenuButton.TYPE_NAME = TYPE_NAME; ContextMenuButton.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-context-menu-btn" [ngClass]="getStyleClasses()" (click)="onMoreButtonClick($event)"> <div class="icon-img" *ngIf="!isIconURLEmpty()"> <img src="{{getIconURL()}}"> </div> <button type="button" class="fake" (focusin)="_doFocus($event)" (blur)="_doLostFocus($event)"></button> </div> <phx-context-menu [model]="getMenuModel()" [context]="this" class="vertical" [autoFocus]="isAutoFocus()"></phx-context-menu> ` },] }, ]; /** @nocollapse */ ContextMenuButton.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; ContextMenuButton.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 },], "menuFactory": [{ type: Input },], "iconURL": [{ type: Input }, { type: Output },], "styleClasses": [{ type: Input }, { type: Output },], "anchorComponent": [{ type: Input },], "anchorSelector": [{ type: Input },], "menuOffsetTop": [{ type: Input },], "menuOffsetLeft": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ContextMenuButton.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ContextMenuButton.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ContextMenuButton.prototype, "disabled", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "menuFactory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ContextMenuButton.prototype, "anchorComponent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "anchorSelector", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "menuOffsetTop", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ContextMenuButton.prototype, "menuOffsetLeft", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], ContextMenuButton.prototype, "loadEvent", void 0); tslib_1.__decorate([ I18N(), tslib_1.__metadata("design:type", MenuModel) ], ContextMenuButton.prototype, "menuModel", void 0); function ContextMenuButton_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ContextMenuButton.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ContextMenuButton.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ContextMenuButton.propDecorators; /** @type {?} */ ContextMenuButton.TYPE_NAME; /** @type {?} */ ContextMenuButton.prototype.dataParent; /** @type {?} */ ContextMenuButton.prototype.ignoreParentData; /** @type {?} */ ContextMenuButton.prototype.data; /** @type {?} */ ContextMenuButton.prototype.ignoreParentDisabled; /** @type {?} */ ContextMenuButton.prototype.delegateHistory; /** @type {?} */ ContextMenuButton.prototype.onDisabled; /** @type {?} */ ContextMenuButton.prototype.onEnabled; /** @type {?} */ ContextMenuButton.prototype.loadingEnabled; /** @type {?} */ ContextMenuButton.prototype.i18nKey; /** @type {?} */ ContextMenuButton.prototype.bypass; /** @type {?} */ ContextMenuButton.prototype.options; /** @type {?} */ ContextMenuButton.prototype.disabled; /** @type {?} */ ContextMenuButton.prototype.menuFactory; /** @type {?} */ ContextMenuButton.prototype.iconURL; /** @type {?} */ ContextMenuButton.prototype.styleClasses; /** @type {?} */ ContextMenuButton.prototype.anchorComponent; /** @type {?} */ ContextMenuButton.prototype.anchorSelector; /** @type {?} */ ContextMenuButton.prototype.menuOffsetTop; /** @type {?} */ ContextMenuButton.prototype.menuOffsetLeft; /** @type {?} */ ContextMenuButton.prototype.loadEvent; /** @type {?} */ ContextMenuButton.prototype.menuModel; /** @type {?} */ ContextMenuButton.prototype.contextMenu; /** @type {?} */ ContextMenuButton.prototype.needFocusService; /** @type {?} */ ContextMenuButton.prototype.autoFocus; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE1lbnVCdXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0NvbnRleHRNZW51QnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUl2RSx1QkFBTSxTQUFTLEdBQVcsc0JBQXNCLENBQUM7QUFFakQsdUJBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3Qix1QkFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO0FBQ2pDLHVCQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFjakMsTUFBTSx3QkFBeUIsU0FBUSxlQUFlOzs7OztJQWlGcEQsWUFBWSxVQUFzQixFQUFFLGdCQUFrQztRQUNwRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0tBQ3ZCOzs7O0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Ozs7SUFHUCxXQUFXO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdB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QUs7d0JBR0wsS0FBSzt1QkFHTCxLQUFLLFNBQUMsWUFBWTt3QkFHbEIsS0FBSzt5QkFFTCxLQUFLOzRCQUtMLEtBQUs7d0JBS0wsS0FBSyxZQUNMLE1BQU07NkJBRU4sS0FBSyxZQUNMLE1BQU07Z0NBRU4sS0FBSzsrQkFHTCxLQUFLOzhCQUdMLEtBQUs7K0JBR0wsS0FBSzswQkFNTCxNQUFNLFNBQUMsU0FBUzs7O0lBOURoQixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7c0NBQ2EsUUFBUTs7O0lBRTdCLE1BQU0sRUFBRTtzQ0FDWSxRQUFROzs7SUFFNUIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxDQUFDLFlBQVksQ0FBQzs7OztJQUtwQixNQUFNLEVBQUU7Ozs7SUFLUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7Ozs7SUFVUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFNUixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUloQyxJQUFJLEVBQUU7c0NBQ2MsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZW51TW9kZWwgfSBmcm9tICcuL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAnLi9Db250ZXh0TWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4vSUNvbnRleHQnO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4vSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi9JTmVlZEZvY3VzJztcclxuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuL0lNZW51TW9kZWxGYWN0b3J5JztcclxuaW1wb3J0IHsgQWJzdHJhY3RIYXNEYXRhIH0gZnJvbSAnLi9BYnN0cmFjdEhhc0RhdGEnO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1jb250ZXh0LW1lbnUtYnRuXCI7XHJcblxyXG5jb25zdCBUWVBFX1BBUkVOVCA9IFwicGFyZW50XCI7XHJcbmNvbnN0IFRZUEVfQ0hJTERSRU4gPSBcImNoaWxkcmVuXCI7XHJcbmNvbnN0IFRZUEVfRElTVEFOQ0UgPSBcImRpc3RhbmNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWNvbnRleHQtbWVudS1idG5cIiBbbmdDbGFzc109XCJnZXRTdHlsZUNsYXNzZXMoKVwiIChjbGljayk9XCJvbk1vcmVCdXR0b25DbGljaygkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImljb24taW1nXCIgKm5nSWY9XCIhaXNJY29uVVJMRW1wdHkoKVwiPlxyXG4gICAgPGltZyBzcmM9XCJ7e2dldEljb25VUkwoKX19XCI+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmYWtlXCIgKGZvY3VzaW4pPVwiX2RvRm9jdXMoJGV2ZW50KVwiIChibHVyKT1cIl9kb0xvc3RGb2N1cygkZXZlbnQpXCI+PC9idXR0b24+XHJcbjwvZGl2PlxyXG48cGh4LWNvbnRleHQtbWVudSBbbW9kZWxdPVwiZ2V0TWVudU1vZGVsKClcIiBbY29udGV4dF09XCJ0aGlzXCIgY2xhc3M9XCJ2ZXJ0aWNhbFwiIFthdXRvRm9jdXNdPVwiaXNBdXRvRm9jdXMoKVwiPjwvcGh4LWNvbnRleHQtbWVudT5cclxuYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29udGV4dE1lbnVCdXR0b24gZXh0ZW5kcyBBYnN0cmFjdEhhc0RhdGEgaW1wbGVtZW50cyBPbkluaXQsIElDb250ZXh0LCBPbkRlc3Ryb3ksIElOZWVkRm9jdXMge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxyXG4gIEBPcHRpb24oJ2kxOG5CeXBhc3MnKVxyXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvLyAtLS0gZnJvbSBTZWxmXHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeTtcclxuXHJcbiAgQElucHV0KClcclxuICBAT3V0cHV0KClcclxuICBwcml2YXRlIGljb25VUkw6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPdXRwdXQoKVxyXG4gIHByaXZhdGUgc3R5bGVDbGFzc2VzOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByaXZhdGUgYW5jaG9yQ29tcG9uZW50OiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcml2YXRlIGFuY2hvclNlbGVjdG9yOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcml2YXRlIG1lbnVPZmZzZXRUb3A6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByaXZhdGUgbWVudU9mZnNldExlZnQ6IHN0cmluZztcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIC0tLSBmcm9tIFNlbGZcclxuXHJcbiAgQEkxOE4oKVxyXG4gIHByb3RlY3RlZCBtZW51TW9kZWw6IE1lbnVNb2RlbDtcclxuICBwcm90ZWN0ZWQgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xyXG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBhdXRvRm9jdXM6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xyXG5cclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XHJcbiAgICB0aGlzLmF1dG9Gb2N1cyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9IG51bGwgJiYgdHlwZW9mIHRoaXMuY29udGV4dE1lbnUgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuc2V0Q29udGV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUgIT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1lbnVGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1lbnVGYWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLm1lbnVNb2RlbCA9IHRoaXMubWVudUZhY3RvcnkuY3JlYXRlTWVudU1vZGVsKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlY3JlYXRlTWVudU1vZGVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW51TW9kZWwgPSB0aGlzLm1lbnVGYWN0b3J5LmNyZWF0ZU1lbnVNb2RlbCh0aGlzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk1vcmVCdXR0b25DbGljaygkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCkpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICB0aGlzLmhpZGVNZW51KCk7XHJcbiAgICAgICAgfSwgNTApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBhbmNob3JFbDogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFuY2hvckNvbXBvbmVudCAhPT0gbnVsbCAmJiB0aGlzLmFuY2hvckNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBhbmNob3JFbCA9IHRoaXMuYW5jaG9yQ29tcG9uZW50LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYW5jaG9yU2VsZWN0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuYW5jaG9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBsZXQgc2VsZWN0b3I6IGFueSA9ICQodGhpcy5hbmNob3JTZWxlY3Rvcik7XHJcblxyXG4gICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYW5jaG9yRWwgPSBzZWxlY3RvclswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvZmZzZXRUb3A6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbGV0IG9mZnNldExlZnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lbnVPZmZzZXRUb3AgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudU9mZnNldFRvcCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIG9mZnNldFRvcCA9IHRoaXMubWVudU9mZnNldFRvcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWVudU9mZnNldExlZnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudU9mZnNldExlZnQgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICBvZmZzZXRMZWZ0ID0gdGhpcy5tZW51T2Zmc2V0TGVmdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3AgPSAkKGFuY2hvckVsKS5vZmZzZXQoKS50b3AgKyAkKGFuY2hvckVsKS5oZWlnaHQoKSArIG9mZnNldFRvcDsgIFxyXG4gICAgICAgIGxldCBsZWZ0RWxsaXBzaXNCdXR0b24gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0ICsgb2Zmc2V0TGVmdDtcclxuICAgICAgICBsZXQgd2lkdGhFbGxpcHNpc0J1dHRvbiA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm91dGVyV2lkdGgoKTtcclxuICAgICAgICBsZXQgc2V0TGVmdCA9IGxlZnRFbGxpcHNpc0J1dHRvbiArIHdpZHRoRWxsaXBzaXNCdXR0b247ICBcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3dBdCh0b3AsIHNldExlZnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29udGV4dE1lbnUoKTogQ29udGV4dE1lbnUge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q29udGV4dE1lbnUobWVudTogQ29udGV4dE1lbnUpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udGV4dE1lbnUgPSBtZW51O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1lbnVNb2RlbEZhY3RvcnkoKTogSU1lbnVNb2RlbEZhY3Rvcnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVudUZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TWVudU1vZGVsRmFjdG9yeShtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3RvcnkpOiB2b2lkIHtcclxuICAgIHRoaXMubWVudUZhY3RvcnkgPSBtZW51RmFjdG9yeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNZW51TW9kZWwoKTogTWVudU1vZGVsIHtcclxuICAgIHJldHVybiB0aGlzLm1lbnVNb2RlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZlNhdmVEYXRhKGRhdGE6IGFueSk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxmUmVzZXREYXRhKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb1ByZWxvYWQoKTogUHJvbWlzZTxhbnk+IHsgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgIHJlc29sdmUobnVsbCk7ICAgICB9KTsgICB9ICBwdWJsaWMgZG9Mb2FkZWQoKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSWNvblVSTEVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaWNvblVSTCA9PSBudWxsIHx8IHRoaXMuaWNvblVSTCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJY29uVVJMKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uVVJMO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFN0eWxlQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHlsZUNsYXNzZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZU1lbnUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLmNvbnRleHRNZW51LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1Nob3dNZW51KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnUuaXNTaG93KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNBdXRvRm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRvRm9jdXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWRlTWVudSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIF9kb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGRvIHNvbWV0aGluZyB3aGVuIGZvY3VzXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2RvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5lZWRGb2N1c1NlcnZpY2UgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UucmVzZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19