com.phloxui
Version:
PhloxUI Ng2+ Framework
722 lines (721 loc) • 55 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractSelectItems } from './AbstractSelectItems';
import { Option } from '../../../decorator/Option.decorator';
import { BEFORE_SHOW_EVENT, SHOW_EVENT, BEFORE_HIDE_EVENT, HIDE_EVENT, BEFORE_CLICK_EVENT, CLICK_EVENT } from '../../../share/CustomEventType';
import { EventUtils } from '../../../share/utils/EventUtils';
var /** @type {?} */ LEFT = "left";
var /** @type {?} */ RIGHT = "right";
var /** @type {?} */ CENTER = "center";
/**
* @abstract
*/
var AbstractMultiDropdown = /** @class */ (function (_super) {
tslib_1.__extends(AbstractMultiDropdown, _super);
function AbstractMultiDropdown(needFocusService, elementRef, phloxAppInfoService) {
var _this = _super.call(this, elementRef, needFocusService) || this;
_this.beforeClickEvent = new EventEmitter();
_this.clickEvent = new EventEmitter();
_this.beforeShowEvent = new EventEmitter();
_this.showEvent = new EventEmitter();
_this.beforeHideEvent = new EventEmitter();
_this.hideEvent = new EventEmitter();
_this.selectEvent = new EventEmitter();
_this._isItemClick = false;
phloxAppInfoService.getAppInfo().then(function (info) {
_this.phloxAppInfo = info;
});
return _this;
}
Object.defineProperty(AbstractMultiDropdown.prototype, "align", {
get: /**
* @return {?}
*/
function () {
if (this._align === null || typeof this._align === 'undefined') {
return LEFT;
}
return this._align;
},
set: /**
* @param {?} align
* @return {?}
*/
function (align) {
if (align === LEFT || align === RIGHT || align === CENTER) {
this._align = align;
return;
}
this._align = null;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.ngOnInit = /**
* @return {?}
*/
function () {
_super.prototype.ngOnInit.call(this);
};
/**
* @param {?} changes
* @return {?}
*/
AbstractMultiDropdown.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
// fix bug when set selected before item is not loaded
if (changes['items'] !== null && typeof changes['items'] !== 'undefined') {
var /** @type {?} */ oldType = changes['items'].previousValue;
var /** @type {?} */ newType = changes['items'].currentValue;
var /** @type {?} */ oldSize = (oldType !== null && typeof oldType !== 'undefined' && Array.isArray(oldType)) ? oldType.length : 0;
var /** @type {?} */ newSize = (newType !== null && typeof newType !== 'undefined' && Array.isArray(newType)) ? newType.length : 0;
if (oldSize !== newSize) {
if (this.dataParent !== null && this.dataParent !== undefined) {
// fix bug setData but still has a bug this.comp.setData() in ngOnInit
setTimeout(function () {
_this.loadedItems();
}, 1);
}
else {
this.loadedItems();
}
}
}
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.scrollToSelectedIndex = /**
* @return {?}
*/
function () {
var /** @type {?} */ ele = $(this.elementRef.nativeElement).find('.menu');
var /** @type {?} */ hChild = $(this.elementRef.nativeElement).find('.menu > :eq(0)').outerHeight();
var /** @type {?} */ firstIndex = this.getSelectedIndexes().length > 0 ? this.getSelectedIndexes()[0] : 0;
var /** @type {?} */ h = hChild * (firstIndex == 0 ? 0 : firstIndex - 1);
if (!(ele.scrollTop() >= (h - ele.height() + hChild + hChild) && ele.scrollTop() <= (h + hChild))) {
ele.stop().animate({ scrollTop: h }, 1, 'swing', function () {
ele.css({
transition: "all 60ms cubic-bezier(0.175, 0.885, 0.32, 1.275)"
});
ele.scrollTop(h);
});
}
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.emitBeforeClickEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItems();
var /** @type {?} */ sIndex = this.getSelectedIndexes();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
this.beforeClickEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.emitClickEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItems();
var /** @type {?} */ sIndex = this.getSelectedIndexes();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
this.clickEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.emitBeforeShowEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItems();
var /** @type {?} */ sIndex = this.getSelectedIndexes();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_SHOW_EVENT, this, data, $event);
this.beforeShowEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.emitShowEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItems();
var /** @type {?} */ sIndex = this.getSelectedIndexes();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(SHOW_EVENT, this, data, $event);
this.showEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.emitBeforeHideEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItems();
var /** @type {?} */ sIndex = this.getSelectedIndexes();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_HIDE_EVENT, this, data, $event);
this.beforeHideEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.emitHideEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItems();
var /** @type {?} */ sIndex = this.getSelectedIndexes();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(HIDE_EVENT, this, data, $event);
this.hideEvent.emit(ev);
};
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractMultiDropdown.prototype.doShow = /**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.show = true;
_this.scrollToSelectedIndex();
if (_this.needFocusService) {
_this.needFocusService.setFocusingComponent(_this, $event);
}
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeShowEvent($event);
}, function ($event, result) {
// emitAfterEvent
// emitAfterEvent
_this.emitShowEvent($event);
}, function ($event) {
// doPrevented
});
};
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractMultiDropdown.prototype.doHide = /**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.show = false;
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeHideEvent($event);
}, function ($event, result) {
// emitAfterEvent
// emitAfterEvent
_this.emitHideEvent($event);
}, function ($event) {
// doPrevented
});
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getUIUpdateInterval = /**
* @return {?}
*/
function () {
if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) {
return 600;
}
if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) {
return 600;
}
if (this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === null || this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === undefined) {
return 600;
}
return this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL;
};
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractMultiDropdown.prototype.click = /**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (this.isReadOnly()) {
return;
}
if (this.isDisabled()) {
return;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.setShow(true);
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeClickEvent($event);
}, function ($event, result) {
// emitAfterEvent
// emitAfterEvent
_this.emitClickEvent($event);
}, function ($event) {
// doPrevented
});
};
/**
* @param {?} $event
* @param {?} index
* @return {?}
*/
AbstractMultiDropdown.prototype.onSelectItemClicked = /**
* @param {?} $event
* @param {?} index
* @return {?}
*/
function ($event, index) {
this._isItemClick = true;
var /** @type {?} */ oldIndexes = this.getSelectedIndexes();
var /** @type {?} */ item = this.getItemAtIndex(index);
var /** @type {?} */ oldDatas = [];
var /** @type {?} */ newDatas = [];
if (oldIndexes !== null && oldIndexes !== undefined) {
try {
for (var oldIndexes_1 = tslib_1.__values(oldIndexes), oldIndexes_1_1 = oldIndexes_1.next(); !oldIndexes_1_1.done; oldIndexes_1_1 = oldIndexes_1.next()) {
var oldIndex = oldIndexes_1_1.value;
oldDatas.push(this.getItemAtIndex(oldIndex));
newDatas.push(this.getItemAtIndex(oldIndex));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (oldIndexes_1_1 && !oldIndexes_1_1.done && (_a = oldIndexes_1.return)) _a.call(oldIndexes_1);
}
finally { if (e_1) throw e_1.error; }
}
}
if (oldDatas.indexOf(item) === -1) {
newDatas.push(item);
}
else {
newDatas.splice(oldDatas.indexOf(item), 1);
}
this.setSelectedItems(newDatas);
var e_1, _a;
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.doFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.doLostFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.setShow(false);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.onFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.setFocusingComponent(this, $event);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.onLostFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
if ($event !== undefined && $event !== null) {
$event.preventDefault();
}
if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') {
clearTimeout(this._itemLostFocusingTimeout);
this._itemLostFocusingTimeout = null;
}
this._itemLostFocusingTimeout = setTimeout(function () {
if (!_this._isItemClick) {
_this.doBlur($event);
_this.needFocusService.resetFocusingComponent($event);
}
else {
_this.doFocus($event);
}
_this._isItemClick = false;
}, 20); // if dropdown not hide try to adjust this value
};
/**
* @param {?} show
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractMultiDropdown.prototype.setShow = /**
* @param {?} show
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function (show, $event, fireEvent) {
if (show === null || typeof show !== 'boolean') {
show = false;
}
if (this.show === show) {
return;
}
if (show) {
this.doShow($event, fireEvent);
}
else {
this.doHide($event, fireEvent);
}
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.isShow = /**
* @return {?}
*/
function () {
return this.show;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getAlign = /**
* @return {?}
*/
function () {
return this.align;
};
/**
* @param {?} align
* @return {?}
*/
AbstractMultiDropdown.prototype.setAlign = /**
* @param {?} align
* @return {?}
*/
function (align) {
this.align = align;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getDropdownWidth = /**
* @return {?}
*/
function () {
return this.dropdownWidth;
};
/**
* @param {?} dropdownWidth
* @return {?}
*/
AbstractMultiDropdown.prototype.setDropdownWidth = /**
* @param {?} dropdownWidth
* @return {?}
*/
function (dropdownWidth) {
this.dropdownWidth = dropdownWidth;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getDropdownHeight = /**
* @return {?}
*/
function () {
return this.dropdownHeight;
};
/**
* @param {?} dropdownHeight
* @return {?}
*/
AbstractMultiDropdown.prototype.setDropdownHeight = /**
* @param {?} dropdownHeight
* @return {?}
*/
function (dropdownHeight) {
this.dropdownHeight = dropdownHeight;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getClickEvent = /**
* @return {?}
*/
function () {
return this.clickEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractMultiDropdown.prototype.setClickEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.clickEvent = event;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getBeforeClickEvent = /**
* @return {?}
*/
function () {
return this.beforeClickEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractMultiDropdown.prototype.setBeforeClickEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeClickEvent = event;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getShowEvent = /**
* @return {?}
*/
function () {
return this.showEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractMultiDropdown.prototype.setShowEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.showEvent = event;
};
/**
* @return {?}
*/
AbstractMultiDropdown.prototype.getSelectEvent = /**
* @return {?}
*/
function () {
return this.selectEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractMultiDropdown.prototype.setSelectEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.selectEvent = event;
};
/**
* @param {?} data
* @return {?}
*/
AbstractMultiDropdown.prototype.setData = /**
* @param {?} data
* @return {?}
*/
function (data) {
_super.prototype.setData.call(this, data);
this.setPreloadData(data);
};
AbstractMultiDropdown.LEFT = LEFT;
AbstractMultiDropdown.RIGHT = RIGHT;
AbstractMultiDropdown.CENTER = CENTER;
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeShow'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "beforeShowEvent", void 0);
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('beforeHide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "beforeHideEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "hideEvent", void 0);
tslib_1.__decorate([
Option('select'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "selectEvent", void 0);
return AbstractMultiDropdown;
}(AbstractSelectItems));
export { AbstractMultiDropdown };
function AbstractMultiDropdown_tsickle_Closure_declarations() {
/** @type {?} */
AbstractMultiDropdown.LEFT;
/** @type {?} */
AbstractMultiDropdown.RIGHT;
/** @type {?} */
AbstractMultiDropdown.CENTER;
/** @type {?} */
AbstractMultiDropdown.prototype.needFocusService;
/** @type {?} */
AbstractMultiDropdown.prototype.data;
/** @type {?} */
AbstractMultiDropdown.prototype.dataParent;
/** @type {?} */
AbstractMultiDropdown.prototype.items;
/** @type {?} */
AbstractMultiDropdown.prototype.dataComparator;
/** @type {?} */
AbstractMultiDropdown.prototype.field;
/** @type {?} */
AbstractMultiDropdown.prototype.beforeClickEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.clickEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.beforeShowEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.showEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.beforeHideEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.hideEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.selectEvent;
/** @type {?} */
AbstractMultiDropdown.prototype._align;
/** @type {?} */
AbstractMultiDropdown.prototype.dropdownWidth;
/** @type {?} */
AbstractMultiDropdown.prototype.dropdownHeight;
/** @type {?} */
AbstractMultiDropdown.prototype.phloxAppInfo;
/** @type {?} */
AbstractMultiDropdown.prototype._isItemClick;
/** @type {?} */
AbstractMultiDropdown.prototype._itemLostFocusingTimeout;
/** @type {?} */
AbstractMultiDropdown.prototype.show;
/**
* @abstract
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.doBlur = function ($event) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNdWx0aURyb3Bkb3duLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L0Fic3RyYWN0TXVsdGlEcm9wZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBc0QsWUFBWSxFQUF3QixNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFN0QsT0FBTyxFQUNMLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUU5RixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCxxQkFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQzVCLHFCQUFNLEtBQUssR0FBVyxPQUFPLENBQUM7QUFDOUIscUJBQU0sTUFBTSxHQUFXLFFBQVEsQ0FBQzs7Ozs7SUFFb0IsaURBQW1CO0lBa0RyRSwrQkFBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLG1CQUF3QztRQUFoSCxZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxTQWVwQztRQWJDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsS0FBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLEtBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxLQUFJLENBQUMsU0FB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QUM7UUFFcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7aUNBaGFVLElBQUk7a0NBQ0gsS0FBSzttQ0FDSixNQUFNOztRQVE3QyxNQUFNLENBQUMsYUFBYSxDQUFDOzBDQUNNLFlBQVk7OztRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDOzBDQUNNLFlBQVk7OztRQUNqQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDOzBDQUNNLFlBQVk7O2dDQTVDckM7RUFtQm9ELG1CQUFtQjtTQUFqRCxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgVHlwZSwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFNlbGVjdEl0ZW1zIH0gZnJvbSAnLi9BYnN0cmFjdFNlbGVjdEl0ZW1zJztcclxuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL0lIYXNEYXRhJztcclxuaW1wb3J0IHsgSURhdGFDb21wYXJhdG9yIH0gZnJvbSAnLi4vLi4vSURhdGFDb21wYXJhdG9yJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSwgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2Uvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XHJcbmltcG9ydCB7XHJcbiAgQkVGT1JFX1NIT1dfRVZFTlQsIFNIT1dfRVZFTlQsIEJFRk9SRV9ISURFX0VWRU5ULCBISURFX0VWRU5ULCBCRUZPUkVfQ0xJQ0tfRVZFTlQsIENMSUNLX0VWRU5ULFxyXG4gIEJFRk9SRV9TRUxFQ1RfRVZFTlQsIFNFTEVDVF9FVkVOVFxyXG59IGZyb20gJy4uLy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcclxuXHJcbmNvbnN0IExFRlQ6IHN0cmluZyA9IFwibGVmdFwiO1xyXG5jb25zdCBSSUdIVDogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5jb25zdCBDRU5URVI6IHN0cmluZyA9IFwiY2VudGVyXCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNdWx0aURyb3Bkb3duIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RJdGVtcyBpbXBsZW1lbnRzIE9uSW5pdCwgSU5lZWRGb2N1cywgT25DaGFuZ2VzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMRUZUOiBzdHJpbmcgPSBMRUZUO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUklHSFQ6IHN0cmluZyA9IFJJR0hUO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0VOVEVSOiBzdHJpbmcgPSBDRU5URVI7XHJcblxyXG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIHByb3RlY3RlZCBpdGVtczogRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbFtdO1xyXG4gIHByb3RlY3RlZCBkYXRhQ29tcGFyYXRvcjogSURhdGFDb21wYXJhdG9yPGFueT47XHJcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XHJcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3B0aW9uKCdjbGljaycpXHJcbiAgcHJvdGVjdGVkIGNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2JlZm9yZVNob3cnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3Nob3cnKVxyXG4gIHByb3RlY3RlZCBzaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVIaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2hpZGUnKVxyXG4gIHByb3RlY3RlZCBoaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ3NlbGVjdCcpXHJcbiAgcHJvdGVjdGVkIHNlbGVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBwcm90ZWN0ZWQgX2FsaWduOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGRyb3Bkb3duV2lkdGg6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgZHJvcGRvd25IZWlnaHQ6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XHJcbiAgcHJvdGVjdGVkIF9pc0l0ZW1DbGljazogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0OiBhbnk7XHJcblxyXG4gIHByaXZhdGUgc2hvdzogYm9vbGVhbjtcclxuXHJcbiAgcHJvdGVjdGVkIHNldCBhbGlnbihhbGlnbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoYWxpZ24gPT09IExFRlQgfHwgYWxpZ24gPT09IFJJR0hUIHx8IGFsaWduID09PSBDRU5URVIpIHtcclxuICAgICAgdGhpcy5fYWxpZ24gPSBhbGlnbjtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYWxpZ24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBhbGlnbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2FsaWduID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLl9hbGlnbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuIExFRlQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fYWxpZ247XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwaGxveEFwcEluZm9TZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlKTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmJlZm9yZVNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuc2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuc2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgdGhpcy5faXNJdGVtQ2xpY2sgPSBmYWxzZTtcclxuXHJcbiAgICBwaGxveEFwcEluZm9TZXJ2aWNlLmdldEFwcEluZm8oKS50aGVuKChpbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMucGhsb3hBcHBJbmZvID0gaW5mbztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpIHtcclxuICAgIC8vIGZpeCBidWcgd2hlbiBzZXQgc2VsZWN0ZWQgYmVmb3JlIGl0ZW0gaXMgbm90IGxvYWRlZFxyXG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gIT09IG51bGwgJiYgdHlwZW9mIGNoYW5nZXNbJ2l0ZW1zJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGxldCBvbGRUeXBlID0gY2hhbmdlc1snaXRlbXMnXS5wcmV2aW91c1ZhbHVlO1xyXG4gICAgICBsZXQgbmV3VHlwZTogYW55ID0gY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWU7XHJcblxyXG4gICAgICBsZXQgb2xkU2l6ZSA9IChvbGRUeXBlICE9PSBudWxsICYmIHR5cGVvZiBvbGRUeXBlICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KG9sZFR5cGUpKSA/IG9sZFR5cGUubGVuZ3RoIDogMDtcclxuICAgICAgbGV0IG5ld1NpemUgPSAobmV3VHlwZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmV3VHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShuZXdUeXBlKSkgPyBuZXdUeXBlLmxlbmd0aCA6IDA7XHJcblxyXG4gICAgICBpZiAob2xkU2l6ZSAhPT0gbmV3U2l6ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFQYXJlbnQgIT09IG51bGwgJiYgdGhpcy5kYXRhUGFyZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIC8vIGZpeCBidWcgc2V0RGF0YSBidXQgc3RpbGwgaGFzIGEgYnVnIHRoaXMuY29tcC5zZXREYXRhKCkgaW4gbmdPbkluaXRcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XHJcbiAgICAgICAgICB9LCAxKTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxUb1NlbGVjdGVkSW5kZXgoKTogdm9pZCB7XHJcbiAgICBsZXQgZWxlID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLm1lbnUnKTtcclxuICAgIGxldCBoQ2hpbGQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcubWVudSA+IDplcSgwKScpLm91dGVySGVpZ2h0KCk7XHJcblxyXG4gICAgbGV0IGZpcnN0SW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCkubGVuZ3RoID4gMCA/IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKClbMF0gOiAwO1xyXG4gICAgbGV0IGggPSBoQ2hpbGQgKiAoZmlyc3RJbmRleCA9PSAwID8gMCA6IGZpcnN0SW5kZXggLSAxKTtcclxuXHJcbiAgICBpZiAoIShlbGUuc2Nyb2xsVG9wKCkgPj0gKGggLSBlbGUuaGVpZ2h0KCkgKyBoQ2hpbGQgKyBoQ2hpbGQpICYmIGVsZS5zY3JvbGxUb3AoKSA8PSAoaCArIGhDaGlsZCkpKSB7XHJcbiAgICAgIGVsZS5zdG9wKCkuYW5pbWF0ZSh7IHNjcm9sbFRvcDogaCB9LCAxLCAnc3dpbmcnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBlbGUuY3NzKHtcclxuICAgICAgICAgIHRyYW5zaXRpb246IFwiYWxsIDYwbXMgY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMiwgMS4yNzUpXCJcclxuICAgICAgICB9KTtcclxuICAgICAgICBlbGUuc2Nyb2xsVG9wKGgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2xpY2tFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVTaG93RXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHNJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICBsZXQgc0luZGV4ID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgZGF0YTogYW55ID0ge1xyXG4gICAgICBpdGVtOiBzSXRlbSxcclxuICAgICAgaW5kZXg6IHNJbmRleFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9TSE9XX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRTaG93RXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHNJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XHJcbiAgICBsZXQgc0luZGV4ID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgZGF0YTogYW55ID0ge1xyXG4gICAgICBpdGVtOiBzSXRlbSxcclxuICAgICAgaW5kZXg6IHNJbmRleFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFNIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5zaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0hJREVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEhpZGVFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmhpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9TaG93KCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVNob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRJbmRleCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMubmVlZEZvY3VzU2VydmljZSkge1xyXG4gICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlU2hvd0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCwgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcclxuICAgICAgdGhpcy5lbWl0U2hvd0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvSGlkZSgkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVIaWRlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRIaWRlRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRVSVVwZGF0ZUludGVydmFsKCk6IG51bWJlciB7XHJcblxyXG4gICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDYwMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiA2MDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5waGxveEFwcEluZm8uc2V0dGluZ3MuVUlfQU5JTUFURV9JTlRFUlZBTCA9PT0gbnVsbCB8fCB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5VSV9BTklNQVRFX0lOVEVSVkFMID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDYwMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5waGxveEFwcEluZm8uc2V0dGluZ3MuVUlfQU5JTUFURV9JTlRFUlZBTDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGljaygkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlQ2xpY2tFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuc2V0U2hvdyh0cnVlKTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCwgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcclxuICAgICAgdGhpcy5lbWl0Q2xpY2tFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgIC