UNPKG

dbweb-common

Version:

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

327 lines 30.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @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 const noneSelector = { show: false, startX: -1, startY: -1, endX: -1, endY: -1 }; /** @type {?} */ export const nonePoint = { x: -1, y: -1 }; export class Selector { /** * @param {?} colIndex * @param {?} rowIndex * @return {?} */ cellSelector(colIndex, rowIndex) { if (!this.selector.show) { return false; } // 注意有反向选择 /** @type {?} */ const x = Math.max(1, Math.min(this.selector.startX, this.selector.endX)); /** @type {?} */ const x1 = Math.min(this.tabData.nativeElement.rows[0].cells.length - 1, Math.max(this.selector.startX, this.selector.endX)); /** @type {?} */ const y = Math.min(this.selector.startY, this.selector.endY); /** @type {?} */ const y1 = Math.max(this.selector.startY, this.selector.endY); return colIndex >= x && colIndex <= x1 && rowIndex >= y && rowIndex <= y1; } // 是否左边 /** * @param {?} col * @param {?} row * @return {?} */ cellSelectorLeft(col, row) { if (!this.selector.show) { return false; } /** @type {?} */ const x = Math.min(this.selector.startX, this.selector.endX); /** @type {?} */ const y = Math.min(this.selector.startY, this.selector.endY); /** @type {?} */ const y1 = Math.max(this.selector.startY, this.selector.endY); return col === x && row >= y && row <= y1; } // 是否下边 /** * @param {?} col * @param {?} row * @return {?} */ cellSelectorBottom(col, row) { if (!this.selector.show) { return false; } /** @type {?} */ const x = Math.min(this.selector.startX, this.selector.endX); /** @type {?} */ const x1 = Math.max(this.selector.startX, this.selector.endX); /** @type {?} */ const y1 = Math.max(this.selector.startY, this.selector.endY); return col >= x && col <= x1 && row === y1; } // 是否右边 /** * @param {?} col * @param {?} row * @return {?} */ cellSelectorRight(col, row) { if (!this.selector.show) { return false; } /** @type {?} */ const x1 = Math.max(this.selector.startX, this.selector.endX); /** @type {?} */ const y = Math.min(this.selector.startY, this.selector.endY); /** @type {?} */ const y1 = Math.max(this.selector.startY, this.selector.endY); return col === x1 && row >= y && row <= y1; } // 是否上边 /** * @param {?} col * @param {?} row * @return {?} */ cellSelectorTop(col, row) { if (!this.selector.show) { return false; } /** @type {?} */ const x = Math.min(this.selector.startX, this.selector.endX); /** @type {?} */ const x1 = Math.max(this.selector.startX, this.selector.endX); /** @type {?} */ const y = Math.min(this.selector.startY, this.selector.endY); return row === y && col >= x && col <= x1; } /** * @param {?} event * @param {?} colIndex * @param {?} rowIndex * @return {?} */ cellMouseDown(event, colIndex, rowIndex) { 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 {?} */ () => { if (this.leftPressed) { this.scrollTable(); } }), 20); // event.preventDefault(); // event.stopPropagation(); } /** * @param {?} event * @return {?} */ mouseUp(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 {?} */ cellMouseEnter(event) { this.current.x = ((/** @type {?} */ (event.target))).cellIndex; this.current.y = ((/** @type {?} */ (((/** @type {?} */ (event.target))).parentElement))).rowIndex; } /** * @param {?} event * @return {?} */ onMouseMove(event) { this.x = event.x; this.y = event.y; if (this.leftPressed) { /** @type {?} */ const 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 {?} */ scrollTable() { // 元素在文档的位置x,y const { left: xLeft, top: yTop, right: xRight, bottom: yBottom } = this.elRef.nativeElement.getBoundingClientRect(); // 判断鼠标是否到元素边界 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; } } } 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; } const { left, top, bottom, right } = ele.getBoundingClientRect(); /** @type {?} */ let outter = false; let [x, y] = [ox, oy]; // 超出可视区域,用边界代替 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 {?} */ let colIndex = ele.rows[0].cells.length - 1; /** @type {?} */ let rowIndex = ele.rows.length - 1; /** @type {?} */ let totalLeft = left; /** @type {?} */ let totalTop = top; // 表格必定会有一行,先确定列位置 for (let i = 0; i < ele.rows[0].cells.length; i++) { totalLeft += ele.rows[0].cells[i].offsetWidth; if (x < totalLeft) { colIndex = i; break; } } for (let i = 0; i < ele.rows.length; i++) { // 不用offsetheight,防止四舍五入引起累计偏差 /** @type {?} */ const 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvcmVjb3JkLXZpZXcvdGFibGUvc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBLCtCQU1DOzs7SUFMQSx5QkFBYzs7SUFDZCwyQkFBZTs7SUFDZiwyQkFBZTs7SUFDZix5QkFBYTs7SUFDYix5QkFBYTs7Ozs7QUFFZCw0QkFHQzs7O0lBRkEsbUJBQVU7O0lBQ1YsbUJBQVU7OztBQUVYLE1BQU0sT0FBTyxZQUFZLEdBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTs7QUFDbEcsTUFBTSxPQUFPLFNBQVMsR0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDakQsTUFBTSxPQUFPLFFBQVE7Ozs7OztJQVdwQixZQUFZLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDYjs7O2NBRUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Y0FDbkUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJ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LEdBQUcsU0FBUyxFQUFFO1lBQ2xCLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDYixNQUFNO1NBQ047S0FDRDtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7O2NBRW5DLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFO1FBQ2hELFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRTtZQUNqQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTTtTQUNOO0tBQ0Q7SUFDRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3RvciB7XHJcblx0c2hvdzogYm9vbGVhbjtcclxuXHRzdGFydFg6IG51bWJlcjtcclxuXHRzdGFydFk6IG51bWJlcjtcclxuXHRlbmRYOiBudW1iZXI7XHJcblx0ZW5kWTogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcclxuXHR4OiBudW1iZXI7XHJcblx0eTogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBjb25zdCBub25lU2VsZWN0b3I6IElTZWxlY3RvciA9IHsgc2hvdzogZmFsc2UsIHN0YXJ0WDogLTEsIHN0YXJ0WTogLTEsIGVuZFg6IC0xLCBlbmRZOiAtMSB9O1xyXG5leHBvcnQgY29uc3Qgbm9uZVBvaW50OiBJUG9pbnQgPSB7IHg6IC0xLCB5OiAtMSB9O1xyXG5leHBvcnQgY2xhc3MgU2VsZWN0b3Ige1xyXG5cdHJlbmRlcmVyOiBSZW5kZXJlcjI7XHJcblx0Y2xvc2VNb3VzZURvd25MaXN0ZXJuOiAoKSA9PiB2b2lkO1xyXG5cdHNlbGVjdG9yOiBJU2VsZWN0b3I7XHJcblx0bGVmdFByZXNzZWQ6IGJvb2xlYW47XHJcblx0eDogbnVtYmVyO1xyXG5cdHk6IG51bWJlcjtcclxuXHRjdXJyZW50OiBJUG9pbnQ7XHJcblx0dGltZXI6IE5vZGVKUy5UaW1lcjtcclxuXHRlbFJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblx0dGFiRGF0YTogRWxlbWVudFJlZjxIVE1MVGFibGVFbGVtZW50PjtcclxuXHRjZWxsU2VsZWN0b3IoY29sSW5kZXg6IG51bWJlciwgcm93SW5kZXg6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Ly8g5rOo5oSP5pyJ5Y+N5ZCR6YCJ5oupXHJcblx0XHRjb25zdCB4ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4odGhpcy5zZWxlY3Rvci5zdGFydFgsIHRoaXMuc2VsZWN0b3IuZW5kWCkpO1xyXG5cdFx0Y29uc3QgeDEgPSBNYXRoLm1pbihcclxuXHRcdFx0dGhpcy50YWJEYXRhLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscy5sZW5ndGggLSAxLFxyXG5cdFx0XHRNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKVxyXG5cdFx0KTtcclxuXHRcdGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdGNvbnN0IHkxID0gTWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRyZXR1cm4gY29sSW5kZXggPj0geCAmJiBjb2xJbmRleCA8PSB4MSAmJiByb3dJbmRleCA+PSB5ICYmIHJvd0luZGV4IDw9IHkxO1xyXG5cdH1cclxuXHQvLyDmmK/lkKblt6bovrlcclxuXHRjZWxsU2VsZWN0b3JMZWZ0KGNvbDogbnVtYmVyLCByb3c6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeCA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeSA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRZLCB0aGlzLnNlbGVjdG9yLmVuZFkpO1xyXG5cdFx0Y29uc3QgeTEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiBjb2wgPT09IHggJiYgcm93ID49IHkgJiYgcm93IDw9IHkxO1xyXG5cdH1cclxuXHQvLyDmmK/lkKbkuIvovrlcclxuXHRjZWxsU2VsZWN0b3JCb3R0b20oY29sOiBudW1iZXIsIHJvdzogbnVtYmVyKSB7XHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0b3Iuc2hvdykge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCB4ID0gTWF0aC5taW4odGhpcy5zZWxlY3Rvci5zdGFydFgsIHRoaXMuc2VsZWN0b3IuZW5kWCk7XHJcblx0XHRjb25zdCB4MSA9IE1hdGgubWF4KHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeTEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiBjb2wgPj0geCAmJiBjb2wgPD0geDEgJiYgcm93ID09PSB5MTtcclxuXHR9XHJcblx0Ly8g5piv5ZCm5Y+z6L65XHJcblx0Y2VsbFNlbGVjdG9yUmlnaHQoY29sOiBudW1iZXIsIHJvdzogbnVtYmVyKSB7XHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0b3Iuc2hvdykge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCB4MSA9IE1hdGgubWF4KHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeSA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRZLCB0aGlzLnNlbGVjdG9yLmVuZFkpO1xyXG5cdFx0Y29uc3QgeTEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiBjb2wgPT09IHgxICYmIHJvdyA+PSB5ICYmIHJvdyA8PSB5MTtcclxuXHR9XHJcblx0Ly8g5piv5ZCm5LiK6L65XHJcblx0Y2VsbFNlbGVjdG9yVG9wKGNvbDogbnVtYmVyLCByb3c6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeCA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeDEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKTtcclxuXHRcdGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiByb3cgPT09IHkgJiYgY29sID49IHggJiYgY29sIDw9IHgxO1xyXG5cdH1cclxuXHRjZWxsTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBjb2xJbmRleDogbnVtYmVyLCByb3dJbmRleDogbnVtYmVyKSB7XHJcblx0XHRpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMubGVmdFByZXNzZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5zZWxlY3Rvci5zaG93ID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2VsZWN0b3Iuc3RhcnRYID0gY29sSW5kZXg7XHJcblx0XHR0aGlzLnNlbGVjdG9yLnN0YXJ0WSA9IHJvd0luZGV4O1xyXG5cdFx0dGhpcy5zZWxlY3Rvci5lbmRYID0gY29sSW5kZXg7XHJcblx0XHR0aGlzLnNlbGVjdG9yLmVuZFkgPSByb3dJbmRleDtcclxuXHRcdC8vIEFkZCBsaXN0ZW5lcnNcclxuXHRcdHRoaXMuY2xvc2VNb3VzZURvd25MaXN0ZXJuID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuXHRcdHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLmxlZnRQcmVzc2VkKSB7XHJcblx0XHRcdFx0dGhpcy5zY3JvbGxUYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAyMCk7XHJcblx0XHQvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0Ly8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0fVxyXG5cdG1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdGlmIChldmVudC5idXR0b24gPT09IDApIHtcclxuXHRcdFx0dGhpcy5sZWZ0UHJlc3NlZCA9IGZhbHNlO1xyXG5cdFx0XHRpZiAodGhpcy5jbG9zZU1vdXNlRG93bkxpc3Rlcm4pIHtcclxuXHRcdFx0XHR0aGlzLmNsb3NlTW91c2VEb3duTGlzdGVybigpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLnRpbWVyKSB7XHJcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcclxuXHRcdFx0XHR0aGlzLnRpbWVyID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHQvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHR9XHJcblx0Y2VsbE1vdXNlRW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdHRoaXMuY3VycmVudC54ID0gKDxIVE1MVGFibGVDZWxsRWxlbWVudD5ldmVudC50YXJnZXQpLmNlbGxJbmRleDtcclxuXHRcdHRoaXMuY3VycmVudC55ID0gKDxIVE1MVGFibGVSb3dFbGVtZW50Pig8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5wYXJlbnRFbGVtZW50KS5yb3dJbmRleDtcclxuXHR9XHJcblxyXG5cdG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHR0aGlzLnggPSBldmVudC54O1xyXG5cdFx0dGhpcy55ID0gZXZlbnQueTtcclxuXHJcblx0XHRpZiAodGhpcy5sZWZ0UHJlc3NlZCkge1xyXG5cdFx0XHRjb25zdCBjZWxsID0gY2VsbEZyb21Qb3NpdGlvbih0aGlzLnRhYkRhdGEubmF0aXZlRWxlbWVudCwgZXZlbnQueCwgZXZlbnQueSk7XHJcblx0XHRcdC8vIOmcgOimgeWOu+aOieesrOS4gOWIl+WSjOacgOWQjuS4gOWIl1xyXG5cdFx0XHRpZiAoY2VsbC5jb2x1bW5JbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdGNlbGwuY29sdW1uSW5kZXggPSAxO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChjZWxsLmNvbHVtbkluZGV4ID09PSB0aGlzLnRhYkRhdGEubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzLmxlbmd0aCAtIDEpIHtcclxuXHRcdFx0XHRjZWxsLmNvbHVtbkluZGV4ID0gY2VsbC5jb2x1bW5JbmRleCAtIDE7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8g6ZyA6KaB5Y675o6J56ys5LiA6KGMXHJcblx0XHRcdGlmIChjZWxsLnJvd0luZGV4ID09PSAwKSB7XHJcblx0XHRcdFx0Y2VsbC5yb3dJbmRleCA9IDE7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGNlbGwpIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdG9yLmVuZFggPSBjZWxsLmNvbHVtbkluZGV4O1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0b3IuZW5kWSA9IGNlbGwucm93SW5kZXggLSAxOyAvLyDpnIDopoHljrvmjonmoIfpopjooYxcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNjcm9sbFRhYmxlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHNjcm9sbFRhYmxlKCkge1xyXG5cdFx0Ly8g5YWD57Sg5Zyo5paH5qGj55qE5L2N572ueCx5XHJcblx0XHRjb25zdCB7XHJcblx0XHRcdGxlZnQ6IHhMZWZ0LFxyXG5cdFx0XHR0b3A6IHlUb3AsXHJcblx0XHRcdHJpZ2h0OiB4UmlnaHQsXHJcblx0XHRcdGJvdHRvbTogeUJvdHRvbVxyXG5cdFx0fSA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdC8vIOWIpOaWrem8oOagh+aYr+WQpuWIsOWFg+e0oOi+ueeVjFxyXG5cdFx0aWYgKHRoaXMueSA8PSB5VG9wKSB7XHJcblx0XHRcdC8vIOa7muWKqOadoeeahOS9jee9rlxyXG5cdFx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC09IHlUb3AgLSB0aGlzLnk7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMueSA+PSB5Qm90dG9tIC0gMjApIHtcclxuXHRcdFx0dGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCArPSB0aGlzLnkgLSB5Qm90dG9tICsgMjA7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMueCA8PSB4TGVmdCkge1xyXG5cdFx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCAtPSB4TGVmdCAtIHRoaXMueDtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy54ID49IHhSaWdodCkge1xyXG5cdFx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCArPSB0aGlzLnggLSB4UmlnaHQ7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmludGVyZmFjZSBDZWxsUG9zaXRpb24ge1xyXG5cdGNvbHVtbkluZGV4OiBudW1iZXI7XHJcblx0cm93SW5kZXg6IG51bWJlcjtcclxuXHQvLyDmmK/lkKbotoXlh7rlj6/op4bojIPlm7RcclxuXHRvdXR0ZXI6IGJvb2xlYW47XHJcbn1cclxuLy8g5qC55o2u6byg5qCH5L2N572u77yM6L+U5Zue5LiA5Liq5Y2V5YWD5qC85Z2Q5qCH77yM5oC75piv6L+U5Zue5LiA5Liq5Z2Q5qCH77yM6LaF5Ye65Y+v6KeG5Yy65Z+f6IyD5Zu055qE77yM6L+U5Zue6L6555WM5LiK55qE5Z2Q5qCHXHJcbmZ1bmN0aW9uIGNlbGxGcm9tUG9zaXRpb24oZWxlOiBIVE1MVGFibGVFbGVtZW50LCBveDogbnVtYmVyLCBveTogbnVtYmVyKTogQ2VsbFBvc2l0aW9uIHtcclxuXHRpZiAoIWVsZSB8fCBlbGUucm93cy5sZW5ndGggPT09IDApIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHRjb25zdCB7IGxlZnQsIHRvcCwgYm90dG9tLCByaWdodCB9ID0gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdGxldCBvdXR0ZXIgPSBmYWxzZTtcclxuXHRsZXQgW3gsIHldID0gW294LCBveV07XHJcblx0Ly8g6LaF5Ye65Y+v6KeG5Yy65Z+f77yM55So6L6555WM5Luj5pu/XHJcblx0aWYgKG94IDwgbGVmdCkge1xyXG5cdFx0b3V0dGVyID0gdHJ1ZTtcclxuXHRcdHggPSBsZWZ0O1xyXG5cdH0gZWxzZSBpZiAob3ggPiByaWdodCkge1xyXG5cdFx0b3V0dGVyID0gdHJ1ZTtcclxuXHRcdHggPSByaWdodDtcclxuXHR9XHJcblx0aWYgKG95IDwgdG9wKSB7XHJcblx0XHRvdXR0ZXIgPSB0cnVlO1xyXG5cdFx0eSA9IHRvcDtcclxuXHR9IGVsc2UgaWYgKG95ID4gYm90dG9tKSB7XHJcblx0XHRvdXR0ZXIgPSB0cnVlO1xyXG5cdFx0eSA9IGJvdHRvbTtcclxuXHR9XHJcblx0bGV0IGNvbEluZGV4ID0gZWxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoIC0gMTtcclxuXHRsZXQgcm93SW5kZXggPSBlbGUucm93cy5sZW5ndGggLSAxO1xyXG5cdGxldCB0b3RhbExlZnQgPSBsZWZ0LFxyXG5cdFx0dG90YWxUb3AgPSB0b3A7XHJcblx0Ly8g6KGo5qC85b+F5a6a5Lya5pyJ5LiA6KGMLOWFiOehruWumuWIl+S9jee9rlxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgZWxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdHRvdGFsTGVmdCArPSBlbGUucm93c1swXS5jZWxsc1tpXS5vZmZzZXRXaWR0aDtcclxuXHRcdGlmICh4IDwgdG90YWxMZWZ0KSB7XHJcblx0XHRcdGNvbEluZGV4ID0gaTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgZWxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuXHRcdC8vIOS4jeeUqG9mZnNldGhlaWdodO+8jOmYsuatouWbm+iIjeS6lOWFpeW8lei1t+e0r+iuoeWBj+W3rlxyXG5cdFx0Y29uc3QgcmVjdCA9IGVsZS5yb3dzW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0dG90YWxUb3AgKz0gcmVjdC5oZWlnaHQ7XHJcblx0XHRpZiAoeSA8IHRvdGFsVG9wKSB7XHJcblx0XHRcdHJvd0luZGV4ID0gaTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB7IGNvbHVtbkluZGV4OiBjb2xJbmRleCwgcm93SW5kZXg6IHJvd0luZGV4LCBvdXR0ZXI6IG91dHRlciB9O1xyXG59XHJcbiJdfQ==