UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

391 lines 31.7 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvcmVjb3JkLXZpZXcvdGFibGUvc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFFQSwrQkFNQzs7O0lBTEEseUJBQWM7O0lBQ2QsMkJBQWU7O0lBQ2YsMkJBQWU7O0lBQ2YseUJBQWE7O0lBQ2IseUJBQWE7Ozs7O0FBRWQsNEJBR0M7OztJQUZBLG1CQUFVOztJQUNWLG1CQUFVOzs7QUFFWCxNQUFNLEtBQU8sWUFBWSxHQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7O0FBQ2xHLE1BQU0sS0FBTyxTQUFTLEdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2pEO0lBQUE7SUFzSkEsQ0FBQzs7Ozs7O0lBM0lBLCtCQUFZOzs7OztJQUFaLFVBQWEsUUFBZ0IsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDYjs7O1lBRUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFDbkUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUNsRDs7WUFDSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDN0QsT0FBTyxRQUFRLElBQUksQ0FBQyxJQUFJLFFBQVEsSUFBSSxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxRQUFRLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPOzs7Ozs7O0lBQ1AsbUNBQWdCOzs7Ozs7O0lBQWhCLFVBQWlCLEdBQVcsRUFBRSxHQUFXO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUN4QixPQUFPLEtBQUssQ0FBQztTQUNiOztZQUNLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOztZQUN0RCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzs7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDN0QsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTzs7Ozs7OztJQUNQLHFD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QyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRTtZQUNsQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTTtTQUNOO0tBQ0Q7SUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7OztZQUVuQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFBRTtRQUNoRCxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUU7WUFDakIsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNiLE1BQU07U0FDTjtLQUNEO0lBQ0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDdEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0b3Ige1xyXG5cdHNob3c6IGJvb2xlYW47XHJcblx0c3RhcnRYOiBudW1iZXI7XHJcblx0c3RhcnRZOiBudW1iZXI7XHJcblx0ZW5kWDogbnVtYmVyO1xyXG5cdGVuZFk6IG51bWJlcjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElQb2ludCB7XHJcblx0eDogbnVtYmVyO1xyXG5cdHk6IG51bWJlcjtcclxufVxyXG5leHBvcnQgY29uc3Qgbm9uZVNlbGVjdG9yOiBJU2VsZWN0b3IgPSB7IHNob3c6IGZhbHNlLCBzdGFydFg6IC0xLCBzdGFydFk6IC0xLCBlbmRYOiAtMSwgZW5kWTogLTEgfTtcclxuZXhwb3J0IGNvbnN0IG5vbmVQb2ludDogSVBvaW50ID0geyB4OiAtMSwgeTogLTEgfTtcclxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yIHtcclxuXHRyZW5kZXJlcjogUmVuZGVyZXIyO1xyXG5cdGNsb3NlTW91c2VEb3duTGlzdGVybjogKCkgPT4gdm9pZDtcclxuXHRzZWxlY3RvcjogSVNlbGVjdG9yO1xyXG5cdGxlZnRQcmVzc2VkOiBib29sZWFuO1xyXG5cdHg6IG51bWJlcjtcclxuXHR5OiBudW1iZXI7XHJcblx0Y3VycmVudDogSVBvaW50O1xyXG5cdHRpbWVyOiBOb2RlSlMuVGltZXI7XHJcblx0ZWxSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+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=