dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
391 lines • 31.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/**
* @record
*/
export function ISelector() { }
if (false) {
/** @type {?} */
ISelector.prototype.show;
/** @type {?} */
ISelector.prototype.startX;
/** @type {?} */
ISelector.prototype.startY;
/** @type {?} */
ISelector.prototype.endX;
/** @type {?} */
ISelector.prototype.endY;
}
/**
* @record
*/
export function IPoint() { }
if (false) {
/** @type {?} */
IPoint.prototype.x;
/** @type {?} */
IPoint.prototype.y;
}
/** @type {?} */
export var noneSelector = { show: false, startX: -1, startY: -1, endX: -1, endY: -1 };
/** @type {?} */
export var nonePoint = { x: -1, y: -1 };
var Selector = /** @class */ (function () {
function Selector() {
}
/**
* @param {?} colIndex
* @param {?} rowIndex
* @return {?}
*/
Selector.prototype.cellSelector = /**
* @param {?} colIndex
* @param {?} rowIndex
* @return {?}
*/
function (colIndex, rowIndex) {
if (!this.selector.show) {
return false;
}
// 注意有反向选择
/** @type {?} */
var x = Math.max(1, Math.min(this.selector.startX, this.selector.endX));
/** @type {?} */
var x1 = Math.min(this.tabData.nativeElement.rows[0].cells.length - 1, Math.max(this.selector.startX, this.selector.endX));
/** @type {?} */
var y = Math.min(this.selector.startY, this.selector.endY);
/** @type {?} */
var y1 = Math.max(this.selector.startY, this.selector.endY);
return colIndex >= x && colIndex <= x1 && rowIndex >= y && rowIndex <= y1;
};
// 是否左边
// 是否左边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
Selector.prototype.cellSelectorLeft =
// 是否左边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
function (col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
var x = Math.min(this.selector.startX, this.selector.endX);
/** @type {?} */
var y = Math.min(this.selector.startY, this.selector.endY);
/** @type {?} */
var y1 = Math.max(this.selector.startY, this.selector.endY);
return col === x && row >= y && row <= y1;
};
// 是否下边
// 是否下边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
Selector.prototype.cellSelectorBottom =
// 是否下边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
function (col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
var x = Math.min(this.selector.startX, this.selector.endX);
/** @type {?} */
var x1 = Math.max(this.selector.startX, this.selector.endX);
/** @type {?} */
var y1 = Math.max(this.selector.startY, this.selector.endY);
return col >= x && col <= x1 && row === y1;
};
// 是否右边
// 是否右边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
Selector.prototype.cellSelectorRight =
// 是否右边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
function (col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
var x1 = Math.max(this.selector.startX, this.selector.endX);
/** @type {?} */
var y = Math.min(this.selector.startY, this.selector.endY);
/** @type {?} */
var y1 = Math.max(this.selector.startY, this.selector.endY);
return col === x1 && row >= y && row <= y1;
};
// 是否上边
// 是否上边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
Selector.prototype.cellSelectorTop =
// 是否上边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
function (col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
var x = Math.min(this.selector.startX, this.selector.endX);
/** @type {?} */
var x1 = Math.max(this.selector.startX, this.selector.endX);
/** @type {?} */
var y = Math.min(this.selector.startY, this.selector.endY);
return row === y && col >= x && col <= x1;
};
/**
* @param {?} event
* @param {?} colIndex
* @param {?} rowIndex
* @return {?}
*/
Selector.prototype.cellMouseDown = /**
* @param {?} event
* @param {?} colIndex
* @param {?} rowIndex
* @return {?}
*/
function (event, colIndex, rowIndex) {
var _this = this;
if (event.button !== 0) {
return;
}
this.leftPressed = true;
this.selector.show = true;
this.selector.startX = colIndex;
this.selector.startY = rowIndex;
this.selector.endX = colIndex;
this.selector.endY = rowIndex;
// Add listeners
this.closeMouseDownListern = this.renderer.listen('window', 'mousemove', this.onMouseMove);
this.timer = setInterval((/**
* @return {?}
*/
function () {
if (_this.leftPressed) {
_this.scrollTable();
}
}), 20);
// event.preventDefault();
// event.stopPropagation();
};
/**
* @param {?} event
* @return {?}
*/
Selector.prototype.mouseUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.button === 0) {
this.leftPressed = false;
if (this.closeMouseDownListern) {
this.closeMouseDownListern();
}
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
// event.preventDefault();
// event.stopPropagation();
}
};
/**
* @param {?} event
* @return {?}
*/
Selector.prototype.cellMouseEnter = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.current.x = ((/** @type {?} */ (event.target))).cellIndex;
this.current.y = ((/** @type {?} */ (((/** @type {?} */ (event.target))).parentElement))).rowIndex;
};
/**
* @param {?} event
* @return {?}
*/
Selector.prototype.onMouseMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.x = event.x;
this.y = event.y;
if (this.leftPressed) {
/** @type {?} */
var cell = cellFromPosition(this.tabData.nativeElement, event.x, event.y);
// 需要去掉第一列和最后一列
if (cell.columnIndex === 0) {
cell.columnIndex = 1;
}
if (cell.columnIndex === this.tabData.nativeElement.rows[0].cells.length - 1) {
cell.columnIndex = cell.columnIndex - 1;
}
// 需要去掉第一行
if (cell.rowIndex === 0) {
cell.rowIndex = 1;
}
if (cell) {
this.selector.endX = cell.columnIndex;
this.selector.endY = cell.rowIndex - 1; // 需要去掉标题行
}
this.scrollTable();
}
};
/**
* @return {?}
*/
Selector.prototype.scrollTable = /**
* @return {?}
*/
function () {
// 元素在文档的位置x,y
var _a = this.elRef.nativeElement.getBoundingClientRect(), xLeft = _a.left, yTop = _a.top, xRight = _a.right, yBottom = _a.bottom;
// 判断鼠标是否到元素边界
if (this.y <= yTop) {
// 滚动条的位置
this.elRef.nativeElement.scrollTop -= yTop - this.y;
}
else if (this.y >= yBottom - 20) {
this.elRef.nativeElement.scrollTop += this.y - yBottom + 20;
}
if (this.x <= xLeft) {
this.elRef.nativeElement.scrollLeft -= xLeft - this.x;
}
else if (this.x >= xRight) {
this.elRef.nativeElement.scrollLeft += this.x - xRight;
}
};
return Selector;
}());
export { Selector };
if (false) {
/** @type {?} */
Selector.prototype.renderer;
/** @type {?} */
Selector.prototype.closeMouseDownListern;
/** @type {?} */
Selector.prototype.selector;
/** @type {?} */
Selector.prototype.leftPressed;
/** @type {?} */
Selector.prototype.x;
/** @type {?} */
Selector.prototype.y;
/** @type {?} */
Selector.prototype.current;
/** @type {?} */
Selector.prototype.timer;
/** @type {?} */
Selector.prototype.elRef;
/** @type {?} */
Selector.prototype.tabData;
}
/**
* @record
*/
function CellPosition() { }
if (false) {
/** @type {?} */
CellPosition.prototype.columnIndex;
/** @type {?} */
CellPosition.prototype.rowIndex;
/** @type {?} */
CellPosition.prototype.outter;
}
// 根据鼠标位置,返回一个单元格坐标,总是返回一个坐标,超出可视区域范围的,返回边界上的坐标
/**
* @param {?} ele
* @param {?} ox
* @param {?} oy
* @return {?}
*/
function cellFromPosition(ele, ox, oy) {
if (!ele || ele.rows.length === 0) {
return null;
}
var _a = ele.getBoundingClientRect(), left = _a.left, top = _a.top, bottom = _a.bottom, right = _a.right;
/** @type {?} */
var outter = false;
var _b = tslib_1.__read([ox, oy], 2), x = _b[0], y = _b[1];
// 超出可视区域,用边界代替
if (ox < left) {
outter = true;
x = left;
}
else if (ox > right) {
outter = true;
x = right;
}
if (oy < top) {
outter = true;
y = top;
}
else if (oy > bottom) {
outter = true;
y = bottom;
}
/** @type {?} */
var colIndex = ele.rows[0].cells.length - 1;
/** @type {?} */
var rowIndex = ele.rows.length - 1;
/** @type {?} */
var totalLeft = left;
/** @type {?} */
var totalTop = top;
// 表格必定会有一行,先确定列位置
for (var i = 0; i < ele.rows[0].cells.length; i++) {
totalLeft += ele.rows[0].cells[i].offsetWidth;
if (x < totalLeft) {
colIndex = i;
break;
}
}
for (var i = 0; i < ele.rows.length; i++) {
// 不用offsetheight,防止四舍五入引起累计偏差
/** @type {?} */
var rect = ele.rows[i].getBoundingClientRect();
totalTop += rect.height;
if (y < totalTop) {
rowIndex = i;
break;
}
}
return { columnIndex: colIndex, rowIndex: rowIndex, outter: outter };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvcmVjb3JkLXZpZXcvdGFibGUvc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFFQSwrQkFNQzs7O0lBTEEseUJBQWM7O0lBQ2QsMkJBQWU7O0lBQ2YsMkJBQWU7O0lBQ2YseUJBQWE7O0lBQ2IseUJBQWE7Ozs7O0FBRWQsNEJBR0M7OztJQUZBLG1CQUFVOztJQUNWLG1CQUFVOzs7QUFFWCxNQUFNLEtBQU8sWUFBWSxHQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7O0FBQ2xHLE1BQU0sS0FBTyxTQUFTLEdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2pEO0lBQUE7SUFzSkEsQ0FBQzs7Ozs7O0lBM0lBLCtCQUFZOzs7OztJQUFaLFVBQWEsUUFBZ0IsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDYjs7O1lBRUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFDbkUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUNsRDs7WUFDSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDN0QsT0FBTyxRQUFRLElBQUksQ0FBQyxJQUFJLFFBQVEsSUFBSSxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxRQUFRLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPOzs7Ozs7O0lBQ1AsbUNBQWdCOzs7Ozs7O0lBQWhCLFVBQWlCLEdBQVcsRUFBRSxHQUFXO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUN4QixPQUFPLEtBQUssQ0FBQztTQUNiOztZQUNLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOztZQUN0RCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDN0QsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTzs7Ozs7OztJQUNQLHFDQUFrQjs7Ozs7OztJQUFsQixVQUFtQixHQUFXLEVBQUUsR0FBVztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDYjs7WUFDSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7O1lBQ3ZELEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzdELE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUNELE9BQU87Ozs7Ozs7SUFDUCxvQ0FBaUI7Ozs7Ozs7SUFBakIsVUFBa0IsR0FBVyxFQUFFLEdBQVc7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ3hCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7O1lBQ0ssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7O1lBQ3ZELENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOztZQUN0RCxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUM3RCxPQUFPLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFDRCxPQUFPOzs7Ozs7O0lBQ1Asa0NBQWU7Ozs7Ozs7SUFBZixVQUFnQixHQUFXLEVBQUUsR0FBVztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDYjs7WUFDSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7O1lBQ3ZELENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzVELE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDM0MsQ0FBQzs7Ozs7OztJQUNELGdDQUFhOzs7Ozs7SUFBYixVQUFjLEtBQWlCLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjtRQUFuRSxpQkFtQkM7UUFsQkEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPO1NBQ1A7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzlCLGdCQUFnQjtRQUNoQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXOzs7UUFBQztZQUN4QixJQUFJLEtBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLEtBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNuQjtRQUNGLENBQUMsR0FBRSxFQUFFLENBQUMsQ0FBQztRQUNQLDBCQUEwQjtRQUMxQiwyQkFBMkI7SUFDNUIsQ0FBQzs7Ozs7SUFDRCwwQkFBTzs7OztJQUFQLFVBQVEsS0FBaUI7UUFDeEIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7YUFDN0I7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7YUFDbEI7WUFDRCwwQkFBMEI7WUFDMUIsMkJBQTJCO1NBQzNCO0lBQ0YsQ0FBQzs7Ozs7SUFDRCxpQ0FBYzs7OztJQUFkLFVBQWUsS0FBaUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBc0IsS0FBSyxDQUFDLE1BQU0sRUFBQSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQXFCLENBQUMsbUJBQXNCLEtBQUssQ0FBQyxNQUFNLEVBQUEsQ0FBQyxDQUFDLGFBQWEsRUFBQSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3JHLENBQUM7Ozs7O0lBRUQsOEJBQVc7Ozs7SUFBWCxVQUFZLEtBQWlCO1FBQzVCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFakIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFOztnQkFDZixJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNFLGVBQWU7WUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxFQUFFO2dCQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQzthQUNyQjtZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzdFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7YUFDeEM7WUFDRCxVQUFVO1lBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7YUFDbEI7WUFDRCxJQUFJLElBQUksRUFBRTtnQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVU7YUFDbEQ7WUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbkI7SUFDRixDQUFDOzs7O0lBQ0QsOEJBQVc7OztJQUFYOztRQUVPLElBQUEscURBSzhDLEVBSm5ELGVBQVcsRUFDWCxhQUFTLEVBQ1QsaUJBQWEsRUFDYixtQkFDbUQ7UUFDcEQsY0FBYztRQUNkLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDbkIsU0FBUztZQUNULElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNwRDthQUFNLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7U0FDNUQ7UUFFRCxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN0RDthQUFNLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1NBQ3ZEO0lBQ0YsQ0FBQztJQUNGLGVBQUM7QUFBRCxDQUFDLEFBdEpELElBc0pDOzs7O0lBckpBLDRCQUFvQjs7SUFDcEIseUNBQWtDOztJQUNsQyw0QkFBb0I7O0lBQ3BCLCtCQUFxQjs7SUFDckIscUJBQVU7O0lBQ1YscUJBQVU7O0lBQ1YsMkJBQWdCOztJQUNoQix5QkFBb0I7O0lBQ3BCLHlCQUFrQzs7SUFDbEMsMkJBQXNDOzs7OztBQTZJdkMsMkJBS0M7OztJQUpBLG1DQUFvQjs7SUFDcEIsZ0NBQWlCOztJQUVqQiw4QkFBZ0I7Ozs7Ozs7OztBQUdqQixTQUFTLGdCQUFnQixDQUFDLEdBQXFCLEVBQUUsRUFBVSxFQUFFLEVBQVU7SUFDdEUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEMsT0FBTyxJQUFJLENBQUM7S0FDWjtJQUNLLElBQUEsZ0NBQTBELEVBQXhELGNBQUksRUFBRSxZQUFHLEVBQUUsa0JBQU0sRUFBRSxnQkFBcUM7O1FBQzVELE1BQU0sR0FBRyxLQUFLO0lBQ2QsSUFBQSxnQ0FBaUIsRUFBaEIsU0FBQyxFQUFFLFNBQWE7SUFDckIsZUFBZTtJQUNmLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtRQUNkLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ1Q7U0FBTSxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUU7UUFDdEIsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLENBQUMsR0FBRyxLQUFLLENBQUM7S0FDVjtJQUNELElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRTtRQUNiLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ1I7U0FBTSxJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUU7UUFDdkIsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNkLENBQUMsR0FBRyxNQUFNLENBQUM7S0FDWDs7UUFDRyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7O1FBQ3ZDLFFBQVEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDOztRQUM5QixTQUFTLEdBQUcsSUFBSTs7UUFDbkIsUUFBUSxHQUFHLEdBQUc7SUFDZixrQkFBa0I7SUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsRCxTQUFTLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRTtZQUNsQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTTtTQUNOO0tBQ0Q7SUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7OztZQUVuQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFBRTtRQUNoRCxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUU7WUFDakIsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNiLE1BQU07U0FDTjtLQUNEO0lBQ0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0b3Ige1xyXG5cdHNob3c6IGJvb2xlYW47XHJcblx0c3RhcnRYOiBudW1iZXI7XHJcblx0c3RhcnRZOiBudW1iZXI7XHJcblx0ZW5kWDogbnVtYmVyO1xyXG5cdGVuZFk6IG51bWJlcjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElQb2ludCB7XHJcblx0eDogbnVtYmVyO1xyXG5cdHk6IG51bWJlcjtcclxufVxyXG5leHBvcnQgY29uc3Qgbm9uZVNlbGVjdG9yOiBJU2VsZWN0b3IgPSB7IHNob3c6IGZhbHNlLCBzdGFydFg6IC0xLCBzdGFydFk6IC0xLCBlbmRYOiAtMSwgZW5kWTogLTEgfTtcclxuZXhwb3J0IGNvbnN0IG5vbmVQb2ludDogSVBvaW50ID0geyB4OiAtMSwgeTogLTEgfTtcclxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yIHtcclxuXHRyZW5kZXJlcjogUmVuZGVyZXIyO1xyXG5cdGNsb3NlTW91c2VEb3duTGlzdGVybjogKCkgPT4gdm9pZDtcclxuXHRzZWxlY3RvcjogSVNlbGVjdG9yO1xyXG5cdGxlZnRQcmVzc2VkOiBib29sZWFuO1xyXG5cdHg6IG51bWJlcjtcclxuXHR5OiBudW1iZXI7XHJcblx0Y3VycmVudDogSVBvaW50O1xyXG5cdHRpbWVyOiBOb2RlSlMuVGltZXI7XHJcblx0ZWxSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cdHRhYkRhdGE6IEVsZW1lbnRSZWY8SFRNTFRhYmxlRWxlbWVudD47XHJcblx0Y2VsbFNlbGVjdG9yKGNvbEluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIpIHtcclxuXHRcdGlmICghdGhpcy5zZWxlY3Rvci5zaG93KSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdC8vIOazqOaEj+acieWPjeWQkemAieaLqVxyXG5cdFx0Y29uc3QgeCA9IE1hdGgubWF4KDEsIE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpKTtcclxuXHRcdGNvbnN0IHgxID0gTWF0aC5taW4oXHJcblx0XHRcdHRoaXMudGFiRGF0YS5uYXRpdmVFbGVtZW50LnJvd3NbMF0uY2VsbHMubGVuZ3RoIC0gMSxcclxuXHRcdFx0TWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFgsIHRoaXMuc2VsZWN0b3IuZW5kWClcclxuXHRcdCk7XHJcblx0XHRjb25zdCB5ID0gTWF0aC5taW4odGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRjb25zdCB5MSA9IE1hdGgubWF4KHRoaXMuc2VsZWN0b3Iuc3RhcnRZLCB0aGlzLnNlbGVjdG9yLmVuZFkpO1xyXG5cdFx0cmV0dXJuIGNvbEluZGV4ID49IHggJiYgY29sSW5kZXggPD0geDEgJiYgcm93SW5kZXggPj0geSAmJiByb3dJbmRleCA8PSB5MTtcclxuXHR9XHJcblx0Ly8g5piv5ZCm5bem6L65XHJcblx0Y2VsbFNlbGVjdG9yTGVmdChjb2w6IG51bWJlciwgcm93OiBudW1iZXIpIHtcclxuXHRcdGlmICghdGhpcy5zZWxlY3Rvci5zaG93KSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHggPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKTtcclxuXHRcdGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdGNvbnN0IHkxID0gTWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRyZXR1cm4gY29sID09PSB4ICYmIHJvdyA+PSB5ICYmIHJvdyA8PSB5MTtcclxuXHR9XHJcblx0Ly8g5piv5ZCm5LiL6L65XHJcblx0Y2VsbFNlbGVjdG9yQm90dG9tKGNvbDogbnVtYmVyLCByb3c6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeCA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeDEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKTtcclxuXHRcdGNvbnN0IHkxID0gTWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRyZXR1cm4gY29sID49IHggJiYgY29sIDw9IHgxICYmIHJvdyA9PT0geTE7XHJcblx0fVxyXG5cdC8vIOaYr+WQpuWPs+i+uVxyXG5cdGNlbGxTZWxlY3RvclJpZ2h0KGNvbDogbnVtYmVyLCByb3c6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeDEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKTtcclxuXHRcdGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdGNvbnN0IHkxID0gTWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRyZXR1cm4gY29sID09PSB4MSAmJiByb3cgPj0geSAmJiByb3cgPD0geTE7XHJcblx0fVxyXG5cdC8vIOaYr+WQpuS4iui+uVxyXG5cdGNlbGxTZWxlY3RvclRvcChjb2w6IG51bWJlciwgcm93OiBudW1iZXIpIHtcclxuXHRcdGlmICghdGhpcy5zZWxlY3Rvci5zaG93KSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHggPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKTtcclxuXHRcdGNvbnN0IHgxID0gTWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFgsIHRoaXMuc2VsZWN0b3IuZW5kWCk7XHJcblx0XHRjb25zdCB5ID0gTWF0aC5taW4odGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRyZXR1cm4gcm93ID09PSB5ICYmIGNvbCA+PSB4ICYmIGNvbCA8PSB4MTtcclxuXHR9XHJcblx0Y2VsbE1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgY29sSW5kZXg6IG51bWJlciwgcm93SW5kZXg6IG51bWJlcikge1xyXG5cdFx0aWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHR0aGlzLmxlZnRQcmVzc2VkID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2VsZWN0b3Iuc2hvdyA9IHRydWU7XHJcblx0XHR0aGlzLnNlbGVjdG9yLnN0YXJ0WCA9IGNvbEluZGV4O1xyXG5cdFx0dGhpcy5zZWxlY3Rvci5zdGFydFkgPSByb3dJbmRleDtcclxuXHRcdHRoaXMuc2VsZWN0b3IuZW5kWCA9IGNvbEluZGV4O1xyXG5cdFx0dGhpcy5zZWxlY3Rvci5lbmRZID0gcm93SW5kZXg7XHJcblx0XHQvLyBBZGQgbGlzdGVuZXJzXHJcblx0XHR0aGlzLmNsb3NlTW91c2VEb3duTGlzdGVybiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XHJcblx0XHR0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5sZWZ0UHJlc3NlZCkge1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsVGFibGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgMjApO1xyXG5cdFx0Ly8gZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdH1cclxuXHRtb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHRpZiAoZXZlbnQuYnV0dG9uID09PSAwKSB7XHJcblx0XHRcdHRoaXMubGVmdFByZXNzZWQgPSBmYWxzZTtcclxuXHRcdFx0aWYgKHRoaXMuY2xvc2VNb3VzZURvd25MaXN0ZXJuKSB7XHJcblx0XHRcdFx0dGhpcy5jbG9zZU1vdXNlRG93bkxpc3Rlcm4oKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy50aW1lcikge1xyXG5cdFx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XHJcblx0XHRcdFx0dGhpcy50aW1lciA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0Ly8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGNlbGxNb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHR0aGlzLmN1cnJlbnQueCA9ICg8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5jZWxsSW5kZXg7XHJcblx0XHR0aGlzLmN1cnJlbnQueSA9ICg8SFRNTFRhYmxlUm93RWxlbWVudD4oPEhUTUxUYWJsZUNlbGxFbGVtZW50PmV2ZW50LnRhcmdldCkucGFyZW50RWxlbWVudCkucm93SW5kZXg7XHJcblx0fVxyXG5cclxuXHRvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG5cdFx0dGhpcy54ID0gZXZlbnQueDtcclxuXHRcdHRoaXMueSA9IGV2ZW50Lnk7XHJcblxyXG5cdFx0aWYgKHRoaXMubGVmdFByZXNzZWQpIHtcclxuXHRcdFx0Y29uc3QgY2VsbCA9IGNlbGxGcm9tUG9zaXRpb24odGhpcy50YWJEYXRhLm5hdGl2ZUVsZW1lbnQsIGV2ZW50LngsIGV2ZW50LnkpO1xyXG5cdFx0XHQvLyDpnIDopoHljrvmjonnrKzkuIDliJflkozmnIDlkI7kuIDliJdcclxuXHRcdFx0aWYgKGNlbGwuY29sdW1uSW5kZXggPT09IDApIHtcclxuXHRcdFx0XHRjZWxsLmNvbHVtbkluZGV4ID0gMTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoY2VsbC5jb2x1bW5JbmRleCA9PT0gdGhpcy50YWJEYXRhLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscy5sZW5ndGggLSAxKSB7XHJcblx0XHRcdFx0Y2VsbC5jb2x1bW5JbmRleCA9IGNlbGwuY29sdW1uSW5kZXggLSAxO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIOmcgOimgeWOu+aOieesrOS4gOihjFxyXG5cdFx0XHRpZiAoY2VsbC5yb3dJbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdGNlbGwucm93SW5kZXggPSAxO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChjZWxsKSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3Rvci5lbmRYID0gY2VsbC5jb2x1bW5JbmRleDtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdG9yLmVuZFkgPSBjZWxsLnJvd0luZGV4IC0gMTsgLy8g6ZyA6KaB5Y675o6J5qCH6aKY6KGMXHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5zY3JvbGxUYWJsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRzY3JvbGxUYWJsZSgpIHtcclxuXHRcdC8vIOWFg+e0oOWcqOaWh+aho+eahOS9jee9rngseVxyXG5cdFx0Y29uc3Qge1xyXG5cdFx0XHRsZWZ0OiB4TGVmdCxcclxuXHRcdFx0dG9wOiB5VG9wLFxyXG5cdFx0XHRyaWdodDogeFJpZ2h0LFxyXG5cdFx0XHRib3R0b206IHlCb3R0b21cclxuXHRcdH0gPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHQvLyDliKTmlq3pvKDmoIfmmK/lkKbliLDlhYPntKDovrnnlYxcclxuXHRcdGlmICh0aGlzLnkgPD0geVRvcCkge1xyXG5cdFx0XHQvLyDmu5rliqjmnaHnmoTkvY3nva5cclxuXHRcdFx0dGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAtPSB5VG9wIC0gdGhpcy55O1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnkgPj0geUJvdHRvbSAtIDIwKSB7XHJcblx0XHRcdHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgKz0gdGhpcy55IC0geUJvdHRvbSArIDIwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnggPD0geExlZnQpIHtcclxuXHRcdFx0dGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgLT0geExlZnQgLSB0aGlzLng7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMueCA+PSB4UmlnaHQpIHtcclxuXHRcdFx0dGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgKz0gdGhpcy54IC0geFJpZ2h0O1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5pbnRlcmZhY2UgQ2VsbFBvc2l0aW9uIHtcclxuXHRjb2x1bW5JbmRleDogbnVtYmVyO1xyXG5cdHJvd0luZGV4OiBudW1iZXI7XHJcblx0Ly8g5piv5ZCm6LaF5Ye65Y+v6KeG6IyD5Zu0XHJcblx0b3V0dGVyOiBib29sZWFuO1xyXG59XHJcbi8vIOagueaNrum8oOagh+S9jee9ru+8jOi/lOWbnuS4gOS4quWNleWFg+agvOWdkOagh++8jOaAu+aYr+i/lOWbnuS4gOS4quWdkOagh++8jOi2heWHuuWPr+inhuWMuuWfn+iMg+WbtOeahO+8jOi/lOWbnui+ueeVjOS4iueahOWdkOagh1xyXG5mdW5jdGlvbiBjZWxsRnJvbVBvc2l0aW9uKGVsZTogSFRNTFRhYmxlRWxlbWVudCwgb3g6IG51bWJlciwgb3k6IG51bWJlcik6IENlbGxQb3NpdGlvbiB7XHJcblx0aWYgKCFlbGUgfHwgZWxlLnJvd3MubGVuZ3RoID09PSAwKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0Y29uc3QgeyBsZWZ0LCB0b3AsIGJvdHRvbSwgcmlnaHQgfSA9IGVsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRsZXQgb3V0dGVyID0gZmFsc2U7XHJcblx0bGV0IFt4LCB5XSA9IFtveCwgb3ldO1xyXG5cdC8vIOi2heWHuuWPr+inhuWMuuWfn++8jOeUqOi+ueeVjOS7o+abv1xyXG5cdGlmIChveCA8IGxlZnQpIHtcclxuXHRcdG91dHRlciA9IHRydWU7XHJcblx0XHR4ID0gbGVmdDtcclxuXHR9IGVsc2UgaWYgKG94ID4gcmlnaHQpIHtcclxuXHRcdG91dHRlciA9IHRydWU7XHJcblx0XHR4ID0gcmlnaHQ7XHJcblx0fVxyXG5cdGlmIChveSA8IHRvcCkge1xyXG5cdFx0b3V0dGVyID0gdHJ1ZTtcclxuXHRcdHkgPSB0b3A7XHJcblx0fSBlbHNlIGlmIChveSA+IGJvdHRvbSkge1xyXG5cdFx0b3V0dGVyID0gdHJ1ZTtcclxuXHRcdHkgPSBib3R0b207XHJcblx0fVxyXG5cdGxldCBjb2xJbmRleCA9IGVsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aCAtIDE7XHJcblx0bGV0IHJvd0luZGV4ID0gZWxlLnJvd3MubGVuZ3RoIC0gMTtcclxuXHRsZXQgdG90YWxMZWZ0ID0gbGVmdCxcclxuXHRcdHRvdGFsVG9wID0gdG9wO1xyXG5cdC8vIOihqOagvOW/heWumuS8muacieS4gOihjCzlhYjnoa7lrprliJfkvY3nva5cclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGVsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR0b3RhbExlZnQgKz0gZWxlLnJvd3NbMF0uY2VsbHNbaV0ub2Zmc2V0V2lkdGg7XHJcblx0XHRpZiAoeCA8IHRvdGFsTGVmdCkge1xyXG5cdFx0XHRjb2xJbmRleCA9IGk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGVsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHQvLyDkuI3nlKhvZmZzZXRoZWlnaHTvvIzpmLLmraLlm5voiI3kupTlhaXlvJXotbfntK/orqHlgY/lt65cclxuXHRcdGNvbnN0IHJlY3QgPSBlbGUucm93c1tpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdHRvdGFsVG9wICs9IHJlY3QuaGVpZ2h0O1xyXG5cdFx0aWYgKHkgPCB0b3RhbFRvcCkge1xyXG5cdFx0XHRyb3dJbmRleCA9IGk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4geyBjb2x1bW5JbmRleDogY29sSW5kZXgsIHJvd0luZGV4OiByb3dJbmRleCwgb3V0dGVyOiBvdXR0ZXIgfTtcclxufVxyXG4iXX0=