com.phloxui
Version:
PhloxUI Ng2+ Framework
447 lines (446 loc) • 37.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, HostListener, EventEmitter, Output } from '@angular/core';
import { AbstractHasData } from '../../AbstractHasData';
import { CalendarEntryPopoverModel } from '../../model/CalendarEntryPopoverModel';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
import { AbstractDataEditor } from '../AbstractDataEditor';
import { Option } from '../../../decorator/Option.decorator';
import { EventUtils } from '../../../share/utils/EventUtils';
const /** @type {?} */ TYPE_NAME = "phx-calendar-entry-popover";
const /** @type {?} */ LEFT = 'left';
const /** @type {?} */ RIGHT = 'right';
const /** @type {?} */ BELOW = 'below';
const /** @type {?} */ ABOVE = 'above';
const /** @type {?} */ POPOVER_SHOW_EVENT = 'calendarpopovershow';
const /** @type {?} */ POPOVER_HIDE_EVENT = 'calendarpopoverhide';
export class CalendarEntryPopover extends AbstractHasData {
/**
* @param {?} elementRef
* @param {?} needFocusService
*/
constructor(elementRef, needFocusService) {
super(elementRef);
this.needFocusService = needFocusService;
this._show = false;
this.defaultArrowTop = 10;
this.showEvent = new EventEmitter();
this.hideEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
this.showMenu(this._show);
this.compoWrapInstance = null;
// when wrapper finished render
this.componentHandler = (result) => {
let /** @type {?} */ comInstance = null;
if (result !== null && typeof result !== 'undefined') {
comInstance = result.instance;
}
if (this.data !== null && typeof this.data !== 'undefined' && comInstance !== null) {
if (typeof comInstance.setData === 'function') {
comInstance.setData(this.data);
}
}
if (typeof comInstance.setCalendarEntryMapper === 'function') {
comInstance.setCalendarEntryMapper(this.entryMapper);
}
if (typeof comInstance.setEditor === 'function') {
comInstance.setEditor(this.editor);
}
this.compoWrapInstance = comInstance;
};
}
/**
* @param {?} isShow
* @return {?}
*/
showMenu(isShow) {
this._show = isShow;
if (isShow) {
if (this.needFocusService != null) {
this.needFocusService.setFocusingComponent(this);
}
}
}
/**
* @return {?}
*/
_getComponentHandler() {
return this.componentHandler;
}
/**
* @return {?}
*/
isModelEmpty() {
if (this.model === null || typeof this.model === 'undefined') {
return true;
}
return false;
}
/**
* @param {?} top
* @return {?}
*/
setArrowTop(top) {
if (top === null || typeof top === 'undefined') {
return;
}
let /** @type {?} */ contWrapElement = $(this.elementRef.nativeElement).find('.container-wrapper');
if (typeof contWrapElement !== 'undefined') {
if (typeof $(contWrapElement).find('.container-after') !== 'undefined') {
$(contWrapElement).find('.container-after').css("top", top);
}
if (typeof $(contWrapElement).find('.container-before') !== 'undefined') {
$(contWrapElement).find('.container-before').css("top", top - 1);
}
}
}
/**
* @return {?}
*/
show() {
this.showMenu(true);
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(POPOVER_SHOW_EVENT, this, data, null);
this.showEvent.emit(ev);
}
/**
* @return {?}
*/
hide() {
this.showMenu(false);
let /** @type {?} */ data = null;
let /** @type {?} */ ev = EventUtils.newCustomEvent(POPOVER_HIDE_EVENT, this, data, null);
this.hideEvent.emit(ev);
}
/**
* @return {?}
*/
isShow() {
return this._show;
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.setModel === 'function' && this.model !== null) {
this.compoWrapInstance.setModel(this.model.model);
}
}
}
/**
* @param {?} data
* @return {?}
*/
setData(data) {
super.setData(data);
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
this.compoWrapInstance.setData(this.data);
}
}
/**
* @return {?}
*/
getPosition() {
if (this.model !== null && typeof this.model !== 'undefined') {
if (this.model.position !== null && typeof this.model.position !== 'undefined') {
if (LEFT === this.model.position) {
return LEFT;
}
else if (RIGHT === this.model.position) {
return RIGHT;
}
else if (BELOW === this.model.position) {
return BELOW;
}
else if (ABOVE === this.model.position) {
return ABOVE;
}
}
}
// default is left
return LEFT;
}
/**
* @return {?}
*/
getShowEvent() {
return this.showEvent;
}
/**
* @return {?}
*/
getHideEvent() {
return this.hideEvent;
}
/**
* @param {?} event
* @return {?}
*/
setShowEvent(event) {
this.showEvent = event;
}
/**
* @param {?} event
* @return {?}
*/
setHideEvent(event) {
this.hideEvent = event;
}
/**
* @param {?} $event
* @return {?}
*/
onClick($event) {
$event.stopPropagation();
}
/**
* @param {?} event
* @return {?}
*/
onFocus(event) {
}
/**
* @param {?} event
* @return {?}
*/
onLostFocus(event) {
this.hide();
this.setDataParent(null);
}
/**
* @return {?}
*/
isSelfDataDirty() {
return false;
}
/**
* @return {?}
*/
selfSaveData() {
}
/**
* @return {?}
*/
selfResetData() {
}
/**
* @param {?} entryMapper
* @return {?}
*/
setCalendarEntryMapper(entryMapper) {
this.entryMapper = entryMapper;
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.setCalendarEntryMapper === 'function') {
this.compoWrapInstance.setCalendarEntryMapper(this.entryMapper);
}
}
}
/**
* @param {?} editor
* @return {?}
*/
setEditor(editor) {
this.editor = editor;
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.setEditor === 'function') {
this.compoWrapInstance.setEditor(this.editor);
}
}
}
/**
* @return {?}
*/
doPreload() { return new Promise((resolve, reject) => { resolve(null); }); }
/**
* @return {?}
*/
doLoaded() {
}
/**
* @return {?}
*/
getEntryMapper() {
return this.entryMapper;
}
/**
* @param {?} $event
* @return {?}
*/
onPopoverClosed($event) {
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.onPopoverClosed === 'function') {
this.compoWrapInstance.onPopoverClosed($event);
}
}
}
/**
* @param {?} $event
* @return {?}
*/
onAutoSaved($event) {
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.onAutoSaved === 'function') {
this.compoWrapInstance.onAutoSaved($event);
}
}
}
/**
* @return {?}
*/
isAutoSave() {
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.isAutoSave === 'function') {
return this.compoWrapInstance.isAutoSave();
}
}
return false;
}
}
CalendarEntryPopover.TYPE_NAME = TYPE_NAME;
CalendarEntryPopover.LEFT = LEFT;
CalendarEntryPopover.RIGHT = RIGHT;
CalendarEntryPopover.BELOW = BELOW;
CalendarEntryPopover.ABOVE = ABOVE;
CalendarEntryPopover.POPOVER_SHOW_EVENT = POPOVER_SHOW_EVENT;
CalendarEntryPopover.POPOVER_HIDE_EVENT = POPOVER_HIDE_EVENT;
CalendarEntryPopover.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-calendar-entry-popover" [class.show]="isShow()" [class.left]="getPosition() === 'left'" [class.right]="getPosition() === 'right'"
[class.above]="getPosition() === 'above'" [class.below]="getPosition() === 'below'">
<div class="container-wrapper">
<div class="container">
<div class="wrapper">
<div class="top-bg"></div>
<div class="content-wrapper">
<div class="content">
<phx-component-wrapper *ngIf="!isModelEmpty()" [type]="getModel().type" [data]="getData()" [handler]="_getComponentHandler()" [dataParent]="this" [model]="getModel().model"></phx-component-wrapper>
</div>
</div>
</div>
</div>
<div class="container-before"></div>
<div class="container-after"></div>
</div>
</div>
`
},] },
];
/** @nocollapse */
CalendarEntryPopover.ctorParameters = () => [
{ type: ElementRef, },
{ type: NeedFocusService, },
];
CalendarEntryPopover.propDecorators = {
"dataParent": [{ type: Input },],
"ignoreParentData": [{ 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 },],
"model": [{ type: Input },],
"data": [{ type: Input },],
"entryMapper": [{ type: Input },],
"editor": [{ type: Input },],
"showEvent": [{ type: Output, args: ['phxShow',] },],
"hideEvent": [{ type: Output, args: ['phxHide',] },],
"onClick": [{ type: HostListener, args: ['click', ['$event'],] },],
};
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], CalendarEntryPopover.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], CalendarEntryPopover.prototype, "hideEvent", void 0);
function CalendarEntryPopover_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
CalendarEntryPopover.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
CalendarEntryPopover.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
CalendarEntryPopover.propDecorators;
/** @type {?} */
CalendarEntryPopover.TYPE_NAME;
/** @type {?} */
CalendarEntryPopover.LEFT;
/** @type {?} */
CalendarEntryPopover.RIGHT;
/** @type {?} */
CalendarEntryPopover.BELOW;
/** @type {?} */
CalendarEntryPopover.ABOVE;
/** @type {?} */
CalendarEntryPopover.POPOVER_SHOW_EVENT;
/** @type {?} */
CalendarEntryPopover.POPOVER_HIDE_EVENT;
/** @type {?} */
CalendarEntryPopover.prototype.dataParent;
/** @type {?} */
CalendarEntryPopover.prototype.ignoreParentData;
/** @type {?} */
CalendarEntryPopover.prototype.ignoreParentDisabled;
/** @type {?} */
CalendarEntryPopover.prototype.delegateHistory;
/** @type {?} */
CalendarEntryPopover.prototype.onDisabled;
/** @type {?} */
CalendarEntryPopover.prototype.onEnabled;
/** @type {?} */
CalendarEntryPopover.prototype.loadingEnabled;
/** @type {?} */
CalendarEntryPopover.prototype.i18nKey;
/** @type {?} */
CalendarEntryPopover.prototype.bypass;
/** @type {?} */
CalendarEntryPopover.prototype.options;
/** @type {?} */
CalendarEntryPopover.prototype.model;
/** @type {?} */
CalendarEntryPopover.prototype.data;
/** @type {?} */
CalendarEntryPopover.prototype.entryMapper;
/** @type {?} */
CalendarEntryPopover.prototype.editor;
/** @type {?} */
CalendarEntryPopover.prototype._show;
/** @type {?} */
CalendarEntryPopover.prototype.componentHandler;
/** @type {?} */
CalendarEntryPopover.prototype.compoWrapInstance;
/** @type {?} */
CalendarEntryPopover.prototype.defaultArrowTop;
/** @type {?} */
CalendarEntryPopover.prototype.needFocusService;
/** @type {?} */
CalendarEntryPopover.prototype.showEvent;
/** @type {?} */
CalendarEntryPopover.prototype.hideEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsZW5kYXJFbnRyeVBvcG92ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9jYWxlbmRhci5pbnRlcm5hbC9DYWxlbmRhckVudHJ5UG9wb3Zlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFtQixZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV4RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUdsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSzdELHVCQUFNLFNBQVMsR0FBVyw0QkFBNEIsQ0FBQztBQUV2RCx1QkFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQzVCLHVCQUFNLEtBQUssR0FBVyxPQUFPLENBQUM7QUFDOUIsdUJBQU0sS0FBSyxHQUFXLE9BQU8sQ0FBQztBQUM5Qix1QkFBTSxLQUFLLEdBQVcsT0FBTyxDQUFDO0FBQzlCLHVCQUFNLGtCQUFrQixHQUFXLHFCQUFxQixDQUFDO0FBQ3pELHVCQUFNLGtCQUFrQixHQUFXLHFCQUFxQixDQUFDO0FBeUJ6RCxNQUFNLDJCQUE0QixTQUFRLGVBQWU7Ozs7O0lBbUR2RCxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENB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LEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUJYO2FBQ0E7Ozs7WUE5QzJCLFVBQVU7WUFNN0IsZ0JBQWdCOzs7MkJBb0R0QixLQUFLO2lDQUVMLEtBQUs7cUNBRUwsS0FBSztnQ0FFTCxLQUFLOzJCQUVMLEtBQUs7MEJBRUwsS0FBSzsrQkFFTCxLQUFLO3dCQUVMLEtBQUs7dUJBRUwsS0FBSyxTQUFDLFlBQVk7d0JBRWxCLEtBQUs7c0JBRUwsS0FBSztxQkFFTCxLQUFLOzRCQUVMLEtBQUs7dUJBRUwsS0FBSzswQkFRTCxNQUFNLFNBQUMsU0FBUzswQkFHaEIsTUFBTSxTQUFDLFNBQVM7d0JBd0poQixZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDOzs7SUE1SmhDLE1BQU0sQ0FBQyxNQUFNLENBQUM7c0NBRUksWUFBWTs7O0lBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUM7c0NBRUksWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgSG9zdExpc3RlbmVyLCBUeXBlLCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGEgfSBmcm9tICcuLi8uLi9BYnN0cmFjdEhhc0RhdGEnO1xuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi4vLi4vSUhhc01vZGVsJztcbmltcG9ydCB7IENhbGVuZGFyRW50cnlQb3BvdmVyTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9DYWxlbmRhckVudHJ5UG9wb3Zlck1vZGVsJztcbmltcG9ydCB7IElDYWxlbmRhckVudHJ5TWFwcGVyIH0gZnJvbSAnLi4vSUNhbGVuZGFyRW50cnlNYXBwZXInO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IElDYWxlbmRhckVudHJ5UG9wb3ZlckNvbnRlbnQgfSBmcm9tICcuLi9JQ2FsZW5kYXJFbnRyeVBvcG92ZXJDb250ZW50JztcbmltcG9ydCB7IEFic3RyYWN0RGF0YUVkaXRvciB9IGZyb20gJy4uL0Fic3RyYWN0RGF0YUVkaXRvcic7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL0lIYXNEYXRhJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LWNhbGVuZGFyLWVudHJ5LXBvcG92ZXJcIjtcblxuY29uc3QgTEVGVDogc3RyaW5nID0gJ2xlZnQnO1xuY29uc3QgUklHSFQ6IHN0cmluZyA9ICdyaWdodCc7XG5jb25zdCBCRUxPVzogc3RyaW5nID0gJ2JlbG93JztcbmNvbnN0IEFCT1ZFOiBzdHJpbmcgPSAnYWJvdmUnO1xuY29uc3QgUE9QT1ZFUl9TSE9XX0VWRU5UOiBzdHJpbmcgPSAnY2FsZW5kYXJwb3BvdmVyc2hvdyc7XG5jb25zdCBQT1BPVkVSX0hJREVfRVZFTlQ6IHN0cmluZyA9ICdjYWxlbmRhcnBvcG92ZXJoaWRlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LWNhbGVuZGFyLWVudHJ5LXBvcG92ZXJcIiBbY2xhc3Muc2hvd109XCJpc1Nob3coKVwiIFtjbGFzcy5sZWZ0XT1cImdldFBvc2l0aW9uKCkgPT09ICdsZWZ0J1wiIFtjbGFzcy5yaWdodF09XCJnZXRQb3NpdGlvbigpID09PSAncmlnaHQnXCJcblx0W2NsYXNzLmFib3ZlXT1cImdldFBvc2l0aW9uKCkgPT09ICdhYm92ZSdcIiBbY2xhc3MuYmVsb3ddPVwiZ2V0UG9zaXRpb24oKSA9PT0gJ2JlbG93J1wiPlxuXHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyLXdyYXBwZXJcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwidG9wLWJnXCI+PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbnRlbnQtd3JhcHBlclwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciAqbmdJZj1cIiFpc01vZGVsRW1wdHkoKVwiIFt0eXBlXT1cImdldE1vZGVsKCkudHlwZVwiIFtkYXRhXT1cImdldERhdGEoKVwiIFtoYW5kbGVyXT1cIl9nZXRDb21wb25lbnRIYW5kbGVyKClcIiBbZGF0YVBhcmVudF09XCJ0aGlzXCIgW21vZGVsXT1cImdldE1vZGVsKCkubW9kZWxcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJjb250YWluZXItYmVmb3JlXCI+PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImNvbnRhaW5lci1hZnRlclwiPjwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckVudHJ5UG9wb3ZlciBleHRlbmRzIEFic3RyYWN0SGFzRGF0YSBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJTmVlZEZvY3VzLCBJQ2FsZW5kYXJFbnRyeVBvcG92ZXJDb250ZW50IHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEVGVDogc3RyaW5nID0gTEVGVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSSUdIVDogc3RyaW5nID0gUklHSFQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQkVMT1c6IHN0cmluZyA9IEJFTE9XO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFCT1ZFOiBzdHJpbmcgPSBBQk9WRTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQT1BPVkVSX1NIT1dfRVZFTlQ6IHN0cmluZyA9IFBPUE9WRVJfU0hPV19FVkVOVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQT1BPVkVSX0hJREVfRVZFTlQ6IHN0cmluZyA9IFBPUE9WRVJfSElERV9FVkVOVDtcblxuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcbiAgQElucHV0KCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBtb2RlbDogQ2FsZW5kYXJFbnRyeVBvcG92ZXJNb2RlbDtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBlbnRyeU1hcHBlcjogSUNhbGVuZGFyRW50cnlNYXBwZXI7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZWRpdG9yOiBBYnN0cmFjdERhdGFFZGl0b3I7XG4gIHByaXZhdGUgX3Nob3c6IGJvb2xlYW47XG4gIHByaXZhdGUgY29tcG9uZW50SGFuZGxlcjogRnVuY3Rpb247XG4gIHByaXZhdGUgY29tcG9XcmFwSW5zdGFuY2U6IGFueTtcbiAgcHJpdmF0ZSBkZWZhdWx0QXJyb3dUb3A6IG51bWJlcjtcbiAgcHJpdmF0ZSBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICBAT3B0aW9uKCdzaG93JylcbiAgQE91dHB1dCgncGh4U2hvdycpXG4gIHByaXZhdGUgc2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignaGlkZScpXG4gIEBPdXRwdXQoJ3BoeEhpZGUnKVxuICBwcml2YXRlIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XG4gICAgdGhpcy5fc2hvdyA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdEFycm93VG9wID0gMTA7XG4gICAgdGhpcy5zaG93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5oaWRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLnNob3dNZW51KHRoaXMuX3Nob3cpO1xuICAgIHRoaXMuY29tcG9XcmFwSW5zdGFuY2UgPSBudWxsO1xuXG4gICAgLy8gd2hlbiB3cmFwcGVyIGZpbmlzaGVkIHJlbmRlclxuICAgIHRoaXMuY29tcG9uZW50SGFuZGxlciA9IChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgbGV0IGNvbUluc3RhbmNlID0gbnVsbDtcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29tSW5zdGFuY2UgPSByZXN1bHQuaW5zdGFuY2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tSW5zdGFuY2Uuc2V0RGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbUluc3RhbmNlLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb21JbnN0YW5jZS5zZXRDYWxlbmRhckVudHJ5TWFwcGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbUluc3RhbmNlLnNldENhbGVuZGFyRW50cnlNYXBwZXIodGhpcy5lbnRyeU1hcHBlcik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNvbUluc3RhbmNlLnNldEVkaXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb21JbnN0YW5jZS5zZXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSA9IGNvbUluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNob3dNZW51KGlzU2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3Nob3cgPSBpc1Nob3c7XG5cbiAgICBpZiAoaXNTaG93KSB7XG4gICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBfZ2V0Q29tcG9uZW50SGFuZGxlcigpOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBpc01vZGVsRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubW9kZWwgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMubW9kZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2V0QXJyb3dUb3AodG9wOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodG9wID09PSBudWxsIHx8IHR5cGVvZiB0b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvbnRXcmFwRWxlbWVudCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5jb250YWluZXItd3JhcHBlcicpO1xuICAgIGlmICh0eXBlb2YgY29udFdyYXBFbGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiAkKGNvbnRXcmFwRWxlbWVudCkuZmluZCgnLmNvbnRhaW5lci1hZnRlcicpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAkKGNvbnRXcmFwRWxlbWVudCkuZmluZCgnLmNvbnRhaW5lci1hZnRlcicpLmNzcyhcInRvcFwiLCB0b3ApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiAkKGNvbnRXcmFwRWxlbWVudCkuZmluZCgnLmNvbnRhaW5lci1iZWZvcmUnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJChjb250V3JhcEVsZW1lbnQpLmZpbmQoJy5jb250YWluZXItYmVmb3JlJykuY3NzKFwidG9wXCIsIHRvcCAtIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01lbnUodHJ1ZSk7XG5cbiAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFBPUE9WRVJfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICB0aGlzLnNob3dFdmVudC5lbWl0KGV2KTtcbiAgfVxuXG4gIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01lbnUoZmFsc2UpO1xuXG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChQT1BPVkVSX0hJREVfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgdGhpcy5oaWRlRXZlbnQuZW1pdChldik7XG4gIH1cblxuICBwdWJsaWMgaXNTaG93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93O1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5zZXRNb2RlbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLm1vZGVsICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29tcG9XcmFwSW5zdGFuY2Uuc2V0TW9kZWwodGhpcy5tb2RlbC5tb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERhdGEoZGF0YTogYW55KTogdm9pZCB7XG4gICAgc3VwZXIuc2V0RGF0YShkYXRhKTtcbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29tcG9XcmFwSW5zdGFuY2Uuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRQb3NpdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRoaXMubW9kZWwucG9zaXRpb24gIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwucG9zaXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChMRUZUID09PSB0aGlzLm1vZGVsLnBvc2l0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIExFRlQ7XG4gICAgICAgIH0gZWxzZSBpZiAoUklHSFQgPT09IHRoaXMubW9kZWwucG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gUklHSFQ7XG4gICAgICAgIH0gZWxzZSBpZiAoQkVMT1cgPT09IHRoaXMubW9kZWwucG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gQkVMT1c7XG4gICAgICAgIH0gZWxzZSBpZiAoQUJPVkUgPT09IHRoaXMubW9kZWwucG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gQUJPVkU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZGVmYXVsdCBpcyBsZWZ0XG4gICAgcmV0dXJuIExFRlQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0SGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIG9uTG9zdEZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnNldERhdGFQYXJlbnQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgaXNTZWxmRGF0YURpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxmU2F2ZURhdGEoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBzZWxmUmVzZXREYXRhKCk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgc2V0Q2FsZW5kYXJFbnRyeU1hcHBlcihlbnRyeU1hcHBlcjogSUNhbGVuZGFyRW50cnlNYXBwZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVudHJ5TWFwcGVyID0gZW50cnlNYXBwZXI7XG5cbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5zZXRDYWxlbmRhckVudHJ5TWFwcGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuY29tcG9XcmFwSW5zdGFuY2Uuc2V0Q2FsZW5kYXJFbnRyeU1hcHBlcih0aGlzLmVudHJ5TWFwcGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0RWRpdG9yKGVkaXRvcjogQWJzdHJhY3REYXRhRWRpdG9yKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG5cbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5zZXRFZGl0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5zZXRFZGl0b3IodGhpcy5lZGl0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb1ByZWxvYWQoKTogUHJvbWlzZTxhbnk+IHsgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgIHJlc29sdmUobnVsbCk7ICAgICB9KTsgICB9ICBwdWJsaWMgZG9Mb2FkZWQoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRFbnRyeU1hcHBlcigpOiBJQ2FsZW5kYXJFbnRyeU1hcHBlciB7XG4gICAgcmV0dXJuIHRoaXMuZW50cnlNYXBwZXI7XG4gIH1cblxuICBwdWJsaWMgb25Qb3BvdmVyQ2xvc2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5vblBvcG92ZXJDbG9zZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5vblBvcG92ZXJDbG9zZWQoJGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25BdXRvU2F2ZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvV3JhcEluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvV3JhcEluc3RhbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvV3JhcEluc3RhbmNlLm9uQXV0b1NhdmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuY29tcG9XcmFwSW5zdGFuY2Uub25BdXRvU2F2ZWQoJGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNBdXRvU2F2ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5pc0F1dG9TYXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvV3JhcEluc3RhbmNlLmlzQXV0b1NhdmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgXHRyZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==